CodeIgniter i Open Power Template

Pojawienie się nowej wersji Code Igniter-a (aktualnie 2.0.2) przyciągnęło moją uwagę, postanowiłem bliżej przyjrzeć się temu niewielkiemu frameworkowi.

Przy tworzeniu rozwiązań w języku php wykorzystuję polskim systemem szablonów Open Power Template, niestety po dłuższym szperaniu wśród zasobów internetu nie znalazłem żadych "udokumentowanych" przypadków integracji CI z OPT (najczęściej spotykane przykłady to połączenie CI z systemem szablonów PHPTAL).

Zaraz po powierzchownym zapoznaniu się z CI przystąpiłem do napisania biblioteki, dzięki której OPT zostało wkomponowane w framework. Zaznacze tutaj, że prezentowane rozwiązanie nie zostało przetestowane w środowisku produkcyjnym.

Po ściągnięciu OPT (link wyżej), przeniosłem zawartość folderu "lib" do katalogu frameworka "applicaton/libraries". Następnie zaimplementowałem prostą klasę która inicjalizuję OPT i umożliwia wyrenderowanie ustawionych templatek.

require_once(APPPATH.'libraries/Opl/Base.php');
/**
 * OptLib - simple load Opt_View (template) and render it
 */
class OptLib
{
    /**
     * The OPT view.
     *
     * @var Opt_View
     */
    public $view;

    /**
     * Http header
     *
     * @var Opt_Output_Http
     */
    private $_out;

    /**
     * Path to template folder
     *
     * @var string
     */
    private $_templatePath;

    public function  __construct()
    {
        Opl_Loader::loadPaths(array('directory' => './',
				  'libraries' => array('Opl' => APPPATH.'libraries/Opl/',
				  'Opt' => APPPATH.'libraries/Opt/')));
        Opl_Loader::setHandleUnknownLibraries(false);
        Opl_Loader::register();

        $this->_templatePath = APPPATH.'views/';

        $this->_initView();
    }

    /**
     * Initializes the Opt_View object for the action.
     */
    private function _initView()
    {
        try
        {
            $tpl = new Opt_Class();
            $tpl->sourceDir = $this->_templatePath;
            $tpl->compileDir = APPPATH.'cache/';
            $tpl->contentType = Opt_Output_Http::XHTML;
            $tpl->compileMode = Opt_Class::CM_REBUILD;
            $tpl->charset = 'utf-8';
            $tpl->setup();

            $this->_out = new Opt_Output_Http();
            $this->_out->setContentType();

            $this->view = new Opt_View('layout.tpl');
            $this->view->modules = array();
        }
        catch(Opt_Exception $exception)
        {
            Opt_Error_Handler($exception);
        }
    } 

    /**
     * Render template file and show in browser
     *
     * @param string $templateName Template file name or path
     * @param mixed $data name/value pair data for current template
     */
    public function render($templateName, $data)
    {
        $this->view->modules = array();
        if (file_exists($this->_templatePath.$templateName))
        {
            $moduleView = new Opt_View($templateName);
            if ($data)
            {
                foreach ($data as $k => $v)
                {
                    $moduleView->assign($k, $v);
                }
            }

            $this->view->modules[] = array('view' => $moduleView);
        }

        $this->_out->render($this->view);
    }
}

W funkcji "_initView" domyślnie tworzony jest widok główny, który zawiera sekcję o nazwie "modules" (poniżej fragment kodu templatki)

<body>
     <opt:section name="modules">
                <opt:include from="modules">
                    <p>Nie znaleziono templatek.</p>
                </opt:include>
     </opt:section>
</body>

By móc korzystać z biblioteki należy ją w pierwszej kolejności załadować np. w konstruktorze kontrolera.

class My_Controller extends CI_Controller
{
	public function __construct()
	{
            parent::__construct();

            $this->load->library('optlib');
	}
}

Wyświetlenie zawartości templatek odbywa się za pomocą funkcji "redner", wewnątrz której dodawana jest do sekcji modules wybrana templatka, wraz z ewentualnymi danymi które chcemy do niej wstrzyknąć.

$this->optlib->render('mytemplate.tpl', array('mytext' => 'Mój tekst'));

Jak widać metchanizm dodawania własnych bibliotek do CI jest dość prosty i wygodny. :)

  1. Na razie brak komentarzy.

  1. Na razie brak trackbacków