Puncte:1

Cum se creează un alias URL automat pentru taxonomy/term/%tid/feed

drapel bd

Cum pot seta aliasuri URL automate pentru feedurile de taxonomie?

Spune că am un termen cu tid=1, numit sărbători, cu o adresă URL de sistem de /taxonomie/termen/1 care este accesibil prin alias-ul URL /sărbători. Apoi vreau ca feedul rss pentru termenul respectiv să fie accesibil pe aliasul URL /sărbători/feed sau /sărbători/rss.xml. A sunat destul de ușor când m-am gândit prima dată la asta, dar se pare că pathauto nu susține asta (sau am ratat-o). Știu că pot crea aliasul manual, dar având în vedere un număr de termeni X pe site, aș prefera să folosesc un model pentru generarea automată.

Singurele probleme pe care le-am găsit despre acest subiect sunt ambele depășite:

Am omis ceva sau vreun modul contrib pe care nu l-am văzut care oferă această funcționalitate?

hotwebmatter avatar
drapel nr
Cotizațiile Pathauto nu joacă bine cu vizualizarea implicită a termenilor taxonomiei. Nu am încă răspunsul, dar voi trimite la propria mea întrebare (asemănătoare cu a ta, dar mai complexă pentru că am de-a face cu taxonomia ierarhică
hotwebmatter avatar
drapel nr
https://drupal.stackexchange.com/a/304279/80164
4uk4 avatar
drapel cn
Când aveți deja aliasuri precum `/holidays`, puteți scrie un procesor de căi personalizat care să aplice acele aliasuri fără apendicele /feed sau /rss.xml. Extindeți https://api.drupal.org/api/drupal/core%21modules%21path_alias%21src%21PathProcessor%21AliasPathProcessor.php/class/AliasPathProcessor/9.2.x și apoi fie înlocuiți clasa în containerul de servicii, fie înregistrați-vă propria servicii de procesor de cale etichetate inbound și outbound.
berliner avatar
drapel bd
@hotwebmatter Mulțumesc pentru link, dar cred că problemele tale sunt destul de diferite de ale mele.
berliner avatar
drapel bd
@4k4 Mulțumesc pentru sugestie. Caut o soluție care nu necesită cod personalizat dacă este posibil. Voi ține cont de ideea ta, dar voi aștepta dacă cineva vine cu o modalitate mai ușoară de a realiza acest lucru. Încă sper că există o soluție pe care pur și simplu nu am văzut-o încă.
4uk4 avatar
drapel cn
Codul personalizat implică doar manipularea șirurilor de caractere ale căii. Nu e mare lucru.
berliner avatar
drapel bd
@4k4 Soluția propusă de dvs. se aplică și adreselor URL de ieșire? Vreau să arăt un link către fluxul RSS și pe pagina de listare a termenilor.
4uk4 avatar
drapel cn
Da, într-un procesor de cale personalizat, bazat pe AliasPathProcessor legat, ați implementa processOutbound() care elimină /feed din cale, apelează getAliasByPath() și apoi adaugă /feed din nou.
berliner avatar
drapel bd
@4k4 Ok, l-am încercat acum și funcționează corect. Există vreun compromis de performanță între această soluție și crearea efectivă a aliasurilor de cale?
4uk4 avatar
drapel cn
Nu, această procesare destul de simplă a căii nu este o problemă de performanță, nu veți observa aceste câteva cicluri CPU și rezultatul este, de asemenea, stocat în cache, atât de intrare ca potrivire a rutei, cât și de ieșire ca linkuri redate. Dar economisiți mult spațiu în tabelul de alias.
berliner avatar
drapel bd
@4k4 Vă mulțumim pentru feedback-ul valoros. Am postat soluția mea pe baza sugestiilor dvs. ca răspuns.
Puncte:2
drapel bd

Pe baza sugestiilor de la @4k4 din secțiunea de comentarii a întrebării, am rezolvat această problemă prin implementarea unui PathProcessor personalizat.

Voi împărtăși codul minim necesar pentru ca acest lucru să funcționeze sub forma unui modul personalizat (numit term_feed_alias în scopul acestui exemplu) pentru care aveți nevoie de 3 fișiere.

term_feed_alias.info.yml

nume: „Alias ​​de feed de termen”
descriere: „Oferă aliasuri automate pentru fluxurile de termeni de taxonomie”
versiunea: „8.x-1.0”
cerinta_versiune_core: ^8.8 || ^9
tip: modul
dependențe:
  - 'path_alias:path_alias'

term_feed_alias.services.yml

Servicii:
  term_feed_alias.path_processor:
    clasa: Drupal\term_feed_alias\PathProcessor\PathProcessorFeedAlias
    argumente: ['@path_alias.manager']
    Etichete:
      - { nume: path_processor_inbound }
      - { nume: path_processor_outbound }

Etichetele de serviciu pot primi, de asemenea, o prioritate, vezi https://www.drupal.org/docs/8/api/services-and-dependency-injection/service-tags Acest lucru ar putea fi necesar pentru a integra corect logica alias cu alte servicii, cum ar fi traducerile, de exemplu. Vedeți și primul comentariu al lui @4k4.

scr/PathProcessorFeedAlias.php

<?php

spațiu de nume Drupal\term_feed_alias\PathProcessor;

utilizați Drupal\Core\PathProcessor\InboundPathProcessorInterface;
utilizați Drupal\Core\PathProcessor\OutboundPathProcessorInterface;
utilizați Drupal\Core\Render\BubbleableMetadata;
utilizați Drupal\path_alias\AliasManager;
utilizați Symfony\Component\HttpFoundation\Request;

/**
 * Furnizați un procesor de cale pentru a gestiona aliasurile pentru fluxurile de termeni de taxonomie.
 */
clasa PathProcessorFeedAlias ​​implementează InboundPathProcessorInterface, OutboundPathProcessorInterface {

  /**
   * Managerul de alias care memorează în cache căutările de alias pe baza solicitării.
   *
   * @var \Drupal\path_alias\AliasManager
   */
  protejat $aliasManager;

  /**
   * Construiește o nouă instanță PathProcessorFeedAlias.
   *
   * @param \Drupal\path_alias\AliasManager $alias_manager
   * Managerul de alias.
   */
  funcția publică __construct(AliasManager $alias_manager) {
    $this->aliasManager = $alias_manager;
  }

  /**
   * {@inheritdoc}
   */
  funcția publică proces Intrare($cale, Solicitare $cerere) {
    $args = explode('/', trim($cale, '/'));
    if (end($args) == 'feed') {
      array_pop($args);
      $system_path = $this->aliasManager->getPathByAlias('/' . implode('/', $args));
      returnează $cale_sistem && strpos($cale_sistem, '/taxonomie/termen/') === 0 ? $cale_sistem . '/feed': $cale;
    }
    returnează $cale;
  }

  /**
   * {@inheritdoc}
   */
  funcția publică processOutbound($cale, &$opțiuni = [], Solicitare $cerere = NULL, BubbleableMetadata $bubbleable_metadata = NULL) {
    $args = explode('/', ltrim($cale, '/'));
    if ($args[0] == 'taxonomie' && $args[1] == 'termen' && end($args) == 'feed') {
      array_pop($args);
      $alias = $this->aliasManager->getAliasByPath('/' . implode('/', $args));
      întoarcere '/' . $alias . '/a hrani';
    }

    returnează $cale;
  }
}
4uk4 avatar
drapel cn
Excelent exemplu de cod. O sugestie pentru site-uri multilingve. Setați o prioritate `{ name: path_processor_outbound, priority: 200 }`. Codul funcționează numai atunci când prefixul de limbă nu este încă adăugat (cu prioritate 100). În acest caz, aveți nevoie și de opțiunea de limbă: https://api.drupal.org/api/drupal/core%21modules%21path_alias%21src%21PathProcessor%21AliasPathProcessor.php/function/AliasPathProcessor%3A%3AprocessOutbound/9.2.x
berliner avatar
drapel bd
@4k4 Am actualizat răspunsul cu o notă despre priorități și un link către documentația etichetelor de serviciu de pe drupal.org. Inițial omis prioritățile în mod intenționat, pentru a menține exemplul la strictul minim, dar presupun că acesta este genul de problemă care este mai greu de rezolvat când încercăm să reutilizam codul exemplu, deci o notă despre nu doare.

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.