0

問題:

HTML/PHPコードの混合シーケンス、以下の疑似コードがあると考えてください:

<html>
    <section 1> ... </section 1>
    <section 2> ... </section 2>
    <section 3> ... </section 3>
</html>

セクションは HTML/PHP コードの単なるブロックであり、詳細は重要ではないことに注意してください。

ただし、ストーリーにとって重要ではない理由により、最初にセクション 3 と 2 でコードをレンダリングし、次にセクション 1 でレンダリングしたいと考えています。従来の PHP/HTML では、無名関数を使用してそれを実現します。

<?php $buff = []; ?>

<?php $buff[] = function() { ?>
    <html>
<?php }; ?>

<?php $buff[] = function() {  ?>
    <section 1> </section 1>
<?php }; ?>

<?php $buff[] = function() {  ?>
    <section 2> </section 2>
<?php }; ?>

<?php $buff[] = function() {  ?>
    <section 3> </section 3>
<?php }; ?>

<?php $buff[] = function() {  ?>
    </html>
<?php }; ?>

<?php 
    for ($i = count($buff)-1; $i >= 0; $i--) {
        $buff[$i] = call_user_func($buff[$i]);
    }

    foreach($buff as $b) echo $b;
?>

お分かりのように、無名関数を介してレンダリングの順序を制御します。セクションのどれも前のセクションの実行結果に依存しないことに注意してください。

述べられた -> アイデアを達成するためには、Twig の Node ビジターを使用することです。もちろん、これらの無名関数には $context 変数と $blocks 変数への参照があります。

function () use ($context, $blocks) {
    ...
}

これはかなり二重です。今、質問は次のとおりです。より良い方法はありますか?私が見逃している潜在的な危険はありますか?

ご了承ください

<?php 
    for ($i = 0; $i < count($buff); $i++) {
        $buff[$i] = call_user_func($buff[$i]);
    }

    foreach($buff as $b) echo $b;
?>

テンプレートを変更していないため、コード実行の順序と同じ結果が得られるはずです。

現在、これはテンプレートで特定のタグが検出された場合にのみ使用されます。この実行の順序変更の目的は、このタグがテンプレートの上にある場合でも -> 最後に実行されますが、上に表示されるようにすることです。

他の回避策はありません->最後に実行され、一番上に表示されるようにする必要があります。

ありがとうございました

4

1 に答える 1

1

あなたの要件を完全に理解しているかどうかはわかりませんが、基本的にセクションをレンダリングする前に並べ替えたいと思われますか? もしそうなら、単純な小枝の拡張機能でうまくいくでしょう。

// Controller
$sections = [ $section1, $section2, $section3];

// Twig
{% for section in sections | section_reorder %}

// Twig extension http://symfony.com/doc/current/cookbook/templating/twig_extension.html
public function sectionReorderFilter($sections)
{
  // Adjust the order of the sections as needed

  return $sectionsReordered;

並べ替えアルゴリズムに追加情報が必要な場合は、フィルターの代わりに関数を使用してください。基本的な考え方は同じ。

一方で、あなたが何を求めているのか、私にはさっぱり分からないかもしれません。

于 2015-08-29T16:46:01.167 に答える