it-swarm.com.de

Wie kann ein Block nur auf den aufgelisteten Seiten mit Platzhalter und ohne Unterseiten angezeigt werden?

Ich habe einen Block, den ich mit der Blockeinstellung "Nur die aufgelisteten Seiten" anzeige. Ich verwende ein Platzhalter-Sternchen, um den Block auf allen Seiten anzuzeigen, die auf about-us/ Folgen. Zum Beispiel: about-us/*

Das Problem ist, dass ich NUR Seiten unmittelbar nach about-us/ Anzeigen möchte. Zum Beispiel würde about-us/faq Den Block anzeigen, aber about-us/faq/content Sollte den Block NICHT anzeigen.

Ich habe about-us/*/ Versucht, aber das hatte keine Auswirkung.

Irgendwelche Vorschläge?

6
Sam

Methode 1. PHP Filter

Ich denke, Ihre Frage wird hier teilweise beantwortet:

Wie füge ich Seitenbeschränkungen für Blöcke in Drupal hinzu?

Nur Sie können diesen Code verwenden:

<?php
$arg = explode('/', drupal_get_path_alias());
if ($arg[0] == 'about-us' && $arg[1] && $arg[2] == NULL) {
  return TRUE;
}
else {
  return FALSE;
}
?>

Methode 2: Kontextmodul

Alternativ können Sie das Modul Context ausprobieren, das robustere Sichtbarkeitsoptionen bietet. Zum Beispiel können Sie einem Pfad zusätzlich zum Einfügen von Pfaden eine Tilde "~" voranstellen, um ausschließen it.

Ich denke, das sollte es tun:

about-us/*
~about-us/*/*

Bearbeiten: Zweite Methode hinzugefügt.

Bearbeiten: Verwenden von $ _GET ['q'] in Methode 1 anstelle von arg () (Thx, @leymannx!)

6
othermachines

Drupal 8 - Einfaches Modul, um dies zu erreichen: https://www.drupal.org/project/block_exclude_pages

Fügen Sie einfach den Pfad, den Sie ausschließen möchten, mit einem '!' Präfix.

Beispiel:

!/path/this

2
Jaime C.

Stellen Sie Ihre Blockanzeigeeinstellungen so ein, dass sie auf about-us/* angezeigt werden, und fügen Sie Ihrem Modul den folgenden Hook hinzu.

<?php
/**
 * Implements hook_block_list_alter().
 */
function my_module_block_list_alter(&$blocks) {
  $alias = explode('/', drupal_get_path_alias());
  if ($alias[0] == 'about-us' && isset($alias[1]) && isset($alias[2])) {
    // unset the bid (block id)
    unset($blocks[55]);
  }
}
?>

Bearbeiten: feste Bedingung - arg () gibt keinen Alias ​​zurück.

1
superdrupal

Verwenden von PHP Filtermodul In Blockeinstellungen> Seiten: Aktivieren

Seiten, auf denen dieser PHP Code TRUE zurückgibt (nur Experten)

Fügen Sie Folgendes ein:

<?php
return preg_match('/^about-us(\/[a-z]*)?(\/)?$/',
drupal_get_path_alias($_GET['q']));
?>
1
ar7max

In Drupal 8) können Sie das Modul Block Visibility Groups verwenden, um sehr einfach mehrere Bedingungen für einen oder mehrere Blöcke zu kombinieren. In diesem Fall können Sie eine Seite hinzufügen [path]/* Bedingung und eine negative [path]/*/* Bedingung.

1
HaleFx

Es gibt eine andere Alternative, um diese Frage zu beantworten ... für die der Filter PHP muss nicht aktiviert sein (was Sie nach Möglichkeit vermeiden sollten) ... Verwenden Sie einfach das Modul Rules Block Visibility . Hier ist ein Zitat von seiner Projektseite:

Mit dem Modul Blockblocksichtbarkeit können Regelkomponenten zur Steuerung der Blocksichtbarkeit verwendet werden. Dies bietet Drupal Administratoren und Entwicklern eine extreme Flexibilität bei der Steuerung, wann Blöcke auf ihren Websites angezeigt werden sollen, zusätzlich zu den von Drupal bereitgestellten Standardsichtbarkeitsoptionen.

Die allgemeine Idee ist, dass Sie, wenn Sie dies mit Regeln tun können, damit die Blocksichtbarkeit steuern können, sodass die Möglichkeiten unbegrenzt sind.

Müssen Sie einen Block nur für Benutzer anzeigen, die vor mehr als einem Monat registriert wurden?

Vielleicht haben Sie einen Block, der wochentags nur zwischen 8 und 17 Uhr angezeigt werden muss?

Was ist mit dem Ein- oder Ausblenden eines Blocks basierend auf den aktuellen Wetterbedingungen?

All dies kann mithilfe der Sichtbarkeit des Regelblocks erfolgen.

Damit und gemäß " wenn Sie es mit Regeln tun können, können Sie es verwenden, um die Blocksichtbarkeit zu steuern" oben, haben Sie Ihre Frage auf reduziert ) Regeln " Überprüfen Sie den Pfad der aktuellen Seite" (so dass nur der Block ist wird auf Ihren Seiten mit einem Pfad angezeigt, der mit "about-us/" beginnt, jedoch nicht auf Seiten mit einem Pfad wie "about-us/*/*").

Eine Illustration zur Verwendung dieses Moduls finden Sie in meiner Antwort auf " Wie kann verhindert werden, dass ein Ansichtsblock für Administratoren wie Benutzer/1 angezeigt wird? ". Es enthält eine Regelkomponente (im Exportformat "Regeln"), die Sie durch diese Variante ersetzen sollten, damit sie Ihrer spezifischen Frage entspricht.

{ "rules_block_visibility_show_on_selected_profile_pages" : {
    "LABEL" : "Show block on selected profile pages",
    "PLUGIN" : "rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "USES VARIABLES" : {
      "module" : { "label" : "Module", "type" : "text" },
      "delta" : { "label" : "Delta", "type" : "text" },
      "result" : { "label" : "Result", "type" : "boolean", "parameter" : false }
    },
    "IF" : [
      { "AND" : [
          { "text_matches" : {
              "text" : [ "site:current-page:path" ],
              "match" : "about-us\/",
              "operation" : "starts"
            }
          },
          { "NOT text_matches" : {
              "text" : [ "site:current-page:path" ],
              "match" : "about-us(\/[a-z]*)?(\/)?$/",
              "operation" : "regex"
            }
          }
        ]
      }
    ],
    "DO" : [ { "data_set" : { "data" : [ "result" ], "value" : "1" } } ],
    "PROVIDES VARIABLES" : [ "result" ]
  }
}

Hinweis : Die 2. Regelbedingung in der obigen Regelkomponente (mit dem regulären Ausdruck darin) muss möglicherweise weiter verfeinert werden, um perfekt zu Ihrem Fall zu passen. Das heißt, der "about-us(\/[a-z]*)?(\/)?$/" Teil davon (obwohl ich denke, dass es ziemlich nah an dem ist, worum es in Ihrer Frage geht).

0
Pierre.Vriens