У меня в голове что-то, что нужно реализовать в текущем проекте. Я объясню на примере ниже:

Я буду использовать следующую структуру переменных во многих шаблонах:

{% if article.tags is iterable %}
    {% for tag in article.tags %}
        {{ tag.title }}
    {% endfor %}
{% endif %}

Как вы можете видеть в строке №1 выше, я затем назначу данные переменных «article», которые имеют список данных «тегов» из PHP, загрузчику шаблонов Twig, который обычно используется. Но я не хочу загружать данные «тегов» из базы данных и назначать их шаблону, потому что я думаю, что он будет использовать мое соединение с сервером и ресурс, даже используемые данные «тегов» или нет.

Поэтому я думаю, что лучший подход - использовать концепцию прослушивателя событий (ловушки), реализованную внутри Twig, ниже показан процесс:

1) Я готовлю слушателя где-то в моем PHP-файле перед загрузкой шаблона: $ this-> twig-> addListenerMethod ($ this, 'tags');

2) Когда Twig анализирует переменную «теги», он проверяет, есть ли слушатель с таким же именем метода, прикрепленным к переменной.

3) Когда слушатели найдены, Twig вызовет указанный метод, передав родительский объект (статью) в качестве первого параметра.

4) Когда метод вызван, он будет обрабатывать как следует и возвращать необходимый список данных «тегов».

Мой вопрос:

1) В каком исходном файле Twig я могу начать поиск и реализацию концепции прослушивателя событий (перехвата) в Twig?

2) Есть ли у кого-то уже такая же реализация с использованием Twig, как я описал выше?

3) или у кого-то есть предложения?

Хотелось бы, чтобы у меня было много предложений по этому поводу, пока я копаюсь в исходниках Twig.

Спасибо.

С уважением.

1
sule 3 Июл 2012 в 07:33
Я думаю, что я уже нашел подобное решение, когда я копался в исходном коде Twig в файле « Template.php » в методе « getAttribute », я обнаружил, что мы может назначить объект как переменную в шаблоне, поэтому « статья » должна быть назначена как объект, а « теги » будут методом. Нет, у меня вопрос, как я собираюсь передать туда « аргументы », найденные в методе « getAttribute »?
 – 
sule
4 Июл 2012 в 06:55

1 ответ

Лучший ответ

Я нашел решение своего вопроса:

Мне просто нужно назначить шаблону объект " Статья ":

$template->render(array(
  'article' => new Article()
);

Вот как выглядит объект « Статья »:

class Article
{
  public function tags($args)
  {
    return array(
      array(
        'title' => 'oke',
        'desc' => 'lorem ipsum'
      ),
      array(
        'title' => 'oke 1',
        'desc' => 'lorem ipsum 1'
      )
    );
  }
}

А если вы хотите передать аргументы методу « теги », просто используйте следующий пример:

{% if article.tags('param_1', 'param_n') is iterable %}
  {% for tag in article.tags('param_1', 'param_n') %}
    {{ tag.title }}
  {% endfor %}
{% endif %}
1
sule 4 Июл 2012 в 07:30