Нодус:Создаем свой тип данных

Компонент: Nodus

Задача: в компоненте Нодус создать тип данных "Кошка" с мнемокодом "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 вызывается автоматически.

Метки: Нодус
26.06.2014
Все статьи