2013-08-02 32 views
3

是否可以刪除以前添加的腳本?如何在Zend Framework控制器中刪除以前添加的腳本文件?

$this->view->headScript()->appendFile("/js/my.js"); 

的這裏的情況是,在我的Bootstrap.php幾個JavaScript文件在上面的例子,但在特定的控制器附加像我想要一個特定的JavaScript文件不會被加載。有沒有辦法在啓動控制器的過程中將其刪除?

我在找這樣的東西。

$this->view->headScript()->removeFile("/js/my.js"); 
+1

只是一個猜測,但我認爲你可以通過操縱佔位註冊表做...'Zend_View_Helper_Placeholder_Registry :: getRegistry() - > getContainer(「Zend_View_Helper_HeadScript」)' – Orangepill

+0

謝謝!我實際上是這樣做的。我會稍後發佈解決方案。 – twigmac

+2

爲什麼你需要刪除這個腳本?可能更好的做法是防止附加它而不是刪除。 – takeshin

回答

3

這是有效的,但實際上並不是一個好的做法,而是出於特殊目的。我建議首先不要加載不需要的腳本。

可以隨後使用像這樣的函數刪除腳本。

/** 
* Removes a previously appended script file. 
* 
* @param string $src The source path of the script file. 
* @return boolean Returns TRUE, if the removal has been a success. 
*/ 
public function removeScript($src) { 
    $headScriptContainer = Zend_View_Helper_Placeholder_Registry::getRegistry() 
      ->getContainer("Zend_View_Helper_HeadScript"); 
    $iter = $headScriptContainer->getIterator(); 
    $success = FALSE; 
    foreach ($iter as $k => $value) { 
     if(strpos($value->attributes["src"], $src) !== FALSE) { 
      $iter->offsetUnset($k); 
      $success = TRUE; 
     } 
    } 
    Zend_View_Helper_Placeholder_Registry::getRegistry() 
      ->setContainer("Zend_View_Helper_HeadScript",$headScriptContainer); 
    return $success; 
} 

請注意,strpos功能在此處使用。這將刪除其路徑中具有$src的每個腳本。當然你可以改變你的需求。

+0

如果我想刪除所有腳本,該怎麼辦? 我正在嘗試使用標題將文件附加到頁面的結尾。我嘗試刪除strpos,但它抵消了第一個,然後停止。 –

+0

正如我所提到的,「strpos」調用僅用於解釋目的。您可以自由地將其替換爲適合您的用例的任何其他表達式。我認爲在stackoverflow上刪除所有腳本應該是一個不同的問題。我真的認爲這不是同一個問題。你可以問和自我回答。同樣,應該提醒人們,這不是一個好的做法,應儘可能避免。 – twigmac

0

這是一個老問題,但在這裏是一種替代方案: 我用minifyHeadScript並改變了他的助手加入該自定義功能:

/** 
* Removes all script file. 
* 
*/ 
public function clearAllScripts(){ 
    $this->getContainer()->exchangeArray(array()); 
    $container = $this->getContainer(); 
    Zend_View_Helper_Placeholder_Registry::getRegistry()->setContainer("Zend_View_Helper_HeadScript", $container); 
} 
相關問題