web-dev-qa-db-fra.com

Afficher un bloc uniquement pour les nœuds d'un type de contenu spécifique, comment puis-je vérifier le type de contenu à l'aide de PHP?

J'ai un bloc que j'aimerais seulement afficher sur un nœud KYN. J'utilise actuellement l'option pour afficher le bloc uniquement sur les pages avec "node/*" qui fonctionnaient lorsque je n'utilisais qu'un seul type de nœud mais maintenant que j'en ai deux (kYNs et Pages), je dois trouver une solution.

Je voudrais utiliser un PHP qui renvoie TRUE lorsque le type de contenu d'un nœud KYN .

Comment puis-je atteindre cet objectif?

6
Mike
// Only show if $match is true
$match = FALSE;

// Which node types
$types = ['kYn'];

// Match current node type with array of types
if (arg(0) == 'node' && is_numeric(arg(1))) {
  $nid = arg(1);
  $node = node_load($nid);
  $type = $node->type;
  $match |= in_array($type, $types);
}

return $match;

source: http://drupal.org/node/115419

11
Axel

Pour développer le commentaire de sheena_d:

Dans Drupal 7 montrant un bloc pour un ou plusieurs types de nœuds spécifiques est disponible dès la sortie de la boîte, sans avoir besoin d'écrire de PHP.

Où vous ajouteriez normalement PHP dans le bloc "paramètres de visibilité", sélectionnez "types de contenu" dans le menu de gauche. Sélectionnez ensuite les types de contenu sur lesquels vous souhaitez que le bloc s'affiche.

J'espère que cela aide à simplifier cela pour quelqu'un.

Where you would normally add PHP in the block 'visibility settings' select 'content types' from the menu on the left.

Then select the content types you wish the block to display on

2
Paul Trotter

Les blocs ne savent rien de la zone de contenu, vous devez donc vérifier d'autres conditions, comme le chemin Drupal:

$is_kyn_page = false;

if (arg(0) == 'node' && is_numeric(arg(1))) {
  $node = node_load(arg(1));
  if ($node && $node->type == 'kYN') {
    $is_kyn_page = true;
  }
}

Notez que 'kYN' est le nom de l'ordinateur du type de nœud, pas le nom lisible par l'homme.

1
Oswald

Si vous demandez en tant qu'administrateur d'un site Drupal, vous n'avez pas besoin d'écrire PHP pour réaliser ce que vous avez décrit: chaque fois que c'est un bloc que vous avez créé à partir de l'interface utilisateur, ou c'est un bloc implémenté à partir d'un module, vous pouvez changer pour quels types de contenu le bloc est affiché.

Sur admin/structure/block, recherchez le bloc que vous souhaitez afficher uniquement pour certains types de contenu. (Dans les captures d'écran suivantes, j'utiliserai le bloc Aide système comme exemple.)

screenshot

Cliquez sur le lien configurer que vous trouverez à droite. Vous accéderez aux paramètres de ce bloc.

screenshot

Cliquez sur Types de contenu . Vous obtiendrez la liste des types de contenu définis sur le site.

screenshot

Comme le dit la description, la sélection d'un type de contenu fera apparaître le bloc sur les nœuds de ces types de contenu. Si vous ne sélectionnez aucun type de contenu, le bloc apparaîtra sur chaque nœud. (Cela signifie qu'il n'est pas nécessaire de sélectionner chaque type de contenu pour afficher le bloc pour tous les nœuds.)

Si vous demandez un bloc implémenté par un module que vous développez, vous pouvez alors décider quand le bloc sera affiché, dans hook_block_view().

function mymodule_block_view($delta = '') {
  switch ($delta) {
    // Replace 'block_id' with the block identifier.
    case 'block_id':
      // $node->type is case sensitive; use the exact content type identifier.
      if ($node = menu_get_object() && $node->type == 'KYN') {
        // Add the block title in $block['subject'],
        // the block content in $block['content'], and return $block.
      }
      break;
  }
}

J'ai utilisé menu_get_object() car il charge l'objet nœud approprié, même lorsque la page est destinée à une révision de nœud (par exemple,/nœud/1/révisions/2/vue).

0
kiamlaluno