是否可以有多个
<?php echo $this->headScript(); ?>
在一个视图中?
像
<?php $this->headScript()->appendFile('foo.js'); ?>
<?php echo $this->headScript(); ?>
some other html here
<?php $this->headScript()->appendFile('bar.js'); ?>
<?php echo $this->headScript(); ?>
目前它重复了foo.js
,有没有办法清理headScript
容器?
UPD :
确切的问题是我对<?php $this->headScript()->captureStart(); ?>
的工作方式不满意。因为我无法指定<script type="...">
因此我的IDE不会将captureStart
和captureEnd
之间的代码视为javascript。
所以我想将输出分成两部分,它们之间有<script type="text/javascript">
PS:我知道将js移动到一个单独的文件会更好,但是在这个特定的地方我需要将它指定为内联
答案 0 :(得分:2)
可能是我错过了,为什么你不能setFile
代替appendFile
?
答案 1 :(得分:1)
问题是多个.js部分的分离。这是完全可行的,因为headlink,headcript等的viewhelper实现了ArrayAccess接口。
我就是这样做的 - 使用ZF2 Bootstrap(来自Skeleton一致):
<!-- allows for comments as well, within diff. .js script tag outputs -->
<?php
$this->headScript()
->prependFile($this->basePath() . '/js/bootstrap.min.js')
->prependFile($this->basePath() . '/js/jquery.min.js')
->prependFile($this->basePath() . '/js/respond.min.js', 'text/javascript', array('conditional' => 'lt IE 9',))
->prependFile($this->basePath() . '/js/html5shiv.js', 'text/javascript', array('conditional' => 'lt IE 9',));
// Notice! below we'll echo out what we have in the headScript placeholder object
echo $this->headScript();
// Now, since it implements ArrayAccess interface, we can use exchangeArray() method
// to clear out (if you will) the stored array of .js files we've previously assigned
$this->headScript()->exchangeArray(array());
?>
<!-- Some other js file(s) I have to include -->
<?php
$this->headScript()
->appendFile($this->basePath() . '/js/scripts.js', 'text/javascript');
// same as above for consistency
echo $this->headScript();
$this->headScript()->exchangeArray(array());
?>
这应该会有很大的帮助。
答案 2 :(得分:0)
这通常的工作方式是<?php echo $this->headScript(); ?>
在您的布局中。它会通过调用headScript()一次来回显你指定它的所有脚本。我的Boostrap中通常有一些脚本,比如jquery或modernizer。
//BootStrap.php
protected function _initView() {
//Initialize view
$view = new Zend_View();
$view->doctype(Zend_Registry::get('config')->resources->view->doctype);
$view->headMeta()->appendHttpEquiv('Content-Type', Zend_Registry::get(
'config')->resources->view->contentType);
$view->headLink()->setStylesheet('/css/normalize.css');
$view->headLink()->appendStylesheet('/css/blueprint/src/liquid.css');
$view->headLink()->appendStylesheet('/css/blueprint/src/typography.css');
$view->headLink()->appendStylesheet(
'/javascript/mediaelement/build/mediaelementplayer.css');
$view->headLink()->appendStylesheet('/css/main.css');
$view->headLink()->appendStylesheet('/css/nav.css');
$view->headLink()->appendStylesheet('/css/table.css');
//add javascript files
$view->headScript()->setFile('/javascript/mediaelement/build/jquery.js');
$view->headScript()->appendFile('/javascript/modernizr.js');
//add it to the view renderer
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
'ViewRenderer');
$viewRenderer->setView($view);
//Return it, so that it can be stored by the bootstrap
return $view;
}
如果我以后需要添加脚本,通常只需要在preDispatch()中将它们传递给控制器:
public function preDispatch() {
if ($this->getRequest()->getActionName() == 'play') {
$this->_helper->layout->setLayout('play');
$this->view->headScript()->appendFile(
'http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js'
);
$this->view->headScript()->appendFile(
'/javascript/mediaplayer/jwplayer.js'
);
}
}
对<?php echo $this->headScript(); ?>
的一次调用将回显所有这四个脚本文件
使用inlineScript()帮助程序可以使用内联脚本完成同样的事情。 inlineScript()帮助器是你使用的那个,如果你需要javascript到你的文件头之外的其他地方。