Коллеги!!! Хэлп!
Или лыжи не едут...
делаю на 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.
результаты $query = \Drupal::database()->update не видит view в той же сессии. Drupal 9.1.5
Главные вкладки
Лучший ответ
Огромное СПАСИБО! всё получилось через:
$entity = \Drupal::entityTypeManager()->getStorage( 'objects')->load();
$entity->set($field_name, $new_value);
$entity->save();
---
PS: А с кэшем я еще по играюсь. Ибо массовые операции с БД через entity работают на порядок медленнее, чем, через $query = \Drupal::database()->update(...
Комментарии
Навскидку вижу два варианта:
Простой: отключить кэширование тех вьюх, которые должны видеть эти обновления (правая колонка настроек вьюхи, ближе к концу).
Правильный: при апдейте БД программно инвалидировать кэш конкретных вьюх, которые это изменение затрагивает. Более подробно не смогу описать, не вникал.
В зависимости от того, что обновляется в БД, нужно инвалидировать соответствующие кэш тэги https://www.drupal.org/docs/drupal-apis/cache-api/cache-tags
Кэш конкретных вьюх отключен. А вот кэш тэги это интересное направление для поиска
Прочитал, но не совсем "догнал".
Есть у меня тип сущности (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" ?
Для entity кэш тэг состоит из типа сущности и ID, т.е. в данном случае это будет типа такого
obects:123
, где 123 - ID сущности. Все тэги которые используются при формировании страницы можно посмотреть в заголовке ответа сервераX-Drupal-Cache-Tags
Но если вы редактируете entity, то может и не надо через базу, лучше через Entity API загружать сущность, редактировать поле и сохранять. Друпал тогда сам нужные тэги сбросит.
Но, если у вас и при выключенном кэшировании вьюса проблема сохраняется, то возможно проблема в чем-то другом. Может вьюс делает выборку до того, как отрабатывает ваш update? Если я ничего не путаю, такое возможно, если основной контент - вьюс, а форма выведена через блок и в форме выбрано поведение после отправки - перезагружать текущую страницу. Блоки же обрабатываются после основного контента...
с тэгами примерно понятно. можно попробовать.
нет блоков. кэш вьюхи выключен. update на отдельной странице в WebForms. после update идет "header('Location: '.$redirect);" на view отдельной страницей и там нет новой цифры. Страница перезагружается.
через Entity можно програмно сделать update? В том то и вся проблема. Мне надо с WebForms записать поле. WebForms сам это не умеет
Получить объект сущности и изменить:
<?php
$entity = \Drupal::entityTypeManager()->getStorage($entity_type)->load($id);
$entity->set($field_name, $new_value);
$entity->save();
?>
Тип сущности 'objects'.
https://www.drupal.org/docs/drupal-apis/entity-api/working-with-the-enti...
вау!!! так это мне предотаточно. и не надо маяться с кэшем и "левыми" update. Grand merci.
Упс. Не увидел в примере "condition". не же не все записи апдэйтить. Куда "primary key" тут вставить ?
pardon. похоже узрел. = $id
Или так, или
"obects:<id изменённой записи>"
По идее да.
Никуда. Вся идея в том, что при модификации данных программист не может и не должен знать в каких местах эти данные используются. Это задача модуля Views при построении и исполнении вьюхи отслеживать кэш-теги исходных данных, по которым построена вьюха.
PS Это я опять теоретизирую - конкретного опыта с кастомными сущностями и их кэш-тегами у меня нет.
Огромное СПАСИБО! всё получилось через:
$entity = \Drupal::entityTypeManager()->getStorage( 'objects')->load();
$entity->set($field_name, $new_value);
$entity->save();
---
PS: А с кэшем я еще по играюсь. Ибо массовые операции с БД через entity работают на порядок медленнее, чем, через $query = \Drupal::database()->update(...