Рейтинг:0

Можно ли найти «оригинальный» маршрут при выполнении кода из виджета?

флаг br

Я на Д9.

У меня есть форма редактирования узла с СМИ поле с помощью Медиа библиотека виджет.

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

Тем не менее, маршрут, доступный с \Drupal::routeMatch() является media_library.ui и нет объект узла имеется в наличии

Я предполагаю, что это правильно, так как код выполняется во время запроса «внутри виджета медиатеки».

Таким образом, я пытаюсь найти, возможно ли как-то получить "основной \ исходный" запрос в этот момент и относительный объект узла или если это невозможно. В последнем случае у вас есть идея, возможна ли эта цель каким-то образом?

apaderno avatar
флаг us
Чтобы сделать вопрос полезным для будущих читателей, вы должны показать код, который вы используете, и четко указать, какой хук вы используете и какую форму вы пытаетесь изменить. Кажется, вопрос касается формы редактирования узла, но затем он говорит, что `\Drupal::routeMatch()` возвращает `'media_library.ui'`, который не является маршрутом для формы редактирования узла.
apaderno avatar
флаг us
Я предполагаю, что описанное было бы возможно, когда виджет поля использует AJAX.
Giuseppe avatar
флаг br
@apaderno пока у меня нет определенного кода для показа, я отлаживаю непосредственно внутри `token_tokens`, потому что пытаюсь проверить, работает ли этот патч https://www.drupal.org/project/token/ Issues/919760 с моим вариантом использования. Как я уже сказал, маршрут не является формой редактирования узла, потому что код «запускается» во время вставки мультимедиа, которая находится внутри «модального виджета мультимедиа».
Рейтинг:2
флаг us

Чтобы изменить форму виджета, Drupal вызывает эти хуки.

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

если ($context['виджет']->getPluginId() == 'media_library_widget') {
  $field_definition = $context['items']->getFieldDefinition();
  если ($field_definition->getTargetEntityTypeId() == 'узел') {
    $node = $context['items']->getEntity();
    // Использовать $узел.
  }
}

Если вместо этого вы пытаетесь изменить значение токена, когда он используется для этого виджета, это невозможно, поскольку хук для изменения токенов (hook_tokens_alter()) знает только, для какого типа сущности запрашивается токен ($контекст['тип']) и для какого объекта сущности ($context['данные'][$context['тип']]).

Рейтинг:0
флаг cn

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

/**
 * Реализует hook_form_BASE_FORM_ID_alter().
 */
функция my_module_form_entity_browser_media_entity_browser_modal_form_alter(&$form, FormStateInterface $form_state) {
  // @todo Переместите этот код в ClassResolver.
  /** @var \Drupal\entity_browser\Form\EntityBrowserForm $form_object */
  $form_object = $form_state->getFormObject();
  $eb = $form_object->getEntityBrowser();
  $eb_params = $eb->getAdditionalWidgetParameters();
  if (!isset($eb_params["path_parts"][1]) || !isset($eb_params["path_parts"][2])) {
    возвращаться;
  }

  если (!is_numeric($eb_params["path_parts"][2])) {
    возвращаться;
  }

  $ параметры = [];
  пытаться {
    $params = Url::fromUserInput(implode('/', $eb_params["path_parts"]))->getRouteParameters();
  }
  поймать (исключение $ исключение) {
    Drupal::messenger()->addError($exception->getMessage());
  }

  $узел = NULL;
  если (isset($params['узел'])) {
    $node = Node::load($params['node']);
  }

  $группа = ПУСТО;
  если (isset($params['group'])) {
    $group = Group::load($params['group']);
  }

  если (пусто($узел) && пусто($группа)) {
    возвращаться;
  }

  $метки = [];
  $group_links = [];
  $group_urls = [];
  $gids = [];
  $гид = НУЛЬ;
  $form['#attributes']['data-parent_node'] = NULL;

  переключатель (!$узел ? 'группа' : 'узел') {
    случай 'группа':
      $gid = $group->id();
      сломать;
    случай 'узел':
      $group_contents = GroupContent::loadByEntity($node);
      foreach ($group_contents как $group_content) {
        $group = $group_content->getGroup();
        $gids[] = $group->id();
        $labels[] = $group->label();
        $group_urls[] = $group->toUrl()->toString();
        $group_links[] = $group->toLink($group->label())->toString();
      }

      $form['#attributes']['data-parent_node'] = $node->id();

      $гид = сброс($гид);
      сломать;
  }

  $form['#attributes']['data-parent_group_names'] = json_encode($labels);
  $form['#attributes']['data-parent_group_urls'] = json_encode($group_urls);
  $form['#attributes']['data-parent_group_links'] = json_encode($group_links);
  $form['#attributes']['data-parent_group_ids'] = json_encode($gids);
  $form['#attributes']['data-parent_group_id'] = $gid;
}

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

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