我需要一种将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
答案 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文件。