Работа с динамикой

Для работы с динамикой существует объект \Eva\dynamicBlender. Все действия связанные с получением списка элементов динамики - рекомендуется производить через него.

Для получения 

Это самый базовый вызов. В ответ получим примерно такой массив:

Array
(
    [items] => Array
        (
            [0] => Array
                (
                    [id] => 6
                    [false_id] => 
                    [name] => Вторичный конус выноса в XXI веке
                    [sort] => 10
                    [preview_text] => 
                    [detail_text] => 
                    [category] => 2
                    [published] => 1
                    [link_name] => 
                    [section] => 0
                    [created_by] => 1
                    [created_time] => 2016-05-19 19:04:20
                    [modified_by] => 1
                    [modified_time] => 2016-05-20 17:15:58
                    [search] => 
                    [property_img] => 
                    [property_img_add] => 
                    [property_img_element] => 
                    [property_date] => 2016-05-08 18:05:39
                    [property_date_add] => 1
                    [property_date_element] => 6
                )
                ...
        )
)

Если нам необходимо получить только первые N элементов - используем такую конструкцию

Очень часто, при вызове динамики, необходимо использовать сортировку и разбивку по страницам.

В ответ, дополнительно к массиву items получим массив pages, в котором будут:

  • rows- количество элементов в выборке
  • pages - количество страниц
  • next_page - номер следующей страницы (если следующей страницы нет, то будет равен 0)
  • prev_page - номер предыдущей страницы (если предыдущей страницы нет, то будет равен 0)
  • next_page_url - ссылка следующей страницы (если следующей страницы нет, то не будет установлена)
  • prev_page_url - ссылка предыдущей страницы (если предыдущей страницы нет, то не будет установлена)
  • links - массив с номерами страниц отсносительно страницы генерации, имейте ввиду, если страниц слишком много, то они будут разбиты знаком -. В постраничной навигации всегдс присутствует первая и последняя страницы.
[pages] => Array
    (
        [rows] => 4
        [pages] => 2
        [page] => 1
        [next_page] => 2
        [prev_page] => 0
        [next_page_url] => /test.php?p=2
        [links] => Array
            (
                [0] => Array
                    (
                        [page] => 1
                        [url] => /test.php
                    )
    
                [1] => Array
                    (
                        [page] => 2
                        [url] => /test.php?p=2
                    )
    
            )
    
    )

Так как запрос на получение количества страниц может являться очень ресурсоемкой задачей (если в базе данных много записей), по этому dynamicBlender кеширует количестов страниц на 1 час.

Как мы видим, по умолчанию dynamicBlender достает все возможные свойства. Не очень хорошо, требовать от базы данных вернуть нам то, что не нужно. 

Допустим нам нужно вывести новостной блок на главную страницу, там нам не нужен детальный текст, разные системные поля, картинка и т.д. Для этого используем setSelect($arr)

Часто приходится строить ссылку детального описания у динамических элементов. Для этого используем метод generateDetailUrl(). Метод принимает строку в качестве параметра. В строке можно использовать любые поля, которые в текущий момент выводятся. По мимо этого существуют следующие функции, которые указываются до двоеточия.

  • translit -  транслитерирует строку, заменяет символы пунктуации на -.

Теперь в ответ приходит только 3 поля: ИД, навзание и дата.

Крайне желательно использовать setSelect(), так как при его использовании dynamicBlender максимально пытается оптимизировать запрос. По мимо того, что он убирает ненужные поля из финального запроса SELECT ... FROM, он еше и убирает ненужные таблицы (например таблицу свойств или таблицы от сторонних модулей, что будет рассмотрено позже).

dynamicBlender так же умеет фильтровать элементы. Для этого используется метов addWhere(). У данного метода очеень много разных вариантов использования. 

Поддерживаются несолько типов сравнения в фильтрации:

  • равно
  • не равно, используется символ: !=
  • больше, используется символ: >
  • больше либо равно, используется символ: >=
  • меньше, используется символ: <
  • меньше либо равно, используется символ: <=
  • похоже (LIKE в MySQL), используется символ ~

Например, показать элементы, где естьк артинка:

Допускается использовать несколько addWhere(), но во всех последующих нужно выбрать вариант сравнения: or или and

Получаем данные из других модулей

По мимо работы с текущей категорией, dynamicBlender умеет подсоединять к ней другие таблицы, для этого  используется метод addJoin().

addJoin() принимает 2 параметра:

  • Модуль, который нужно присоединить
    • Если строка, то во время присоединения, будет использован метов blendTable(), у соответствующего объекта
    • Если массив, то первый элемент будет использован в качестве объекта, а второй, в качестве метода
  • Параметры, которые будут переданы в модуль

Некоторые модули имеют короткий и длинный способы присоединения, но об этом нужно читать в документации плагина, если он не является базовым.

Рассмотрим основные

Присоединение таблицы с пользователями

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

Бывает так, что в одном из свойств текущей динамической категории лежит id другой динамической категории. dynamicBlender может присоединить ее вместе со всеми свойствами. Кроме этого, он может присоединить категорию к уже присоединенной категории.

Короткая форма:

Аналогичная, длинная форма

Добавление модуля универсального кеширования значений (используется, например, при подсчете количества комментариев)

Модуль секций

Модуль рейтинга

По мимо этого существуют поля, которые подключаются через дополнительные плагины. Об этом написано в документации к ним.