0

我需要一种将特定于控制器/动作的javascript插入布局的方法。该 javascript 需要进入<head>文档的内部,远离放置正常内容的位置。我已经有了一个允许每个页面使用多个视图的基础设施,而我已经拥有的 Zend_Layout 充分利用了这一点:

<?php
     $script = $this->layout()->script;
     if (!is_null($script)) : ?>
<script type="text/javascript"> // <![CDATA[
  <?php echo $script; ?>
// ]]>
</script>
<?php endif; ?>

但是,我希望自动选择脚本输出,就像$this->layout()->content默认情况下将普通视图自动放入布局中一样。我知道这个工具是由 ViewRenderer 类提供的。基本上,我想做的是检查 的实例,如果存在,则将其/VIEWPATH/scripts/CONTROLLER/ACTION.js.php呈现为命名的输出段。script

我可以相对简单地创建一个 Zend_Controller_Plugin,它会在发布后自动执行此操作,但是控制器将无法在脚本视图上设置值。我还需要一些方法来复制 ViewRenderer 控制器插件如何影响控制器和操作名称。

理想情况下,我会以某种方式将其附加到 ViewRenderer 助手上,但它似乎不支持这种事情。

我完全错了吗?是否有某种机制可以将特定于页面的 Javascript 嵌入框架中?(我不能是唯一有这个问题的人......)

比利3

4

3 回答 3

1

我认为没有内置机制。我正在使用这样的小型控制器插件:

class My_Controller_Plugin_JavaScript extends Zend_Controller_Plugin_Abstract

{

/**
 * preDispatch
 * Check controller name, and include javaScript library
 *
 * @param Zend_Controller_Request_Abstract $request
 * @return void
 */
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
    $layout = Zend_Layout::getMvcInstance();
    $view = $layout->getView();
    $controller = $request->getControllerName();

    $jsFile = $controller . '-lib.js';
    $jsPath = $view->baseUrl() .
               '/js/' . $controller .
               '/';

    $sPath = PUBLIC_PATH . DIRECTORY_SEPARATOR . 'js' . DIRECTORY_SEPARATOR;
    $sPath .= $controller . DIRECTORY_SEPARATOR . $jsFile;

    if (file_exists($sPath)) { // load as last js (offset 100)
        $view->headScript()->offsetSetFile(
            100,
            $jsPath . $jsFile


           );
        }
    }
}

它通过控制器名称添加一个 js 文件。布局我在呼应它

<?= $this->headScript(); ?>

您可以将其扩展为使用操作。我相信有更好的方法,但它有效!

于 2010-09-23T05:12:51.963 回答
1

Zend 框架有视图助手来添加 javascript 文件(第一个片段)+ 文本 javascript(第二个片段)你可以添加 javascript 文件

<?php
    $this->headScript()->appendFile($this->baseUrl("js/jquery-1.4.2.min"))
        ->appendFile($this->baseUrl("js/jquery-ui-1.8.2.custom.min"));
    $this->headScript()->appendScript("js/dummy.js");
    echo $this->headScript();

?>

然后在其他地方,你可以添加

    <?php $this->headScript()->captureStart() ?>
// start jquery functions 
    var action = '<?php echo $this->baseUrl ?>'; 
    $('foo_form').action = action;
// end jquery functions 
    <?php $this->headScript()->captureEnd() ?>

做出以下假设:

该脚本将附加到堆栈中。如果您希望它替换堆栈或添加到顶部,则需要分别传递“SET”或“PREPEND”作为 captureStart() 的第一个参数。假定脚本 MIME 类型为“text/javascript”;如果你想指定一个不同的类型,你需要将它作为第二个参数传递给 captureStart()。如果您希望为标记指定任何其他属性,请将它们作为第三个参数传递给数组作为 captureStart().to captureStart()。

来源: http: //framework.zend.com/manual/en/zend.view.helpers.html

于 2010-09-23T08:00:49.897 回答
1

扩展我的评论

这是您要查找的文档:

http://framework.zend.com/manual/1.12/en/zend.view.helpers.html#zend.view.helpers.initial.headscript

您可以使用 captureStart() 并在每个相关视图中动态创建脚本。使用这种方法,您不需要创建 *.js.php 文件。

于 2010-09-24T17:17:29.457 回答