Hướng dẫn học: Cách viết 1 Component cho CakePHP

Hướng dẫn học: Cách viết 1 Component cho CakePHP

- CakePHP đã hỗ trợ chúng ta một số component hữu ích: acl, mail, time, security… đặt trong cake/libs/controller/components.

- Để sử dụng các component này, trong controller chúng ta khai báo

var $components=array('Acl',’Mail’); 

- Giả sử tôi muốn loại bỏ dấu tiếng Việt các bài viết mà tôi nhận được từ user, không chỉ các bài bình luận về sản phẩm mà cả các bài bình luận về dự án, về hình ảnh nào đó trong website của tôi…

- Cách đặt tên cho 1 Class Component :

Tên lớp helper = tên comonent + “Component”

Component mà tôi muốn tạo ra có tên là Common, class tương ứng là CommonComponent và file tương ứng là common.php (app/controllers/components/common.php)

Nội dung file common.php như sau:

<?php
class CommonComponent extends Object{

function unicode_convert($str){
              if(!$str) return false;
              $unicode = array(
                'a'=>array('á','à','ả','ã','ạ','ă','ắ','ặ','ằ','ẳ','ẵ','â','ấ','ầ','ẩ','ẫ','ậ'),
                    'A'=>array('Á','À','Ả','Ã','Ạ','Ă','Ắ','Ặ','Ằ','Ẳ','Ẵ','Â','Ấ','Ầ','Ẩ','Ẫ','Ậ'),
                    'd'=>array('đ'),
                    'D'=>array('Đ'),
                    'e'=>array('é','è','ẻ','ẽ','ẹ','ê','ế','ề','ể','ễ','ệ'),
                    'E'=>array('É','È','Ẻ','Ẽ','Ẹ','Ê','Ế','Ề','Ể','Ễ','Ệ'),
                    'i'=>array('í','ì','ỉ','ĩ','ị'),
                    'I'=>array('Í','Ì','Ỉ','Ĩ','Ị'),
                    'o'=>array('ó','ò','ỏ','õ','ọ','ô','ố','ồ','ổ','ỗ','ộ','ơ','ớ','ờ','ở','ỡ','ợ'),
                    '0'=>array('Ó','Ò','Ỏ','Õ','Ọ','Ô','Ố','Ồ','Ổ','Ỗ','Ộ','Ơ','Ớ','Ờ','Ở','Ỡ','Ợ'),
                    'u'=>array('ú','ù','ủ','ũ','ụ','ư','ứ','ừ','ử','ữ','ự'),
                    'U'=>array('Ú','Ù','Ủ','Ũ','Ụ','Ư','Ứ','Ừ','Ử','Ữ','Ự'),
                    'y'=>array('ý','ỳ','ỷ','ỹ','ỵ'),
                    'Y'=>array('Ý','Ỳ','Ỷ','Ỹ','Ỵ'),
                    '-'=>array(' ','&quot;','.','/','\'','’','(',')',',','!','"','“','”','%','&','@','#','$','*'),
              );

              foreach($unicode as $nonUnicode=>$uni){
                  foreach($uni as $value)
                $str = str_replace($value,$nonUnicode,$str);
              }
        return $str;
     }
}
?>

Tuy nhiên ,code bạn vẫn chạy được nhưng sẽ nhận được thông báo lỗi như sau :

Warning (2): call_user_func_array() [function.call-user-func-array]:… 

- Ắc hẳn ít nhiều một số bạn sử dụng các component được chia sẽ trên mạng và cũng sẽ gặp lỗi như vậy. Mà trong khi đó tác giả lại không nhắc đến cách khắc phục , có lẽ một phần họ cho là kiến thức căn bản của chúng ta đã nắm vững .Nhưng không sao, cách phục như sau :

Thêm vào Class Component của bạn dòng code dưới đây :

