0

Smarty Templating for phpを使用すると、毎回呼び出されるfetch()、または呼び出される書き込み出力フィルターを使用できますdisplay()。Smartyも出力バッファーを使用するため、独自のバッファーを作成することはできません(他のバッファーがアクティブな間は、出力バッファーを作成することはできません)。

私の質問は、テンプレートを表示するときにドキュメントを分割するのではなく、ドキュメント全体を整理して実行したいということです。使用しているソフトウェアを、表示またはフェッチを1回だけ使用する程度に書き直すことはできませんが、ドキュメント全体で出力をスマートにフラッシュする前に、出力フィルター/整頓を使用する必要があります。 。しかし、これを行うための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ボックスを早期に閉じることができます。これは、ページをブロックに配置し、各ブロックで表示を呼び出すためです。そのブロックにテーブルの一部が含まれている場合、それらを早期に閉じてレイアウトが破損します。少なくとも私はそれがどんな助けでも起こっていることだと思います。おそらく、スマートに制御している場合でも、何らかの方法でフラッシュされる前に出力バッファを取得することは可能ですか?

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 に答える