Оформление заказа в Twig

Эта проблема:

Учтите, что у меня есть последовательность микса кода 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’s 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;
?>

Должен выдать тот же результат, что и последовательный порядок выполнения кода, т. Е. Мы не модифицировали шаблон.

Теперь это будет использоваться только в том случае, если в шаблоне будет обнаружен определенный тег, и цель этого переупорядочения выполнения состоит в том, чтобы гарантировать, что даже если этот тег находится в верхней части шаблона -> чтобы он выполнялся последним, но отображался сверху.

Другого обходного пути нет -> он должен быть таким, который был выполнен последним и отображен сверху.

Спасибо

0

Решение

Не уверен, что я полностью понимаю ваши требования, но похоже, что вы в основном хотите отсортировать свои разделы перед их отображением? Если так, то простое расширение ветки сделало бы свое дело.

// 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;

Если вашему алгоритму переупорядочения требуется дополнительная информация, используйте вместо фильтра функцию. Та же основная идея.

С другой стороны, я не имею представления о том, что вы спрашиваете.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]