Реализуем отображение страниц

Выше мы создали типы данных для страниц модуля и ф-ии добавления этих страниц. Теперь необходимо сделать так, чтобы когда пользователи заходили на эти страницы, они видели результат обработки этой страницы нашим модулем.

Мы уже создали иерархический тип "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 страницу, на которую у текущего пользователя нет прав, не получится.


Сайт с системой управления от 6000 рублей!