Skip to content
butschster edited this page Mar 25, 2014 · 2 revisions

Behaviors ( тип страницы)

В стандартной комплектации KodiCMS страницы выполняют всего одну функцию - вывод контента из частей страниц.

Но иногда нам нужно вывести данные из собственного модуля, например - мы сделали модуль новостей и хотим выводить по URL http://site/news/my-first-news.html - новость со slug my-first-news из своего модуля. Именно для этого и существуют behavoirs - они позволят обращаться к своим данным по определенным условиям.

Как это работает

После того, как вы установили для определенной страницы (/news/) новый тип, например news, то при попытке в браузере зайти по URL /news/ либо /news/..., то система начнет искать класс Behavior_News и если он существует - вызовет его, если нет - выкинет Exception.

Также будет произведен поиск класса Model_Page_Behavior_News, если он будет найден, то он будет объектом страницы news, если нет, то Model_Page_Front.

Все behaviors должны наследоваться:

  • Behavior_News от Behavior_Abstract и иметь метод execute().
  • Model_Page_Behavior_News от Model_Page_Behavior

При вызове класса Behavior_News в него передается по ссылке объект страницы news, а также uri относительный от /news/, т.е. если мы вызвали URL /news/articles/1234.html, то uri будет articles/1234. После того, как все параметры были переданны, происходит поиск нужного роута из списка указанных, если роутов не указано, то uri разбирается по знаку / и параметры будут доступны по числовому ключу, а именно array(0 => 'articles', 1 => '1234') и далее вызван метод execute

Model_Page_Behavior немного меняет логику вывода частей страниц, т.е. при вызове $page->content() в шаблоне сайта - сначала будет искаться метод Model_Page_Behavior_News::content_body и если найден, то вызван, иначе будет показана часть страницы part::body, то удобно если нужно выводить собственный контент.

Роуты

За основу роутов взят принцип роутов Kohana, только несколько проще.

Например:

public function routes()
{
	return array(
		'/<category>/<news_id>' => array(
			'method' => 'get_news',
			'regex' => array(
				'news_id' => '[0-9]+'
			)
		),
		'/<category>' => array(
			'method' => 'get_category_news'
		),
	);
}

Также как в роутах Kohana, все, что обрамлено скобками, является параметрыми и при разборе роута - будут являтся ключами сегментов uri.

У каждого роута есть параметр с ключом method, который указывает какой метод текущего класса запустить, по умолчанию он равен execute.

Параметры можно получить через метод param, например $this->param('category'), вторым параметром метода указывается значение по умолчанию, в точности как в контроллерах.