2010-03-12 110 views
11

我遇到了一個問題,試圖在Zend中使用headScript()->appendFile('file name')附加JavaScript文件。我有我的佈局設置是這樣的:Zend headScript()和appendFile無法正常工作

<?= $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方法時。如何在之後添加此文件其他文件?謝謝。

回答

21

答案是在視圖中使用layout.phtml headScript()->prependFileheadScript()->appendFile

+0

但不能從控制器可能嗎?(而不是把代碼放在視圖文件中?)。 – YumYumYum 2012-01-26 14:48:26

+1

在視圖中?沒有... – JamesHalsall 2012-07-06 09:49:21

1

我注意到,如果我在佈局中預先放置所有文件,然後我可以在我的控制器中使用appendFile,它會出現在它們之後。不幸的是,那麼我必須在佈局中以相反的順序列出所有我的JS文件(因爲它們預先給自己)。我真的想保持順序並且能夠附加到我的佈局堆棧。

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

其實,你不需要得到baseUrl因爲ZF已經爲你做了。你只需要注意你的路徑。不要使用第一個斜線!否則ZF將返回遠程地址。

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

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員工

+0

我試過了,但無法使它工作。你能否更詳細地解釋你在佈局和視圖中的位置以及結果排列順序是什麼? – 2014-03-12 22:09:19