//called before Controller::beforeFilter()
    function initialize(&$controller, $settings = array()) {
        // saving the controller reference for later use
        $this->controller =& $controller;
    }

    //called after Controller::beforeFilter()
    function startup(&$controller) {
               }

    //called after Controller::beforeRender()
    function beforeRender(&$controller) {
    }

    //called after Controller::render()
    function shutdown(&$controller) {
    }

    //called before Controller::redirect()
    function beforeRedirect(&$controller, $url, $status=null, $exit=true) {
    }

    function redirectSomewhere($value) {
        // utilizing a controller method
    } 

Vậy Component Common hoàn chỉnh của tôi như sau : (app/controllers/components/common.php)

<?php
class CommonComponent extends Object{

    //called before Controller::beforeFilter()
    function initialize(&$controller, $settings = array()) {
        // saving the controller reference for later use
        $this->controller =& $controller;
    }

    //called after Controller::beforeFilter()
    function startup(&$controller) {
    }

    //called after Controller::beforeRender()
    function beforeRender(&$controller) {
    }

    //called after Controller::render()
    function shutdown(&$controller) {
    }

    //called before Controller::redirect()
    function beforeRedirect(&$controller, $url, $status=null, $exit=true) {
    }

    function redirectSomewhere($value) {
        // utilizing a controller method
    }
// Ham chuyen doi tieng viet sang khong dau
    function unicode_convert($str){
              if(!$str) return false;
              $unicode = array(
                'a'=>array('á','à','ả','ã','ạ','ă','ắ','ặ','ằ','ẳ','ẵ','â','ấ','ầ','ẩ','ẫ','ậ'),
                    'A'=>array('Á','À','Ả','Ã','Ạ','Ă','Ắ','Ặ','Ằ','Ẳ','Ẵ','Â','Ấ','Ầ','Ẩ','Ẫ','Ậ'),
                    'd'=>array('đ'),
                    'D'=>array('Đ'),
                    'e'=>array('é','è','ẻ','ẽ','ẹ','ê','ế','ề','ể','ễ','ệ'),
                    'E'=>array('É','È','Ẻ','Ẽ','Ẹ','Ê','Ế','Ề','Ể','Ễ','Ệ'),
                    'i'=>array('í','ì','ỉ','ĩ','ị'),
                    'I'=>array('Í','Ì','Ỉ','Ĩ','Ị'),
                    'o'=>array('ó','ò','ỏ','õ','ọ','ô','ố','ồ','ổ','ỗ','ộ','ơ','ớ','ờ','ở','ỡ','ợ'),
                    '0'=>array('Ó','Ò','Ỏ','Õ','Ọ','Ô','Ố','Ồ','Ổ','Ỗ','Ộ','Ơ','Ớ','Ờ','Ở','Ỡ','Ợ'),
                    'u'=>array('ú','ù','ủ','ũ','ụ','ư','ứ','ừ','ử','ữ','ự'),
                    'U'=>array('Ú','Ù','Ủ','Ũ','Ụ','Ư','Ứ','Ừ','Ử','Ữ','Ự'),
                    'y'=>array('ý','ỳ','ỷ','ỹ','ỵ'),
                    'Y'=>array('Ý','Ỳ','Ỷ','Ỹ','Ỵ'),             
 );

              foreach($unicode as $nonUnicode=>$uni){
                  foreach($uni as $value)
                $str = str_replace($value,$nonUnicode,$str);
              }
        return $str;
     }
}
?>

Cách sử dụng lớp Component Common vừa mới tạo :

- Tôi tạo 1 Controller tên Testcommons (app/controllers/ testcommons _controller.php) sử dụng lớp Comonent Common vừa tạo

<?php
class TestcommonsController extends AppController {
    var $components = array("Common");
    
