Как добавить ссылку "операции" в пользовательский маршрут?


Я внедряю пользовательскую сущность с пакетами в Drupal 8.

На странице списка сущностей пакета (т.Е. эквивалентной странице списка типов контента узла) я хотел бы предоставить дополнительную опцию для списка операций , которые в настоящее время включают Редактирование, Управление полями, Управление отображением, Удаление , чтобы пользователь мог создать сущность этого пакета. Так что, если бы это было на узлах, то это было бы похоже на добавление ссылки "Добавить контент" для каждый тип контента на странице со списком контента, который приведет вас к /node/add/{node_type}.

Соответствующий код, который у меня есть до сих пор:

Добавлена опция "добавить объект" в разделе ссылок аннотаций объекта конфигурации:

* @ConfigEntityType(
*   id = "bloom_stem_type",
*   label = @Translation("BloomStemType"),
*   bundle_of = "bloom_stem",
*   ...
*   links = {
*     "edit-form" = "entity.bloom_stem_type.edit_form",
*     "delete-form" = "entity.bloom_stem_type.delete_form",
*     "collection" = "entity.bloom_stem_type.collection",
*     "add-entity" = "entity.bloom_stem.add_form"
*   }
* )
*/

Обратите внимание, что это указывает на маршрут в другой сущности, фактической сущности, для которой это пакет.

Этот маршрут определен в (routing.yml):

entity.bloom_stem.add_form:
  path: '/admin/bloom_stem/{bloom_stem_type}/add'
  defaults:
    _title: 'Add BloomStem'
    _controller: '\Drupal\bloom\Controller\BloomStemController::addForm'
  requirements:
    _entity_create_access: 'bloom_stem'

Затем я реализовал операции getDefault в пользовательском построителе списков класс:

class BloomStemTypeListBuilder extends ConfigEntityListBuilder {
  ...
  /**
   * Gets this list's default operations.
   *
   * @param \Drupal\Core\Entity\EntityInterface $entity
   *   The entity the operations are for.
   *
   * @return array
   *   The array structure is identical to the return value of
   *   self::getOperations().
   */
  public function getDefaultOperations(EntityInterface $entity) {
    $operations = parent::getDefaultOperations($entity);

    $operations['add'] = array(
      'title' => $this->t('Add'),
      'weight' => 10,
      'url' => $entity->urlInfo('add-entity'),
    );

    return $operations;
  }

Однако, когда я захожу на страницу списка пакетов сущностей, возникает исключение, связанное с невозможностью создать маршрут/путь. При пошаговой отладке это, по-видимому, связано с тем, что Entity::urlinfo(), похоже, не использует маршрут, установленный в аннотации, благодаря этой строке, которая строит свой собственный маршрут:

$route_name = "entity.{$this->entityTypeId}." . str_replace(array('-', 'drupal:'), array('_', ''), $rel);

Единственная документация , которую я смог найти в части links аннотации, просто гласит:

Ссылки
Определения URL-адресов сущностей, ссылающиеся на маршруты из MODULE.routing.yml. "канонический" - это маршрут по умолчанию для сущности. также можно настроить форму редактирования и форму удаления. Они в основном используются для пользовательского интерфейса поля. Здесь можно установить произвольные клавиши . Например, пользователь устанавливает форму отмены, в то время как узел использует форму удаления.

Что я понял как означающее ("ссылка на маршруты из MODULE.routing.yml"), что если бы я ссылался на маршрут, этот маршрут был бы использован.

В сторону: Другие вещи, которые я пробовал, включают более прямое создание URL-адреса (явно неправильный способ действий):

$url = \Drupal::getContainer()->get('url_generator')
  ->generateFromRoute('entity.bloom_stem.add_form', ['bloom_stem_type'=>$entity->id()]);

, который генерирует допустимый путь, но строковое значение - это не то, что getOperations , как ожидается, будет выдано при выводе ключа url.

Может ли кто-нибудь рассказать мне, как это должно работать/где я ошибся? Спасибо.

Author: kiamlaluno, 2015-06-25

1 answers

Какую версию ядра drupal вы используете?

Шаблоны ссылок были изменены на ссылки вместо названий маршрутов несколько месяцев назад. См. Раздел Узел и другие примеры типов сущностей.

Еще одно требование заключается в том, что имена шаблонов ссылок и имена маршрутов должны совпадать.

Однако ваша основная проблема заключается в том, что шаблоны ссылок касаются сущности или, по крайней мере, типа сущности, который у вас есть, и это не относится к вашему примеру.

Использование шаблонов ссылок для операций является удобно, когда это возможно, но ни в коем случае не требуется. Это может быть любой Url-объект. Таким образом, ваша последняя попытка на самом деле близка, вы просто еще не используете правильный API (и да, определенно существует слишком много способов создания ссылок/URL-адресов).

Попробуйте это:

\Drupal\Core\Url::fromRoute('entity.bloom_stem.add_form', ['bloom_stem_type' => $entity->id()])

Затем используйте это для "url".

 2
Author: Berdir, 2015-06-25 15:11:46