Facet programmatisch ausgeben

Geschrieben von patrick am Mi., 08.03.2017 - 09:03 Uhr

Wenn Sie programmatisch einen Facet-Block, der vom Facets-Modul zur verfügung gestellt wird, ausgeben möchten, z.B. um eine Template-Variable in einer Preprocess-Funktion zur Verfügung zu stellen, würde das unegefähr so aussehen:

use Drupal\Core\Plugin\PluginBase;
 
$facet = 'your_facet_id';
$render = [];
$block_manager = \Drupal::service('plugin.manager.block');
$config = [];
$block_plugin = $block_manager->createInstance('facet_block' . PluginBase::DERIVATIVE_SEPARATOR . $facet, $config);
if ($block_plugin) {
  $access_result = $block_plugin->access(\Drupal::currentUser());
  if ($access_result) {
    $render = $block_plugin->build();
  }
}
if (count($render) > 0) {
  $language_manager = \Drupal::service('language_manager');
  $lang_code = $language_manager->getCurrentLanguage()->getId();
  $translated_label = $language_manager->getLanguageConfigOverride($lang_code, 'facets.facet.' . $facet)->get('name');
  $variables[$facet] = [
    'title' => $translated_label ? $translated_label : $block_plugin->label(),
    'render' => $render,
  ];
}

Als erstes benötigen Sie die Facet-Id. Die Facet-Id ist der maschinen-lesbare Name, den Sie angegeben haben, als Sie das Facet angelegt haben. Falls Sie sich nicht mehr daran erinnern, könnten Sie die verfügbare Konfiguration ansehen (Facets speichert seine Konfiguration unter facets.facet.<id>) oder Sie schauen sich die Bearbeiten-URL auf der Konfigurations-Seite des Facets-Moduls an (admin/config/search/facets/<id>/edit). Dann lassen wir uns eine Instanz des BlockManagers geben und erzeugen eine neue Instanz des Facet-Blocks. Da der aktuelle Benutzer möglicherweise keinen Zugriff auf den Block hat, überprüfen wir das, nur um sicherzugehen, und dann bauen wir das Plugin. Falls das Facet nicht leer ist, lassen wir uns den überschriebenen Titel aus der Facet-Konfiguration geben, falls es einen gibt, und stellen das Ergebnis dann als renderable array in einer Template-Variable zur Verfügung.

Systeme
Drupal 8