Smarty输出滤波器

时间:2012-08-24 17:22:51

标签: php smarty tidy

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盒早期,因为这个软件如何设置它将页面放入块和调用显示在每个块上。如果该块包含表的各个部分,则会提前关闭它们,从而导致布局中断。至少我认为这是正在发生的任何帮助将不胜感激。也许有可能在它以某种方式刷新之前获取输出缓冲区,即使是聪明的控制它?

1 个答案:

答案 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压缩已启用,因此无法通过提前刷新获得性能优势,因此这可以在最小化开销或性能命中率的情况下实现结果,尤其是在缓存之后。