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 回答