Comment afficher les blocs à afficher dans certaines pages de Drupal?

10

Considérons un module déserts:

  • Page 1:- deserts/*
  • page 2:- deserts/*/*
  • page3: - deserts/*/*/*

Un contenu dynamique ...

J'ai trois blocs, à savoir a, b et c:

  • Le bloc a doit être affiché uniquement dans la page 1
  • Le bloc b doit être affiché uniquement dans la page 2
  • Le bloc a ne doit être affiché que dans la page 3

Comment devrait faire cette restriction?

Ajmal
la source
Drupal 6 ou 7? 6 facilite la définition du code PHP pour la visibilité des blocs.
Mołot
C'est drupal7 molot
Ajmal
2
@Ajmal Il serait utile que vous puissiez commenter les réponses données et expliquer pourquoi elles n'ont pas aidé. Les gens supposeront (naturellement) que la réponse à haut vote est la bonne et ne continueront pas à fournir une alternative, si vous n'avez pas expliqué pourquoi cette réponse ne fonctionne pas pour vous.
Clive
J'ai la page que desert/*/*/ desert/*/editmon bloc devrait afficher pour tous les desert/*/*pas. desert/*/edit Dans ce cas, cela ne fonctionne pas pour moi ..
Ajmal
1
C'est peut-être juste moi, mais cela semble déroutant. *signifie caractère générique. Donc, demander une solution où le bloc apparaît desert/*/*signifie qu'il devrait apparaître pour desert/*/editou, d'ailleurs desert/*/whatever.
cdmo

Réponses:

18

Utilisez le module de contexte . Bien que je ne sois généralement pas fan de ce module, c'est l'un des cas où il est utile.

Ajoutez une condition pour un chemin. Donc, si je veux un bloc à la page 1, mais pas à la page 2 ou 3, j'écrirais les chemins comme ça, un pour chaque bloc:

Cas 1 - Bloc A

déserts / *
~ déserts / * / *
~ déserts / * / * / *

Cas 2 - Bloc B

~ déserts / *
déserts / * / *
~ déserts / * / * / *

Cas 3- Bloc C

~ déserts / *
~ déserts / * / *
déserts / * / * / *

Le ~ signifie à exclure dans ce cas. Après cela, ajoutez le bloc à la région que vous souhaitez qu'il apparaisse. Vous pouvez également ajouter des chemins d'accès spécifiques qui pourraient autrement être exclus, et vice versa.

kyletaylored
la source
Cela vaut pour ce cas. Mais nous voulons corriger cela pour tous les scénarios possibles, c'est la solution originale, il y a un cas où cela ne tient pas bon. j'ai expliqué ce cas ci-dessus. veuillez donc vous reporter à
Ajmal
J'ai mis à jour ma réponse, alors j'espère que cela l'expliquera mieux. Vous feriez une règle pour chaque bloc.
kyletaylored
4

Vous pouvez utiliser l'option de visibilité "Pages sur lesquelles ce code PHP renvoie VRAI (expert uniquement)". Mais mettre du code PHP dans la base de données est, à mon humble avis, une mauvaise pratique. Au lieu de cela, envisagez d'utiliser quelque chose comme le module de visibilité de bloc étendu ou l'implémentation de hook_block_list_alter()tels que

function MODULE_block_list_alter(&$blocks) {
  global $theme_key;
  foreach ($blocks as $key => $block) {
    if (!isset($block->theme) || !isset($block->status) || $block->theme != $theme_key || $block->status != 1) {
      // This block was added by a contrib module, leave it in the list.
      continue;
    }
    switch ("{$block->module}_{$block->delta}") {
      case "moduleA_deltaA":
        if (arg(0) != 'deserts' || !arg(1) || arg(2)) {
          unset($blocks[$key]);
        }
        break;
      case "moduleB_deltaB":
        if (arg(0) != 'deserts' || !arg(1) || !arg(2) || arg(3)) {
          unset($blocks[$key]);
        }
        break;
      case "moduleC_deltaC":
        if (arg(0) != 'deserts' || !arg(1) || !arg(2) || !arg(3)) {
          unset($blocks[$key]);
        }
        break;
    }
  }
}

Remarque: Il existe probablement un moyen plus intelligent d'implémenter votre règle de visibilité.

Pierre Buyle
la source
0

Vous devriez pouvoir faire fonctionner cela en utilisant le module de visibilité du bloc de règles . Voici une citation de sa page de projet:

Le module de visibilité des blocs de règles permet aux composants de règles d'être utilisés pour contrôler la visibilité des blocs. Cela offre aux administrateurs et développeurs Drupal une flexibilité extrême pour contrôler le moment où les blocs doivent être affichés sur leurs sites Web, en plus des options de visibilité par défaut fournies par Drupal.

L'idée générale est que si vous pouvez le faire avec des règles, vous pouvez l'utiliser pour contrôler la visibilité des blocs, donc les possibilités sont illimitées:

  • Vous devez afficher un bloc uniquement pour les utilisateurs enregistrés il y a plus d'un mois?

  • Peut-être avez-vous un bloc qui ne doit être affiché qu'entre 8 h et 17 h en semaine?

  • Qu'en est-il de l'affichage ou du masquage d'un bloc en fonction des conditions météorologiques actuelles?

Tout cela peut être fait en utilisant la visibilité des blocs de règles.

Avec cela, et selon le " si vous pouvez le faire avec des règles, vous pouvez l'utiliser pour contrôler la visibilité des blocs " ci-dessus, vous avez réduit votre question à faire des règles intercepter les différentes URL correspondant à votre page1, page2 et page3.

Pierre.Vriens
la source