Essayer d'ajouter une balise html head dans Drupal 8, beta 2

9

Avec Drupal 8.0 beta2, drupal_add_html_head() a été déprécié en faveur de #attached. Donc, l'ancienne façon était:

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

Sur la base de l' avis de modification que vous utilisez maintenant #attached. Ainsi, le code ci-dessus est essentiellement le même avec la dernière partie changée en:

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

Cela ne fonctionne pas et aucun message d'erreur ne s'affiche dans le chien de garde. J'ai aussi essayé de mettre cela dans une page modifier ainsi que la permutation $buildavec $variableset $outputmais il ne fonctionne toujours pas. De plus, j'ai essayé le tout en tant que tableau:

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

... mais cela n'a pas fonctionné non plus. Je ne suis pas sûr de ce que je fais mal, semble que cela devrait fonctionner.

Mise à jour

Voici du code de travail qui utilise hook_page_attachments_alterce qui n'est pas dans D8 Beta 2 car il vient d'être engagé pour le développement.

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

Le seul problème maintenant est que la balise viewport du noyau n'est pas écrasée, je suis donc coincé avec ma balise personnalisée et mon noyau. Vous ne savez pas comment gérer celui-ci ou mon tag devrait-il remplacer le noyau?

entrez la description de l'image ici

Danny Englander
la source

Réponses:

7

Vous n'avez pas $ build en pré-processus, donc vous ne pouvez pas travailler comme ça. $ build doit être un tableau de rendu qui est rendu quelque part. Je ne vois pas non plus comment cela aurait pu fonctionner auparavant, car il est déjà converti dans template_preprocess_html () avant l'exécution de votre fonction.

Ajouter hook_page_attachments (_alter) () et déprécier hook_page_build / alter () vient d'être validé , et en tant que thème, vous pouvez implémenter hook_page_attachments_alter (), recherchez des exemples dans le correctif validé , comme common_test_page_attachments_alter () .

Donc, quelque chose comme ça $page['#attached']['html_head'][] = [$viewport, 'viewport'];devrait fonctionner là-dedans.

Berdir
la source
Merci pour votre aide mais je suis toujours perdu. Je serais curieux de voir si vous pouvez le faire fonctionner. J'ai essayé hook_page_build et alter mais toujours pas de joie. J'ai même pris quelques exemples de base sans succès. Il ne semble pas que cela devrait être si difficile.
Danny Englander
1
Mettez à jour votre question avec vos exemples de code actuels. Certes, l'exemple que j'ai indiqué fonctionne, car il est utilisé pour les tests. Vous devez donc faire quelque chose différemment. Le hook que j'ai suggéré d'utiliser est hook_page_attachments_alter (), pas page_build (). Lorsque vous implémentez un hook et que quelque chose ne fonctionne pas, la première chose à vérifier est toujours si votre code est même appelé, en ajoutant une sortie; par exemple.
Berdir
J'ai ajouté du code de travail qui utilise votre suggestion hook_page_attachments_alter. Il y a un effet secondaire: j'ai maintenant deux balises de fenêtre, une du noyau et celle que j'ai ajoutée à partir de mon thème, donc je ne sais pas comment gérer cela.
Danny Englander
1
C'est à cela que le deuxième argument est censé servir, les éléments html_head l'utilisent pour garder les choses uniques. En regardant le noyau, cet élément est ajouté dans DefaultHtmlFragementRenderer :: setDefaultMetatags (). La nouvelle API n'a pas de moyen de spécifier une clé, ce qui semble être un problème assez grave. Je vous suggère d'ouvrir un problème pour cela. Peut-être que drupal.org/node/2350943 est lié.
Berdir
J'ai ouvert un problème principal: drupal.org/node/2359987
Danny Englander