Рейтинг:3

Как создать объект пользовательского контента без канонического URL?

флаг ru

Я создал объект пользовательского контента с помощью drush генерировать модуль-контент-сущность, который отлично работает. Однако я хочу, чтобы мои пользовательские объекты НЕ имели канонический URL-адрес. Drush автоматически создает их в аннотации класса сущности:

/**
 * Определяет класс сущности чанка.
 *
 * @ContentEntityType(
 * id = "кусок",
 * ...
 * ссылки = {
 * "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",
 * "коллекция" = "/admin/content/chunk"
 * },
 * ...
 * )
 */

Я пытался удалить каноническую запись из аннотации, но это привело к многочисленным ошибкам слева и справа, потому что многие модули core и contrib предполагают, что канонические URL-адреса всегда существуют. В моем случае большинство этих ошибок исходит от других модулей, вызывающих функции, которые заканчиваются в EntityBase::туурл, который завершается с ошибкой WSOD из-за отсутствия канонической записи.

Хотя это кажется обязательным (@см. EntityTypeInterface), некоторые другие - например. Модуль абзацев - каким-то образом удалось убрать каноническую ссылку, не вызывая ошибок везде.

Может ли кто-нибудь дать мне несколько советов, как безопасно удалить каноническую ссылку из моего пользовательского контента? Я не хочу превращать канонические ссылки в 403 или 404, я бы предпочел, чтобы эти ссылки вообще никогда не отображались (скрыть основную вкладку «Просмотр», запретить ссылки при отображении меток объектов и т. д.).

Jaypan avatar
флаг de
Я не знаю, какие ошибки вы получаете, но я создал несколько объектов без канонических ссылок. У меня даже есть объекты, для которых вообще не определены ссылки. Они используются только в коде, а не во внешнем интерфейсе.
4uk4 avatar
флаг cn
«*многие модули core и contrib предполагают, что канонические URL-адреса всегда существуют*» — и да, и нет, и нет, потому что этот [скелет сущности] (https://www.drupal.org/docs/8/api/entity-api /creating-a-custom-content-entity#s-entity-skeleton) работает. Да, потому что стандартные обработчики сущностей предполагают определенные свойства в определении сущности. Решение: вам нужны собственные обработчики.
флаг ru
В моем случае, похоже, что большинство из них происходит из `EntityBase::toLink /::toUrl`, который вызывается другими модулями и завершается сбоем с WSOD при удалении канонической записи из аннотации.
4uk4 avatar
флаг cn
Использование этих методов с абзацем приводит к следующему: *Шаблон ссылки «канонический» не найден для типа сущности «абзац»*
Рейтинг:0
флаг ru

На самом деле это очень просто, за исключением удаления всех ссылок на канонический код из шаблонного кода, который мне просто нужно было переопределить одной единственной функцией. toUrl в моем пользовательском классе сущностей:

src/Entity/MyContentEntity.php

/**
 * Определяет класс сущности чанка.
 * Обратите внимание на отсутствующую запись «links = {canonical}» в аннотации.
 *
 *
 * @ContentEntityType(
 * id = "кусок",
 * ...
 * ссылки = {
 * "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",
 * "коллекция" = "/admin/content/chunk"
 * },
 * ...
 * )
 */
класс Chunk расширяет ContentEntityBase, реализует ChunkInterface {
  /**
   * это предотвращает WSOD, когда сторонние модули вызывают $entity->toUrl
   */
  публичная функция toUrl($rel = 'canonical', массив $options = []) {
    если ($rel == 'канонический') {
      return Url::fromUri('route:<nolink>')->setOptions($options);
    }
    еще {
      вернуть parent::toUrl($rel, $options);
    }
  }
}

Прочее здесь необходимо только в том случае, если сущность основана на автоматически сгенерированном шаблонном коде из генерировать драш или похожие:

источник/Форма/MyContentEntityForm.php

/**
 * Следующее изменение необходимо только в том случае, если вы используете шаблонный код из «drush generate» или аналогичный
 */
класс ChunkForm расширяет ContentEntityForm {
  общественная функция сохранения (массив $ form, FormStateInterface $ form_state) {
    ...
    // изменить следующую строку
    //$form_state->setRedirect('entity.chunk.canonical', ['chunk' => $entity->id()]);
    // на что-то по вашему выбору
    $form_state->setRedirect('entity.chunk.edit-form', ['chunk' => $entity->id()]);
  }

}

my_module.links.task.yml:

# Если существует, удалите следующий шаблонный код из "drush generate" или аналогичного

entity.chunk.view:
  Название: Посмотреть
  route_name: entity.chunk.canonical
  base_route: entity.chunk.canonical
wranvaud avatar
флаг us
Ошибка: класс «Drupal\my_content_entity\Entity\Url» не найден

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.