Mirin webspace

Nejbohatší život má ten, kdo žije s minimem nároků

30. 9. 2009 - Komentáře (6) Zend Framework

JQuery a Zend Framework

Zase jsem se trošku ponořil do Zend Frameworku a udělal jsem dvě věci. První věc je poměrně velké refaktorování hlavního controlleru blogu a dále pak úpravy javascriptu. To spočívalo hlavně v přechodu na jQuery s podporou Zend Frameworku a jeho extended modulu ZendX_JQuery následováno trochou toho ajaxu do formulářů.

Zaprvé jsem trochu refaktoroval, rozdělil jsem velký IndexController v blog modulu do specifičtějších controllerů. Kupodivu to přineslo jeden velmi příjemný efekt. Redukoval se mi počet rout, aplikace se tak celá trochu zrychlila. Doporučuji držet se implicitní routy :module/:presenter/:action/* a nějaké speciální dělat jen pokud je to nutné. Ušetříte tak na tabulce rout, ta se musí procházet při každém odbavování požadavku, takže to dělá poměrně dost. Druhá věc je zbytečně nenafukovat controllery. Nemít v jednom controlleru actions, které spolu příliš nesouvisí. Sice vám trochu naroste množství souborů, ale kód je mnohem přehlednější a lépe se udržuje.

Pak přišel na řadu javascript. Nejdříve jsem uvažoval o Dojo, přece jen jeho podpora je v ZF přímo v základu a jeho widgetová knihovna je velmi pokročilá. Další na řadě bylo jQuery, to je ve frameworku podporováno skrz extended modul ZendX_JQuery. Nemá tedy podporu přímo v základu frameworku, je tedy závislý na práci externí komunity (konkrétně Benjamina Eberleie) takže není tak úplně jasné, jak to s ní bude v budoucnu. Na druhé straně jsem s jQuery už nějaký ten čas strávil a v práci ho také používáme, tak jsem nakonec zvolil jQuery a ZendX_JQuery.

Další důvod byl i ten, že jsem nepotřeboval podporu javascriptového ui. Žádné slidery, drag'n'dropy, widget kam se podíváš atd. Pokud by to tak bylo, bylo by mnohem výhodnější zvolit Dojo, protože ve widgetech je jeho síla. Navíc je většina z nich přímo podporována Zend Frameworkem, takže s javascriptem nepřijdete skoro do styku. JQuery má také svou ui knihovnu, která je v ZendX_JQuery také podporována, ale rozsahem se nedá moc s Dojo srovnávat.

Teď trochu o jQuery a integraci do Zend_Frameworku. Základem je jQuery() view helper , který usnadní inicializaci a načtení celého js frameworku, podporována je i googlí CDN, která framework obsahuje. Protože jQuery používám napříč celým webem, tak jsem základní inicializaci nechal na Bootstrapu:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
....
....
protected function _initJQuery()
{
    $this->bootstrap("view");
    $view = $this->getResource("view");
 
    ZendX_JQuery::enableView($view);
 
    return $view->jQuery();
}
.....
...
}

V controller pluginu jsem pak následně nastavil aktuální cestu k celému js frameworku podle aktuálního prostředí. Pro development lokální a pro production z CDN. Musel jsem použít plugin, protože nastavení závisí na base url, které mám dostupné až na začátku zpracování routování.

class MainPlugin extends Zend_Controller_Plugin_Abstract
{
...
...
public function routeStartup(Zend_Controller_Request_Abstract $request)
{
 ...
 $bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap'); 
 
 if ($bootstrap->getEnvironment() != "production") {
  $bootstrap->getResource("JQuery")->setLocalPath(
   MKLib_AppBaseUrl::getBaseUrl()."/js/jquery-1.3.2.min.js"
 );
}
...
}

Je také důležité uvědomit si, že se jedná o modul v namespace ZendX_, nikoli Zend_. Proto budete musit upravit místo, kde přidáváta cestu k Zend Frameworku do include_path (nejastěji index.php, .htaccess).

Tento view helper má ještě pár užitečných metod, využil jsem zejména

  • addJavascriptFile() pro vložení potřebného js souboru do header placeholderu pro externí javascripty.
  • addOnLoad($statement) pro vložení javascriptové sekvence do placeholderu pro jQuery.ready() událost.

Následně jsem upravil téměř všechny javascripty v aplikaci na použití jQuery a pokud možno jsem se snažil minimalizovat inline javascript. Nejsem žádný javascriptový expert, ale myslím, že se to vcelku povedlo. Jeden zajímavý vedlejší efekt to mělo, vyhledávače mě začaly hodnotit články. Zajímavé je, že se to časem ustálilo okolo průměrného hodnocení 3 u každého článku :-). Když už jsem se v tom javascriptu hrabal, řekl jsem si, že by to chtělo trochu ajaxu do formuláře. Našel jsem velmi pěkný popis toho, jak to s pomocí jQuery a ZendX_JQuery udělat pěkně po "Zendovsku". Udělal jsem to nakonec trochu jinak - nepoužil jsem jQuery Form plugin - ale princip zůstal stejný. Zmíním se o něm někdy příště. Autorem není opět nikdo jiný, než sám autor a maintainer celého modulu ZendX_JQuery - Benjamin Eberlei.

P.S.: Benjamin také připravuje jedno velmi slibných rozšíření - Entity, DataMapper. To slibuje přinést do frameworku základy persisteního mapování známé z nástrojů Hibernate a Entity Framework.


Komentáře (6)

  1. anonym - 1. 10. 2009 17:05

    Integrace ZF a Dojo není bůhvíco. Teď jsem narazil na nefunkčnost formulářového rich editoru s MSIE7 (ač stačí lehce změnit helper, nebude se řešit) nebo nefunkčnost form helperu v dojo (primitivní chyba hlášena před mnoha měsíci včetně opravy, bez odezvy). Takže pokud má DojoX_jquery jediného aktivního vývojáře, je na tom o dost lépe i bez oficiální podpory Zendu.

  2. koubel - 1. 10. 2009 19:38

    [1] - věřím, nicméně ZendX_JQuery nemá žádné wrappery na rich editor ani form helper. Alespoň nějaké, byť zabugované je lepší než žádné. Třeba ty chyby někdo při následujích bughunt days opraví.

  3. Jesus - 3. 10. 2009 10:01

    No pokud jde o mě, vyhnul jsem se použití js frameworků přímo v Zendu úplně, veškerou funkčnost nejdříve udělám klasicky a pak na to dodělám pomocí JQuery veškerý hejblátka. Výhodou je 100% kontrola nad výsledkem (teda pokud pominu samotný JQ framework a jeho pluginy)

  4. koubel - 4. 10. 2009 11:03

    [3] - osobně to vidím tak napůl, velmi příjemná je integrace přes view helpery, které se starají o inicializaci frameworku a takové ty základní věci jako přidávání souborů do head apod. Integrovat pak různé GUI záležitosti, jak píšete, už není až tak důležité. Hodí se to zejména pro případy, kdy se člověk nechce moc javascriptem zabývat, framework mu toho spoustu nabídne už v php.

  5. Jesus - 4. 10. 2009 21:58

    [4] jj, asi to tak je. Když píšu něco v Javě, používám IceFaces framework, kde se o JS člověk starat nemusí vůbec, je to pohodlné, ale nemůžu si tam vymyslet "vodotrysk" = jsem frameworkem omezenej. Asi je to tím, že jsem do JQuery úplně zblázněnej :-))

  6. michal - 5. 11. 2009 16:43

    Prosím Vás vidím ze se tu zmiňujete o ICEFACES potřeboval bych poradit jak je dostat do netbeans když je přidal jako modul tak se mi přidá sice do gui paleta ale při přetažení se mi ukážou jen úvodní tady a na začátek dokumentu se přidá
    a červeně podtržene

Komentáře jsou uzavřeny.