Рейтинг:1

Программная загрузка и сохранение узлов не обновляет мое поле, а редактирование и сохранение вручную. Почему разница?

флаг ng

Я перенес поля даты D7 в D9 Smart Date (с повторением). Во время миграции я проанализировал устаревшие правила повторения и заполнил их новым полем D9 Smart Date.

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

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

Я пробовал использовать функцию Save Node в Views Bulks Action. Я пробовал использовать модуль «Сохранить все». Я попытался создать PHP-скрипт для загрузки и сохранения узла.

Ни один из них не работает. Мой скрипт ниже. Любые идеи, почему работает только ручное сохранение?

введите описание изображения здесь

Jaypan avatar
флаг de
Узел обычно ничего не делает при сохранении, если никакие значения не изменились.
quantumized avatar
флаг ng
Я только что изменил скрипт, чтобы изменить липкое значение на true, и оно все еще не работает. Таким образом, узел сохраняется, но все, что нужно делать в поле Smart Date, работает только тогда, когда узел сохраняется вручную. Есть ли способ имитировать сохранение узла вручную с помощью кода? Непонятно, откуда такое несоответствие.
Jaypan avatar
флаг de
Возможно, модуль имеет некоторые функции, которые выполняются при сохранении формы, а не при сохранении сущности. Я бы прошел через модуль и посмотрел на определение формы и/или любые хуки изменения формы, чтобы увидеть, делают ли они что-то таким образом.
quantumized avatar
флаг ng
Спасибо. Это имеет смысл. Есть ли способ сохранить форму программно?
Jaypan avatar
флаг de
В Drupal 7 вы могли использовать drupal_form_submit(). В этой записи изменений (https://www.drupal.org/node/2121003) сказано, что вы можете использовать `\Drupal::formBuilder()->submitForm()`. Хотя я не знаю механики этого
Рейтинг:1
флаг cn

Любые идеи, почему работает только ручное сохранение?

Как отметил Джейпан в комментариях, это связано с тем, что Drupal не сохранит узел, если ничего не изменилось.

Когда ты отправить форму для юридического лица который имеет дату создания/изменения (т.е. реализует EntityChangedInterface), он делает это:

if ($entity instanceof EntityChangedInterface) {
  $entity->setChangedTime($this->time->getRequestTime());
}

Что изменяет значение поля, заставляя объект сохраняться.

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

quantumized avatar
флаг ng
Спасибо за информацию @Clive. Я надеялся, что это будет что-то простое, как вы предложили, но когда я меняю липкое значение с ложного на истинное и повторно сохраняю, Smart Date все еще не творит волшебства, которое происходит при сохранении вручную. Было высказано предположение, что, возможно, модуль делает что-то особенное, что происходит только во время редактирования/сохранения формы узла, но я не могу понять, как сохранить форму программно.
флаг cn
Здесь есть пример: https://drupal.stackexchange.com/questions/253009/how-to-call-submit-form-from-another-page-in-custom-module - проблема в том, что это форма сущности, поэтому не точно просто заполнить значения представления. Для этого также будет другой метод API, но с формами немного сложно работать программно (по крайней мере, снаружи). Возможно, будет проще просмотреть код в модуле Smart Date и посмотреть, не делает ли он что-то необычное.
Jaypan avatar
флаг de
Да, вам может понадобиться просто вытащить код из их модуля и поместить его в hook_update_N() или создать скрипт drush, который делает то же самое.

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

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