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.

Foi útil?

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'); '

http://zendframework.com/issues/browse/ZF-3282?focusedCommentId=23552&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-23552

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top