Puncte:0

Cum să personalizați accesul pentru entitatea paragraphs_type?

drapel cz

Am o problemă cu entitatea paragraphs_type, când adaug un paragraphs_type într-un nod, cu elemente de paragraf înăuntru și îi setez starea de nepublicare, utilizatorii anonimi îl pot vedea în continuare. tip de paragraf nepublicat Încerc să personalizez accesul prin moduri diferite:

/**
 * Implementează hook_ENTITY_TYPE_access().
 * ENTITY_TYPE: paragraphs_type
 */
funcția my_module_paragraphs_type_access(
  Drupal\Core\Entity\EntityInterface $entity,
  $operatie,
  \Drupal\Core\Session\AccountInterface $cont
) {
  ecou '<pre>';
  var_dump('my_module_paragraphs_type_access');
  var_dump($operatie);
  var_dump($cont);
  Ieșire();
  //Ascunde paragraful pentru utilizatorii anonimi dacă nu este publicat
    if ($operation == 'vizualizare'
        && !$entity->isPublished()
        && ($cont->isAnonymous() ||
        !$account->hasPermission('vezi paragrafele nepublicate'))
      ) {
    returnează \Drupal\Core\Access\AccessResult::forbidden();
  }

  returnează \Drupal\Core\Access\AccessResult::allowed();
}

Nu e treaba, var_dump('my_module_paragraphs_type_access'); nu se execută niciodată

Sau o clasă personalizată care extinde ParagraphsTypeAccessControlHandler :

<?php

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

/*
 * Adăugați acces personalizat paragraphs_type
 */
clasa CustomParagraphsTypeAccessControlHandler extinde ParagraphsTypeAccessControlHandler {
  
  /**
   * {@inheritdoc}
   */
  funcția protejată checkAccess(EntityInterface $entity, $operation, AccountInterface $cont) {
    comutator ($operare) {
      cazul „vezi paragrafe nepublicate”:
        if($cont->este anonim())
          returnează AccessResult::interzis();
        pauză;
      caz „vezi eticheta”:
        return AccessResult::allowedIfHasPermission($cont, „acces conținut”);
      Mod implicit:
        return parent::checkAccess($entity, $operation, $cont);
    }
  }
}

dar tot la fel... Un alt plan de a le ascunde utilizatorilor anonimi?

Am gasit o problema asta:https://www.drupal.org/project/paragraphs/issues/3095959#comment-13363535

Chris4783 avatar
drapel gb
Este nebifată permisiunea „Vizualizare paragrafe nepublicate” pentru utilizatorii anonimi? Cârligul „hook_ENTITY_TYPE_access” trebuie să fie numit „my_module_paragraph_access”. Ați modificat tipul de entitate pentru AccessControllHandler cu cârligul „my_module_entity_type_alter”?
florian_drupal avatar
drapel cz
Da, permisiunea „Vizualizare paragrafe nepublicate” este nebifată, sunt confundat cu tipurile de entități `paragraph` și `paragraphs_types`, nu sunt aceeași entitate. Pentru a trece noul meu AccessControllHandler, folosesc `hook_entity_type_build` cu asta: `$entity_types['paragraphs_type']->setHandlerClass('access', 'Drupal\my_module\Access\CustomParagraphsTypeAccessControlHandler');`
Chris4783 avatar
drapel gb
Tipul de entitate paragraphs_types este pachetul paragrafului, de exemplu WYSIWYG. Tipul de paragraf este un paragraf al unui pachet specific, de exemplu WYSIWYG. Deci trebuie să modificați accesul la paragraf și nu la paragraphs_type. Utilizați cârligul `hook_entity_type_alter` pentru a modifica manipulatorul de control al accesului înregistrat. `hook_entity_type_build` doar adaugă informații suplimentare și nu le modifică. Apoi folosiți `$entity_types['paragraph']->setAccessClass`. Am încercat scenariul dvs. cu o instalare nouă și nu a trebuit să ajustez nimic, deși aveam activat modulul Permisiuni de tip Paragrafe.
florian_drupal avatar
drapel cz
multumesc pentru raspuns, nu am activat modulul Paragraphs Type in cazul meu, voi incerca solutia ta cu ``hook_entity_type_alter`` Nu am inteles dependenta entitatilor, acum e mai clar.
florian_drupal avatar
drapel cz
Încerc ceva: ``function my_module_paragraph_alter(array &$entity_types) { /** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */ ecou'
Chris4783 avatar
drapel gb
Funcția ta trebuie să fie numită `my_module_entity_type_alter`, nu `my_module_paragraph_alter`.
florian_drupal avatar
drapel cz
Mulțumesc, nu am văzut greșeala mea, am remediat-o, dar am o eroare: ```Tipul de entitate „paragraf” nu a specificat un handler de acces. în Drupal\Core\Entity\EntityTypeManager->getHandler()```
Chris4783 avatar
drapel gb
Se pare că aveți o problemă cu numele fișierului sau cu spațiul de nume. Asigurați-vă că utilizați spațiul de nume al fișierului, puneți fișierul în folderul corect și că fișierul este denumit corect.Poate că acest link vă poate ajuta [https://www.prometsource.com/blog/how-override-entity-access-handlers-drupal](https://www.prometsource.com/blog/how-override-entity- access-handlers-drupal)
florian_drupal avatar
drapel cz
Am găsit problema: este o randare personalizată cu hook_preprocess_node, fără a verifica accesul când paragraful este randat cu ``\Drupal::entityTypeManager()->getViewBuilder('paragraph')->view($paragraph, 'paragraph_type'); ``
Puncte:0
drapel cz

Am găsit problema, paragraful este redat programatic cu hook_preprocess_node, o rezolv prin verificarea accesului așa:

funcția mymodule_preprocess_node__my_node(&$variabile) {

  $nod = $variabile['nod'];

  $paragrafe = $nod->get('field_para_blocks');

  /** @var \Drupal\paragraphs\Entity\Paragraph $paragraph */
  foreach ($paragraphs->referencedEntities() ca $paragraph) {

    $bundle = $paragraf->bundle();

    if ($paragraf->acces('vizualizare')) {
      $bundle = $paragraf->bundle();
      $variables[$bundle] = \Drupal::entityTypeManager()
        ->getViewBuilder('paragraf')
        ->view($paragraph, 'my_paragraph_type');
    }
  }

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.