2010-03-12 19 views
11

Tengo un problema al intentar agregar un archivo javascript usando headScript()->appendFile('file name') con Zend. Tengo mi configuración diseño como esto:Zend headScript() y appendFile no funciona como se esperaba

<?= $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')); 

?> 

Entonces, en mi controlador Estoy intentando agregar un archivo js adicional sólo para esta página, como:

$this->view->headScript()->appendFile('another/js/file.js'); 

Este archivo debe ser añadido a lo que ya está configurado en el diseño. Sin embargo, este archivo se agrega antes de los otros archivos 'appendFile'. También probé

$this->headScript()->offsetSetFile(999, '/js/myfuncs.js'); 

Pero esto todavía agrega el archivo antes que los otros archivos. Esta no es la forma en que esperaría que esto funcione, especialmente cuando se usa el método offsetSetFile. ¿Cómo puedo agregar este archivo después de los otros archivos? Gracias.

Respuesta

21

La respuesta es utilizar headScript()->prependFile en layout.phtml y headScript()->appendFile en una vista.

+0

pero no de Controladores posible?(en lugar de poner código en el archivo de vista?). – YumYumYum

+1

en la vista? no ... – JamesHalsall

1

Me he dado cuenta de que si 'preparo' todos los archivos en el diseño, puedo usar appendFile en mi controlador y aparecerá después de ellos. Desafortunadamente, entonces tengo que listar todos mis archivos JS en orden inverso en el diseño (ya que son anteriores a ellos mismos). Realmente me gustaría mantener las cosas en orden y solo poder agregar a mi pila de diseño.

0

Si anteponer en el archivo de diseño no es lo suficientemente bueno, puede incluir los archivos en su bootstrap cuando configura su vista o puede configurar un complemento de controlador si necesita anteponer en función de qué módulo se está cargando .

// 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'); 
     } 
    } 
} 
0

En realidad, no necesita obtener la baseUrl porque ZF ya lo hace por usted. Solo tienes que prestar atención a tu camino. ¡No use la primera barra! de lo contrario, ZF devolverá la dirección remota.

sólo tiene que utilizar '$this->_view->headLink()->appendStylesheet('css/main.css'); '

2

Sé que es una respuesta tardía pero!

Si anexaFile o appendScript usa el siguiente índice disponible. Por lo tanto

$this->headScript()->offsetSetFile(50, 'file'); 
$this->headScript()->appendFile('file2'); 

es equivalente a

$this->headScript()->offsetSetFile(50, 'file'); 
$this->headScript()->offsetSetFile(51, 'file2'); 

También es fundamental tener en cuenta que el código de controlador de conseguir ejecuta en primer lugar antes de que el código de la vista/diseño. Por lo tanto, en su caso, sus anexos están usando los identificadores 1000 y 1001. Una solución rápida es utilizar explícitamente offsetSetFile para todos sus archivos adjuntos. Por lo que su código en su diseño se vería así:

<?= 
    $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')); 
?> 

espero que esto ayude a futuro de Googler

+0

Intenté esto, pero no pude hacerlo funcionar. ¿Puede dar una explicación más detallada de lo que coloca en el diseño y la vista y cuál es el orden de clasificación resultante? –

Cuestiones relacionadas