В FrogCMS есть тип страницы - 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; ?>
<?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.
Зависимость потомков не нужна. У страницы - свой тип, у потомков -
свой, они не должны зависеть друг от друга.
В идеале создаем страницу с типом 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;
}
}
...
Прикольно получилось, уже сайт почти доделал. Теперь даже сниппеты не
нужны, просто создаем класс со своей функцией content(), которая
заменит аналогичную в классе Page (WolfCMS). Если класс задать тип
Archive, то у потомков будет класс PageArchive. Есть только один
недостаток: если у текущей страницы не задан тип, то ф-я children()
вернет объекты Page, а не тех типов которые были заданы у потомков.