我正在开发一个基于某个自定义CMS的项目,其中当我调用CMS时,CMS的模块会返回显示块。这些块是使用我在不同文件中定义的自定义函数绘制的。当然,CMS本身已经使用ob_start()
来保存输出字符串。现在,正如我所看到的,一些内部块(由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的多次回声。
我知道这个问题有点复杂,但任何帮助都会非常感激。
答案 0 :(得分:0)
我会在这里写一个真正的答案。 就像我说的,你可以将多个ob_start()嵌套在一起。
查看php.net手册:http://php.net/manual/en/function.ob-start.php 发出警告信息后。
输出缓冲区是可堆叠的,也就是说,当另一个ob_start()处于活动状态时,您可以调用ob_start()。只需确保调用ob_end_flush()适当的次数。如果多个输出回调函数处于活动状态,则将按嵌套顺序依次过滤每个输出。
所以你的代码可能是:
ob_start();
eval(trim($block->detail));
$block = ob_get_contents();
ob_end_clean();
if($block){
echo $start.$block.$end;
}
就是这样,您不必再次停止并启动输出缓冲区。
修改强>
或者你甚至可以离开ob_end_clean()
(http://php.net/manual/en/function.ob-get-clean.php)
像这样:
ob_start();
eval(trim($block->detail));
$block = ob_get_clean();
if($block){
echo $start.$block.$end;
}