Javascript Zend headScript()和appendFile未按预期工作
我在尝试使用Zend的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
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') );
?>