Перевірте тип вмісту вузла в гачці попередньої обробки


12

У мене є ряд змінних, які я хочу зробити доступними на гілочках для конкретних шаблонів вмісту.

У MYTHEME.themeмене є:

function MYTHEME_preprocess_node(&$variables) {

  if (isset($variables['node'])) {

    $mycustomblock = \Drupal::service('plugin.manager.block')
      ->createInstance('myblock', []);

    $variables['mycustomblock'] = $mycustomblock->build();

    $headertext = \Drupal::service('plugin.manager.block')
      ->createInstance('headertext',
        [
          'text-align-submit'  => 'right',
          'uppercase-submit'   => TRUE,
          'header_size'        => 'h4',
          'header-size-submit' => 'h4',
          'grid-size-submit'   => 6,
          'header-title'       => 'This is a test',
        ]
      );

    $variables['headertext'] = $headertext->build();
  }
}

Це дозволяє мені використовувати {{ headertext }}і {{ mycustomblock }}в шаблонах типу вмісту, як node--contenttype1.html.twigі node--contenttype2.html.twig. Але я краще не будувати 'headertext'і 'mycustomblock'змінні для кожного типу вузлів, коли мені потрібен лише один для одного типу вмісту. Було б непогано мати комутатор або якщо оператор, який перевіряє, який тип вмісту він є, перш ніж генерувати змінну з блоком.

Чи є спосіб я перевірити тип вмісту вузла?

Я намагався

$type = $variables['node']->type;

Але це не вийшло.

Відповіді:


15

Щоб отримати тип вмісту вузла, ви просто використовуєте $variables['node']->getType()або $variables['node']->bundle(). Перший метод просто викликає другий, тому виклик того чи іншого не має великого значення.

public function getType() {
  return $this->bundle();
}

Єдина відмінність полягає в тому, що bundle()визначено для кожної сутності, оскільки поняття пакету є загальним для всіх сутностей, тоді як тип вмісту - це властивість Drupal, що використовується для вузлів, перш ніж змінювати їх в одному з об'єктів, реалізованих основними модулями Drupal; використання bundle()полегшує адаптацію коду для інших типів сутності, але я не думаю, що це стосується коду, який ви використовуєте.


5

Ви повинні використовувати $variables['node']->getType(). Також якщо вам це потрібно лише в деяких режимах перегляду, спробуйте також перевірити це$variables['view_mode']


2

Ви можете додати вузол (і тип перегляду) до імені функції гачка:

function MYTHEME/MYMODULE_preprocess_node__nodetype__display(&$variables) {
  // ...
}

Наприклад, для pageтипу вузла в fullрежимі:

function MYTHEME/MYMODULE_preprocess_node__page__full(&$variables) {
  // ...
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.