bitrix-i18n
bitrix-i18n copied to clipboard
Не сохраняет изменения элемента в инфоблоке 1.0
- при изменении элемента, выбрасывает ошибку:
Запись для этой языковой версии уже существует
- при создании все ок
- работает только на инфоблоках 2.0
- версия модуля 1.0.1
Не получается воспроизвести. Можете показать содержимое таблиц notamedia_i18n_iblock
и notamedia_i18n_iblock_public_id
, прислать URL формы редактирования элемента (можно без домена), скриншот с настройками свойств инфоблока?
Таблицы: notamedia_i18n_iblock, notamedia_i18n_iblock_public_id
URL: bitrix/admin/iblock_element_edit.php?IBLOCK_ID=5&type=pages&ID=33&lang=ru&find_section_section=0&WF=Y
при переключении типа инфоблока (2.0 на 1.0) url не меняеться
уточнение на инфоблоках 1.0 выбрасывает ошибку. на 2.0 работает нормально
уточнение на инфоблоках 1.0 выбрасывает ошибку. на 2.0 работает нормально
А вот это да, мы не тестировали на ИБ 1.0. Нужно диагностировать и вносить исправления.
2.0 аналогично. Создал запись, меняю свойство, жму применить и получаю:
Ошибка Запись для этой языковой версии уже существует
Не понимаю зачем на update делать checkDouble?
/**
* @param array $fields Element fields.
* @return bool
*/
public static function onBeforeUpdate(&$fields)
{
if ($settings = InterfaceHelper::getIblockSettings($fields['IBLOCK_ID'])) {
if (static::checkDoubleElement($fields, $settings, static::ACTION_UPDATE)) {
return false;
}
}
}
checkDouble нужен, что бы не было коллизий в БД. Он защищает от создания нескольких записей с одинаковым идентификатором и языком.
Понятно. Получается checkDouble
не понимает, сохраняю я новый элемент или обновляю текущий - он видит, что элемент уже есть с этими опциями и всё?
Ну метод имеет представление о том, какой экшен сейчас выполняется (создание или обновление), это видно по коду, приведённому тобой в примере выше. Исходный код метода можно посмотреть прямо на Гитхабе: https://github.com/notamedia/bitrix-i18n/blob/master/lib/iblock/elementhandler.php#L68-L117.
Да да. Похоже, при создании элемента был выставлен неверный PUBLIC_ID (получилось 1, вместо ожидаемого 79, т.к. элементы с PUBLIC_ID уже были).
При создании новых элементов он берет неверный PUBLIC_ID. Насколько я успел понять — после конвертации инфоблока таблица notamedia_i18n_iblock_public_id
осталась пустой.
Заколхозил по-быстрому:
foreach($a as $item)
$DB->Insert('notamedia_i18n_iblock_public_id', ['ID' => $item['PROPERTY_PUBLIC_ID_VALUE']]);
Просто записал PUBLIC_ID, которые должны были быть после конвертации
Ребят, проблема не в хранениях и потере PUBLIC_ID, а в том, что при update вы считываете пустое свойство, т.е. в $fields у вас находится свойство [#property_id#][#value_id#] и в случае первой версии (хранения в общей таблице) он формируется как int и является числом, а в случае второй версии он формируется как строка element_id:property_id, вот и получается, что при хранении в общей таблице значений нет. #4
я развернул актуальный битрикс, завёл ИБ, поставил модуль, сконвертировал ИБ. при попытке создания нового элемента в другом языке — "языковая версия уже существует" при редактировании существующего элемента аналогично. таблица в БД — пустая.
заполнил таблицу значениями PUBLIC_ID всех сконвертированных элементов — проблема не решилась