Überprüfen Sie den Inhaltstyp des Knotens im Vorverarbeitungs-Hook

12

Ich habe eine Reihe von Variablen, die ich auf Zweigvorlagen für bestimmte Inhaltsvorlagen verfügbar machen möchte.

In habe MYTHEME.themeich:

function MYTHEME_preprocess_node(&$variables) {

  if (isset($variables['node'])) {

    $mycustomblock = \Drupal::service('plugin.manager.block')
      ->createInstance('myblock', []);

    $variables['mycustomblock'] = $mycustomblock->build();

    $headertext = \Drupal::service('plugin.manager.block')
      ->createInstance('headertext',
        [
          'text-align-submit'  => 'right',
          'uppercase-submit'   => TRUE,
          'header_size'        => 'h4',
          'header-size-submit' => 'h4',
          'grid-size-submit'   => 6,
          'header-title'       => 'This is a test',
        ]
      );

    $variables['headertext'] = $headertext->build();
  }
}

Dies ermöglicht mir die Verwendung von {{ headertext }}und {{ mycustomblock }}in Inhaltstypvorlagen wie node--contenttype1.html.twigund node--contenttype2.html.twig. Aber ich möchte lieber nicht die Variablen 'headertext'und 'mycustomblock'für jeden einzelnen Knotentyp erstellen, wenn ich nur jeden für einen Inhaltstyp benötige. Es wäre schön, einen Schalter oder eine if-Anweisung zu haben, die prüft, um welchen Inhaltstyp es sich handelt, bevor eine Variable mit einem Block generiert wird.

Gibt es eine Möglichkeit, den Inhaltstyp des Knotens zu überprüfen?

ich habe es versucht

$type = $variables['node']->type;

Das hat aber nicht funktioniert.

Matt
quelle

Antworten:

15

Um den Inhaltstyp eines Knotens abzurufen, verwenden Sie einfach $variables['node']->getType()oder $variables['node']->bundle(). Die erste Methode ruft nur die zweite auf, sodass das Aufrufen der einen oder anderen Methode keinen großen Unterschied macht.

public function getType() {
  return $this->bundle();
}

Der einzige Unterschied besteht darin, dass er bundle()für jede Entität definiert ist, da das Konzept des Bundles für alle Entitäten gleich ist, während der Inhaltstyp die Eigenschaft ist, die Drupal für Knoten verwendet, bevor sie in einer der Entitäten geändert werden, die Drupal-Kernmodule implementieren. Die Verwendung bundle()erleichtert das Anpassen des Codes für andere Entitätstypen, aber ich glaube nicht, dass dies bei dem von Ihnen verwendeten Code der Fall ist.

kiamlaluno
quelle
5

Du musst benutzen $variables['node']->getType(). Auch wenn Sie es nur in einigen Ansichtsmodi benötigen, sollten Sie dies mit überprüfen$variables['view_mode']

yvan
quelle
2

Sie können den Knoten (und den Ansichtstyp) zu Ihrem Hook-Funktionsnamen hinzufügen:

function MYTHEME/MYMODULE_preprocess_node__nodetype__display(&$variables) {
  // ...
}

Zum Beispiel für den pageKnotentyp im fullModus:

function MYTHEME/MYMODULE_preprocess_node__page__full(&$variables) {
  // ...
}
Tim
quelle