Zend Framework - 如何将Javascript放在布局中?

时间:2010-09-23 03:01:24

标签: php zend-framework zend-framework-mvc

我需要一种将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,它会在post dispatch中自动执行,但是控制器无法在脚本视图上设置值。我还需要一些方法来复制ViewRenderer控制器插件如何影响控制器和动作名称。

理想情况下,我只是以某种方式将其添加到ViewRenderer帮助程序中,但它似乎不支持这种事情。

我是否完全错了?是否有一些机制用于嵌入框架中特定于页面的Javascript? (我不能成为唯一有此问题的人......)

Billy3

3 个答案:

答案 0 :(得分: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文件。布局iam回应它

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

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

答案 1 :(得分:1)

Zend Framework有视图助手添加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()的参数。如果你   希望指定任何额外的   传递的标签属性   它们在数组中作为第三个参数   to captureStart()。到captureStart()。

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

答案 2 :(得分:1)

扩展我的评论

以下是您正在寻找的文档:

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

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