在Twig中呈现订单

时间:2015-08-29 16:16:47

标签: php symfony twig twig-extension

问题:

考虑到我有一系列混合的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;
?>

所以你明白了,我会通过匿名函数来控制渲染的顺序。请注意,非部分取决于上一部分的执行结果。

为了实现所述 - &gt;想法是使用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;
?>

应该产生与代码执行的顺序相同的结果,即我们没有修改模板。

现在,只有在模板上检测到特定标记时才会使用此功能,并且执行此重新排序的目的是确保即使此标记位于模板顶部 - &gt;最后执行但显示在顶部。

没有其他解决方法 - &gt;它必须像那样,最后执行,显示在顶部。

谢谢

1 个答案:

答案 0 :(得分: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;

如果您的重新排序算法需要其他信息,请使用函数而不是过滤器。同样的基本想法。

另一方面,我可能不知道你在问什么。