Использование селекторов для определения разделов сайта

На печать

Для удобства и гибкости при указании разделов сайта в макросах можно использовать селекторы.  Селекторы в Багире – это аналог селекторов в JQuery. У тех и у других есть сходства и различия, но логика построения и синтаксис очень похожи.

Определение раздела по указанному селектору можно использовать в следующих макросах:

%structure.menu()%

%structure.filter()%

%structure.objList()%

%structure.objListByTags()%

%structure.getObjURL()%

%voting.objList()%

 

Общая структура селектора

Любой селектор состоит из двух частей разделенных пробелом:

  1. Определение нужного раздела в структуре сайта (далее по тексту «Цепочка»).
  2. Определение выбираемого содержимого указанного раздела по ORM-классу.

Пример простейшего составного селектора:

454 news – указываем, что в разделе с ID равным «454» нас интересуют подразделы являющиеся наследниками ORM-класса «news».

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

454 – указываем на раздел с ID равным «454».

news – указываем на все страницы являющихся наследниками ORM-класса «news».

453 *|news — указываем на все страницы являющихся ORM-классом «news» без наследников.

 

Цепочка (первая часть селектора), определяющая нужный раздел в структуре сайта, может быть записана в более сложной форме.  Эта запись напоминает запись URL`a страницы, только вместо псевдо адресов указывается либо ID, либо класс, либо порядковый номер в разделе и разделяется она не слешами, а знаком «>».

Посмотрим на конкретном примере:

455 > #5 > category goods

Логика системы при разборе селектора следующая:

  1. Находим в структуре сайта раздел с ID равным «455»
  2. В этом разделе находим пятый по счету подраздел.
  3. В нем находим первый подраздел являющийся наследником ORM-класса «category». Обратите внимание, если в разделе будет несколько подразделов с классом «category», будет выбран первый по порядку.
  4. В найденном разделе работаем с подразделами имеющих ORM-класс «goods».

Еще примеры:

#3 > gallery – в корне сайта находим третий по счету раздел и берем из него первый подраздел имеющим ORM-класс «gallery».

faq > #1 > #8 – в корне сайта находим раздел имеющим ORM-класс «faq», в нем находи первый по порядку подраздел и в этом подразделе находим восьмой по счету подраздел.

Исключение страницы из выборки (new v1.2.1b)

Бывают моменты когда нужно исключить конкретную страницу из выборки, для этого нужно в конце селектора дописать @{id}, где {id} — id страницы, которую нужно исключить.

340 news @1856 — выведет все новости из раздела 340 исключая новость с id 1856

Селектор для выбора всех подразделов указанного раздела

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

Как и обычные селекторы, они состоят из двух частей, но разделяются «..»:

  1. ID нужного раздела.
  2. Определение выбираемого содержимого указанного раздела по ORM-классу.

Примеры:

654… goods – выбираем из всех подразделов раздела c ID равным «654» страницы имеющие ORM-класс «goods».

234 .. – выбираем из всех подразделов раздела c ID равным «234» любые страницы.

 

Выбор объектов нескольких ORM-классов

Для всех перечисленных выше селекторов вы можете указать не один ORM-класс, а несколько. Для этого названия классов перечисляются через знак вертикальной черты «|». По аналогии с логическим «или».

Для примера несколько видоизменённых селекторов описанных выше:

454 news|article

455 > #5 > category goods|photo

faq > #1 > #8 page|section

654… news|article|report

 

Основные правила работы с селекторами

  1. В селекторе можно использовать следующие символы: числа, английские символы и знаки «_»,  «>»,  «#»,  «|».
  2. Знак «>» используется для разделения цепочки на части и определяет вложенность и подчиненность элементов цепочки.
  3. Числа рассматриваются как указание ID страниц.
  4. Знак «#» и число рассматривается как указание порядкового номера страницы в разделе.
  5. Знак «|» используется для перечисления названий ORM-классов во второй части селектора.
  6. Пробелы используются для визуального разделения цепочки и не несут смысловой нагрузки. Исключением является отделение пробелом второй части селектора от цепочки, в данном случае он обязателен.
  7. Все остальные сочетания символов рассматриваются как названия ORM-классов.

 

Так же необходимо учитывать, что:

  1. Использование сложных селекторов с привязкой к позиции страницы или классу страницы оправданно только в том случае, если нужно избавиться от зависимости макросов от указания конкретных ID`шников.
  2. Результат выполнения всех селекторов кешируется на время генерации одной страницы и их повторный вызов не приводит к лишним обращениям к БД. 


Что-то не так? Напиши, учтем!