0

Smarty Templating for php 让您编写每次调用fetch()或被display()调用的输出过滤器。Smarty 也使用输出缓冲区,你不能创建自己的(当另一个缓冲区仍然处于活动状态时,你不能有一个输出缓冲区)。

我的问题是,我想在完成后对整个文档进行整理,而不是在显示模板时分段进行。我无法将我正在使用的软件重写到只使用一次显示或获取的程度,但我仍然需要使用输出过滤器/整洁,然后将输出刷新到 smarty 中,一次在整个文档上. 但我认为 smarty 没有办法做到这一点。

我的代码工作正常:

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 框时有问题,因为这个软件是如何设置的,它将页面放入块中并在每个块上调用 display。如果该块包含表格的各个部分,它会提前关闭它们,从而导致布局损坏。至少我认为这是正在发生的事情,任何帮助将不胜感激。也许有可能在输出缓冲区被刷新之前抓住它,即使聪明人也在控制它?

4

1 回答 1

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 压缩已打开,因此您无法从早期刷新中获得性能优势,因此这可以以最小的开销或性能损失实现结果,尤其是在缓存之后。

于 2012-08-24T18:06:50.113 回答