Puncte:-2

Cum arăt un bloc cu un QR unic pentru fiecare nod?

drapel th

Există o cerință în care trebuie să plasez un bloc pe nodul în care fiecare bloc va avea codul QR unic.

Am creat un bloc de cod QR codificat cu următorul cod.

public function build() {
  $cale = '';
  $directory = "public://Imagini/QrCodes/";
  \Drupal::service('file_system')->prepareDirectory($directory, \Drupal\Core\File\FileSystemInterface::CREATE_DIRECTORY);
  $qrName = 'myQrcode';
  $uri = $director . „QR”. „.png”; // generează o imagine png.
    
  $cale = \Drupal::service('file_system')->realpath($uri);
    
  \PHPQRCode\QRcode::png(„www.google.com”, $cale, „L”, 4, 2);
  
  $relative_file_url = \Drupal::service('file_url_generator')
    ->generateAbsoluteString($uri); 
    
  $qr_image = "<img src='{$relative_file_url}'/>";
      
  întoarcere [
    '#markup' => $qr_image,
  ];
}

Singura problemă este că nu pot adăuga blocul la noduri și nici nu pot face codul QR dinamic.

Înseamnă că fiecare nod va avea un bloc unic de cod QR.

Cum se creează un bloc dinamic în hook_preprocess_node?

Te rog ajuta-ma

leymannx avatar
drapel ne
Deci aceasta a fost sarcina inițială legată de întrebarea https://github.com/Dineshkushwaha/sph-test/blob/main/README.md și pare puțin ca și cum ai lăsa pe alții să-ți facă temele.
drapel fr
Mai întâi trebuie să înțelegeți ce sunt un bloc și un nod și cum diferă de o pagină. Nu poți „plasa un bloc pe un nod”. Blocurile sunt plasate pe o *pagină*, ca parte a afișajului paginii; acea pagină ar putea sau nu *de asemenea* să afișeze un nod.
leymannx avatar
drapel ne
Și există doar o listă de cereri de extragere cu soluții posibile. https://github.com/Dineshkushwaha/sph-test/pulls Poate încercați mai întâi să le citiți și să le înțelegeți.
apaderno avatar
drapel us
Răspunsul la *Cum creez un bloc dinamic în `hook_preprocess_node()`?* este *Nu o faci.* deoarece `hook_preprocess_node()` nu se crede că creează blocuri dinamice.
Puncte:5
drapel cn

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ă.

drapel th
Dar cum adaug bloc pe nod?
4uk4 avatar
drapel cn
Plasați blocul în bara laterală din dreapta, conform [planului dvs.](https://drupal.stackexchange.com/questions/310719/how-do-i-show-a-block-with-a-unique-qr-for -each-node/310724?noredirect=1#comment395068_310721). Atunci când vizitați un nod, blocul va fi afișat, cu QR-Code pentru acel nod. Pe alte pagini blocul este gol și va fi ascuns.
leymannx avatar
drapel ne
(Nodul ar putea fi injectat din context și apelurile \Drupal ar trebui evitate. )
4uk4 avatar
drapel cn
@leymannx, contextul este o idee grozavă și asta elimină orice apeluri \Drupal, fără DI ;-)
Jaypan avatar
drapel de
De asemenea, puteți adăuga blocul în Layout Builder dacă îl utilizați.
Puncte:2
drapel cn
  1. Răspunsul simplu este: dacă nu vrei/nu poți folosi https://www.drupal.org/project/twig_tweak - apoi doar copiați codul drupal_block Extensie crenguță de la modulul respectiv la modul propriu.

  2. Dacă nu este cazul - pur și simplu implementați hook_preprocess_node și puneți acolo codul de construcție a blocului sau încărcați blocul și trimiteți-l la un șablon de nod prin $variabile.

  3. Utilizați modulul de constructor de layout (în nucleu) pentru a plasa blocurile pe paginile nodului.

drapel cn
BTW, din codul dvs. nu văd cum s-a conectat la un anumit nod.
drapel th
Am căutat mult, dar nu am găsit modalitatea de a plasa blocul pe noduri. Puteti ajuta va rog
drapel th
am găsit acest lucru https://stackoverflow.com/questions/43771500/using-preprocess-hook-on-specific-node-type-in-drupal-8..Încercare acum
drapel cn
Doar copiați conținutul metodei `build()` a blocului în preprocesarea nodului și scăpați de bloc.
drapel cn
A adăugat încă o soluție.
drapel th
În declarația problemei, se menționează clar că trebuie să folosesc Block și acel bloc ar trebui să fie plasat pe bara din partea dreaptă, dar mulțumesc pentru răspunsuri.
Puncte:1
drapel fr

Modulul Coduri de bare https://www.drupal.org/project/barcodes oferă un bloc care afișează un cod de bare de orice tip, inclusiv codul QR. Această sarcină este la fel de simplă ca activarea modulului, apoi configurarea blocului pentru a afișa ceea ce doriți. Nu este necesară codificarea. Codurile de bare acceptă jetoane, astfel încât să puteți codifica și afișa în mod dinamic un ID de produs, un ID de nod sau orice alte informații din blocul de coduri de bare.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.