instantsoft / icms2

Self-hosted Site Management System
https://instantcms.ru
GNU General Public License v2.0
294 stars 120 forks source link

Не правильно работает метод поля hookAfterAdd() #1425

Closed asnenne closed 2 years ago

asnenne commented 2 years ago

Используемая версия InstantCMS: 2

Стоит такая задача. Есть таблица X, куда записываются данные компонентом. Есть поле, при создании которого в админке нужно записать в него значения из таблицы X, соответствующие записям этого типа контента.

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

$model->update... не работает просто потому, что столбец с именем поля в таблице cms_ctype еще не существует. Вернее, уже существует, но его не видно.

Вот фрагмент кода:

foreach ($items as $id => $users) {

    $model->update($content_table_name, $id, [$field['name'] => $users]);

}

До этого момента всё хорошо, все данные на месте.

Проверка наличия столбца в таблице dump($model->db->getTableFields($content_table_name)); перед $model->update... показала, что столбца еще нет. Хотя реально в БД он уже есть.

При этом hookAfterUpdate отрабатывает правильно.

Простите, если что-то не теми словами объяснил, я не программист))

UPD. Нашел выход, но он подразумевает не использовать системные методы, раз они не работают))

foreach ($items as $id => $users) {

    $model->db->query('UPDATE {#}'.$content_table_name.' SET `'.$field['name'].'`= \''.$model->arrayToYaml($users).'\' WHERE `id`=\''.$id.'\'');

}
fuzegit commented 2 years ago

Методы работают правильно.

https://github.com/instantsoft/icms2/blob/master/system/core/model.php#L530

У метода update есть еще параметры, вы заглядывайте в код. Четвёртым параметром передавайте true

$model->update($content_table_name, $id, [$field['name'] => $users], true);
asnenne commented 2 years ago

Спасибо за подсказку. Но какой-то не очевидный способ, сам бы никогда не додумался отключить проверку наличия поля, если оно уже есть, ведь метод hookAfterAdd по идее должен работать после его создания, а значит поле уже должно быть. Да и в БД оно уже на месте. В этом и был вопрос. Метод выполняется после создания поля, но, получается, движок не видит, что оно уже создано.