Puncte:3

Cum se creează o entitate de conținut personalizată fără URL canonică?

drapel ru

Am creat o entitate de conținut personalizată cu drush genera module-content-entity, care funcționează grozav. Cu toate acestea, vreau ca entitățile mele personalizate NU să aibă o adresă URL canonică. Drush le creează automat pe cele din adnotarea clasei de entități:

/**
 * Definește clasa de entitate chunk.
 *
 * @ContentEntityType(
 * id = „bucătură”,
 *...
 * linkuri = {
 * "add-form" = "/admin/content/chunk/add/{chunk_type}",
 * "add-page" = "/admin/content/chunk/add",
 * "canonic" = "/bucătă/{bucătură}",
 * "edit-form" = "/admin/content/chunk/{chunk}/edit",
 * "delete-form" = "/admin/content/chunk/{chunk}/delete",
 * "colecție" = "/admin/content/chunk"
 *},
 *...
 * )
 */

Am încercat să elimin intrarea canonică din adnotare, dar acest lucru a dus la numeroase erori la stânga și la dreapta, deoarece multe module de bază și contribuție presupun că URL-urile canonice există întotdeauna. În cazul meu, majoritatea acestor erori provin de la alte module care apelează funcții care ajung în EntityBase::toUrl, care eșuează cu un WSOD din cauza intrării canonice lipsă.

Chiar dacă acest lucru pare a fi obligatoriu (@a se vedea EntityTypeInterface), unele altele - de ex. Modulul Paragrafe - a reușit cumva să elimine legătura canonică, fără a provoca erori peste tot.

Poate cineva să-mi dea niște indicii cum să fac în siguranță eliminați linkul canonic din entitatea mea de conținut personalizat? Nu vreau să transform linkurile canonice în 403 sau 404, aș prefera ca acele linkuri să nu fie redate deloc (ascunde fila principală „Vizualizare”, împiedică linkurile atunci când redați etichetele entităților etc.).

Jaypan avatar
drapel de
Nu știu ce erori primești, dar am creat mai multe entități fără linkuri canonice. Am chiar și entități care nu au deloc legături definite. Ele sunt folosite doar în cod, nu pe front-end.
4uk4 avatar
drapel cn
„*multe module de bază și contribuție presupun că URL-urile canonice există întotdeauna*” - Da și nu, Nu, deoarece acest [schelet de entitate](https://www.drupal.org/docs/8/api/entity-api /creating-a-custom-content-entity#s-entity-skeleton) funcționează. Da, deoarece manipulatorii de entități standard își asumă anumite proprietăți în definiția entității. Soluție: aveți nevoie de propriile dvs. de gestionare.
drapel ru
În cazul meu, majoritatea par să provină din `EntityBase::toLink / ::toUrl`, care este apelat de alte module și nu reușește cu un WSOD atunci când elimină intrarea canonică din adnotare
4uk4 avatar
drapel cn
Utilizarea acestor metode cu un paragraf are ca rezultat: *Niciun șablon de link „canonic” găsit pentru tipul de entitate „paragraf”*
Puncte:0
drapel ru

Este de fapt foarte ușor, cu excepția eliminării tuturor referințelor la canonic din codul standard de care aveam nevoie doar să suprascriu o singură funcție adresă URL în clasa mea de entitate personalizată:

src/Entity/MyContentEntity.php

/**
 * Definește clasa de entitate chunk.
 * Rețineți că lipsește intrarea „links = { canonical }” din adnotare
 *
 *
 * @ContentEntityType(
 * id = „bucătură”,
 *...
 * linkuri = {
 * "add-form" = "/admin/content/chunk/add/{chunk_type}",
 * "add-page" = "/admin/content/chunk/add",
 * "edit-form" = "/admin/content/chunk/{chunk}/edit",
 * "delete-form" = "/admin/content/chunk/{chunk}/delete",
 * „colecție” = „/admin/content/chunk”
 *},
 *...
 * )
 */
clasa Chunk extinde ContentEntityBase implementează ChunkInterface {
  /**
   * acest lucru previne WSOD atunci când modulele terțe apelează $entity->toUrl
   */
  funcția publică toUrl($rel = 'canonic', matrice $opțiuni = []) {
    if ($rel == 'canonic') {
      return Url::fromUri('route:<nolink>')->setOptions($options);
    }
    else {
      return parent::toUrl($rel, $opțiuni);
    }
  }
}

Celelalte lucruri de aici sunt necesare numai dacă entitatea se bazează pe un cod standard generat automat de la drush genera sau asemănător:

src/Form/MyContentEntityForm.php

/**
 * Următoarea modificare este necesară numai dacă utilizați codul standard de la „drush generate” sau similar
 */
clasa ChunkForm extinde ContentEntityForm {
  funcția publică salvare (matrice $form, FormStateInterface $form_state) {
    ...
    // schimbă următoarea linie
    //$form_state->setRedirect('entity.chunk.canonical', ['chunk' => $entity->id()]);
    // la ceva la alegerea ta
    $form_state->setRedirect('entity.chunk.edit-form', ['chunk' => $entity->id()]);
  }

}

my_module.links.task.yml:

# Dacă există, eliminați următorul cod boilerplate din „drush generate” sau similar

entity.chunk.view:
  titlu: Vedere
  nume_rută: entity.chunk.canonical
  rută_de bază: entity.chunk.canonical
wranvaud avatar
drapel us
Eroare: clasa „Drupal\my_content_entity\Entity\Url” nu a fost găsită

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.