Нодус:Создаем свой тип данных
Задача: в компоненте Нодус создать тип данных "Кошка" с мнемокодом "cat". Для этого идем в каталог app/components/Nodus/app/Datatype и создаем в нем подкаталог Cat. В нем создаем модуль Type.php со следующим содержимым:
Core::load('Component.Nodus.Datatype'); class Component_Nodus_App_Datatype_Cat_Type extends Component_Nodus_Datatype implements Core_ModuleInterface { public function title() { return 'Кот (кошка)'; } public function description() { return 'Представитель семейства млекопитающих отряда хищных'; } public function tabs() { return array( 'default' => 'Параметры', 'extra' => 'Доп.параметры', ); } public function fields() { return array( 'image' => array( 'type' => 'image', 'sqltype' => 'varchar(100)', 'caption' => 'Портрет', 'tab' => 'default', ), 'description' => array( 'type' => 'textarea', 'sqltype' => 'text', 'style' => 'width:100%;height:100px;', 'caption' => 'Описание', 'tab' => 'default', ), 'price' => array( 'type' => 'input', 'sqltype' => 'price', 'caption' => 'Цена', 'tab' => 'default', ), ); } }
Теперь сбрасываем кеш. Эту процедуру вообще надо делать после любых серьезных изменений в Нодусе: добавления типов, добавления/изменения полей в существующем типе, добавления/удаления шаблонов. После этого мы можем зайти в админке в раздел "Содержимое сайта : Материалы" и нажать кнопку "Добавить материал". Новый материал появился в списке:
Разъяснение сути
В данном классе наблюдаем следующие функции:
- title - заголовок типа. Он нужен в основном только для админки, но никто не мешает приспособить его и для иных нужд.
- description - также нужен только в админке.
- tabs - вкладки формы редактирования материала. Их может быть много, но вкладки default и extra должны быть обязательно, т.к. именно в них будут отображаться стандартные поля.
- fields - описание полей материала
Функция fields вообще самая важная. На основании возвращаемых ею данных не только рисуется форма редактирования, но и создается структура базы данных. Обратите внимание на параметр sqltype: если он есть, то в БД будет создано соответствующее поле. Как описывать SQL-типы полей - это отдельная тема.
Полей в форме много, но мы описываем только те, которые характерны для данного типа. Остальные поля - стандартные и в описаниях не нуждаются, однако их тоже можно упоминать в функции fields в том случае, если нужно что-то изменить в параметрах поля. Вот, к примеру, давайте внимательнее взглянем на форму редактирования: мы увидим там поле "Заголовок". Непорядок. У кота не может быть заголовка, у кота должно быть имя. Поэтому нам нужно caption у поля title заменить на "Имя". Для этого добавим в информацию, возвращаемую функцией fields, еще одну позицию:
'title' => array( 'caption' => 'Имя', ),
Обратите, что мы упомянули лишь один параметр (caption), а остальные параметры остаются стандартными.
Отображение записи
Создадим запись (см. скриншот).
И по указанному адресу (/leopold/) мы теперь можем наблюдать страницу, посвященную этому достойнейшему представителю семейства кошачьих. Конечно же, страница по умолчанию нас совершенно не устроит, поэтому давайте сверстаем простенький шаблон. Создадим в том же самом каталоге app/components/Nodus/app/Datatype/Cat новый файл - full.phtml:
// app/components/Nodus/app/Datatype/Cat/full.phtml <h1><?= $item->field('title') ?></h1> <div class="cat-full"> <div class="cat-img"><?= $item->field('image')->fit('300x600') ?></div> <div class="props"> <div class="price">Цена: <?= $item->field('price') ?> сольдо</div> <div class="description"><?= $item->field('description') ?></div> </div> </div>
В данном случае файл шаблона должен иметь расширение phtml (как и все шаблоны) и имя, равное наименованию режима отображения записи. Наша страница по умолчанию имеет режим отображения full. Есть возможность делать страницы и с другими режимами, но это - отдельный разговор.
В шаблоне нам доступен объект записи $item со всей своей информацией. Обратите внимание, что к полям записи мы обращаемся через функцию field, имеющую параметром имя поля. Конечно же, никто не мешает обращаться к полям напрямую - например, $item->description. Однако $item->field('description') предпочтительнее, т.к. field возвращает не значение, а т.н. ValueContainer - объект, содержащий в себе значение, а кроме этого - дополнительные методы для работы с этим значением. Набор методов зависит от типа поля и в некоторых случаях предоставляет весьма полезную функциональность. В общем случае для получения значения поля в строковом виде необходимо вызвать render:
$rendered_value = $item->field('image')->render();
При вставке в шаблон непосредственно объекта-контейнера функция render вызывается автоматически.