【问题标题】:How to remove a previously added script file in a Zend Framework controller?如何在 Zend Framework 控制器中删除以前添加的脚本文件?
【发布时间】:2013-08-02 15:23:45
【问题描述】:

是否可以删除以前这样添加的脚本?

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

这里的情况是在我的Bootstrap.php 中附加了几个 JavaScript 文件,就像上面的例子一样,但是在一个特定的控制器中,我希望不加载一个特定的 JavaScript 文件。有没有办法在控制器初始化的时候把它去掉?

我正在寻找这样的东西。

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

【问题讨论】:

  • 只是一个猜测,但我认为您可以通过操纵占位符注册表来做到这一点...Zend_View_Helper_Placeholder_Registry::getRegistry()->getContainer("Zend_View_Helper_HeadScript")
  • 谢谢!我实际上使它以这​​种方式工作。我将在稍后发布解决方案。
  • 为什么你需要删除这个脚本?可能更好的做法是防止附加而不是删除。
  • 我知道,我知道。谢谢你提到它。原因是:这是一个非常大的项目。应用程序的许多部分都依赖于这个脚本,所以它在引导周期的早期就被附加了。但是,在应用程序结构的这个分支中,它会引起麻烦,需要将其删除。

标签: php javascript zend-framework


【解决方案1】:

这可行,但实际上不是一个好习惯,而是出于特殊目的。我建议首先不要加载不需要的脚本。

随后可以使用类似这样的功能删除脚本。

/**
 * 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 的每个脚本。当然,您可以根据自己的需要进行更改。

【讨论】:

  • 如果我想删除所有脚本怎么办?我也在尝试使用 headscript 将文件附加到页面末尾。我尝试删除 strpos if,但它抵消了第一个然后停止。
  • 正如我所提到的,strpos 调用仅用于说明目的。您可以随意将其替换为适合您用例的任何其他表达式。我认为删除所有脚本应该是 stackoverflow 上的另一个问题。我真的认为这不是同一个问题。你可以问并自己回答。再次提醒人们,这根本不是一个好的做法,应该尽可能避免。
【解决方案2】:

这是一个老问题,但这里有一个替代方案: 我使用了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);
}

【讨论】:

    猜你喜欢
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多