Thứ Hai, 10 tháng 8, 2009

Sử dụng plugin trong cakephp 1.2!

Hello cả nhà!

Hôm nay tôi xin giới thiệu với mọi người về cách sử dụng plugin trong cakephp. Như mọi người đều biết, cakephp là một framework hỗ trợ lập trình php một cách nhanh chóng và hiệu quả nhất. Sử dụng cakephp sẽ làm tăng tốc độ phát triển các dự án lên nhiều lần. Trong quá trình phát triển dự án, việc sử dụng đi sử dụng lại các đoạn code viết sẵn là đỉều tất yếu. Vậy sử dụng lại code như thế nào cho hiệu quả cũng là một bài toán đáng để quan tâm. Nếu như mọi người cứ copy nguyên code các dự án đã có rồi phát triển nên, sẽ làm cho code ngày càng nhiều khó quản lý và tái sử dụng ở các lần sau. Với cakephp, việc tái sử dụng code sẽ trở nên đơn giản hơn thông qua sử dụng tiện ích plugin. Các module chức năng sẽ được tách riêng ra thành các plugin, và khi sử dụng module chức năng nào, ta chỉ việc đưa plugin đó vào trong cakephp mà thôi. Việc sử dụng plugin sẽ làm cho các chức năng trở nên rõ ràng, tách biệt và dễ quản lý, maintain cũng như phát triên nên.

Việc tạo một plugin trong cakephp vô cùng đơn giản và dễ hiểu. Để tạo ra một plug, chúng ta sẽ đưa vào trong thư mục app/plugins. Ví dụ sau đây chúng ta sẽ tạo ra một plugin tin tức với các chức năng thêm sửa xóa. Đâu tiên sẽ là tạo ra CSDL tên là plugin trong đó có bảng news:

CREATE TABLE IF NOT EXISTS `news` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL,
`description` text,
`content` text,
`created` datetime DEFAULT NULL,
`user_id` int(4) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

CREATE TABLE IF NOT EXISTS `users` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Việc cấu hình database kết nối đến CSDL mới tạo tôi sẽ để mọi người tự làm nhé (Đây là công việc cơ bản mà ^_^ ). Tiếp theo ta sẽ tạo ra một plugin tintuc bằng cách thêm một thư mục tintuc như sau : app/plugins/tintuc . Cấu trúc bên trong thư mục tin tức sẽ giống hệt như là cấu trúc bên trong thư mục app. Ta sẽ có một thư thư mục cơ bản cần thiết như sau:

+ Thư mục controller như sau: app/plugins/tintuc/controllers.

+ Thư mục view như sau:  app/plugins/tintuc/view

+ Thư mục models như sau:  app/plugins/tintuc/models

+ Thư mục layout như sau:  app/plugins/tintuc/layouts

+ Thư mục helpers như sau:  app/plugins/tintuc/view/helpers

+ Thư mục components như sau:  app/plugins/tintuc/controllers/components

+ Tệp tin TintucAppController: app/plugins/tintuc/tintuc_app_controller.php

+ Tệp tin TintucAppModel: app/plugins/tintuc/tintuc_app_model.php

+ .......................................

Như đã thấy ở trên, cấu trúc các thư mục trong plugin sẽ tương tự như cấu trúc thư mục như trong phần app. Riêng 2 file tintuc_app_controller.php và tintuc_app_model.php sẽ có nội dung như sau:
//app/plugins/tintuc/tintuc_app_controller.php

<?php
class TinTucAppController extends AppController {

}
?>

//app/plugins/tintuc/tintuc_app_model.php

<?php
class TintucAppModel extends AppModel {

}
?>

