Нодус:Создание и редактирование материалов из скрипта

Компонент: Nodus

Админки Нодуса не всегда хватает для функционирования сайта. Иногда приходится создавать дополнительные программные механизмы. Например, часто требуется автоматический скрипт закачки (синхронизации) товаров в каталоге. Рассмотрим средства для создания и изменения контента.

Создание нового материала

$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');
Метки: Нодус
26.06.2014
Все статьи