Ajax и php-шаблонизатор — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
(Новая страница: « category:Написание кастомных макросов '''Актуально для версии 18 и php-шаблонизатора.''' В доку…»)
 
Строка 1: Строка 1:
[[category:Написание кастомных макросов]]
+
'''Статья предоставлена партнером UMI.CMS [https://www.umi-cms.ru/find_webdevs/shiriev_artur_venerovich/ Шириевым Артуром]'''
 
 
 
'''Актуально для версии 18 и php-шаблонизатора.'''
 
'''Актуально для версии 18 и php-шаблонизатора.'''
  
Строка 52: Строка 51:
 
Если в параметре $is_ajax истинное значение, то рендерится html.
 
Если в параметре $is_ajax истинное значение, то рендерится html.
 
Т.е. данный метод можно также использовать, как обычный макрос.
 
Т.е. данный метод можно также использовать, как обычный макрос.
 +
 +
[[category:Написание кастомных макросов]]

Версия 10:00, 13 июня 2018

Статья предоставлена партнером UMI.CMS Шириевым Артуром Актуально для версии 18 и php-шаблонизатора.

В документации не нашел, как подружить php-шаблонизатор и ajax.

Привожу пример метода для ajax-подгрузки новостей.

public function getGallery($parentId = 0, $limit = false, $is_ajax = 0) {
    $module = $this->module ? $this->module : $this;
    $limit = ($limit) ? $limit : $module->per_page;
    $currentPage = (int) getRequest('p');
    $offset = $currentPage * $limit;

    $pages = new selector('pages');
    $pages->types('hierarchy-type')->name('news', 'item');
    $pages->where('hierarchy')->page($parentId)->level(2);
    $pages->order('ord');
    $pages->limit($offset, $limit);

    $result = array();
    $total = $pages->length();
    $result['nodes:page'] = array();
    foreach($pages->result as $page) {
        $result['nodes:page'][] = $page;
    }
    $result['total'] = $total;
    $result['per_page'] = $limit;
    $result['stop'] = (int) (($offset + count($result['nodes:page'])) == $total);
    $result['category'] = $parentId;

    // кусок, отвечающий за рендер
    if ($is_ajax) {
        $currentTemplater = cmsController::getInstance()->getCurrentTemplater();
        $templatesSource = $currentTemplater->getTemplatesSource();
        $templater = new umiTemplaterPHP($templatesSource);
        $buffer = OutputBuffer::current('HTTPOutputBuffer');
        $buffer->push($templater->render($result, 'news/inc/gallery'));
        $buffer->end();
    }

    return $result;
}

В данном примере используется шаблон news/inc/gallery. Лучше не передавать его снаружи из-за соображений безопасности. Либо делать это с большой осторожностью.

Пример вызова: http://localhost/news/getGallery/{page_id}/{page_number}/1/

Если в параметре $is_ajax истинное значение, то рендерится html. Т.е. данный метод можно также использовать, как обычный макрос.