Не могу достучаться до параметров запроса из hook_contextual_links_view_alter в контексте вьюшки с параметром

Главные вкладки

Аватар пользователя marassa marassa 18 июля 2018 в 19:52

Успешно добавил контекстную ссылку "Добавить фото" на страницу ноды "Здание":

    function tanw_contextual_links_view_alter(&$element, $items) {
      if (isset($element['#contextual_links']['node'])
             && in_array($element['#contextual_links']['node']['metadata']['ds_bundle'], ['artefacts','events'])) {
        $entity = entity_load('node', $element['#contextual_links']['node']['route_parameters']['node']);
          {далее делаю что мне нужно с текущей сущностью}

Теперь хочу добавить точно такую же ссылку на страницу вьюшки "Фотографии объекта". Nid объекта отчетливо виден в адресе вьюшки: http://MY_DOMAIN/manage_photos?node=32006
Без проблем нашел как цеплять нужный код в хуке:

  else if (isset($element['#contextual_links']['entity.view.edit_form'])
         && $element['#contextual_links']['entity.view.edit_form']['metadata']['name']
== 'photo_slideshow' )

Но никак не могу сообразить откуда взять nid из адреса! В массиве $element в контексте вьюшки (в отличие от контекста ноды) этот параметр нигде не содержится. Попробовал через request - \Drupal::request()->query возвращает NULL, и при ближайшем рассмотрении текущим путем является /contextual/render, так как контекстные менюшки рендерятся по отдельным ajax-запросам. Попробовал вытащить RequestStack, а там тоже все мимо кассы.
Нужный мне параметр наблюдается внутри строки \Drupal::request->server->parameters['HTTP_REFERER'], и конечно по крайней нужде я могу его оттуда и выскрести, но это же ужас какой хак?! Неужели нет более прямого пути?

Комментарии

Аватар пользователя marassa marassa 18 июля 2018 в 20:18

Это было самое первое, что я сделал и получил
Error: Call to a member function id() on null
Как я уже сказал, \Drupal::request()->query возвращает NULL, так как у ajax-запроса /contextual/render нету ничего в query. Есть у запроса, по которому грузилась основная страница, а вот до него-то добраться я никак и не могу...

Аватар пользователя marassa marassa 19 июля 2018 в 9:47

В общем, не найдя лучшего варианта, а время идет, выдрал nid из реферера и сразу столкнулся с новой напастью: единожды сгенеренные ссылки намертво кэшатся, и при попытке добавить фото к любому другому объекту оно привязывается к самому первому объекту, на котором было вызвано контекстное меню.
Буду премного благодарен тому, кто подскажет где и как настроить кэшинг контекстных ссылок для вьюшек, чтобы при кэшинге принимались во внимание разные рантайм-параметры запроса (значения контекстного фильтра).
Ну или придется отлавливать эти ссылки уже на клиенте и джаваскриптом подменять nid...

Аватар пользователя marassa marassa 19 июля 2018 в 13:26

Честно говоря, не очень понимаю вопрос... Есть страница view с контекстным фильтром, у нее справа вверху при наведении появляется карандашик, а под ним контекстное меню. "Из коробки" там линки "Translate view" и "Edit view", через hook_contextual_links_view_alter я вполне успешно добавляю еще один линк "Add picture", осталось только сгенерировать для него правильный URL со всеми контекстными подробностями, в частности nid.
В хук передается параметр $element, по структуре он похож на билд-массив, и в нем даже уже есть секция [#cache] с какой-то неактуальной для меня фигней. Для данного конкретного меню я легко готов пожертвовать кэшингом совсем, только вот не получается почему-то.