Tiếp theo ta sẽ khai báo một news_controllers theo app/plugins/tintuc/controllers/news_controller.php
<?php
class NewsController extends TintucAppController
{

var $name = 'News';
var $uses = array('Tintuc.News');
var $helpers = array('Html', 'Form', 'Javascript');

function index($param=null)
{
$this->News->recursive = 0;
$this->paginate = array('limit' => 15, 'page' => 1, 'order' => array('News.created' => 'desc'));
$this->set ('news', $this->paginate ('News'));
}

function add()
{
$this->layout = 'homepage';
if(! empty ($this->data))
{
$this->News->create ();
if($this->News->save ($this->data))
{
$this->Session->setFlash (__ ('The News has been saved', true));
$this->redirect ('/tintuc/news/index');
}else
{
$this->Session->setFlash (__ ('The News could not be saved. Please, try again.', true));
}
}
}

function edit($id = null)
{
if(! $id && empty ($this->data))
{
$this->Session->setFlash (__ ('Invalid News', true));
$this->redirect (array('action' => 'index'));
}
$news = $this->News->read (null, $id);
if(! empty ($this->data))
{
if($this->News->save ($this->data))
{
$this->Session->setFlash (__ ('The News has been saved', true));
$this->redirect ('/tintuc/news/index');
}else
{
$this->Session->setFlash (__ ('The News could not be saved. Please, try again.', true));
}
}

if(empty ($this->data))
{
$this->data = $news;
}
}

function delete($id = null)
{
if(! $id)
{
$this->Session->setFlash (__ ('Invalid id for News', true));
$this->redirect ('/tintuc/news/index');
}
$del_news = $this->News->findById ($id);
if($this->News->del ($id))
{
$this->Session->setFlash (__ ('News deleted', true));
$this->redirect ('/tintuc/news/index');
}
}

}
?>

Khai báo tiếp một file model news.php theo đường dẫn app/plugins/tintuc/models/news.php
<?php
class News extends TintucAppModel {
var $name = 'News';
var $belongsTo = array('User');
}
?>

Vậy là đã xong controller và model. Giờ tôi sẽ tạo ra 3 view là index, add và edit
//app/plugins/tintuc/views/news/add.ctp

<?php
echo $form->create('News', array('url' => '/tintuc/news/add'));
echo $form->input('title');
echo $form->input('description');
echo $form->input('created');
echo $form->input('content');
echo $form->end('Submit');
?>

//app/plugins/tintuc/views/news/edit.ctp

<?php
echo $form->create('News');
echo $form->hidden('id');
echo $form->input('title');
echo $form->input('description');
echo $form->input('created');
echo $form->input('content');
echo $form->end('Submit');
?>

//app/plugins/tintuc/views/news/index.ctp

<h2>Index</h2>

<table>
<tr>
<th>Title</th>
<th>User</th>
<th>Created</th>
<th>Action</th>
</tr>
<?php
foreach ($news as $n)
{
?>
<tr>
<td><?=$n['News']['title']?></td>
<td><?=$n['User']['name']?></td>
<td><?=$n['News']['created']?></td>
<td>
<?=$html->link('Edit', '/tintuc/news/edit/'.$n['News']['id']);?>
<?=$html->link('Delete', '/tintuc/news/delete/'.$n['News']['id'], null, sprintf(__('Are you sure you want to delete # %s?', true), $n['News']['id']));?>
</td>
</tr>
<?php
}
?>
</table>

<?=$html->link('Add', '/tintuc/news/add')?>

Tôi đã vừa hoàn thành một plugin cơ bản trong cakephp. Bây giờ tôi sẽ lấy dữ liệu từ plugin thông qua một test_controller như sau:
//app/controllers/tests_controllers.php

