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