CODEIGNITER TUTORIALS
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Tự tạo thư viện load widget trong codeigniter

Như các bạn biết mặc định hệ thống của Codeigniter hoạt động theo mô hình MVC, như vậy ở một controller bắt buộc phải load tất cả các phần header, footer, slidebar, ... điều này đôi khi làm làm phiền toái cho coder vì khó quản lý nó. Vậy hôm nay mình sẽ hướng dẫn các bạn tự viết một thư viện load widget.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Widget có thể coi là một block, một thành phần của website, hiện tại trên mạng có rất nhiều thư viện load widget và các bạn có thể download về và sử dụng nhưng tôi nghĩ các bạn cũng nên đọc qua bài này vì trong bài sẽ giải thích cách bạn viết một thư viện ngoài.

Các bạn thấy tôi đã tạo một folder widgets trong folder application. và mỗi widget sẽ có 2 file chính là controller và view, trong đó file controller dùng để xử lý và gọi đến file view để hiển thị.

Viết thư viện cho controller widget

Để hiểu được phần này bạn phải đọc qua bài overwrite bộ core trong codeigniter nhé

Bài viết này được đăng tại [free tuts .net]

Trước tiên các bạn vào thư mục application/core tạo một file MY_Widget.phpMY_Loader.php có nội dung như sau:

File MY_Widget.php

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Widget 
{
        function __get($key)
	{
		$CI =& get_instance();
		return $CI->$key;
	}
        
        function __set($key, $val)
        {
                $CI =& get_instance();
                if (isset($CI->$key))
                    $CI->$key = $val;
                else
                    $this->$key = $val;
        }
}
?>

Hàm này dành cho các controller trong widget extends tới nó. Mặc định tất cả các lớp controller trong widget đều tuân theo quy tắc đặt tên chữ hoa đầu tiên và tên lớp bắt đầu bằng tên folder sau đó kèm với chữ _widget.

File widgets/header/controller.php có nội dung như sau:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Header_widget extends MY_Widget 
{
    function index(){
        $this->load->view('view');
    }
}

Nội dung của file này là tạo một controller với tên Header_widget kế thừa lớp MY_Widget và cuối cùng là load file view.php tương ứng bên dưới nó.

File widgets/header/views.php có nội dung như sau:

<h1>Đây là header</h1>

Vậy là bạn đã tạo được một widget thành công rồi, bước tiếp theo là ta sẽ tạo một hàm load widget dành cho controller chính.

Viết hàm load widget

Hàm này tôi sẽ viết nó trong file MY_Loader với nội dung như sau:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
require 'MY_Widget.php';
class MY_Loader extends CI_Loader 
{
    public function widget($widget_directory, $agrs = array()) 
    {
        // Đường dẫn đến file controller widget
        $path = APPPATH . 'widgets/' . $widget_directory . '/controller.php';
        
        // Tên controller widget
        $class_name = ucfirst(str_replace('/', '_', $widget_directory)) . '_widget';

        // Kiểm tra widget tồn tại ko
        if (!file_exists($path)) {
            show_error('The Widget ' . $path . ' Not Found');
        }

        //--------------------------------
        // Tạo đường dẫn để load file view trong widget
        $this->_ci_view_paths = array(APPPATH . 'widgets/' . $widget_directory . '/' => TRUE);

        //--------------------------------
        // Load Widget
        require_once($path);

        if (!class_exists($class_name)) {
            show_error("Class Name Widget $class_name Not Found, URL Is $path");
        }

        $MD = new $class_name;

        if (!method_exists($MD, 'index')) {
            show_error("Method Index Of Widget $class_name Not Found, URL Is $path");
        }

        ob_start();
        call_user_func_array(array($MD, 'index'), $agrs);
        $content = ob_get_contents();
        ob_end_clean();

        // Trả lại phương thức load views cho hệ thống CI
        $this->_ci_view_paths = array(APPPATH . 'views/' => TRUE);

        return $content;
    }

}

?>

Trong đó đoạn code require 'MY_Widget.php'; sẽ load file MY_Widget vào hệ thống, nếu như không có dòng này thì trong các controller widget không thể extends lớp này được vì nó không tồn tại.

Hàm widget có 2 tham số truyền vào, $widget_directory là đường dẫn đến widget cần load, $agrs là mảng các biến muốn truyền vào widget

Đoạn code dưới đây dùng để thiết lập vị trí view cho widget

//--------------------------------
        // Tạo đường dẫn để load file view trong widget
        $this->_ci_view_paths = array(APPPATH . 'widgets/' . $widget_directory . '/' => TRUE);

Và sau khi load widget thì trả lại vị trí view cho folder view chính của hệ thống

// Trả lại phương thức load views cho hệ thống CI
        $this->_ci_view_paths = array(APPPATH . 'views/' => TRUE);

Gọi Widget Từ Controller Chính

Bạn tạo một controller welcome.php với nội dung như sau:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Welcome extends CI_Controller {
	public function index()
	{
		echo $this->load->widget('header');
	}
}
?>

Nhìn vào code đơn giản đúng không nào, để load widget thì chỉ cần gọi $this->load->widget('widget_name', array('cac_bien_truyen_vao'))

Bạn chạy controller này lên màn hình sẽ xuất hiện dòng chữ Đây là header, và đây cũng chính là nội dung trong file view của widget header.

Truyền biến vào widget

Đôi lúc ta cũng cần truyền biến vào widget để xử lý, ta làm như sau:

Controller welcome.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Welcome extends CI_Controller {
	public function index()
	{
                $title = 'Hướng dẫn tạo widget';
                $content = 'Tự tạo widget cho riêng mình';
		echo $this->load->widget('header', array($title, $content));
	}
}
?>

