Puncte:0

Cum să utilizați hook_block_access() cu bloc personalizat creat în UI

drapel gb

Am un bloc personalizat creat folosind biblioteca de blocuri personalizate Drupal 9. Vreau să folosesc hook_block_access() pentru a controla accesul la acesta, dar, deoarece este un bloc personalizat, nu are un nume de mașină de blocare. Singurul ID pe care îl pot găsi (folosind variabilele Devel) este:

Obiectul stdClass ( [CLASĂ] => Drupal\block_content\Entity\BlockContent [theme:protected] => [values:protected] => Matrice
( [id] => Matrice ( [x-default] => 4 )

        [revision_id] => Matrice
            (
                [x-default] => 4
            )

        [type] => Array
            (
                [x-default] => de bază
            )

        [uuid] => Matrice
            (
                [x-default] => f0c17429-584a-4221-995c-c00f4c41c714
            )

        [langcode] => Matrice
            (
                [x-default] => en
            )

        [revision_user] => Matrice
            (
                [x-implicit] => 
            )

        [revision_created] => Matrice
            (
                [x-default] => 1632243859
            )

        [revision_log] => Matrice
            (
                [x-implicit] => 
            )

        [revision_default] => Matrice
            (
                [x-default] => 1
            )

        [isDefaultRevision] => Matrice
            (
                [x-default] => 1
            )

        [status] => Matrice
            (
                [x-default] => 1
            )

        [info] => Array
            (
                [x-default] => Adăugați conținut
            )

        [modificat] => Matrice
            (
                [x-default] => 1632261438
            )

        [default_langcode] => Matrice
            (
                [x-default] => 1
            )

        [revision_translation_affected] => Matrice
            (
                [x-default] => 1
            )

        [reutilizabil] => Matrice
            (
                [x-default] => 1
            )

        [body] => Array
            (
                [x-default] => Matrice
                    (
                        [0] => Matrice
                            (
                                [valoare] => 

etc...

Ajung la editarea blocului mergând la: http://mysite.com/block/4

Cum pot folosi hook_block_access(Blocați $block, $operațiune, AccountInterface $cont) pentru a controla accesul la acest bloc? Cum identific acest bloc în $bloc variabil?

Puncte:2
drapel cn

După ce ați creat blocul personalizat în UI, îl puteți plasa în diferite regiuni. Fiecare dintre aceste instanțe primește un nume de mașină și hook_block_access() funcționează conform intenției.

Dacă doriți să controlați accesul la nivel de entitate de conținut, acest lucru are sens deoarece puteți utiliza conținutul bloc nu numai în aspectul bloc, ci și implementați un cârlig de acces pentru tipul de entitate block_content:

utilizați Drupal\Core\Access\AccessResult;
utilizați Drupal\Core\Entity\EntityInterface;
utilizați Drupal\Core\Session\AccountInterface;

/**
 * Implementează hook_ENTITY_TYPE_access().
 */
function mymodule_block_content_access(EntityInterface $entity, $operation, AccountInterface $cont) {
  if ($operațiune == 'vizualizare') {
    if ($entity->id() == 4) {
      returnează AccessResult::interzis();
    }
  }
  returnează AccessResult::neutral();
}
SomebodySysop avatar
drapel gb
Am descoperit că hook_block_access() nu funcționează deloc atunci când blocul este plasat folosind constructorul de layout. hook_entity_type_access(), pe de altă parte, funcționează perfect. Multumesc pentru aceasta.

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.