Zend headScript()和appendFile没有按预期工作

时间:2010-03-12 17:21:25

标签: javascript zend-framework appendfile

我在尝试使用headScript()->appendFile('file name')与Zend附加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') );

?>

然后,在我的控制器中,我试图仅为此页面附加一个额外的js文件,如:

    $this->view->headScript()->appendFile( 'another/js/file.js' );

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

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

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

6 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:2)

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

如果你执行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') );
?>

我希望这有助于未来的Google员工

答案 2 :(得分:1)

我注意到如果我在布局中“添加”所有文件,我可以在我的控制器中使用appendFile,它将出现在它们之后。不幸的是,那么我必须在布局中以相反的顺序列出我的所有JS文件(因为它们会自行添加)。我真的很想保持秩序,只是能够附加到我的布局堆栈。

答案 3 :(得分:0)

如果布局文件中的前置不够好,您可以在设置视图时将文件包含在引导程序中,或者如果需要根据正在加载的模块进行前置,则可以设置控制器插件。

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

答案 4 :(得分:0)

实际上,你不需要得到baseUrl,因为ZF已经为你做了。你只需要注意你的道路。不要使用第一个斜线!否则ZF将返回远程地址。

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

答案 5 :(得分:0)

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

最后一条评论提供了一个很好的解决方案,首先包括在顶部的布局中,然后在需要时进行打印,这样就可以了。