web-dev-qa-db-fra.com

Comment créer un bloc qui extrait le contenu du nœud actuel?

Ok, donc je sais que les blocs dans Drupal 8 ont ces choses appelées "contextes" qui permettent à Core d'effacer le cache sur une base fine. Je ne trouve aucune explication décente sur la façon dont ils fonctionnent , ou comment obtenir des variables de page d'eux ou autre chose.

Mon objectif est d'avoir un type de bloc qui rend les champs ou un mode d'affichage du nœud actuel dans le contenu du bloc. J'ai vu ailleurs comment on obtiendrait le nœud actuel, mais je ne comprends pas entièrement comment il est censé se réinjecter dans les contextes de cache. Je sais que #cache sur les tableaux de rendu existe, mais il y a aussi un tas de méthodes de ContextAwarePluginInterface que je ne suis pas sûr de ce qu'elles font. Y a-t-il des documents qui me manquent?

7
Libertardian

Il existe deux types de contextes complètement différents.

Contextes de cache, qui n'ont rien à voir avec cela. Ils ne sont pas utilisés pour invalider quelque chose, mais varient en fonction de quelque chose (par exemple, mettre en cache différemment pour différentes autorisations utilisateur). Les balises de cache sont destinées à l'invalidation.

Ce que vous voulez dire, ce sont des contextes de plugin. Et oui, les blocs peuvent les utiliser depuis peu de temps (ils le pouvaient toujours, mais le block.module ne le supportait pas correctement). Comme l'a dit @larowlan, le noyau les utilise principalement pour les conditions de visibilité, mais cela fonctionne de la même manière pour les blocs.

Un tel exemple que vous pouvez regarder est la condition NodeType . Ce que vous devez faire est d'ajouter l'annotation de contexte et vous pouvez ensuite l'utiliser comme $this->getContextValue('node'). L'avantage est que votre bloc est plus flexible et n'a pas besoin de savoir d'où vient exactement le nœud, c'est à l'utilisateur de le configurer.

Notez que cela n'est actuellement pas visible dans l'interface utilisateur, sauf s'il y a en fait plus d'un nœud à choisir.

9
Berdir

Pour utiliser le nœud en bloc, j'utilise le contexte. Par exemple: ce bloc affiche les liens pour l'édition et la suppression du nœud actuel:

/**
 * @file
 * Contains \Drupal\my_module\Plugin\Block\NodeMenuBlock.
 */

namespace Drupal\my_module\Plugin\Block;

use Drupal\Core\Block\BlockBase;
use Drupal\Core\Link;
use Drupal\Core\Url;

/**
 * @Block(
 *   id = "node_menu_block",
 *   admin_label = @Translation("Node Menu Block"),
 *   category = @Translation("My Group"),
 *   context = {
 *     "node" = @ContextDefinition(
 *       "entity:node",
 *       label = @Translation("Current Node")
 *     )
 *   }
 * )
 */
class NodeMenuBlock extends BlockBase {
  /**
   * {@inheritdoc}
   */
  public function build() {
    $node = $this->getContextValue('node');
    $nid_fld = $node->nid->getValue();
    $nid = $nid_fld[0]['value'];

    $markup = '';
    $links = ['entity.node.edit_form' => 'Edit', 'entity.node.delete_form' => 'Delete', ];
    foreach($links as $rout=>$text) {
      $url = Url::fromRoute($rout, array('node' => $nid));
      $link = Link::fromTextAndUrl(t($text), $url)->toRenderable();
      $link['#attributes'] = array('class' => array('button', 'button-action'));
      $markup .= render($link).' ';
    }

    $block = [
      '#type' => 'markup',
      '#markup' => $markup,
    ];
    return $block;
  }

}
8
Verter

Le plugin context contextual est principalement utilisé par les conditions de visibilité des blocs. Par exemple, voir la condition du nœud qui prend le nœud actuel. Je ne sais pas si les blocs en soi peuvent s'y accrocher. Je peux dire avec certitude que vous pouvez utiliser le service de correspondance d'itinéraire et obtenir le nœud actuel, s'il existe, à partir de cela.

1
larowlan

Consultez le module contrib du nœud de bloc: https://www.drupal.org/project/block_node

Introduction

Ce module fournit un bloc qui peut afficher le nœud actuel ou un nœud spécifié dans un mode d'affichage donné.

Utilisations possibles

Je souhaite afficher un nœud spécifique dans une région de la barre latérale à l'aide d'un mode d'affichage d'accroche. Je souhaite afficher une liste de nœuds d'accroche référencés par un champ de référence d'entité sur le nœud actuel.

Installation

Installez comme d'habitude, idéalement avec le compositeur. Activez le module.

Configuration

Placez le bloc à l'aide de la page de disposition de bloc comme vous le feriez normalement pour placer n'importe quel bloc.

Options de configuration:

Utiliser le nœud actuel

  • Lorsqu'elle est cochée, le nœud actuel sera affiché dans le bloc si le bloc est placé sur une page de nœud.

Noeud à afficher

  • Recherchez un nœud à afficher. Une fois sélectionné, ce nœud sera affiché dans le bloc.

Mode d'affichage

  • Choisissez le mode d'affichage parmi les options disponibles. Le nœud affiché dans le bloc sera affiché dans ce mode d'affichage.
  • Les autres paramètres sont les paramètres de bloc standard.
0
tekNorah