Smarty Templating for php允许每次调用fetch()
或display()
时调用的写输出过滤器。 Smarty也使用输出缓冲区,你不能自己创建(你不能有输出缓冲区,而另一个缓冲区仍然有效)。
我的问题是,我想在整个文档完成后对整个文档进行整理,而不是在显示模板时分片。我无法将我正在使用的软件重写为使其仅使用display或fetch一次的程度,但我仍然需要在smarty中刷新输出之前使用输出过滤器/ tidy,同时在整个文档上。但是,我认为聪明才有可能做到这一点。
我的代码工作正常:
function tidy_html(&$output, &$smarty){
$config = array(
'indent' => true,
#'output-html' => true,
'wrap' => 0,
'drop-proprietary-attributes' => false,
'indent-cdata' => true,
'indent-spaces' => 5,
'tab-size' => 5,
'show-warnings' => true
#'markup' => false ,
#'sort-attributes' => 'alpha',
#'char-encoding' => 'utf8'
);
try {
$tidy = new tidy;
$tidy->parseString($output, $config, 'utf8');
$tidy->cleanRepair();
} catch (Exception $e) {
$tidy = $output;
}
return $tidy;
}
$view->register_outputfilter('tidy_html');
但是因为它在fetch()
或display()
被调用时运行,所以如果在该文件中没有表格,那么它会关闭它们并中断布局,打破我的网站。大多数显示都很好,它只是有问题关闭表和一些div盒早期,因为这个软件如何设置它将页面放入块和调用显示在每个块上。如果该块包含表的各个部分,则会提前关闭它们,从而导致布局中断。至少我认为这是正在发生的任何帮助将不胜感激。也许有可能在它以某种方式刷新之前获取输出缓冲区,即使是聪明的控制它?
答案 0 :(得分:2)
我打开了模板中的php标签,并将其放在任何请求调用的文件的开头:
{php}
ob_start('tidy_html_buffer');
{/php}
这是在文件的末尾:
{php}
ob_end_flush();
{/php}
这是回调函数:
function tidy_html_buffer(&$output){
$config = array(
'indent' => true,
#'output-html' => true,
'wrap' => 0,
'drop-proprietary-attributes' => false,
'indent-cdata' => true,
'indent-spaces' => 5,
'tab-size' => 5,
'show-warnings' => true
#'markup' => false ,
#'sort-attributes' => 'alpha',
#'char-encoding' => 'utf8'
);
try {
$tidy = new tidy;
$tidy->parseString($output, $config, 'utf8');
$tidy->cleanRepair();
} catch (Exception $e) {
if(!empty($e)) print_r($e);
$tidy = $output;
}
#print_r($tidy);
return $tidy;
}
由于gzip压缩已启用,因此无法通过提前刷新获得性能优势,因此这可以在最小化开销或性能命中率的情况下实现结果,尤其是在缓存之后。