    function test_component(){
        $string = "Diễn đàn QHonline . Nơi khơi nguồn các mã nguồn mở "; // chuỗi ban đầu
        $data = $this->Common->unicode_convert($string); // dữ liệu sau khi chuyển đổi không dấu
        $this->set("data",$data); // gán dữ liệu để hiển thị bên view 
    }
?>

- Tạo file test_component.ctp (app/views/testcommons/ test_component.ctp)

<?php
echo $data;
?>

Chạy thử : http://localhost/cakephp/testcommons/test_component

Chú ý :

Biến $components được khai báo trong Controller nào thì chỉ dùng được trong Controller đó

Nếu tôi khai báo trong Controller NewsController thì sang trang Controller Product, dùng $this->Common->unicode_convert() sẽ bị báo lỗi ngay! Như vậy không áp dụng được tính chất “dùng mọi lúc, mọi nơi” .

Nhưng không sao, ta có thể giải quyết vấn đề này bằng cách:

- Tạo file app_controller.php đặt trong thư mục app, nội dung file này như sau:

class AppController extends Controller {
   var $components=array('Acl',’Mail’);
} 

Mọi thứ đặt trong AppController sẽ có tác dụng trên toàn bộ các Controller khác, do đó ta chỉ cần khai báo

var $components=array('Acl',’Mail’); 

----------------------------------------

//called before Controller::beforeFilter()
function initialize(&$controller, $settings = array()) {
// saving the controller reference for later use
$this->controller =& $controller;
}

//called after Controller::beforeFilter()
function startup(&$controller) {
}

//called after Controller::beforeRender()
function beforeRender(&$controller) {
}

//called after Controller::render()
function shutdown(&$controller) {
}

//called before Controller::redirect()
function beforeRedirect(&$controller, $url, $status=null, $exit=true) {
}

function redirectSomewhere($value) {
// utilizing a controller method
}

- Cách phương thức trên phải được định nghĩa khi ta viết 1 Component , hay nói cách khác nó còn gọi là 1 template của Component Bạn có thể xem chi tiết tại trang chủ

- Giải thích cho bạn 1 số hàm như sau :

//called before Controller::beforeFilter()
function initialize(&$controller, $settings = array()) {
// saving the controller reference for later use
$this->controller =& $controller;
} 

-> Component sẽ được gọi trước khi gọi phương thức của Controller để sử dụng

Ví dụ :

Conttroller User :

- Có 2 phương thức : checkname , sendmail
- Có Component : Mail

Khi gọi tới phương thức checkname của Controller User thì Conponent Mail sẽ được nạp vào trước , ròi phương thức checkname mới được gọi Còn 1 số hàm khác bạn tự tra các chạy tại đây nhé !

Trong template đó , các tên hàm đã nói lên chức năng của nó ròi . Vì nó không có lệnh nào trong đó . Bạn thử chèn vài lệnh vào để kiểm tra là sẽ rõ ngay thôi !

Tags: 
Bạn thấy bài viết này như thế nào?: 
Average: 10 (1 vote)
Ảnh của Khanh Hoang

Khanh Hoang - Kenn

Kenn is a user experience designer and front end developer who enjoys creating beautiful and usable web and mobile experiences.

Advertisement

 

jobsora

Dich vu khu trung tphcm

Dich vu diet chuot tphcm

Dich vu diet con trung

Quảng Cáo Bài Viết

 
Biểu tượng chọn Profile nằm cạnh bar “New Tab”.

Trình duyệt Chrome 16 hỗ trợ nhiều tài khoản

Để khởi động tính năng này, người dùng click vào biểu tượng cờ lê ở bên phải, sau đó đến Personal stuff rồi Add new users và đặt tên.

Sau Messenger Platform liệu có Facebook OS

Sự kiện Facebook F8 diễn ra rạng sáng nay diễn ra không kèn không trống nhưng khiến những gã khủng lồ phải run sợ.

tin nhắn SMS, Android, Android 4.1 Jelly Bean, Google Play

5 ứng dụng chặn cuộc gọi và tin nhắn SMS trên Android

Đôi khi bạn nhận được quá nhiều cuộc gọi và tin nhắn rác không mong muốn từ một số điện thoại nào đó, làm cho bạn cảm thấy phiền hà, khó chịu và muốn ngăn chặn nó.

Công ty diệt chuột T&C

 

Diet con trung