Справка
Таблица
Код: [add]
Пример добавления:
[cex.articles.add('title'='Заголовок', 'body'='Тело статьи')]
После добавления новый объект доступен через команду [li].
Проверить, возможно ли добавление в таблицу/подтаблицу для текущего пользователя можно с помощью команды [Можно добавлять объекты?]
Код: [allcol]
Результат: Массивы
Например [cex.articles.title] вернёт массив заголовков всех статей, а [cex.articles.tags] вернёт массив всех тегов для всех статей.
Для фильтрации одинаковых значений в массиве используйте команду [Массив данных из определённого поля (без дубликатов)]
Код: [rasc]
Результат: Массивы
Кроме этого можно указать лимиты (начальный элемент и количество элементов).
Например:
[cex.articles.rasc('date',5,10)]
Выдаст массив статей, отсортированных по дате (вначале самые старые). Выдаст с 5ой по 15ую статью.
Если указано поле и два аргумента. То первый означает отступ, а второй лимит.
Если указано только поле и один аргумент, то он будет обозначать не отступ, а количество возвращаемых объектов.
Например:
[cex.articles.rasc('date',10)]
Выдаст первые 10 статей, отсортированных по дате.
Код: [rdesc]
Код: [id]
Результат: Значение (текст, числа, дата)
Код: [owner]
Результат: Объект
Код: [add?]
Результат: Значение (текст, числа, дата)
Код: [url]
Псевдонимы: geturl
Результат: Поле объекта
Для доступа к переменной используйте методы из категории "Поле объекта".
Если таблица вызвана из объекта, то возможен доступ к получению или изменению значения.
Например: [cex.pages.rows.first.table.url.value] выдаст значение URL-переменной у первой статьи.
Код: [major]
Результат: Поле объекта
Для доступа переменной используйте методы из категории "Поле объекта".
Если таблица вызвана из объекта, то возможен доступ к получению или изменению значения.
Например: [cex.pages.rows.first.table.major.value] выдаст значение главной переменной (например, заголовка) у первой страницы.
Код: [col]
Результат: Поле объекта
Например: [cex.pages.col.title.sname]
Если таблица вызвана из объекта, то позволяет работать с значением переменной.
Например:
[cex.pages.rows.first.table.col.body.value]
Выдаст значение переменной "Тело" у первой страницы.
Код: [st]
Псевдонимы: st2, st3, ast
Результат: Массивы
Например, попробуем получить перечень всех статей в категориях:
[cex.cat.st.articles]
А теперь попробуем получить комментарии этих статей:
[cex.cat.st.articles.st.comments]
Код: [st_auth]
Код: [foreign_tables]
Результат: Таблица
Например, если мы хотим получить доступ к подтаблице комментариев в статьях (при условии, что комментарии подключены из модуля комментариев) используем следующий код:
[cex.articles
.foreign_tables.mod_comments.table_comments]
Полученный экземпляр можно применить в тех методах, где требуется указать ID таблицы. Для типичных операций с объектами данный метод не работает, используйте флаги из метода [FIND].
Код: [local_tables]
Например, если мы хотим получить доступ к подтаблице статей в категориях, используем следующий код:
[cex.cat.local_tables.articles]
Полученный экземпляр можно применить в тех методах, где требуется указать ID таблицы. Для типичных операций с объектами данный метод не работает, используйте флаги из метода [FIND].
Код: [get]
Результат: Объект
Если переменная не указана, то производит поиск по всем переменным объекта.
Например, получим статью с заголовком "Интересная" - [cex.articles.get('title','Интересная')]
А теперь получим сотрудников, у которых хотя бы одно поле соответствует значению "Иван" - [cex.employers.get('Иван')]
Для получения множества значений, используйте оператор [gets]
Код: [gets]
Результат: Массивы
Код: [find]
Результат: Массивы
Поскольку операции происходят непосредственно в базе данных, такой вариант поиска (в отличие от оператора массива [Текущий объект (определённый через URL разбор)]) позволяет значительно экономить трафик между базой данных и сервером, оперативную память сервера и процессорное время. Единственное исключение - проверка доступов (флаг [check_auth]) произойдёт после выборки.
Существует несколько вариаций данной команды. Она может быть вызвана из таблицы/подтаблицы либо из массива данных. В первом случае отправной точкой станут все объекты таблицы, во втором - только те элементы, которые присутствуют в исходном массиве.
Кроме этого команда может возвращать не только набор элементов, но и их количество (оператор [find_count]).
Также команда может выдать ссылку на выборку в БД (что позволит в некоторых случаях сэкономить ОЗУ сервера) - [find_pointer]. Данная ссылка будет работать в связке с оператором перебора [tree], однако с ней нельзя работать как с обычным массивом.
[FIND] - первая команда из группы. Инициализирует поиск, настраивает его параметры.
- Флаг "Игнорировать родителя" позволяет проводить поиск по дочерним объектам.
- Флаг "Проверять доступы" осуществит проверку на возможность просмотра объектов текущим пользователем. В конечной выборке будут присутствовать только те объекты, которые прошли эту проверку. Аналогичного результата можно добиться, если подставить после цепочки команду [arows]
- Опция "Условия поиска". Позволяет игнорировать экземпляр таблицы, в которой происходит поиск ([ignore_ex]), или же вовсе игнорировать модуль ([ignore_module]).
Например, опцию [ignore_ex] мы можем использовать, если нам нужно найти все статьи, даже те, которые находятся в качестве дочерних объектов в категориях (т.е. совсем в другой таблице).
Пример: [cex.articles.find(ignore_ex)] - Опция "Какие объекты возвращает" предлагает провести поиск только среди активных/неактивных, либо среди всех объектов
- Опция "Дополнительные условия" позволяет вернуть массив родителей объектов.
- Опция "Подтаблица" позволит работать со всеми подобъектами из указанной подтаблицы.
Настройка [FIND] может выглядеть следующим образом:
[cex.category.find(subtable=articles, disabled, return_owners)]
Что будет означать - выбрать из таблицы "Категории" все деактивированные статьи, игнорируя их родителя, а затем выдать их категории.
Данный код (включая последующие операторы) полностью генерируется с помощью визуального редактора вставки.
После команды [FIND] можно задать условия для поиска, а также настройку сортировки и обрезки. Для этого существуют команды [where], [where_set], [sort], [limit], [start] и [if].
Команда [WHERE] позволяет задать условие для поиска.
Несколько команд [where] (без использования [where_set]) объединяются по принципу AND (логическое И).
Команда состоит из следующих аргументов:
- Переменная объекта, по которой будет происходить сверка
- Операция сравнения (см.ниже)
- Значение (то, с чем будет сравниваться переменная, если это необходимо)
- Мутатор переменной объекта (см.ниже)
Виды операций сравнения:
- Стандартные ==, !=, <, >, <=, >=
- contain - проверяет, содержит ли переменная значение
- not_contain - проверяет, что переменная не содержит значение
- contained - проверяет, содержит ли значение переменную
- not_contained - проверяет, что значение не содержит переменной
- in_array - проверяет, содержится ли переменная в массиве значений
- not_in_array - проверяет, что переменная не содержится в массиве значений
- empty - переменная пустая (значение в этом случае можно не указывать)
- not_empty - переменная не пустая (также можно не указывать значение)
Виды мутаторов переменной:
- mutate_lower - приводит переменную объекта в нижний регистр перед сверкой с значением (может не работать на некоторых СУБД с кириллическими текстами)
- mutate_length - сравнивает со значением длину переменной
- mutate_value - сравнивает с значением другого поля текущего объекта (в этом случае, в поле "Значение" заполняется sname нужного для сравнения поля)
Зарезервированные названия для переменных (данный перечень также работает для сортировки):
- id - идентификатор объекта
- pos - позиция объекта в административном кабинете
- owner/own - ID родителя объекта
- user/usr - главный владелец (пользователь) объекта
- major - главная переменная объекта
- creation_date - дата создания объекта
- modified_date - дата модификации объекта
Команда [WHERE_SET] позволяет задать группировку нескольких условий where, объединённых с помощью AND или OR (логическое и / или). Группировка может быть сколь угодно вложенная (т.е. вместо условия where в группировку можно вставить команду where_set).
Первый аргумент [where_set] определяет тип проверки 'or' или 'and', все последующие аргументы делятся на условия и группы условий.
Команда [SORT] позволяет указать переменную, по которой произойдёт сортировка и тип сортировки. Если тип не указывать, произойдёт сортировка по возрастанию. Также можно указать тип DESC (по уменьшению), RAND (случайным образом).
Для сортировки по множеству переменных укажите несколько операторов [SORT], идущих друг за другом. Приоритеты сортировки будут аналогичны порядку команд [SORT].
Вместо названия переменной можно указать одно из зарезервированных значений - id, pos, owner, user, major и т.д. (см. выше).
Команда [START] позволяет пропустить некоторые объекты от начала выборки. Например, [start(10)] пропустит первые 9 элементов.
Команда [LIMIT] ограничивает выборку указанным количеством.
Команда [IF] является префексом для любой команды. Если условие из неё не выполняется, то следующая за ней команда игнорируется.
Примеры
[cex.pages.find.where('title', contain, 'контакты', mutate_lower).if($x==0).limit(5)]
Произойдёт выборка страниц, заголовки которых в нижнем регистре содержат слово "контакты". Если [$x==0], то произойдёт обрезка результата до 5 страниц.
[cex.category.find(subtable='articles', ignore_owner).where_set('or',
where('tags', '==', cex.tags.get('интересно')),
where('owner', 'in_array', cex.category.find.where('title', contain, 'хорошо') ),
if($x==1).where('creation_date', '<', glob.date.day(-10) )
) .sort('modified_date','desc') .if($x==0).sort('title').start(2)]
Выборка произойдёт во всех статьях из всех категорий. Затем выберутся только те статьи, которые подойдут под одно из указанных в [where_set] условиях:
- Либо у статьи будет тег "Интересно"
- Либо категория, в которой лежит статья будет содержать название "хорошо"
- Либо (если [$x==1]) если дата создания меньше текущей на 10 дней
Затем будет пропущена первая статья ([start(2)]).
Пример работы с методом [FIND] через визуальный редактор можно найти во второй половине этого видео
Код: [find_count]
Результат: Значение (текст, числа, дата)
Код: [find_pointer]
Далее результат работы этой команды можно использовать в качестве аргумента для цикла [tree].
Код: [count]
Результат: Значение (текст, числа, дата)
Код: [sel]
Псевдонимы: sel_row
Результат: Объект
Код: [rows_auth]
Проверка работает на стороне сервера, что означает полную выгрузку всех объектов таблицы из БД и последующую их фильтрацию по правам доступа. Будьте внимательны при эксплуатации метода, следите за расходом оперативной памяти и процессорного времени.
Код: [irows]
Псевдонимы: rows4
Результат: Массивы
Например, таблица статьи вложена в категории. Статьи при этом существуют как отдельно от категорий (в самой таблице статьи) так и в подтаблице "Статьи" для каждой отдельной категории.
Метод [irows] вернёт все статьи. И те, которые находились непосредственно в исходной таблице, и те, которые находились в категориях.
Работает в рамках текущего экземпляра модуля.
Код: [admin_url]
Псевдонимы: aurl
Результат: Значение (текст, числа, дата)
Код: [on_edit]
Результат: Значение (текст, числа, дата)
Для запуска используйте [$table.on_edit.shell]
Код: [on_top]
Результат: Значение (текст, числа, дата)
Для запуска используйте [$table.on_top.shell]
Код: [on_bottom]
Результат: Значение (текст, числа, дата)
Для запуска используйте [$table.on_bottom.shell]
Код: [md]
Результат: Модуль
Например, подчиним таблице "Статьи" из соответствующего модуля, таблицу "Комментарии" из модуля "Общение".
Теперь для каждой статьи у нас доступен набор комментариев. При этом каждая отдельная статья является экземпляром модуля "Общение" (это выражается в наличии настроек переменных модуля для каждой отдельной статьи, а также общих настроек, доступных в настройках экземпляра из модуля "Статьи").
Теперь мы можем запустить модуль комментариев из части "Показать статью" таким образом:
[cow.comments.md.auto]
где [cow] - текущая открытая статья.
Либо можем вызвать отдельную часть этого модуля - [cow.comments.md.part.show_add_form]
Таким образом обеспечивается быстрая интеграция модулей друг с другом.
Читать далее про "Поле объекта"