CodeIgniterでウィジェット(ビューパーシャル)を使う

CodeIgniter 3でウィジェット(ビューパーシャル)を使う方法は、HMVCを使う方法がありますが、HMVCはCodeIgniterの基本設計に反した実装であり、あまり筋がよくないです。

そこで、それ以外の方法です。

ここでは、フレームワークに依存しないウィジェットシステムである「myth/bay」を使います。このライブラリの作者Lonnie Ezellは、CodeIgniter Councilのメンバーの一人であり、Bonfireの作者で、CodeIgniter4開発の現在の事実上のリード開発者です。

準備

CodeIgniterと必要なライブラリをインストールします。

$ composer create-project kenjis/codeigniter-composer-installer codeigniter-widgets
$ cd codeigniter-widgets/
$ composer require 'myth/bay:dev-develop'

ウィジェットを簡単に使えるようにヘルパー関数を用意します。

application/helpers/widget_helper.php

<?php
/**
 * Widget helper for CodeIgniter 3
 *
 * @author     Kenji Suzuki <https://github.com/kenjis>
 * @license    MIT License
 * @copyright  2016 Kenji Suzuki
 * @link       https://github.com/kenjis/codeigniter-widgets
 */

/**
 * Widget helper
 * 
 * @staticvar Myth\Bay\Bay $bay
 * @param string $library    Widget library and method
 * @param array  $params     Params for the method
 * @param int    $cache_ttl  Time to live (in minutes)
 * @param string $cache_name Cache name
 * @return string
 */
function widget($library, $params = null, $cache_ttl = 0, $cache_name = null)
{
    static $bay;

    if ($bay === null)
    {
        $CI =& get_instance();
        $CI->load->driver('cache', array('adapter' => 'file'));

        $bay = new Myth\Bay\Bay(
            new Myth\Bay\CI3Finder(),
            new Myth\Bay\CI3Cache()
        );
    }

    return $bay->display($library, $params, $cache_name, $cache_ttl);
}

使い方

ウィジェットをライブラリとして作成します。例えば、Blog_widgetを作成します。

application/libraries/Blog_widget.php

<?php

class Blog_widget
{
    public function list_latest()
    {
        $CI =& get_instance();

        $CI->load->view('blog/list_latest');
    }
}

これで、ビューの中から、以下のように呼び出せます。

<?php echo widget('Blog_widget::list_latest'); ?>

もし、public function list_latest($max)だとしたら、以下のように引数を指定できます。

<?php echo widget('Blog_widget::list_latest', ['max' => 10]); ?>

ウィジェットをキャッシュしたい場合は、キャッシュする時間を分で指定します。

<?php echo widget('Blog_widget::list_latest', ['max' => 10], 10); ?>

関連

Date: 2016/01/18

Tags: codeigniter