Próba dodania tagu html head w Drupal 8, beta 2

9

Z Drupal 8.0 beta2 drupal_add_html_head() został wycofany na korzyść #attached. Więc stary sposób brzmiał:

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');
}

Na podstawie zawiadomienia o zmianie, z którego teraz korzystasz #attached. Powyższy kod jest zasadniczo taki sam, a ostatnia część zmienia się na:

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

To jednak nie działa i nie ma komunikatów o błędach w watchdog. Próbowałem zostały również umieszczenie tego na stronie zmieniać jak zamiana $buildz $variablesa $outputjednak nadal nie działa. Dodatkowo próbowałem całej rzeczy jako tablicy:

  $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',
    ),
  );

... ale to też nie działało. Nie jestem pewien, co robię źle, wydaje się, że powinno działać.

Aktualizacja

Oto działający kod, który używa, hook_page_attachments_alterktórego nie ma w D8 Beta 2, ponieważ został on właśnie poświęcony programistom.

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'];
  }

Jedynym problemem jest teraz to, że znacznik rdzenia nie jest nadpisywany, więc utknąłem z moim znacznikiem niestandardowym i rdzeniem. Nie wiesz, jak sobie z tym poradzić, czy też mój tag powinien nadpisywać rdzenie?

wprowadź opis zdjęcia tutaj

Danny Englander
źródło

Odpowiedzi:

7

Nie masz wbudowanej $ w procesie wstępnym, więc nie możesz tak działać. $ build musi być tablicą renderującą, która jest renderowana gdzieś. Nie rozumiem też, jak mogło to wcześniej działać, ponieważ jest ono już przekonwertowane w template_preprocess_html () przed uruchomieniem funkcji.

Dodaj hook_page_attachments (_alter) () i przestarzałe hook_page_build / alter () właśnie został zatwierdzony , a jako motyw możesz wdrożyć hook_page_attachments_alter (), poszukaj przykładów w zatwierdzonej łatce, takich jak common_test_page_attachments_alter () .

Więc coś takiego $page['#attached']['html_head'][] = [$viewport, 'viewport'];powinno tam działać.

Berdir
źródło
Cóż, dzięki za pomoc, ale wciąż się gubię. Byłbym ciekawy, czy da się to uruchomić. Próbowałem hook_page_build i zmieniam, ale nadal nie ma radości. Bez powodzenia sięgnąłem nawet po kilka przykładów z rdzenia. Nie wydaje się, żeby to było takie trudne.
Danny Englander
1
Zaktualizuj swoje pytanie za pomocą bieżących przykładów kodu. Z pewnością przykład, na który wskazałem, działa, ponieważ jest używany do testów. Więc musisz robić coś inaczej. Hakiem, który zaproponowałem do użycia, jest hook_page_attachments_alter (), a nie page_build (). Kiedy implementujesz hook i coś nie działa, pierwszą rzeczą do sprawdzenia jest zawsze, czy twój kod jest nawet wywoływany, poprzez dodanie wyjścia; na przykład.
Berdir
Dodałem działający kod, który używa Twojej sugestii hook_page_attachments_alter. Jest jeden efekt uboczny, że mam teraz dwa tagi rzutni, jeden z rdzenia i ten, który dodałem z mojego motywu, więc nie jestem pewien, jak sobie z tym poradzić.
Danny Englander
1
Właśnie po to powinien być drugi argument, elementy html_head wykorzystują to, aby zachować wyjątkowość. Patrząc na rdzeń, ten element jest dodawany w DefaultHtmlFragementRenderer :: setDefaultMetatags (). W nowym interfejsie API nie ma sposobu na określenie klucza, co wydaje się dość poważnym problemem. Sugeruję, aby otworzyć w tym celu problem. Może drupal.org/node/2350943 jest powiązany.
Berdir,
Otworzyłem główny problem: drupal.org/node/2359987
Danny Englander