Добавление переменных в html.html.twig: как правильно передать переменные?

Главные вкладки

Аватар пользователя chelwolf chelwolf 1 июня 2021 в 18:12

Для типа материала "Новости" вывожу в head сайта метки для Фейсбук, чтобы пост при шаринге страницы в ленте отображался с картинкой и другими атрибутами, согласно документации: https://developers.facebook.com/docs/sharing/webmasters

Чтобы это реализовать, нужно сделать две вещи:
1) Передать значение двух полей ноды для шаблона html.html.twig через файлик mytheme.theme
2) Настроить вывод в самом html.html.twig

Вывод в файле html.html.twig:

<?php{% if node_type == 'news'  %}
            <meta property="og:url" content="{{ url('<current>') }}" />
            <meta property="og:type" content="article" />
            <meta property="og:title" content="{{ drupal_title() }}" />
            {% if news_body is not empty %}
                <meta property="og:description" content="{{ news_body }}" />
            {% endif %}
            {% if news_cover is not empty %}
                <meta property="og:image" content="{{ news_cover }}" />
            {% endif %}
        {% endif %}?>

Проблема возникла с передачей переменных, добился для новостей корректного отображения, но на главной странице вылетает белый экран. Оно и понятно, главная страница - не узел. Вопрос - как при передаче переменных сделать проверку, чтобы эта переменная передавалась только для новостей. Голову уже сломал. Код в фале такой:

<?php
function mytheme_preprocess_html(&$variables) {
  
$node = \Drupal::routeMatch()->getParameter('node');
  if (isset(
$node)){
    
$nodelabel $node->type->entity->label();
    if (
$nodelabel == "news"){
      
$news_teaser $node->get('body')->summary;
      
$news_cover $node->get('field_news_cover_inside')->entity->url();
      
$variables['news_body'] = $news_teaser;
      
$variables['news_cover'] = $news_cover;
    }
  }
}
?>

В текущей версии код не работает. Если убрать текущие проверки - получаю ошибку: Error: Call to a member function get() on null

На главной странице ошибки вызывают строчки:
$news_teaser = $node->get('body')->summary;
$news_cover = $node->get('field_news_cover_inside')->entity->url();

Лучший ответ

Аватар пользователя chelwolf chelwolf 7 июня 2021 в 19:21

Поправка - добавляем ещё одну проверку на пустоту поля, прежде чем присвоить значение переменной:

<?php
function netprizyvu_preprocess_html(&$variables) {
  
$node = \Drupal::routeMatch()->getParameter('node');
  if (
$node instanceof \Drupal\node\NodeInterface) {
    
$nodelabel $node->bundle();
    if (
$nodelabel == "news"){
      if (
$node->hasField('field_news_cover_inside') && !$node->get('field_news_cover_inside')->isEmpty()) {
        
$news_cover $node->get('field_news_cover_inside')->entity->url();
        
$variables['news_cover'] = $news_cover;
      }
      
$news_teaser $node->get('body')->summary;
      
$variables['news_body'] = $news_teaser;
    }
  }
}
?>

Комментарии

Аватар пользователя chelwolf chelwolf 1 июня 2021 в 19:57

Спасибо проверка работает, но теперь выдаёт ошибку на другое поле ($news_cover = $node->get('field_news_cover_inside')->entity->url();) - оно есть только в типе материала "новости" (машинное имя news), как выводить переменную только для этого типа материала?

Конструкция у меня не сработала:

<?php
$nodelabel 
$node->type->entity->label();
if (
$nodelabel == "news"){}
?>
Аватар пользователя chelwolf chelwolf 1 июня 2021 в 20:03

Разобрался, моё решение такое:

<?php
function mytheme_preprocess_html(&$variables) {
  
$node = \Drupal::routeMatch()->getParameter('node');
  if (
$node instanceof \Drupal\node\NodeInterface) {
    
$nodelabel $node->bundle();
    if (
$nodelabel == "news"){
      
$news_teaser $node->get('body')->summary;
      
$news_cover $node->get('field_news_cover_inside')->entity->url();
      
$variables['news_body'] = $news_teaser;
      
$variables['news_cover'] = $news_cover;
    }
  }
}
?>
Аватар пользователя chelwolf chelwolf 7 июня 2021 в 19:21

Поправка - добавляем ещё одну проверку на пустоту поля, прежде чем присвоить значение переменной:

<?php
function netprizyvu_preprocess_html(&$variables) {
  
$node = \Drupal::routeMatch()->getParameter('node');
  if (
$node instanceof \Drupal\node\NodeInterface) {
    
$nodelabel $node->bundle();
    if (
$nodelabel == "news"){
      if (
$node->hasField('field_news_cover_inside') && !$node->get('field_news_cover_inside')->isEmpty()) {
        
$news_cover $node->get('field_news_cover_inside')->entity->url();
        
$variables['news_cover'] = $news_cover;
      }
      
$news_teaser $node->get('body')->summary;
      
$variables['news_body'] = $news_teaser;
    }
  }
}
?>