|
В этой главе будут рассмотрены несколько примеров работы с новостями (получение новости, получение списка новостей) и классы для генерации результатов вывода.
В приведенных ниже примерах показана только та часть кода, которая непосредственно отвечает за получение требуемых данных. Точка входа (отдельно
стоящий скрипт или плагин) может быть любой.
4.1 Получение новости
Получение новости с идентификатором id=1 и вывод данных:
Используемые методы будут пояснены в
дальнейших примерах.
$oNewsItem = AMI::getResourceModel('news/table')->find(1); echo "News item ID = ".$oNewsItem->id."<br>"; print_r(iterator_to_array($oNewsItem));
4.2 Получение списка новостей Получение значений столбцов id, header у трех новостей и печать данных.
$oNewsList = AMI::getResourceModel('news/table')->getList() ->addColumns(array('id', 'header')) ->setLimitParameters(0, 3)->load(); print_r(array_map('iterator_to_array', iterator_to_array($oNewsList)));
Или поэлементная печать, используя foreach: $oNewsList = AMI::getResourceModel('news/table') ->getList()->addColumns(array('id', 'header')) ->setLimitParameters(0, 3)->load(); foreach($oNewsList as $oNewsItem) { print_r(iterator_to_array($oNewsItem)); }
4.3 Рабочий пример вывода списка новостей
Предполагается разработка на домене cms.my.
Задача – создать скрипт my_news.php, выводящий 3
опубликованных русскоязычных новости в виде таблицы, состоящей из 2 столбцов:
дата, название. Т.е. http://cms.my/my_news.php
выводит требуемую таблицу новостей.
4.3.1 Исходный код Поскольку файл содержит код HTML, необходимо сохранять его в кодировке UTF-8.
<?php require 'ami_env.php';
// Get response object $oResponse = AMI::getSingleton('response'); $oResponse->start();
/* Код, находящийся между комментариями «Show items list start» и «Show items list end» отвечает непосредственно за генерацию списка элементов. */ // ************* // Show items list start // *************
$modId = 'news';
/* Получение объекта модели для списка: */ $oNewsModelList = AMI::getResourceModel($modId . '/table')->getList();
/* На список накладываются фильтры, порядок сортировки, лимиты, выбираются поля объектов, которые должны быть загружены, и происходит загрузка элементов из базы данных: */
$oNewsModelList ->addColumns(array('date_created', 'header', 'id')) ->addOrder('date_created', ' desc') ->addWhereDef('AND ' . $oNewsModelList->getFieldName('public') . ' = 1') ->addWhereDef('AND ' . $oNewsModelList->getFieldName('lang') . " = 'ru'") DB_Query::getSnippet('AND %s = %s') ->plain($oNewsModelList->getFieldName('lang')) ->q('ru') ) ->setLimitParameters(0, 3) ->load();
/* Производится подготовка переменной, для сбора таблицы результатов вывода: */
$res = '<table>'; $res .= '<tr><th>Дата</th><th>Название</th></tr>';
/* Цикл по списку элементов: Следует обратить внимание, что $oNewsModelItem, получаемый в цикле, это объект модели элемента. */
foreach($oNewsModelList as $oNewsModelItem) { $res .= '<tr><td>' . $oNewsModelItem->date_created . '</td><td>' . $oNewsModelItem->header . '</td></tr>'; }
/* Закрытие таблицы: */
$res .= '</table>';
// ************* // Show items list end // ************* $oResponse->write($res); $oResponse->send();
4.3.2 Список доступных полей модели
Список доступных полей модели возвращает метод
AMI_ModTable::getAvailableFields():
AMI::getResourceModel($modId
. '/table')->getAvailableFields();
Общие поля, присутствующие в большинстве моделей:
|
Поле
|
Тип
|
Описание
|
|
Общие поля
|
|
id
|
целое
|
Идентификатор
|
|
public
|
0/1
|
1 – элемент доступен, 0 – элемент неопубликован
|
|
archive
|
0/1
|
Статус архивности
|
|
header
|
строка
|
Заголовок
|
|
announce
|
строка
|
Краткое описание
|
|
body
|
строка
|
Полное описание
|
|
lang
|
строка, 2-3 символа
|
Принадлежность элемента к локализации (ru, en, de, и
т.д.)
|
|
date_created
|
дата
|
Дата создания
|
|
date_modified
|
дата
|
Дата модификации
|
|
sublink
|
строка
|
Собственная часть URL элемента на публичной части сайта
|
|
id_page
|
Целое
|
Идентификатор страницы элемента в менеджере сайте (0 –
общий элемент)
|
|
id_owner
|
Целое
|
Идентификатор владельца элемента
|
|
position
|
Целое
|
Позиция для сортировки в ручном режиме
|
|
details_noindex
|
0/1
|
Флаг, регулирующий запрет индексации поисковиками
деталей
|
|
hide_in_list
|
0/1
|
Флаг, регулирующий скрытие элемента в списках, без
запрета на показ по прямой ссылке.
|
|
sticky
|
0/1
|
Флаг, указывающий, что элемент является прикрепленным в
списке
|
|
date_sticky_till
|
строка, дата
|
Срок действия флага прикрепленности
|
|
Поля расширения изображений
|
|
ext_img
|
строка
|
Файл изображения
|
|
ext_img_small
|
строка
|
Файл малого изображения
|
|
ext_img_popup
|
строка
|
Файл всплывающего изображения
|
|
Поля расширения рейтингов
|
|
ext_rate_count
|
целое
|
Число голосов
|
|
ext_rate_rate
|
целое
|
Рейтинг элемента
|
|
Поля расширения обсуждения
|
|
ext_dsc_disable
|
0/1
|
Флаг, регулирующий запрет обсуждения элемента
|
|
Поля расширения категорий (добавляются только при
активированном расширении категорий)
|
|
cat_id
|
целое
|
Идентификатор категории
|
|
cat_header
|
строка
|
Заголовок категории
|
|
cat_sublink
|
строка
|
Собственная часть URL категории элемента на публичной
части сайта
|
Данный метод может использоваться для проверки наличия полей у требуемой модели
4.3.3 Объект AMI_Response
Объект AMI_Response
предназначен для управления выводом: вывод HTTP-заголовков, буферизация, кеширование, замеры и отладка скорости работы.
Объект создается автоматически при работе всех стандартных
модулей Amiro.CMS, и его настоятельно
рекомендуется использовать при создании собственных скриптов.
Создание объекта:
// Get response object $oResponse = AMI::getSingleton('response'); $oResponse->start();
Вывод результата в требуемом формате (JSON или HTML): $oResponse->write($res); $oResponse->send();
4.3.4 Шаблонизатор AMI_Template, AMI_TemplateSystem
В приведенном выше примере для упрощения кода не
используются шаблоны и логика смешана с отображением. В реальном коде делать
так крайне не рекомендуется. API
предоставляет два вида шаблонизаторов – полный и облегченный. Пример
использования будет показан в MVC разделе данного руководства.
При разработке для публичной части сайта рекомендуется
использовать некеширующий шаблонизатор AMI_Template,
работающий только с шаблонами на диске, содержащий минимально достаточный
функционал, потребляющий минимум памяти и процессорного времени. Полный
шаблонизатор AMI_TemplateSystem рекомендуется
использовать, только если базовым функционалом обойтись заведомо невозможно..
В плагине достаточно использовать AMI_Template в случаях
если:
- Плагин
является некэшируемым, важна скорость обработки шаблона (типовой пример –
плагин для отдачи быстрых AJAX запросов).
- Шаблоны
содержат только заменяемые переменные типа ##name##, ##link## и т.д.
Поддержка специальных конструкций ##if(...)##, ##include_template...##,
##setvar...## и т.п. в лёгком шаблонизаторе отсутствует.
- Шаблон
не содержит конструкции подключения языковых файлов, например %%include_language...%%.
Все языковые файлы должны быть добавлены в PHP коде плагина. Тем не менее
языковые переменные типа %%caption%% обрабатываются.
- Шаблоны
лежат только на жёстком диске.
Типовые операции с
шаблонами:
Операция | Пример вызова |
|---|
Создание объекта | $oTpl = new AMI_Template; | Добавление блока | oTpl->addBlock('my_block', 'templates/my_tpl.tpl'); | Парсинг шаблона | $str =
$oTpl->parse('my_block:my_set', $aScope); |
Добавление блока | oTpl->addBlock('my_block', 'templates/my_tpl.tpl'); | Парсинг языкового файла | $aLang = $oTpl->parseLocale('templates/lang/my_lang.lng'); |
AMI_TemplateSystem в отличие от AMI_Template поддерживает
чтение шаблонов из базы и позволяет использовать полный функционал системы.
Типовые операции с
шаблонами:
Операция | Пример вызова |
|---|
Создание объекта | $oTpl = new AMI_TemplateSystem; | Переключение источника шаблонов | $oTpl->addBlock('templates/', 'db'); | Добавление блока | $oTpl->addBlock('my_block', 'templates/my_tpl.tpl'); |
Парсинг шаблона | $str = $oTpl->parse('my_block:my_set', $aScope); | Парсинг языкового файла | $aLang = $oTpl->parseLocale('templates/lang/my_lang.lng');
|
4.3.5 Комментарии 4.3.5.1 Перенос кода примера в плагин
Следует обратить внимание, что для того, чтобы создать плагин, выводящую аналогичную таблицу, достаточно код, размещенный между комментариями «Show items list start» и «Show items list end» добавить, например, в качестве спецблока плагина, и вернуть результат в переменную $resultHtml.
Т.е. если в спецблоке плагина используется файл my_specblock.php, то он должен выглядеть так:
<?php
// *************
// Show items list start
// *************
...
// *************
// Show items list end
// *************
$resultHtml = $res;
4.3.5.2 Автоматическая генерация изображений
Если при разработке скриптов с использованием точки входа ami_env.php требуется функциональность автоматической генерации изображений, заложенная в системе, параметры автоматической генерации, соответствующие одноимённым настройкам модулей в секции «Расширение «Изображения»», необходимо задавать следующим образом:
<?php
$modId = 'news';
// Выбранные изображения будут уменьшены автоматически
AMI::setOption($modId, 'generate_pictures', array('picture', 'popup_picture', 'small_picture'));
// Приоритетное исходное изображение
AMI::setOption($modId, 'prior_source_picture', 'popup_picture');
// Максимальная ширина уменьшенного изображения
AMI::setOption($modId, 'picture_maxwidth', 300);
// Максимальная высота уменьшенного изображения
AMI::setOption($modId, 'picture_maxheight', 300);
// Максимальная ширина маленького изображения
AMI::setOption($modId, 'small_picture_maxwidth', 80);
// Максимальная высота маленького изображения
AMI::setOption($modId, 'small_picture_maxheight', 80);
// Максимальная ширина всплывающего изображения
AMI::setOption($modId, 'popup_picture_maxwidth', 800);
// Максимальная высота всплывающего изображения
AMI::setOption($modId, 'popup_picture_maxheight', 600);
// Увеличивать ли изображение, если оно меньше чем задано
AMI::setOption($modId, 'generate_bigger_image', true);
|