it-swarm.com.de

Ansicht programmgesteuert ausblenden D8

Ich versuche, einen Ansichtsblock auszublenden, wenn er ein oder weniger Ergebnisse hat. Ich verwende dazu die Funktion MYTHEME_preprocess_views_view.

Hier ist der Code

// Removes product range if only one product is availiable!
if($variables['view']->id() == 'brand_product_range') {
  if(count($variables['view']->result) < 2) {
    // $variables['view']->destroy();
    // $variables['view']->setDisplay(false);
    // I want to hide block here!
  }
}

Ich habe es geschafft, die ID des Ansichtsblocks und die Anzahl der Ergebnisse in der Ansicht abzurufen, aber ich weiß nicht, wie ich den Block ausblenden soll. Ich habe die oben genannten Methoden ausprobiert, aber sie funktionieren nicht.

4
Bassem Mohamed

Ich gehe davon aus, dass Ihre Ansicht eine Blockanzeige verwendet und Sie nicht möchten, dass der Block überhaupt angezeigt wird, wenn nur 1 Ergebnis vorliegt.

Meiner Meinung nach sind Sie zu spät dran, um die Ansicht dort zu verbergen. Es ist möglich, es in der Themenebene auszublenden, aber ich denke nicht, dass es der optimale Ansatz ist.

Es gibt eine Reihe von Möglichkeiten, wie Sie dies tun können. Hier sind jedoch einige Möglichkeiten, wie Sie einen Hook in einem benutzerdefinierten Modul und nicht in einem Thema verwenden können. (Dies ist keine vollständige Liste der Optionen, die Sie haben.)

Option 1

  1. Binden Sie sich in den Ausführungsprozess der Ansicht ein und teilen Sie dem Prozess mit, dass die Ausführung fehlgeschlagen ist, damit die Ansicht nicht gerendert wird.

Zum Beispiel:

use Drupal\views\ViewExecutable;

function MODULE_NAME_views_post_execute(ViewExecutable $view) {
  // If there is only 1 result set the failure condition so that
  // execution will not continue and the view will not display.
  if ($view->id() == 'VIEW_NAME') {
    if (count($view->result) == 1) {
      $view->build_info['fail'] = TRUE;
    }
  }
}

Option 2

  1. Konfigurieren Sie Ihre Ansicht so, dass 'Block ausblenden, wenn die Ansichtsausgabe leer ist' = Ja
  2. Schließen Sie sich dem Ausführungsprozess der Ansicht an und löschen Sie die Ergebnisse, wenn Sie nicht möchten, dass sie angezeigt werden.

Zum Beispiel:

use Drupal\views\ViewExecutable;

/**
 * Implements hook_views_post_execute().
 */
function MODULE_NAME_views_post_execute(ViewExecutable $view) {
  // Clear the results if there is only 1 result.
  // The view will then hide as it is configured to hide the
  // block if empty.
  if ($view->id() == 'VIEW_NAME') {
    if (count($view->result) == 1) {
      $view->result = array();
    }
  }
}

Hinweis: Je nachdem, wie Sie die Ansicht ausblenden möchten, sollten Sie sich dieses ausstehenden Fehlers bewusst sein, wenn Ihr Ansichtsblock der einzige Block in Ihrer Region ist. Dies kann dazu führen, dass Ihre Region weiterhin angezeigt wird, obwohl Ihr Block dies nicht tut: https://www.drupal.org/project/drupal/issues/953034

4
rooby