Как передать переменную темы из шаблона в другую?

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

У меня есть тема, которая имеет функции препроцесса как для тела бюллетеня, так и для полей, содержащихся в теле.

Я хочу установить переменную в функции препроцесса тела и связанный с ней шаблон ветви, который можно проверить с помощью функции препроцессора поля и /или собственного шаблона.

Другими словами, я хочу, чтобы каждое поле знало о контексте тела, в котором оно отображается.

В частности, у меня есть mytheme_preprocess_simplenews_newsletter_body(), который устанавливает переменную ($variables['summons'] = 'placeholder';), который может быть проверен (а также установлен) с помощью шаблона simpleenews-newsletter-body.html.twig темы, но (поскольку он находится в другом массиве рендеринга) впоследствии не может быть видимым для mytheme_preprocess_field(), а field - node - title.html.twig.

Как мне установить связь между двумя массивами рендеринга?

Обратите внимание, что

  1. Существуют, по-видимому, глобальные переменные, такие как $db_is_active и $is_admin

  2. Иногда, можно добиться такого рода каскадом CSS атрибуты класса из содержащего элемента в содержащийся элемент. Это обычно не является удовлетворительным, и в этом конкретном случае он не будет стирать на разных целевых почтовых клиентах непредсказуемое лечение CSS.

6 голосов | спросил iainH 13 Jpm1000000pmWed, 13 Jan 2016 19:51:15 +030016 2016, 19:51:15

2 ответа


4

Решением, с которым я работаю, является использование drupal_static() ; упрощенные основы в коде ниже - позаботьтесь об амперсандах. Это дает мне контроль, где мне это нужно.

Итак, используя этот подход, я могу - учитывая их глобальный контекст - за поле, задавать переменные обычным способом, например. в mytheme_preprocess_field(), который впоследствии будет использоваться в соответствующем шаблоне, например field--node--title--agenda.html.twig

function mytheme_preprocess_simplenews_newsletter_body(&$variables) {
  // prepare to alter static var ...
  // get a reference binding to static var
  $var = &myvariable_function();
  // alter static var
  $var = 'simplenews_newsletter';
}

function mytheme_preprocess_field(&$variables, $hook) {
  // prepare to read static var
  // assign static var
  $var = myvariable_function();
  // $element is the render array for the field
  $element = $variables['element'];
  // filter those cases where it matters that we're theming a newsletter
  if ($element['#view_mode'] == 'email_html' and $var == 'simplenews_newsletter') {
    // Do stuff here like setting a variable for twig ...
    $variables['summons'] = 'some text';
  }
}
function &myvariable_function() {
  $var = &drupal_static(__FUNCTION__);
  if (!isset($var)) {
    // generate contents of static variable
    $var =  'initial_value';
  }
  return $var;
}

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

ответил iainH 15 Jpm1000000pmFri, 15 Jan 2016 15:21:26 +030016 2016, 15:21:26
0

Я все еще новичок в D8, поэтому я мог легко упустить трюк. Обычно в этой ситуации вы хотите найти наиболее специфический крючок, который дает вам доступ ко всему, что вы хотите изменить. Поэтому изменение на полевом уровне слишком специфично, а на уровне страницы (например) слишком общее.

К сожалению MailEntity не является реальным (Drupal) сущностью, поэтому вы не можете использовать стандартные перехватчики для изменения своего массива рендеринга. Он не вызывает никаких пользовательских перехватов, которые я вижу, чтобы вы могли изменять содержимое. В D7 в этой ситуации у меня возникнет соблазн использовать hook_page_alter(), который является грязным, но будет работать, я думаю, но это было удалено из D8.

Вы всегда можете переопределить класс MailEntity и предоставить свои собственные настройки прямо там, но для этого необходимо изменить это для изменений темы. немного неправильно для меня.

ответил Andy 15 Jpm1000000pmFri, 15 Jan 2016 17:41:30 +030016 2016, 17:41:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132