Javascript Zend headScript()和appendFile未按预期工作

Javascript Zend headScript()和appendFile未按预期工作,javascript,zend-framework,appendfile,Javascript,Zend Framework,Appendfile,我在尝试使用Zend的headScript()->appendFile('file name')附加javascript文件时遇到问题。我的布局设置如下所示: <?= $this->headScript() ->prependScript( 'BASE_URL = "' . $this->baseUrl() . '";' ) ->appendFile( $this->baseUrl('js/lib/jquery/jquery-1.4.2

我在尝试使用Zend的
headScript()->appendFile('file name')
附加javascript文件时遇到问题。我的布局设置如下所示:

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

?>
此文件需要附加到布局中已设置的内容。但是,此文件是在其他“appendFile”文件之前添加的。我也试过了

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

但这仍然会在其他文件之前添加该文件。这不是我期望的工作方式,尤其是在使用offsetSetFile方法时。如何在其他文件之后添加此文件?谢谢。

我注意到,如果我在布局中“预先添加”所有文件,我就可以在控制器中使用appendFile,它将出现在它们之后。不幸的是,然后我不得不在布局中以相反的顺序列出我的所有JS文件(因为它们是在自己前面的)。我真的很想把事情安排得井井有条,只是能够附加到我的布局堆栈中。

如果布局文件中的预处理不够好,您可以在设置视图时将文件包括在引导中,或者如果需要根据加载的模块预处理,可以设置控制器插件

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

实际上,您不需要获取baseUrl,因为ZF已经为您提供了它。你只需要注意你的路线。不要使用第一个斜杠!否则,ZF将返回远程地址


只需使用
'$this->_view->headLink()->appendStylesheet('css/main.css')
'

答案是在layout.phtml中使用
headScript()->prependFile
,在视图中使用
headScript()->appendFile


最后一条评论给出了一个很好的解决方案,首先在顶部的布局中包含,然后在需要时打印,这样它就可以工作了

我知道这是一个迟来的答案,但是

如果执行appendFile或appendScript,则使用下一个可用索引。因此

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

$this->headScript()->offsetSetFile(50, 'file');
$this->headScript()->offsetSetFile(51, 'file2');
还需要注意的是,首先执行控制器代码,然后执行视图/布局代码。因此,在您的例子中,您的附件实际上使用的是id的1000和1001。解决这个问题的一个快速方法就是显式地为所有附件使用offsetSetFile。因此,布局中的代码如下所示:

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

但不可能来自控制器?(而不是将代码放在视图文件中?)。我尝试了这个,但无法使它工作。您能否更详细地解释一下您在布局和视图中放置了什么,以及生成的排序顺序是什么?
<?= 
   $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') );
?>