如何在控制器完成之前发送<head>
内容?我们的想法是尽快开始加载CSS(不要等待控制器操作)。
示例场景:
// in the controller
sleep(5);
这给出了:
空白页5秒 - &gt;显示head
- &gt;开始加载CSS - &gt; body
我想要的流程是:
发送head
- &gt;开始加载CSS - &gt;等待控制器 - &gt;发送页面的其余部分(正文)
<head>
现在位于layout.phtml
,后面包含索引控制器脚本(index.phtml
)。
也许我可以将<head>
作为一个部分并在整个布局之前以某种方式发送它?
答案 0 :(得分:1)
一种方法是创建一个所有控制器都扩展的抽象控制器,并在<script type="text/javascript">
$(function () {
$('[id*=dropDownKved]').multiselect({
includeSelectAllOption: false,
numberDisplayed: 1,
buttonWidth: '100%',
onChange: function (element, checked) {
var brands = $('[id*=dropDownKved]');
var selected = [];
$(brands).each(function (index, brand) {
selected.push([$(this).val()]);
});
console.log(selected);
}
});
});
</script>
函数中渲染头模板并刷新:
onDispatch
这种方法的缺点:
您无权访问应用程序中其他地方的public function onDispatch(MvcEvent $e) {
$renderer = $this->getServiceLocator()->get('ViewRenderer');
$content = new ViewModel();
$content->setTemplate('path/to/head.phtml');
$content = $renderer->render($content);
echo $content;
flush();
parent::onDispatch($e);
}
,headTitle
,headMeta
,headLink
和其他视图助手(可以在控制器中使用)或者viewcript为该页面添加样式表和js插件。)
由于已经发送了回复,您将无法执行重定向
您无法gzip内容以及刷新内容
理论上,您可以使用此方法在headScript
echo
之前加载布局中的所有静态内容 - 例如徽标,导航,搜索栏等。
正如我所说,这打破了重定向,这意味着帮助者和插件PostRedirectGet
将无效。