Попытка добавить тег заголовка HTML в Drupal 8, бета 2

9

С Drupal 8.0 beta2 drupal_add_html_head() устарела в пользу #attached. Таким образом, старый способ был:

function MYTHEME_page_build(&$page) {
    $viewport = array(
          '#type' => 'html_tag',
          '#tag' => 'meta',
          '#attributes' => array(
            'name' => 'viewport',
            'content' => 'width=device-width, initial-scale=1.0, maximum-scale=2.0, minimum-scale=0.55, user-scalable=yes',
          ),
        );
        drupal_add_html_head($viewport, 'viewport');
}

На основании уведомления об изменении, которое вы сейчас используете #attached. Таким образом, приведенный выше код по сути такой же, с последней частью, изменяющейся на:

$build['#attached']['html_head'][] = [$viewport, 'viewport'];

Это не работает, хотя и никаких сообщений об ошибках в сторожевой таймер. Я также попытался положить это на странице изменить, а также обмен $buildс $variablesи , $outputно он по- прежнему не работает. Кроме того, я попробовал все это в виде массива:

  $build['#attached']['html_head'][] = array(
    '#type' => 'html_tag',
    '#tag' => 'meta',
    '#attributes' => array(
      'name' => 'viewport',
      'content' => 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no',
    ),
  );

... но это тоже не сработало. Я не уверен, что я делаю неправильно, похоже, это должно работать.

Обновить

Вот рабочий код, который использует, hook_page_attachments_alterкоторого нет в D8 Beta 2, как это было просто передано dev.

function MYTHEME_page_attachments_alter(array &$page) {
    $viewport = array(
      '#type' => 'html_tag',
      '#tag' => 'meta',
      '#attributes' => array(
        'name' => 'viewport',
        'content' => 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no',
      ),
    );
    $page['#attached']['html_head'][] = [$viewport, 'viewport'];
  }

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

введите описание изображения здесь

Дэнни Энгландер
источник

Ответы:

7

У вас нет $ build в препроцессе, поэтому вы не можете так работать. $ build должен быть массивом рендеринга, который отображается где-то. Я также не понимаю, как это могло сработать раньше, так как это уже преобразуется в template_preprocess_html () до запуска вашей функции.

Добавьте hook_page_attachments (_alter) () и отмените hook_page_build / alter () только что зафиксировал, и в качестве темы вы можете реализовать hook_page_attachments_alter (), искать примеры в исправленном патче, например, common_test_page_attachments_alter () .

Таким образом, что-то вроде $page['#attached']['html_head'][] = [$viewport, 'viewport'];должно работать там.

Berdir
источник
Хорошо, спасибо за вашу помощь, но я все еще потерялся. Мне было бы интересно посмотреть, сможете ли вы заставить это работать. Я попытался hook_page_build и изменить, но все еще не радует. Я даже взял некоторые примеры из ядра без удачи. Не похоже, что это должно быть так сложно.
Дэнни Энгландер
1
Обновите ваш вопрос с вашими текущими примерами кода. Конечно, пример, на который я указал, работает, так как он используется для тестов. Так что вы должны делать что-то по-другому. Хук, который я предложил использовать, это hook_page_attachments_alter (), а не page_build (). Когда реализуется ловушка и что-то не работает, первое, что нужно проверить, это всегда, если ваш код даже вызывается, добавляя выход; например.
Бердир
Я добавил рабочий код, который использует ваш предложенный hook_page_attachments_alter. Есть один побочный эффект, что у меня теперь есть два тега области просмотра, один из ядра и тот, который я добавил из моей темы, поэтому я не уверен, как с этим справиться.
Дэнни Энгландер
1
Это то, для чего предполагается использовать второй аргумент, элементы html_head используют его для сохранения уникальности. Глядя на ядро, этот элемент добавляется в DefaultHtmlFragementRenderer :: setDefaultMetatags (). В новом API нет способа указать ключ, что кажется довольно серьезной проблемой. Я предлагаю вам открыть для этого вопрос. Возможно drupal.org/node/2350943 связано.
Бердир
Я открыл основной вопрос: drupal.org/node/2359987
Дэнни Энгландер,