Zend headScript () e appendfile não funciona como esperado
-
19-09-2019 - |
Pergunta
Eu estou tendo um problema tentando anexar um arquivo JavaScript usando headScript()->appendFile('file name')
com Zend. Eu tenho a minha configuração de layout como este:
<?= $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') );
?>
Então, no meu controlador Eu estou tentando anexar um arquivo js adicional apenas para esta página, como:
$this->view->headScript()->appendFile( 'another/js/file.js' );
Este arquivo precisa ser anexado ao que já está configurado no layout. No entanto, este arquivo é adicionado antes os outros arquivos 'appendfile'. Eu também tentei
$this->headScript()->offsetSetFile(999, '/js/myfuncs.js');
Mas isso ainda adiciona o arquivo antes que os outros arquivos. Isto não é como eu esperaria que isso funcione, especialmente quando se utiliza o método offsetSetFile. Como posso adicionar este arquivo após os outros arquivos? Obrigado.
Solução
A resposta é usar headScript()->prependFile
em layout.phtml e headScript()->appendFile
em uma exibição.
Outras dicas
Eu sei que é uma resposta tardia, mas!
Se você fizer appendfile ou appendScript é usos o próximo índice disponível. Assim
$this->headScript()->offsetSetFile(50, 'file');
$this->headScript()->appendFile('file2');
é equivalente a
$this->headScript()->offsetSetFile(50, 'file');
$this->headScript()->offsetSetFile(51, 'file2');
Também é fundamental observar que o código do controlador são executadas antes de o código de exibição / layout. Assim, no seu caso seus Anexa estão realmente usando o ID de 1000 e 1001. Uma solução rápida para isso é só para usar explicitamente offsetSetFile para todas as suas Anexa. Portanto, o seu código em seu layout seria parecido com:
<?=
$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 isso ajude o futuro do Googler
Tenho notado que se eu 'preceder' todos os arquivos no layout, então eu posso usar appendfile no meu controlador e ela vai aparecer depois deles. Infelizmente, então eu tenho que listar todos os meus arquivos JS em ordem inversa no layout (uma vez que preceder a si mesmos). Eu realmente gostaria de manter as coisas em ordem e apenas ser capaz de acrescentar à minha pilha de layout.
Se prepending no arquivo layout não é bom o suficiente, você pode incluir os arquivos em seu bootstrap quando você configurar seu ponto de vista ou você pode configurar um controller plugin se você precisa prefixar com base no que o módulo está sendo carregado.
// 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');
}
}
}
Na verdade, você não precisa obter o baseUrl porque ZF já faz isso por você. Você apenas tem que prestar atenção ao seu caminho. Não use a primeira barra! caso contrário ZF irá retornar o endereço remoto.
Apenas uso '$this->_view->headLink()->appendStylesheet('css/main.css');
'
o último comentário dá uma excelente solução, primeiro incluir no layout no topo, em seguida, imprimir quando você precisar dele, desta forma ele vai trabalhar