Puncte:1

Exemplu hook_pathauto_pattern_alter

drapel cn

Nu înțeleg cârligul. M-aș aștepta ca „modelul_modelului” să-mi permită să „alterez” „modelul”. Dar se pare că nu este cazul.

De asemenea, am încercat să modific pseudonimul... care nici nu pare să aibă efect.

Poate cineva să-mi arate un exemplu de lucru, vă rog?

funcția xxx_pathauto_pattern_alter(\Drupal\pathauto\PathautoPatternInterface &$pattern, matrice $context) {

  /* //////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////
  //// article_type - suprascrie logica căii pentru nodurile *arhivate* ('/archiv/[node::title]')
  /* //////////////////////////////////////////////////////////////////// ////////////////////////////////////*/
  if( $context['op'] === "actualizare" && $context['bundle'] === "știri") {

    $nod = $context['date']['node'];
    $arhivat = $nod->get('field_archived')->getString() === "1";
    dacă ($arhivat) {

      $pattern->setPattern('/archive/[node::title]');
      dpm($pattern); //LUCRĂRI !!! numai în obiect. Modelul nu se va schimba în lumea reală.
    }
  }
}

funcția xxx_pathauto_alias_alter(&$alias, matrice &$context) {
  /* //////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////
    //// article_type - suprascrie logica căii pentru nodurile *arhivate* ('/archive/[node::title]')
    /* //////////////////////////////////////////////////////////////////// ////////////////////////////////////*/
  if ($context['op'] === "actualizare" && $context['bundle'] === "știri") {

    $nod = $context['date']['node'];
    $arhivat = $nod->get('field_archived')->getString() === "1";
    dacă ($arhivat) {
      $alias = "/arhiva/nu";
      dpm($alias); //LUCRĂRI !!! numai în funcție. Aliasul nu se va schimba în lumea reală.
    }
  }
Puncte:2
drapel us

hook_pathauto_pattern_alter() este invocat numai atunci când:

  • Entitatea are un cale camp
  • Procesarea Pathauto este activată
  • Pentru entitățile care acceptă revizuiri, entitatea utilizează versiunea implicită
  • Un model implicit a fost setat pentru acea entitate
  • $entity->toUrl()->getInternalPath() nu arunca a EntityMalformedException, UndefinedLinkTemplateException, sau UnexpectedValueException excepție

Cârligul afișat este, de asemenea, invocat numai atunci când o entitate este actualizată, nu atunci când este creată o entitate.
Când modulul Pathauto a fost setat să nu schimbe un alias de cale existent, chiar dacă hook_pathauto_pattern_alter() au fost invocate, alias-ul căii nu va fi schimbat.

Ca o notă secundară, hook-ul ar trebui să verifice mai întâi că entitatea pentru care este invocat hook-ul este un nod, ceea ce este în exemplul hook-ului pathauto.api.php face.

/**
 * Modificați modelul care urmează să fie utilizat înainte ca un alias să fie generat de către Pathauto.
 *
 * Acest cârlig va fi apelat numai dacă este configurat un model implicit (activat
 * admin/config/search/path/patterns).
 *
 * @param \Drupal\pathauto\PathautoPatternInterface $pattern
 * Modelul Pathauto care trebuie utilizat.
 * @param array $context
 * O serie asociativă de opțiuni suplimentare, cu următoarele elemente:
 * - „modul”: modulul sau tipul de entitate care este alias.
 * - 'op': Un șir cu operația efectuată asupra obiectului
 * alias. Poate fi „inserat”, „actualizare”, „return” sau „bulkupdate”.
 * - „sursă”: un șir al căii sursei pentru alias (de exemplu, „nod/1”).
 * - 'data': o matrice de obiecte cu cheie de transmis la token_replace().
 * - „bundle”: subtipul sau pachetul obiectului care este alias.
 * - „limba”: un șir de cod de limbă pentru alias (de exemplu, „en”).
 * Acest lucru poate fi modificat prin referință.
 */
funcția hook_pathauto_pattern_alter(\Drupal\pathauto\PathautoPatternInterface $pattern, matrice $context) {
  // Închideți orice simbol [node:created:*] cu [node:updated:*] la actualizare.
  if ($context['modul'] == 'nod' && ($context['op'] == 'actualizare')) {
    $pattern->setPattern(preg_replace('/\[node:created(\:[^]]*)?\]/', '[node:updated$1]', $pattern->getPattern()));
  }
}

Codul pentru cârligul afișat ar fi similar cu următorul.


utilizați Drupal\pathauto\PathautoPatternInterface;

function mymodule_pathauto_pattern_alter(PathautoPatternInterface $pattern, matrice $context) {
  if ($context['modul'] == 'nod' && $context['op'] === "actualizare" && $context['bundle'] === "știri") {
    $nod = $context['date']['node'];
    $arhivat = $nod->get('field_archived')->getString() === "1";
    dacă ($arhivat) {
      $pattern->setPattern('/archive/[node::title]');
    }
  }
}

Obiectele sunt deja trecute prin referință; nu este necesar să se definească primul parametru ca &$model.

De asemenea, aș verifica că nu există alte module implementate hook_pathauto_pattern_alter() pentru care implementarea lor este invocată după implementarea prezentată în întrebare și asta modifică modelul pentru aceeași entitate și același pachet.

Referințe

mogio avatar
drapel cn
Apaderno. Mulțumesc pentru răspunsul lung și detaliat! .. pare să funcționeze!

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.