J'ai créé un nouveau type de bloc personnalisé à partir de /admin/structure/block/block-content/types
ayant des champs x
et y
avec respectivement les types de champ image et textfield
. Puis créé un bloc avec le même type de bloc et une image téléchargée dans x
et du texte dans y
. Voici mon problème: comment charger ce bloc via du code?
Plus que cela, comment obtenir les valeurs de ces champs de bloc x
et y
en chargeant le bloc?
J'ai essayé ces derniers:
$block = \Drupal\block_content\Entity\BlockContent::load($bid);
$render = \Drupal::entityManager()->getViewBuilder('block_content')->view($block);
mais ça n'a pas marché.
Placez le bloc dans la section désactivée à admin/structure/block, cela crée une instance de bloc avec votre type block_content, donnez-lui un joli nom de machine facile à retenir.
En le plaçant dans la section désactivée, il n'apparaîtra pas jusqu'à ce que vous le chargiez par programme.
Puis en utilisant le nom de votre machine:
$machine_name = 'myblock';
$block = \Drupal::entityTypeManager()
->getStorage('block')
->load($machine_name);
if (!empty($block)) {
$block_content = \Drupal::entityTypeManager()
->getViewBuilder('block')
->view($block);
$pre_render = $block_content;
}
Si vous voulez vraiment obtenir les champs rendus, vous pouvez faire:
$render = \Drupal::entityTypeManager()
->getViewBuilder('block')
->build($pre_render);
Mais il est plus courant d'utiliser les formateurs de Drupal et autres et peut-être un modèle personnalisé, plutôt que de construire le bloc et d'extraire des éléments du tableau de rendu rendu.
$block = \Drupal::service('entity.repository')->loadEntityByUuid('block_content', $uuid);
if (!empty($block)) {
$recArticleAdView = \Drupal::entityTypeManager()
->getViewBuilder('block_content')
->view($block);
$rendered = \Drupal::service('renderer')->render($recArticleAdView);
$response = new CacheableResponse($rendered);
$response->addCacheableDependency(CacheableMetadata::createFromRenderArray($recArticleAdView));
$variables['content']['sponsored_content'] = Markup::create(trim(strip_tags($response->getContent(), '<div>')));
}
Essayez ce code en incluant EntityInterface
:
// Block
use Drupal\Core\Entity\EntityInterface;
// the last part of the parameter is the block id
$block = \Drupal\block\Entity\Block::load('yourblockid');
$block_content = \Drupal::entityManager()
->getViewBuilder('block')
->view($block);
\Drupal::service('renderer')->renderRoot($block_content);
Mon cas était différent: je charge un bloc personnalisé dans le fichier .theme. Je n'ai pas pu obtenir le "Block ID" exact dans un chiffre.
J'ai le nom de la machine à blocs. Dans ce cas, utilisez le code suivant.
$block_config = \Drupal\block\Entity\Block::load($machine_blockid);
$uuid = $block_config->getPlugin()->getDerivativeId();
$block_content = \Drupal::service('entity.repository')->loadEntityByUuid('block_content', $uuid);
if ($block_content) {
$img = file_create_url($block_content->field_X_image->entity->uri->value);
$color = $block_content->field_Y_textfield->value;
}
Sinon, utilisez le code suivant. $bid
est l'ID du contenu du bloc. Vous voyez cela dans/block/[enchère].
$block = \Drupal\block_content\Entity\BlockContent::load($bid);
$x_img_url = file_create_url($block_content->field_X_image->entity->uri->value);;
$y_textfield_value = $block_content->field_Y_textfield->value;
Il y a deux questions. @Oknate explique parfaitement comment charger et rendre un bloc configuré.
La deuxième question: plus que cela, comment obtenir les valeurs de ces champs de bloc "x" et "y" en chargeant le bloc?
C'est facile, car vous avez déjà chargé l'entité de contenu de bloc, où les champs sont stockés dans la base de données.
$block = \Drupal\block_content\Entity\BlockContent::load($bid);
Vous pouvez accéder à la valeur depuis le champ de texte
$text = $block->field_y->value;
et récupérez l'url du champ image.
$image_url = file_create_url($block->field_x->entity->uri->value);