Prova di aggiungere un tag head HTML in Drupal 8, beta 2


9

Con Drupal 8.0 beta2, drupal_add_html_head() è stato deprecato a favore di #attached. Quindi il vecchio modo 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');
}

In base all'avviso di modifica ora in uso #attached. Quindi il codice sopra è essenzialmente lo stesso con l'ultima parte che cambia in:

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

Questo non funziona però e nessun messaggio di errore nel watchdog. Ho anche provato a mettere questo in una pagina di alterare così come lo scambio $buildcon $variablese $outputma non è così ancora il lavoro. Inoltre, ho provato l'intera cosa come un array:

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

... ma neanche quello ha funzionato. Non sono sicuro di quello che sto facendo di sbagliato, sembra che dovrebbe funzionare.

Aggiornare

Ecco un codice funzionante che utilizza hook_page_attachments_alterche non è in D8 Beta 2 in quanto è stato appena impegnato a 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'];
  }

L'unico problema ora è che il tag viewport del core non viene sovrascritto, quindi sono bloccato con il mio tag personalizzato e quelli del core. Non sei sicuro di come gestirlo o il mio tag dovrebbe sovrascrivere i core?

inserisci qui la descrizione dell'immagine

Risposte:


7

Non hai $ build in pre-elaborazione, quindi non puoi lavorare così. $ build deve essere un array di rendering reso da qualche parte. Inoltre non vedo come questo avrebbe potuto funzionare prima, poiché questo è già convertito in template_preprocess_html () prima dell'esecuzione della funzione.

Aggiungi hook_page_attachments (_alter) () e deprecate hook_page_build / alter () è stato appena eseguito il commit e, come tema, puoi implementare hook_page_attachments_alter (), cercare esempi nella patch di commit, come common_test_page_attachments_alter () .

Quindi, qualcosa del genere $page['#attached']['html_head'][] = [$viewport, 'viewport'];dovrebbe funzionare lì dentro.


Bene, grazie per l'aiuto, ma mi sono ancora perso. Sarei curioso di vedere se riesci a farlo funzionare. Ho provato hook_page_build e modificare ma ancora nessuna gioia. Ho anche preso alcuni esempi dal core senza fortuna. Non sembra che dovrebbe essere così difficile.
Danny Englander,

1
Aggiorna quindi la tua domanda con i tuoi attuali esempi di codice. Sicuramente l'esempio che ho indicato sta funzionando, in quanto viene utilizzato per i test. Quindi devi fare qualcosa di diverso. L'hook che ho suggerito di usare è hook_page_attachments_alter (), non page_build (). Quando si implementa un hook e qualcosa non funziona, la prima cosa da verificare è sempre se il proprio codice viene chiamato, aggiungendo un'uscita; per esempio.
Berdir,

Ho aggiunto un codice funzionante che utilizza il tuo suggerito hook_page_attachments_alter. C'è un lato che ora ho due tag viewport, uno dal core e quello che ho aggiunto dal mio tema, quindi non sono sicuro di come gestirlo.
Danny Englander,

1
Questo è ciò che dovrebbe essere il secondo argomento, gli elementi html_head lo usano per essere in grado di mantenere le cose uniche. Guardando core, quell'elemento viene aggiunto in DefaultHtmlFragementRenderer :: setDefaultMetatags (). La nuova API non ha un modo per specificare una chiave, che sembra un problema piuttosto serio. Ti suggerisco di aprire un problema per questo. Forse drupal.org/node/2350943 è correlato.
Berdir,

Ho aperto un problema principale: drupal.org/node/2359987
Danny Englander,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.