Не чувствуй себя глупым, потому что ты не чувствуешь! Мы все были там. У меня были те же вопросы, когда я начал с Timber. Мы пытаемся постоянно улучшать документацию, поэтому подобные вопросы помогают нам выяснить, что мы можем сделать лучше ».
Всякий раз, когда вы видите переменную в Twig, она на самом деле может происходить из нескольких разных мест:
Переменные из глобального контекста
Существует фильтр, который большинство из нас использует, чтобы сделать переменную доступной глобально, когда вы настраиваете свой контекст с помощью Timber::get_context()
. Когда вы видите {% for item in menu.items %}
, то это, вероятно, из раздела документов о «Глобальная настройка меню» . Я должен признать, что мы объясняем фильтр только в этом примере, что не идеально. Но мы меняем это. В следующей версии Timber мы попытаемся объяснить глобальный контекст лучше (обязательно прочитайте только раздел о глобальном контексте, потому что часть о «шаблонных контекстах» описывает функциональность, которая пока недоступна. )
Переменные из шаблона
Рассмотрим следующий пример:
$context = Timber::get_context();
$context['post'] = new Timber\Post();
Timber::render( 'single.twig', $context );
Здесь вы настраиваете свой контекст через Timber::get_context()
. При использовании Timber::get_context()
вы получите набор переменных, которые имеют смысл в глобальном масштабе, но не для каждого шаблона.
Переменная $context
- это массив, содержащий все переменные, которые вы хотите передать в шаблон Twig, в данном случае single.twig . Когда мы можем добавить наши собственные переменные, как в примере выше, где мы добавляем post
, который содержит Timber\Post
объект текущего отображаемого сообщения.
Переменные из классов Timber
В шаблоне, когда вы видите {{ post.author.name }}
, тогда author
могут быть разными вещами:
- Свойство объекта
Timber\Post
, которое содержит значение. Это все переменные, которые вы увидите, когда будете делать {{ dump(post) }}
.
- Метод объекта
Timber\Post
, который будет исключен. Поначалу это может сбивать с толку, потому что в PHP вам всегда нужно добавлять фигурные скобки для вызова функции, но в Twig вам это не нужно. Когда вы вызываете $post->author()
в PHP, вы используете post.author
в Twig. Чтобы увидеть список всех методов, доступных для Timber\Post
, вам нужно заглянуть в Справочный раздел для Timber\Post
в документации .
Итак, если вы напишите пример {{ post.author.name }}
на PHP, он будет выглядеть так:
$post->author()->name()
Итак, author
- это метод Timber\Post
, который возвращает объект Timber\User
. У объекта Timber\User
есть метод с именем name
, который возвращает «понятное человеку имя пользователя».
Но! Когда вы просто посмотрите на {{ post.author.name }}
, это также может быть многомерный массив, который вы определили сами:
$context['post'] = array(
'author' => array(
'name' => 'Tom Riddle',
),
);
Вы не узнаете об этом, просто взглянув на него в Twig.
Переменные из синтаксиса Twig
Когда вы видите {% for item in menu.items %}
, вы перебираете переменную menu.items
. Переменная menu
, вероятно, происходит из глобального контекста (объект Timber\Menu
), а items
является свойством этого объекта. Переменная item
- это новая переменная, которая создается для доступа к текущему элементу цикла в for loop . В этом примере это текущий пункт меню. Вы можете выбрать любое имя для item
, которое вы хотите.
Переменные от include
Вы можете передать переменную в Twig с помощью оператора include . Например, если вы определили post
в своем файле шаблона и хотите использовать другое имя в шаблоне, который вы включаете, вы можете использовать его следующим образом:
{% include 'teaser.twig' with { teaser: post } %}
Возвращаясь к вашим конкретным вопросам:
- Где найти список всех доступных предметов?
- Какова логика этих предметов?
Боюсь, что нет определенногоЭтот список может быть очень динамичным. В основном это сочетание глобального контекста, переменных, которые вы устанавливаете из шаблона, методов и свойств из классов Timber , а также переменных, которые вы определяете сами в Twig.
Если у вас есть дополнительные вопросы, добавьте к этому ответу в качестве комментариев, и я могу соответствующим образом обновить этот ответ.