результаты $query = \Drupal::database()->update не видит view в той же сессии. Drupal 9.1.5

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

Аватар пользователя denis.noskov denis.noskov 14 марта 2021 в 20:11

Коллеги!!! Хэлп!
Или лыжи не едут...
делаю на web-form post на эту же форму со встроенным PHP скриптом. Аля "$query = \Drupal::database()->update". Авторизация сделана. Форма однозначно авторизованная. Скрипт отрабатывает. В БД вижу изменение данных через MySQL WorkBench. А во всех вьюхах (view) этих изменений не видно. В ТОЙ ЖЕ СЕССИИ.
Они проявляются только после чистки системного кЭша Drupal .
Я лыжи не тем смазываю ? Но чистить кэш после каждого update это маразм.
Уточняю. Именно апдэйт существующей таблицы, которая создана мною, как сущность ECK.
Ковырял Etentity API. Думал "update" сделать через "Etentity query" но не увидел, как это сделать. Запрос данных на просмотр=пожалуйста. Апдэйта в упор не вижу в Etentity API Drupal 9.1.5.

Лучший ответ

Аватар пользователя denis.noskov denis.noskov 16 марта 2021 в 11:21

Огромное СПАСИБО! всё получилось через:
$entity = \Drupal::entityTypeManager()->getStorage( 'objects')->load();
$entity->set($field_name, $new_value);
$entity->save();
---
PS: А с кэшем я еще по играюсь. Ибо массовые операции с БД через entity работают на порядок медленнее, чем, через $query = \Drupal::database()->update(...

Комментарии

Аватар пользователя marassa marassa 14 марта 2021 в 21:30

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

Аватар пользователя denis.noskov denis.noskov 15 марта 2021 в 18:29

Прочитал, но не совсем "догнал".
Есть у меня тип сущности (entity) по имени "obects" с набором (bundle) по имени "data". В наборе поле "code". Есть view по имени "code_list" , которая показывает список этих "code".
У меня нет модуля. Нет хуков. Есть PHP вставка в WebForm: \Drupal::database()->update этого поля одной записи по "primary key".
мой кэш тэг будет: "obects_list:data" ?
после update мне надо выполнить : Cache::invalidateTags("obects_list:data");?
Не понимаю. Куда тут запихнуть view по имени "code_list" ?

Аватар пользователя charOFF charOFF 15 марта 2021 в 20:03

Для entity кэш тэг состоит из типа сущности и ID, т.е. в данном случае это будет типа такого obects:123, где 123 - ID сущности. Все тэги которые используются при формировании страницы можно посмотреть в заголовке ответа сервера X-Drupal-Cache-Tags

Но если вы редактируете entity, то может и не надо через базу, лучше через Entity API загружать сущность, редактировать поле и сохранять. Друпал тогда сам нужные тэги сбросит.

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

Аватар пользователя denis.noskov denis.noskov 15 марта 2021 в 20:43

с тэгами примерно понятно. можно попробовать.
нет блоков. кэш вьюхи выключен. update на отдельной странице в WebForms. после update идет "header('Location: '.$redirect);" на view отдельной страницей и там нет новой цифры. Страница перезагружается.
через Entity можно програмно сделать update? В том то и вся проблема. Мне надо с WebForms записать поле. WebForms сам это не умеет

Аватар пользователя denis.noskov denis.noskov 15 марта 2021 в 21:11

вау!!! так это мне предотаточно. и не надо маяться с кэшем и "левыми" update. Grand merci.
Упс. Не увидел в примере "condition". не же не все записи апдэйтить. Куда "primary key" тут вставить ?

Аватар пользователя marassa marassa 15 марта 2021 в 20:07

denis.noskov wrote: мой кэш тэг будет: "obects_list:data" ?

Или так, или "obects:<id изменённой записи>"

denis.noskov wrote: после update мне надо выполнить : Cache::invalidateTags("obects_list:data");?

По идее да.

denis.noskov wrote: Куда тут запихнуть view по имени "code_list" ?

Никуда. Вся идея в том, что при модификации данных программист не может и не должен знать в каких местах эти данные используются. Это задача модуля Views при построении и исполнении вьюхи отслеживать кэш-теги исходных данных, по которым построена вьюха.
PS Это я опять теоретизирую - конкретного опыта с кастомными сущностями и их кэш-тегами у меня нет.

Аватар пользователя denis.noskov denis.noskov 16 марта 2021 в 11:21

Огромное СПАСИБО! всё получилось через:
$entity = \Drupal::entityTypeManager()->getStorage( 'objects')->load();
$entity->set($field_name, $new_value);
$entity->save();
---
PS: А с кэшем я еще по играюсь. Ибо массовые операции с БД через entity работают на порядок медленнее, чем, через $query = \Drupal::database()->update(...