<?php
class TestController extends AppController {

var $name = 'Test';
var $uses = array('Tintuc.News);

function index()
{
debug($this->News->find('all'));
die();
}
}
?>

Trong plugin ta còn có thể tạo ra các components, helpers, layouts riêng cho mình. Các file này sẽ nằm ở các thư mục tương ứng trong plugins. Việc tao ra các class components, helpers, layout tương tự như thêm components, helpers hoặc layout bình thường.  Sử dụng các components, helpers, layouts trong controller như sau:

var $components = array('Tintuc.Comp');

Như vậy là ta chỉ thêm tên các plugin phía trước các components và helper mà thôi, riêng với layout tao khai báo như bình thương, vì nó sẽ mặc định là chồng đề lên thư mục app/views/layouts.
var $layout = 'temp_layout';

Việc chỉ định sử dụng các file javascript, css và ảnh sẽ được lưu vào trong các thư mục tương ứng là tintuc/vendors/js, tintuc/vendors/css and tintuc/vendors/img và sẽ được gọi như sau:

<?php echo $html->image('/tintuc/img/my_image.png'); ?>

<?php echo $html->css('/tintuc/css/my_css'); ?>

<?php echo $javascript->link('/tintuc/js/do_cool_stuff'); ?>

Tôi đã trình bày mọi thứ cơ bản liên quan đến plugin với mọi người rồi, giờ mọi người hãy tự trải nghiêm nhé. Chúc cả nhà vui vẻ @(^_^)@.





15 nhận xét:

  1. Một hướng dẫn thật ngắn gọn, và dể hiểu. Cảm ơn bạn

    Trả lờiXóa
  2. tgbulk quantities wholesale of products to retail stores.Fortunately, there wholesale jeans is a wholesale company that stands out for its willingness to source to individuals as well as sellers. Rhinomart is the name of this wholesale source. The Rhinomart corporation does all of its business abercrombie and fitch online; this enables you to wholesale shoes search through Rhinomart’s wide-ranging inventory of available products and select what you want without ever having to leave the comfort of your own home. Of course, as is the case with normal wholesale businesses, you, the wholesale jerseys client, save more as wholesale shirts you buy more of a specific handbags good like dollar.

    Trả lờiXóa
  3. Eating, loving, singing and pooping are, in actuality, the four acts of the mirthful opera known as freshness, and they pass like bubbles of a grit of champagne. Whoever lets them break without having enjoyed them is a entire fool.

    Sent via Blackberry

    Trả lờiXóa
  4. Cảm ơn bạn. Một bài viết rất hay . Rất cần thiết cho tôi lúc này .
    Thanks !

    Trả lờiXóa
  5. cakePHP sẽ lưu các file sau khi zen thàng cache rồi sau đó lấy những file này dể show lên web hả? giống templates engine hả?

    Trả lờiXóa
  6. Do you have a spam problem on this site; I also am a blogger, and I was curious about your situation; we have created some nice procedures and we are looking to trade solutions with others, why not shoot me an e-mail if interested.

    Trả lờiXóa
  7. Does your website have a contact page? I'm having problems locating it but, I'd like to shoot you an e-mail. I've got some creative ideas for your blog you might be interested in hearing. Either way, great blog and I look forward to seeing it improve over time.

    Trả lờiXóa
  8. When I originally commented I clicked the "Notify me when new comments are added" checkbox and now each time a comment is added I get three e-mails with the same comment. Is there any way you can remove me from that service? Many thanks!

    Trả lờiXóa
  9. This is the right blog for anyone who wants to find out about this topic. You realize so much its almost hard to argue with you (not that I actually would want…HaHa). You definitely put a new spin on a topic thats been written about for years. Great stuff, just great!

    Trả lờiXóa
  10. Here is the deal that I have for you today. Get a custom website, read the niche selection secrets, select an income source, plug in the traffic source, and finally just let the breakthrough software go to work. Check it out for yourself... http://tinyurl.com/6mot2q9

    Trả lờiXóa
  11. Aw, this was a really nice post. In idea I would like to put in writing like this additionally – taking time and actual effort to make a very good article… but what can I say… I procrastinate alot and by no means seem to get something done.

    Trả lờiXóa
  12. em đã extends Controller của plugin nhưng ko biết dung View. jo em muôn lấy View ra app sao ah?

    Trả lờiXóa