Der Versuch, ein HTML-Head-Tag in Drupal 8, Beta 2, hinzuzufügen

9

Mit Drupal 8.0 Beta2 wurde zugunsten von drupal_add_html_head() veraltet#attached . Der alte Weg war also:

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

Basierend auf dem Änderungshinweis, den Sie jetzt verwenden #attached. Der obige Code ist also im Wesentlichen derselbe, wobei der letzte Teil geändert wurde zu:

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

Dies funktioniert jedoch nicht und keine Fehlermeldungen im Watchdog. Ich habe auch diese auf einer Seite ändern sowie Swapping versucht setzen $buildmit $variablesund $outputaber es funktioniert immer noch nicht. Außerdem habe ich das Ganze als Array ausprobiert:

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

... aber das hat auch nicht funktioniert. Ich bin nicht sicher, was ich falsch mache, scheint, dass es funktionieren sollte.

Aktualisieren

Hier ist Arbeitscode, der verwendet, hook_page_attachments_alterder nicht in D8 Beta 2 enthalten ist, da er nur für dev festgelegt wurde.

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

Das einzige Problem ist jetzt, dass das Ansichtsfenster-Tag des Kerns nicht überschrieben wird, sodass ich mit meinem benutzerdefinierten Tag und den Kerns festgefahren bin. Sie sind sich nicht sicher, wie Sie damit umgehen sollen, oder sollte mein Tag den Kern überschreiben?

Geben Sie hier die Bildbeschreibung ein

Danny Englander
quelle

Antworten:

7

Sie haben kein $ build in preprocess, können also nicht so arbeiten. $ build muss ein Render-Array sein, das irgendwo gerendert wird. Ich sehe auch nicht, wie dies vorher hätte funktionieren können, da dies bereits in template_preprocess_html () konvertiert wurde, bevor Ihre Funktion ausgeführt wird.

Fügen Sie hook_page_attachments (_alter) () hinzu und verwerfen Sie hook_page_build / alter (), das gerade festgeschrieben wurde. Als Thema können Sie hook_page_attachments_alter () implementieren. Suchen Sie im festgeschriebenen Patch nach Beispielen wie common_test_page_attachments_alter () .

Also $page['#attached']['html_head'][] = [$viewport, 'viewport'];sollte so etwas drin funktionieren.

Berdir
quelle
Nun, danke für deine Hilfe, aber ich bin immer noch verloren. Ich wäre gespannt, ob Sie das zum Laufen bringen können. Ich habe versucht, hook_page_build und zu ändern, aber immer noch keine Freude. Ich habe sogar einige Beispiele aus dem Kern geholt, ohne Glück. Es scheint nicht so schwer zu sein.
Danny Englander
1
Aktualisieren Sie dann Ihre Frage mit Ihren aktuellen Codebeispielen. Sicherlich funktioniert das Beispiel, auf das ich hingewiesen habe, da es für Tests verwendet wird. Sie müssen also etwas anders machen. Der von mir vorgeschlagene Hook ist hook_page_attachments_alter (), nicht page_build (). Wenn Sie einen Hook implementieren und etwas nicht funktioniert, müssen Sie zunächst überprüfen, ob Ihr Code überhaupt aufgerufen wird, indem Sie einen Exit hinzufügen. zum Beispiel.
Berdir
Ich habe Arbeitscode hinzugefügt, der Ihren Vorschlag verwendet hook_page_attachments_alter. Es gibt einen Nebeneffekt, dass ich jetzt zwei Ansichtsfenster-Tags habe, eines aus dem Kern und eines, das ich aus meinem Thema hinzugefügt habe, sodass ich nicht sicher bin, wie ich damit umgehen soll.
Danny Englander
1
Dafür soll das zweite Argument stehen. Html_head-Elemente verwenden dies, um die Dinge einzigartig zu halten. Mit Blick auf den Kern wird dieses Element in DefaultHtmlFragementRenderer :: setDefaultMetatags () hinzugefügt. Die neue API dort bietet keine Möglichkeit, einen Schlüssel anzugeben, was ein ziemlich ernstes Problem zu sein scheint. Ich schlage vor, Sie eröffnen ein Problem dafür. Vielleicht ist drupal.org/node/2350943 verwandt.
Berdir
Ich habe ein Kernproblem eröffnet: drupal.org/node/2359987
Danny Englander