问题:
考虑到我有一系列混合的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;它必须像那样,最后执行,显示在顶部。
谢谢
答案 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;
如果您的重新排序算法需要其他信息,请使用函数而不是过滤器。同样的基本想法。
另一方面,我可能不知道你在问什么。