File widgets/header/controller.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Header_widget extends MY_Widget 
{
    // Nhận 2 biến truyền vào
    function index($title, $content){
        
        // truyền qua view
        $this->load->view('view', array(
            'title' => $title,
            'content' => $content
        ));
    }
}

File widgets/header/view.php

<h1><?php echo $title ?></h1>

<h3><?php echo $content; ?></h3>

Thật đơn giản đúng không nào, muốn truyền biến qua widget thì khai báo hàm load widget và bên controller widget sẽ nhận với các biến tương ứng.

Load Model, Library, Helper trong widget

Ở mỗi widget ta load model, helper, library, language một cách bình thường nhé, vì bản chất nó cũng là instance của codeigniter.

Ví dụ:

$this->load->view()

$this->load->model()

$this->load->library()

$this->load->helper()

Lời kết

Qua bài này các bạn có thể tự tạo cho mình một thư xử lý widget rồi đúng không nào, đoạn code mình viết có thể chưa tối ưu nên nếu các bạn có ý kiến khác thì hãy bổ sung góp ý giúp mình với nhé, và mình có gửi file Download đính kèm. Cuối cùng cám ơn các bạn đã đọc bài này và chúc các bạn vui vẻ khi tham gia freetuts.net.

Cùng chuyên mục:

Chia sẻ theme web blog mobile đơn giản (Theme FMB1)

Chia sẻ theme web blog mobile đơn giản (Theme FMB1)

Freetuts Mobile Blog được code trên nền tảng PHP và MySQL, sử dụng Codeigniter Framework.

Bài 19: Rewrite URL trong Codeigniter

Bài 19: Rewrite URL trong Codeigniter

Sau một khoảng thời gian không đụng tới Codeigniter thì hôm nay lại có dịp…

Tìm hiểu quy trình load model trong codeigniter

Tìm hiểu quy trình load model trong codeigniter

Việc load model rất quen thuộc với những bạn sử dụng framwork codeigniter nhưng đôi…

Hướng dẫn custom bộ core codeigniter

Hướng dẫn custom bộ core codeigniter

Có khi nào bạn đặt câu hỏi có nên sửa các file nằm trong bộ…

Bài 18: Tìm Hiểu Library Shopping Cart trong Codeigniter

Bài 18: Tìm Hiểu Library Shopping Cart trong Codeigniter

Chào mừng các bạn đã quay trở lại freetuts.net. Như vậy ở bài trước chúng…

Bài 17: Xây dựng crud add - update - edit user

Bài 17: Xây dựng crud add - update - edit user

Crud là một thuật ngữ không hề xa lạ với dân lập trình, nó là…

Bài 16: Kỹ thuật master layout trong codeigniter

Bài 16: Kỹ thuật master layout trong codeigniter

Đây là một vấn đề mở rộng mà CI không đề cập trong user guide,…

Bài 15: Tìm Hiểu Helper Language Trong Codeigniter

Bài 15: Tìm Hiểu Helper Language Trong Codeigniter

Trong bài viết này , chúng ta chỉ tìm hiểu ở khái niệm cơ bản…

Bài 14: Tìm Hiểu Helper Text Trong Codeigniter

Bài 14: Tìm Hiểu Helper Text Trong Codeigniter

Nhìn tiêu đề, hẳn các bạn đã đoán ra hôm nay chúng ta sẽ tìm…

Bài 13: Tìm Hiểu Helper Date Trong Codeigniter

Bài 13: Tìm Hiểu Helper Date Trong Codeigniter

Hôm nay chúng ta sẽ tiếp tục tìm hiểu sâu hơn về các helper mà…

Bài 12: Đóng dấu watermark image trong codeigniter

Bài 12: Đóng dấu watermark image trong codeigniter

Đầu tiên xin gửi lời cảm ơn các bạn đã quan tâm và theo dõi…

Bài 11: Tìm Hiểu Library Image Trong Codeigniter

Bài 11: Tìm Hiểu Library Image Trong Codeigniter

Kết thúc bài trước, chúng ta đã hoàn thành khá xuất sắc phần upload hình…

Bài 10: Tìm hiểu library upload trong codeigniter

Bài 10: Tìm hiểu library upload trong codeigniter

Chào mừng các bạn đã quay trở lại freetuts.net, đã lâu rồi tôi không viết…

Bài 9: Tìm Hiểu Library Form Validation

Bài 9: Tìm Hiểu Library Form Validation

Cho tới bài viết này, chắc hẵn các bạn đều đã biết rõ cách load…

Bài 8: Tìm hiểu Helper Url Và Form Trong Codeigniter

Bài 8: Tìm hiểu Helper Url Và Form Trong Codeigniter

Trong Codeigniter Framework nó chia ra 2 khái niệm đó là helper & library, vậy…

Bài 7: Load Library Pagination Trong Codeigniter

Bài 7: Load Library Pagination Trong Codeigniter

Đây là một library cũng khá là phổ biến, hay được sử dụng trong quá…

Bài 6: Load Library Database Trong Codeigniter

Bài 6: Load Library Database Trong Codeigniter

Tôi sẽ không giới thiệu về library này mà sẽ xoáy sâu vào các thao…

Bài 5: Load Library Session Trong Codeigniter

Bài 5: Load Library Session Trong Codeigniter

Đây là một thư viện khá là quan trọng , trong framework CI (Codeigniter) .…

Bài 4: Load Model Trong Codeigniter

Bài 4: Load Model Trong Codeigniter

Trong Codeigniter để kết nối với Database chúng ta phải cấu hình thông tin cho…

Bài 3: Load View Trong Codeigniter

Bài 3: Load View Trong Codeigniter

Trong Codeigniter tất cả các Views đều được đặt trong thư mục application/views. Các bạn…

Top