Archive for Kwiecień, 2011

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. :)

Mój pierwszy raz na 4Developers

Mam za sobą pierwsze "odwiedziny" na corocznej konferencji 4Developers. Postanowiłem pokusić się o małe podsumowanie w dość nietypowej formie. Z różnych przyczyn nie zdołałem oddać swojej ankiety oceniającej całe wydarzenie. Poniżej prezentuję niektóre pytania wraz z moimi odpowiedziami.

  1. Jakie zagadnienia chciałbyś, aby zostały poruszone na następnej konferencji 4Developers?

    Proponował bym zagadnienia związane z technologią Adobe Flex w połączeniu z Php.

  2. Co podczas konferencji 4Developers podobało Ci się najbardziej?

    Kompetentna obsługa całej imprezy – mimo drobnych problemów technicznych organizatorzy zdołali opanować i utrzymać konferencje w wyznaczonych ramach czasowych.
    Podobała mi się również płeć piękna wśród obsługi. :)

  3. Wymień 3 najlepsze wykłady w których uczestniczyłeś:

    • "Wdrażanie Continuous Integration w praktyce" – Sebastian Marek

    • "Nowe bardziej racjonalne podejście do warstw" – Sławomir Sobótka

    • "Zend Framework 2.0 rządzi" – Juozas Kaziukenas

  4. Wymień 3 najsłabsze wykłady, w których uczestniczyłeś: (Tutaj pozwole sobie wymienić tylko jeden który najmniej mi przypadł do gustu)

    • "Uprość zarządzanie zależnościami między aplikacjami trzecimi, a swoim projektem" – Stephan Hochdoerfer

Wyjazd uważam za bardzo udany, generalnie brak uwag w strone organiztorów. Dobrze wydane pieniądze, dobry dobór prelegentów na ścieżce PHP i nie tylko. :) Tak trzymać! Do zobaczenia za rok. :)