Zend headScript () e appendFile non funziona come previsto
-
19-09-2019 - |
Domanda
Sto avendo un problema cercando di aggiungere un file JavaScript utilizzando headScript()->appendFile('file name')
con Zend. Io ho la mia messa a punto di layout in questo modo:
<?= $this->headScript()
->prependScript( 'BASE_URL = "' . $this->baseUrl() . '";' )
->appendFile( $this->baseUrl('js/lib/jquery/jquery-1.4.2.min.js') )
->appendFile( $this->baseUrl('js/admin.js') );
?>
Poi, nel mio controller Sto cercando di aggiungere un file js aggiuntivo solo per questa pagina, come:
$this->view->headScript()->appendFile( 'another/js/file.js' );
Questo file deve essere aggiunto a ciò che è già configurato nel layout. Tuttavia, questo file viene aggiunto prima gli altri file 'appendFile'. Ho anche provato
$this->headScript()->offsetSetFile(999, '/js/myfuncs.js');
Ma questo aggiunge ancora il file prima che gli altri file. Questo non è come mi aspetterei questo lavoro, soprattutto quando si utilizza il metodo offsetSetFile. Come posso aggiungere questo file dopo gli altri file? Grazie.
Soluzione
La risposta è quella di utilizzare headScript()->prependFile
in layout.phtml e headScript()->appendFile
in una vista.
Altri suggerimenti
Lo so che è una risposta in ritardo, ma!
Se fai appendFile o appendScript è utilizza il successivo indice disponibile. Così
$this->headScript()->offsetSetFile(50, 'file');
$this->headScript()->appendFile('file2');
è equivalente a
$this->headScript()->offsetSetFile(50, 'file');
$this->headScript()->offsetSetFile(51, 'file2');
Inoltre è fondamentale da notare che il codice di controllo vengono eseguiti prima il codice della vista / layout. Così, nel tuo caso il tuo accodamento sono in realtà utilizzando l'ID del 1000, e 1001. Una soluzione rapida a questo è solo utilizzare in modo esplicito offsetSetFile per tutte le vostre accodamento. Quindi, il codice nel layout sarà simile:
<?=
$this->headScript()
->prependScript( 'BASE_URL = "' . $this->baseUrl() . '";' )
->offsetSetFile(500, $this->baseUrl('js/lib/jquery/jquery-1.4.2.min.js') )
->offsetSetFile(501, $this->baseUrl('js/admin.js') );
?>
Spero che questo aiuta il futuro di Googler
Ho notato che se 'anteporre' tutti i file nel layout, posso quindi utilizzare appendFile nel mio controller e apparirà dopo di loro. Purtroppo, allora devo elencare tutti i miei file JS in ordine inverso nel layout (dal momento che antepongono a se stessi). Mi piacerebbe davvero mantenere le cose in ordine e solo essere in grado di aggiungere al mio stack layout.
Se anteponendo nel file di layout non è abbastanza buono, è possibile includere i file del bootstrap quando si imposta la visualizzazione o si potrebbe installare un plugin di controllo se è necessario anteporre in base a quale modulo viene caricato.
// in your bootstrap
protected function _initHeadScript()
{
$this->bootstrap('view');
$view = $this->getResource('view');
$view->headScript()->appendFile('another/js/file.js');
}
// as a plugin
class My_Plugin_HeadScriptPlugin extends Zend_Controller_Plugin_Abstract
{
public function routeStartup(Zend_Controller_Request_Abstract $request)
{
$view = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->view;
if($request->getModuleName() == 'foo')
{
$view->headScript()->appendFile('another/js/file.js');
}
}
}
In realtà, non è necessario ottenere la causa baseurl' ZF già fa per voi. Basta prestare attenzione al tuo percorso. Non usare la prima barra! altrimenti ZF restituirà l'indirizzo remoto.
Basta usare '$this->_view->headLink()->appendStylesheet('css/main.css');
'
l'ultimo commento dà una soluzione eccellente, in primo luogo inserire nel layout in alto, quindi stampare quando ne avete bisogno, in questo modo funzionerà