Puncte:0

Cum să extinzi clasa de bloc de bază SystemBrandingBlock

drapel ph

Vă rugăm să indicați cum putem extinde clasa de bloc de bază Drupal\system\Plugin\Block\SystemBrandingBlock pentru a adăuga o metodă personalizată.

În cazul meu, vreau să includ funcția buildToArray() pentru a obține datele blocului în format matrice, mai degrabă decât matrice redată.

Metoda build() existentă:

public function build() {
    $build = [];
    $site_config = $this->configFactory->get('system.site');

    $build['site_logo'] = [
      '#theme' => 'imagine',
      '#uri' => theme_get_setting('logo.url'),
      '#alt' => $this->t('Acasă'),
      '#access' => $this->configuration['use_site_logo'],
    ];

    $build['site_name'] = [
      '#markup' => $site_config->get('nume'),
      '#access' => $this->configuration['use_site_name'],
    ];

    $build['site_slogan'] = [
      '#markup' => $site_config->get('slogan'),
      '#access' => $this->configuration['use_site_slogan'],
    ];

    returnează $build;
}

Metoda necesară pentru a adăuga:

funcția publică buildToArray() {
    $site_config = $this->configFactory->get('system.site');

    întoarcere [
      'site_logo' => theme_get_setting('logo.url'),
      'site_name' => $site_config->get('nume'),
      'site_slogan' => $this->configuration['use_site_slogan'],
    ];
}
drapel in
Bună ziua și bine ați venit la Drupal Answers! Ați putea, vă rog, să descrieți ce ați încercat, ce nu a funcționat și să postați vreun cod relevant?
drapel ph
@Beau Mulțumesc pentru comentariu. Am actualizat întrebarea la mai precis.
Puncte:0
drapel in

Extinderea unui bloc

Pentru a extinde blocul, veți defini un nou bloc, așa cum este descris în tutorialul următor, cu excepția faptului că veți extinde clasa Drupal\system\Plugin\Block\SystemBrandingBlock, în loc de clasă Drupal\Core\Block\BlockBase. Puteți adăuga apoi metoda personalizată la blocul nou definit.

https://www.valuebound.com/resources/blog/drupal-8-how-to-create-a-custom-block-programatically

Considerare alternativă

Dacă ceea ce ai nevoie de la SystemBrandingBlock este doar date, și nu neapărat un bloc real, aș sfătui să definiți în schimb a serviciu care furnizează datele de la dvs buildToArray() metodă.

Răspunsuri la comentarii

Este adevărat că acest lucru va crea un nou tip de bloc, în plus față de SystemBrandingBlock. Blocurile sunt gestionate, organizate și recuperate de către Block Plugin Manager. Ai putea să scrii un decorator pentru acest serviciu și să anulezi getDefinitions() metoda pentru a preveni originalul SystemBrandingBlock de a fi disponibil ca definiție de plugin, obținând efectul de înlocuire a originalului SystemBrandingBlock cu noul tău bloc.

Încă mi se pare că un serviciu este ceea ce ai nevoie. Prin examinarea codului din original SystemBrandingBlock definiția clasei, vedem asta SystemBrandingBlock se bazează doar pe un singur serviciu, config.fabrică. Deci, serviciul dvs. trebuie doar să injecteze config.fabrică serviciu pentru a prelua informațiile de care aveți nevoie pentru buildToArray() metoda (care ar putea fi mai bine redenumită ca ceva de genul getBrandingInfo()). Definirea unui serviciu în acest fel înseamnă că nu va trebui să vă faceți griji cu privire la implementarea sau implementarea unui bloc (care nu pare să fie ceea ce aveți nevoie, oricum) sau nevoia de a scrie un decorator de servicii.

Rețineți, de asemenea, că SystemBrandingBlock nu este sursa originală a datelor, ci mai degrabă un plugin pentru afișarea acelor date într-un format redat. Blocul este complet irelevant dacă tot ce vrei sunt datele.

În cele din urmă, vorbind în termeni mai largi, Drupal este organizat în mare parte în jurul pluginurilor, serviciilor și injecției de dependențe, iar familiarizarea cu aceste concepte vă va oferi instrumentele pentru a rezolva în mod sistematic multe probleme în Drupal.

drapel ph
Vă mulțumim pentru sugestii.
drapel ph
Vreau să extind toate blocurile disponibile. Prima abordare „Extinderea unui bloc” duce la duplicarea blocurilor. A doua abordare „De la serviciu” nu am putut accesa proprietățile protejate ale blocului, așa că trebuie să implementez acea logică de bloc în serviciu.
drapel ph
răspunsul tău mi-a oferit o altă perspectivă. Mulțumiri
drapel ph
Din câte am înțeles, putem suprascrie blocurile prin hook_block_alter și plugin decorator. Sunt clar despre cârlig. Vă rog să dați un exemplu despre decoratorul de pluginuri pentru bloc. Va fi de ajutor pentru mulți, deoarece nu există o documentație adecvată despre decoratorul de pluginuri.
drapel in
În Drupal, toate tipurile de pluginuri sunt gestionate de un manager de plugin, care este un serviciu. Un decorator de plugin este într-adevăr un decorator de servicii pentru un manager de plugin. Iată un tutorial grozav despre decoratorii de servicii Drupal 8: https://www.phase2technology.com/blog/using-symfony-service-decorators-drupal-8. În cazul dvs., veți dori să decorați serviciul al cărui ID este `plugin.manager.block`. Dar încă simt că un serviciu personalizat al dvs. este ceea ce aveți nevoie cu adevărat și va necesita mai puțină muncă.
drapel ph
Mulțumesc @Beau
Puncte:0
drapel gb

Dacă utilizați Drupal 9 și nu doriți să creați o duplicare a blocurilor, iată cel mai simplu mod de a înlocui o clasă de bloc: Pentru a anula clasa Block, puteți folosi hook_block_alter ca aceasta.

/**
 * Implementează hook_block_alter().
 */
funcția [MODULE]_block_alter(&$definiții) {
  foreach ($definiții ca $id => $definiție) {
    // Verificați ID-ul pluginului dvs. aici.
    if ($id === 'system_branding_block') {
      // Setează-ți noua clasă aici.
      $definitions[$id]['class'] = 'Drupal\MODULE\Plugin\Block\SystemBrandingBlockAlter';
    }
  }
}

Și apoi creați-vă noua clasă SystemBrandingBlockAlter în MODULE/src/Plugin/Block ca aceasta:

<?php

spațiu de nume Drupal\MODULE\Plugin\Block;

utilizați Drupal\system\Plugin\Block\SystemBrandingBlock;

clasa SystemBrandingBlockAlter extinde SystemBrandingBlock {
  
  public function build() {
    $site_config = $this->configFactory->get('system.site');
    întoarcere [
      'site_logo' => theme_get_setting('logo.url'),
      'site_name' => $site_config->get('nume'),
      'site_slogan' => $this->configuration['use_site_slogan'],
    ];
  }
  
}

Acum clasa responsabilă pentru blocul tău este Drupal\MODULE\Plugin\Block\SystemBrandingBlockAlter si nu Drupal\system\Plugin\Block\SystemBrandingBlock

drapel ph
Mulțumesc mult. Este exact ceea ce caut.
drapel ph
În matricea de definiții, putem vedea „provider” => „sistem”, dar vom suprascrie clasa de bloc din modulul nostru personalizat. Va avea vreun impact?
berramou avatar
drapel gb
dacă verificați `'furnizorul' == 'sistem'`, veți suprascrie toate clasele de blocuri create de modulul de sistem, nu numai SystemBrandingBlock

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.