JQuery a Zend Framework
30.9.2009 | | 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 projQuery.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.
1924x
a červeně podtržene