【发布时间】:2014-09-06 12:17:49
【问题描述】:
我正在开发一个基于一些自定义 CMS 的项目,其中显示块在我调用它时由 CMS 的模块返回。这些块是使用我在不同文件中定义的自定义函数绘制的。当然,ob_start() 已在 CMS 本身中用于保存输出字符串。现在,正如我所见,某些内部块(由 CMS 模块调用的函数绘制)仅在满足某些条件(例如,日期)时才绘制。因此,在某些情况下,只有块的外包装 (div) 被绘制,因为被调用的函数没有回显。现在,我想通过检查函数是否回显某些内容来编辑该模块。我的问题是我不能使用这样的东西:
$temp = ob_get_contents();
ob_flush();
ob_start();
eval(trim($block->detail));//this is where custom function is called in module
$block = ob_get_contents();
ob_flush();
ob_start();
echo $temp;
if($block)
{
echo $start.$block.$end;//$start and $end contains div wrapper html
}
原因是这个VIEW模块在同一个组件内被多次调用,根据不同的条件绘制块。像我上面所做的那样,多次绘制以前回显的 html(在调用视图模块之前)。我仍然坚持如何避免同一个 html 的多次回显。
我知道这个问题有点复杂,但任何帮助都将不胜感激。
【问题讨论】:
-
你不必刷新之前的ob_...,你可以将多个ob_start()嵌套在一起!
-
会跳过缓冲已经缓冲的公共输出吗?
-
是的! php.net/manual/en/function.ob-start.php "输出缓冲区是可堆叠的,也就是说,您可以在另一个 ob_start() 处于活动状态时调用 ob_start()。只要确保调用 ob_end_flush() 适当的次数即可。如果多个输出回调函数处于活动状态,则输出正在按嵌套顺序依次过滤它们中的每一个。”
-
好的。让我检查一下。等一下。
-
我已经回答了一些示例代码。
标签: php echo buffering ob-start