Comment commandez-vous des balises META ajoutées par drupal_add_html_head ()?

12

J'ajoute la prise en charge d'Open Graph à un site Drupal et j'ai un tas d'appels drupal_add_html_head (), comme:

  $og_title = array(
    '#tag' => 'meta',
    '#attributes' => array(
      'property' => 'og:title', 
      'content' => $node->title,
    ),
  );
  drupal_add_html_head($og_title, 'zujava_og_title');

 $og_url = array(
    '#tag' => 'meta',
    '#attributes' => array(
      'property' => 'og:url', 
      'content' => url('node/' . $node->nid, array('absolute' => TRUE)),
    ),
  );
  drupal_add_html_head($og_url, 'zujava_og_url');

Au total, j'en ai 10. Ils ne semblent pas sortir dans le même ordre qu'ils sont appelés (tous dans une seule fonction).

Existe-t-il une sorte de pondération que je peux utiliser pour définir la commande?

Justin
la source

Réponses:

15

Utilisez la propriété #weight. Comme drupal_get_html_head () utilise drupal_render () pour rendre les balises META, #weight est utilisé lors du rendu.

J'utilise le code suivant pour faire un test sur mon site local; c'est le même code que vous utilisez, sauf qu'il n'a aucune référence à l'objet nœud.

  $og_title = array(
    '#tag' => 'meta',
    '#attributes' => array(
      'property' => 'og:title', 
      'content' => "This is the title",
    ),
  );
  drupal_add_html_head($og_title, 'zujava_og_title');

 $og_url = array(
    '#tag' => 'meta',
    '#attributes' => array(
      'property' => 'og:url', 
      'content' => url('node/1', array('absolute' => TRUE)),
    ),
  );
  drupal_add_html_head($og_url, 'zujava_og_url');

  dsm(drupal_get_html_head());

La sortie que j'ai obtenue est la suivante.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta property="og:url" content="http://tero.local/dr72/node/1" />
<meta name="Generator" content="Drupal 7 (http://drupal.org)" />
<meta property="og:title" content="This is the title" />

Comme vous le voyez, la dernière balise ajoutée est la première à apparaître.

J'exécute ensuite le code suivant.

  $og_title = array(
    '#tag' => 'meta',
    '#attributes' => array(
      'property' => 'og:title', 
      'content' => "This is the title",
    ),
    '#weight' => 10,
  );
  drupal_add_html_head($og_title, 'zujava_og_title');

 $og_url = array(
    '#tag' => 'meta',
    '#attributes' => array(
      'property' => 'og:url', 
      'content' => url('node/1', array('absolute' => TRUE)),
    ),
    '#weight' => 200,
  );
  drupal_add_html_head($og_url, 'zujava_og_url');

  dsm(drupal_get_html_head());

La sortie que j'ai obtenue est la suivante.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="Generator" content="Drupal 7 (http://drupal.org)" />
<meta property="og:title" content="This is the title" />
<meta property="og:url" content="http://tero.local/dr72/node/1" />

Comme vous le voyez, l'ordre des balises META a été modifié; les balises META ajoutées à partir du code apparaissent après les balises META par défaut ajoutées à partir de Drupal.

_drupal_default_html_head () (la fonction qui renvoie les balises META par défaut) utilise #weight pour la balise META "Content-Type".

  $elements['system_meta_content_type'] = array(
    '#type' => 'html_tag', 
    '#tag' => 'meta', 
    '#attributes' => array(
      'http-equiv' => 'Content-Type', 
      'content' => 'text/html; charset=utf-8',
    ),
    // Security: This always has to be output first. 
    '#weight' => -1000,
  );
kiamlaluno
la source
Génial merci! Cela a fonctionné. Il semble que j'ai raté quelque chose de très évident quelque part. Pour ma propre éducation, où avez-vous trouvé cela documenté?
Justin
1
Une fois que j'ai remarqué que les balises META sont rendues avec drupal_render(), j'ai essayé de voir si #weight était utilisé, car il est utilisé pour les éléments de formulaire qui sont rendus via la même fonction. La documentation de drupal_render()dit: "Les éléments sont triés en interne à l'aide de uasort ()."
kiamlaluno