ZendX_JQuery e metodo addOnLoad con layout disabilitato

Zend Framework Logo

In un applicativo sviluppato su Zend Framework in cui è necessario un uso massiccio di ajax e jQuery spesso la libreria ZendX_JQuery non è sufficiente a coprire tutte le esigenze. Tempo fa avevo già riscontrato alcuni problemi sulle funzioni di Autocomplete di ZendX_JQeury. Oggi mi sono scontrato con il metodo OnLoad (che genera codice in $(document).ready(function(){ … }); )

Siamo nella situazione in cui da una pagina si caricano elenchi e svariate altre sottosezioni tramite le classiche chiamate jQuery. Prendiamo questa funzione Javascript come esempio:

function my_ChangeTab(url)
    {
        startLoadingBoxTopLeft('box_left');
        $.get( url ,
            function(data, textStatus)
            {
                stopLoadingBoxTopLeft('box_left');
                // load HTML data in box_left
                $('#box_left').html(data);
            }, 'html');
    }

Questa funzione carica il contenuto che restituisce url dentro un elemento (div) box_left.

Il mio problema nasce nel momento in cui url carica un form. Se in questo form abbiamo elementi di ZendX_JQuery (es: DatePicker, Autocomplete, ecc.) siamo fregati. Questi elementi infatti invocano internamente il metodo addOnLoad.

Vedi ad esempio ZendX_JQuery_View_Helper_DatePicker nel metodo datePicker (riga 71):

$this->jquery->addOnLoad($js);

Questo metodo carica, se correttamente configurato, nel head tag della pagina il codice $js. Questo codice serve per innescare le funzioni delle librerie jQuery UI per il DatePicker.

Tornando alla nostra situazione (vedi sopra) è comprensibile come il tutto non funzioni. La chiamata Javascript qui sopra infatti richiama solo il contenuto generato dall’action e non l’intero layout: nell’action infatti il layout sarà disabilitato:

$this->_helper->layout()->disableLayout();

Come risolvere?

Io mi sono arrangiato con un bel plugin:

<?php 
class My_Controller_Plugin_JQueryOnLoadWithoutLayout
    extends Zend_Controller_Plugin_Abstract
{
	protected $view;
 
	function __construct(){
		$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
        if (null === $viewRenderer->view) {
            $viewRenderer->initView();
        }
        $this->view = $viewRenderer->view;
	}
 
    public function  postDispatch(Zend_Controller_Request_Abstract $request)
    {
        // get Layout
        $layout = Zend_Layout::getMvcInstance();
 
        // elenco delle action registrate in OnLoad
        $actions = $this->view->jQuery()->getOnLoadActions();
        if( count($actions) > 0
            && !$layout->isEnabled()
          )
        {
            // create jQuery code
            $content = "";
            if(ZendX_JQuery_View_Helper_JQuery::getNoConflictMode() == true) {
                $content .= '$j(document).ready(function() {'."\n    ";
            } else {
                $content .= '$(document).ready(function() {'."\n    ";
            }
            foreach($actions AS $action)
            {
                $content .= $action . PHP_EOL;
            }
            $content .= '});'."\n";
 
            // add code to script tag
            $code = '<script type="text/javascript">' . PHP_EOL
                  . '//<![CDATA[' . PHP_EOL
                  . $content
                  . '//]]>' . PHP_EOL
                  . '</script>' . PHP_EOL;
 
            // OUTPUT
            $this->getResponse()->appendBody($code);
        }
    }
 
}
?>

Questo plugin modifica l’output a fine dispatch (postDispatch). Prima di tutto verifica se esistono righe di codice da inserire nella sezione OnLoad, poi verifica che il layout sia disabilitato (altrimenti quando è abilitato scriviamo 2 volte lo stesso codice) e infine genera l’apposito codice Javascript che viene aggiunto al Response.

In questo modo risolviamo il problema posto sopra. Ogni volta che carichiamo una “porzione” di pagina tramite Ajax (quindi il layout è disabilitato) e necessitiamo di codice in OnLoad (generato automaticamente, ad esempio, dagli elementi form di ZendX_JQuery) il suddetto plugin aggiungerà il codice generato per l’OnLoad in coda all’HTML restituito via Ajax.

3 pensieri su “ZendX_JQuery e metodo addOnLoad con layout disabilitato

I commenti sono chiusi.