Behavior

3 views
Skip to first unread message

sartas

unread,
Jan 3, 2011, 9:40:32 AM1/3/11
to Frog CMS RU
Мне нужно сделать чтобы для каждой страницы можно было назначить тип
отображения. Например тип категория - выводится список детей;
фотогалерея - к контенту добавляются фотки из определенной папки и тд.

В FrogCMS есть тип страницы - Behavior, но я не могу понять как с его
помощью сделать то что я хочу.

jMas

unread,
Jan 3, 2011, 10:09:10 AM1/3/11
to Frog CMS RU
Есть плагин Archive, где реализованы типы или Behavior.

Суть следующая: мы можем подключить типы таким образом

Behavior::add('archive', 'archive/archive.php');
Behavior::add('archive_day_index', 'archive/archive.php');
Behavior::add('archive_month_index', 'archive/archive.php');
Behavior::add('archive_year_index', 'archive/archive.php');

В папке с плагином существует файл archive.php в котором реализовано 2
класса.

Первый класс Archive. Если для странице назначить этот класс, то
объект этого класса становиться доступен по $this->archive. В этом
классе есть возможность манипулировать потомками, это реализовано в
Archive::__construct(&$page, $params).

Второй класс ArchivePage, который должен наследовать FrontPage. Все
потомки FrontPage::children() страницы, которой был назначен
соответствующий behavior будут объектами этого класса. Можно
реализовать дополнительный функционал для всех потомков.

Как реализовать вашу задумку... Создаем плагин, называем его, к
примеру, "example" (не забудьте про файл manifest.ini).

index.php:

<?php

Behavior::add('example', 'example/example.php');

?>

example.php:

<?php

class Example
{
public function __construct(&$page, $params)
{
$this->page =& $page;
$this->params = $params;

$this->_displayPage( join('/', $params) );
}

private function _displayPage($slug)
{
if( ($this->page = find_page_by_slug($slug, $this->page)) ===
false )
page_not_found();
}
}

class ExamplePage extends FrontPage
{
public function getPhotos()
{
// Здесь, к примеру, основываясь на $this->slug можно
получить фотографии из папки, например, public/photos1 (slug =
photos1)
}
}

?>

Простите, если не понятно - после праздников еще как то туго
соображаю... :)

А использовать это можно будет так: просто в шаблоне сделать

<?php foreach( $this->getPhotos() as $photo_link ): ?>
...и выводить фотографии здесь
<?php endforeach; ?>

jMas

unread,
Jan 3, 2011, 10:17:09 AM1/3/11
to Frog CMS RU
Можно кстати пойти другим путем и в плагине реализовать функцию:

<?php

function example_photos( $page )
{
$dir = FROG_ROOT . PUBLIC_FILES . '/' . $page->slug;

use_helper('Dir');
$opendir = new Dir( $dir );

$photos = $opendir->getFiles();
return $photos;
}

?>

А в шаблоне просто добавить:

<?php foreach( example_photos($this) as $photo ): ?>
<img src="<?php exho $photo->getPathShort(); ?>" />
<?php endforeach; ?>

То есть другими словами получать фотографии на основе текущей
страницы, то есть переменной $this.

sartas

unread,
Jan 3, 2011, 1:48:30 PM1/3/11
to Frog CMS RU
В этом классе есть возможность манипулировать потомками, это
реализовано в
Archive::__construct(&$page, $params).

Зависимость потомков не нужна. У страницы - свой тип, у потомков -
свой, они не должны зависеть друг от друга.
В идеале создаем страницу с типом Archive - класс этой страницы -
Archive, а у потомков класс не меняется (Page).


Вроде нашел решение, frontpage.php

public static function find( $uri )
...
if( $page = find_page_by_slug($page_slug, $parent) )
{
// check for behavior
if( $page->behavior_id != '' )
{
// add a instance of the behavior with the name of the behavior
$params = explode_uri(substr($uri, strlen($url)));
//$page->{$page->behavior_id} = Behavior::load($page-
>behavior_id, $page, $params);
$page = Behavior::load($page->behavior_id, $page, $params);

//return $page;
}
}

...

sartas

unread,
Jan 9, 2011, 3:06:04 PM1/9/11
to Frog CMS RU
$page = Behavior::load($page->behavior_id, $page, $parent);

Прикольно получилось, уже сайт почти доделал. Теперь даже сниппеты не
нужны, просто создаем класс со своей функцией content(), которая
заменит аналогичную в классе Page (WolfCMS). Если класс задать тип
Archive, то у потомков будет класс PageArchive. Есть только один
недостаток: если у текущей страницы не задан тип, то ф-я children()
вернет объекты Page, а не тех типов которые были заданы у потомков.

Reply all
Reply to author
Forward
0 new messages