Aceasta este descrierea originală a sarcinii (acum eliminată din întrebare):
Construiți următoarele:
- Un tip de conținut Drupal pentru a păstra toate produsele lor
- Un bloc Drupal care poate fi plasat pe orice pagină de produs. Blocul, atunci când este plasat pe orice pagină de produs, afișează automat actualul
a afișat linkul de cumpărare al aplicației ca un cod QR, care site-ul
vizitatorii pot scana folosind mobilul lor.
Puteți folosi ruta curentă pentru a obține nodul și pentru a adăuga un bloc unic pentru fiecare nod:
/src/Plugin/Block/ExampleBlock.php:
<?php
spațiu de nume Drupal\mymodule\Plugin\Block;
utilizați Drupal\Core\Block\BlockBase;
/**
* Oferă un exemplu de bloc.
*
* @Bloc(
* id = "mymodule_example",
* admin_label = @Translation ("Exemplu"),
* categorie = @Translation("mymodule")
* )
*/
clasa ExampleBlock extinde BlockBase {
public function build() {
$build = [];
$nod = \Drupal::routeMatch()->getParameter('nod');
if ($node instanță a \Drupal\node\NodeInterface) {
// calculează $qr_image cu $node
$build = [
'#markup' => $qr_image,
'#cache' => ['tags' => $node->getCacheTags()],
];
}
$build['#cache']['contexts'] = ['rută'];
returnează $build;
}
}
2. Versiune
Implementarea aceluiași bloc cu un context de nod, așa cum a sugerat @leymann:
/src/Plugin/Block/ExampleBlock.php:
<?php
spațiu de nume Drupal\mymodule\Plugin\Block;
utilizați Drupal\Core\Block\BlockBase;
/**
* Oferă un exemplu de bloc.
*
* @Bloc(
* id = "mymodule_example",
* admin_label = @Translation ("Exemplu"),
* categorie = @Translation("mymodule"),
* context_definitions = {
* „nod” = @ContextDefinition(„entity:node”)
*}
* )
*/
clasa ExampleBlock extinde BlockBase {
public function build() {
$nod = $this->getContextValue('nod');
// calculează $qr_image cu $node
întoarcere [
'#markup' => $qr_image,
];
}
}
Avantajul, nu trebuie să ai grijă de cache, contextul face acest lucru automat. Dezavantajul, trebuie să faceți blocul dependent de un context atunci când îl plasați în aspectul blocului. Drupal nu este încă capabil să mapeze automat un context de bloc. Ai putea, de exemplu, să adaugi o vizibilitate pentru tipul de conținut, care oricum este probabil o idee bună.