多个headScript()输出

时间:2012-04-24 04:35:59

标签: php zend-framework

是否可以有多个

<?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不会将captureStartcaptureEnd之间的代码视为javascript。

所以我想将输出分成两部分,它们之间有<script type="text/javascript">

PS:我知道将js移动到一个单独的文件会更好,但是在这个特定的地方我需要将它指定为内联

3 个答案:

答案 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到你的文件头之外的其他地方。