Intentando agregar una etiqueta de cabeza html en Drupal 8, beta 2

9

Con Drupal 8.0 beta2, drupal_add_html_head() ha quedado en desuso a favor de #attached. Entonces la vieja forma era:

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

Según el aviso de cambio que usa ahora #attached. Entonces, el código anterior es esencialmente el mismo con la última parte cambiando a:

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

Sin embargo, esto no funciona y no hay mensajes de error en el perro guardián. También he intentado poner esto en una página alternativa, así como intercambiar $buildcon $variablesy, $outputpero todavía no funciona. Además, probé todo como una matriz:

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

... pero eso tampoco funcionó. No estoy seguro de lo que estoy haciendo mal, parece que debería estar funcionando.

Actualizar

Aquí hay un código de trabajo que usa el hook_page_attachments_alterque no está en D8 Beta 2, ya que solo se comprometió con 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'];
  }

El único problema ahora es que la etiqueta de viewport de core no se sobrescribe, así que estoy atascado con mi etiqueta personalizada y la de core. ¿No está seguro de cómo manejarlo o mi etiqueta debería sobrescribir los núcleos?

ingrese la descripción de la imagen aquí

Danny Englander
fuente

Respuestas:

7

No tiene $ build en el preproceso, por lo que no puede funcionar así. $ build debe ser una matriz de renderizado que se represente en alguna parte. Tampoco veo cómo esto podría haber funcionado antes, ya que esto ya está convertido en template_preprocess_html () antes de que se ejecute su función.

Agregar hook_page_attachments (_alter) () y desaprobar hook_page_build / alter () se acaba de confirmar, y como tema, puede implementar hook_page_attachments_alter (), buscar ejemplos en el parche confirmado, como common_test_page_attachments_alter () .

Entonces, algo así $page['#attached']['html_head'][] = [$viewport, 'viewport'];debería funcionar allí.

Berdir
fuente
Bueno, gracias por tu ayuda, pero todavía estoy perdido. Me gustaría ver si puedes hacer que esto funcione. He intentado hook_page_build y alter pero todavía no me alegro. Incluso tomé algunos ejemplos del núcleo sin suerte. No parece que deba ser tan difícil.
Danny Englander
1
Actualice su pregunta con sus ejemplos de código actuales entonces. Seguramente el ejemplo que señalé está funcionando, ya que se usa para pruebas. Entonces debes estar haciendo algo diferente. El gancho que sugerí usar es hook_page_attachments_alter (), no page_build (). Cuando se implementa un enlace y algo no funciona, lo primero que debe verificar es siempre si se llama a su código, agregando una salida; por ejemplo.
Berdir
He agregado un código de trabajo que usa su sugerencia hook_page_attachments_alter. Hay un efecto secundario que ahora tengo dos etiquetas de ventana gráfica, una desde el núcleo y la que he agregado desde mi tema, por lo que no estoy seguro de cómo lidiar con eso.
Danny Englander
1
Para eso se supone que es el segundo argumento, los elementos html_head están usando eso para poder mantener las cosas únicas. Mirando el núcleo, ese elemento se agrega en DefaultHtmlFragementRenderer :: setDefaultMetatags (). La nueva API no tiene forma de especificar una clave, lo que parece un problema bastante grave. Le sugiero que abra un problema para esto. Quizás drupal.org/node/2350943 está relacionado.
Berdir
Abrí un tema central: drupal.org/node/2359987
Danny Englander