Выше мы создали типы данных для страниц модуля и ф-ии добавления этих страниц. Теперь необходимо сделать так, чтобы когда пользователи заходили на эти страницы, они видели результат обработки этой страницы нашим модулем.
Мы уже создали иерархический тип "mymod" / "page" и страницу, которая принадлежит этому иерархическому типу. Это означает, что при заходе на страницу этого иерархического типа, будет вызываться метод "page" модуля "mymod". Откроем новую, предварительно созданную страницу (допустим, по адресу /my_test_page/) и приступим к созданию обработчика. Если зайти на нее сейчас, то нам выведется ошибка, которая говорит о том, что система не знает, как ее обработать.
Создадим в файле classes/modules/mymod/class.php метод "page":
public function page() {
return "Test. Do you see this text?";
}
Обновите страницу, и увидите, что вместо текста ошибки вывелась фраза "Test. Do you see this text?". Это то, что вернет метод-обработчик данной страницы.
Теперь сделаем так, чтобы вернет что-то из свойств этой страницы.
public function page() {
//Получим id текущей страницы:
$element_id = cmsController::getInstance()->getCurrentElementId();
//Получим объект этой страницы:
$element = umiHierarchy::getInstance()->getElement($element_id);
//Если не получилось, то выбрасываем исключение:
if(!is_object($element)) {
throw new privateException("Не могу получить элемент #{$element_id}");
}
//Получаем свойство страницы (например, заголовок)
$h1 = $element->getValue("h1");
//Возвращаем результат:
return "Выводим результат страницы с заголовком {$h1}.";
}
Теперь последний шаг - допустим, что мы выводим какую-то сложную страницу и хотим при этом использовать шаблоны:
public function page($template = "default") {
//Получаем блок шаблона "block" из файла шаблона $template, из папки "tpls/mymod".
list($template_block) = $this->loadTemplates("./tpls/mymod/{$template}.tpl", "block");
$block_arr = Array();
//Получим id текущей страницы:
$element_id = cmsController::getInstance()->getCurrentElementId();
//Получим объект этой страницы:
$element = umiHierarchy::getInstance()->getElement($element_id);
//Если не получилось, то выбрасываем исключение:
if(!is_object($element)) {
throw new privateException("Не могу получить элемент #{$element_id}");
}
//Получаем свойство страницы (например, заголовок)
$h1 = $element->getValue("h1");
//Добавим в $block_arr несколько значений:
$block_arr['id'] = $element_id;
$block_arr['link'] = umiHierarchy::getInstance()->getPathById($element_id);
/*
Возвращаем в качестве результата блок шаблона, полученный выше через метод loadTemplates.
В качестве $block_arr передаем массив, ключи которого заменяться на макросы %array_key%
3й аргумент означает, что этот блок шаблона выводится для страницы с id $element_id, и все макросы, которые встретятся
в шаблоне будут заменены на соответствующие значения свойств у страницы $element_id
*/
return $this->parseTemplate($template_block, $block_arr, $element_id);
}
Обратите внимание, что
- Метод loadTemplates в случае неудачи выбрасывает publicException, который перехватывается выше и его можно вывести через макрос
- Допустимое имя файла шаблонов - [A-z_\-0-9]
- 3й параметр в parseTemplate - id элемента, все свойства которого будут представлены блоке шаблона ($template_block). Например, если указать в шаблоне макрос "%anons%", то если свойство "anons" есть у страницы $element_id, то вместо макроса будет подставлено значение этого свойства.
- При вызове ф-ий все права проверяются самой системой. Т.е. вызвать через umiHierarchy::getElement страницу, на которую у текущего пользователя нет прав, не получится.