Нодус:Создание и редактирование материалов из скрипта
Админки Нодуса не всегда хватает для функционирования сайта. Иногда приходится создавать дополнительные программные механизмы. Например, часто требуется автоматический скрипт закачки (синхронизации) товаров в каталоге. Рассмотрим средства для создания и изменения контента.
Создание нового материала
$item = Component_Nodus::datatype('catalog')->new_item(); $item->field('title')->set('Трансценденция прозрачная'); $item->field('price')->set(2.87); $item->save();
Обратите внимание, что при вызове new_item в базе данных реально создается запись, которая становится активной только при последующем вызове save. Если save не вызвать, то запись некоторое время останется лежать мертвым грузом в базе данных, но потом удалится при прошествии не менее суток. Плюс такой схемы в том, что у только что созданного материала уже есть числовой идентификатор и место, куда можно сохранять связанные с материалом файлы.
Для присвоения значения полям используется функция set контейнера значения. В принципе, для простых строковых или числовых полей можно использовать и простое присвоение, но это не всегда подходит. Например, для типа image можно передать в set путь к картинке, и при этом файл реально будет переписан в нужное место и переименован как надо. При простом присвоении ничего этого не получится.
Изменение существующего материала
Если вам известен автоинкрементный идентификатор материала, то тут все просто: вместо создания материала делаем его чтение из БД.
$item = Component_Nodus::item(576); $item->field('price')->set(3.62); $item->save();
Но так просто - не всегда. Проблема в том, что обычно в случаях с обновлением каталога товаров идентификация материала ведется отнюдь не по автоинкрементному идентификатору, а по некоему артикулу из внутренней базы данных организации. Этот артикул надо хранить для каждого товара. Для этого у каждого материала специально предусмотрено поле code (не путать с mnemocode!).
Для загрузки материала по коду (артикулу) используем следующую конструкцию:
$item = Component_Nodus::item_by_code('wheat05');
В этом случае материал будет загружен только если он реально существует в БД. Но в реальной ситуации бывает удобнее если при отсутствии такого материала он создается автоматически. Для этого можно передать второй параметр - мнемокод типа данных. В этом случае если материала с таким артикулом нет, то создается новый материал с указанным типом и артикулом:
$item = Component_Nodus::item_by_code('wheat05','catalog');