Кастомный макрос на основе выборки через selector

Материал из Umicms
Версия от 16:48, 13 июня 2018; Lesnik512 (обсуждение | вклад) (Новая страница: «'''Актуально для версии 18.''' Стандартные макросы для выборки данных содержать в себе довол…»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

Актуально для версии 18.

Стандартные макросы для выборки данных содержать в себе довольно много функциональности, которая может совсем не использоваться, а каких то функций или данных может наоборот не хватать.

В последнее время стараюсь избегать использования стандартных макросов в пользу небольших самописных. Ниже пример с комментариями из реального проекта.

/**Постраничный вывод объектов каталога 
 * @param int $parentId id раздела для поиска страниц
 * @param bool $limit количество объектов на странице
 * @param array $fields массив с дополнительными полями, которые нужны
 * @return array
 * @throws selectorException
 */
public function getObjects($parentId = 0, $limit = false, $fields = array()) {
    $limit = ($limit) ? $limit : $this->module->per_page;
    $currentPage = (int) getRequest('p');
    $offset = $currentPage * $limit;
    if (!is_array($fields)) $fields = explode(',',$fields);

    // объединяем общий список полей с переданным через параметр $fields
    $fields = array_merge(array('id', 'name', 'alt_name'), $fields);

    $hierarchy = umiHierarchy::getInstance();
    $pages = new selector('pages');
    $pages->types('hierarchy-type')->name('catalog', 'object');
    $pages->where('hierarchy')->page($parentId)->level(2);

    // selector вернет вместо объектов umiHierarchyElement ассоциативный массив
    $pages->option('return')->value($fields);
    $pages->order('ord')->asc();
    $pages->limit($offset, $limit);

    $result = array();
    $total = $pages->length();
    foreach($pages->result as $page) {
        $item = $page;
        $item['link'] = $hierarchy->getPathById($item['id']);
        $result['nodes:page'][] = $item;
    }
    $result['total'] = $total;
    $result['per_page'] = $limit;
    return $result;
}

Метод работает в php- и xslt-шаблонизаторах.