Макроси в нашій системі є простим способом підключати різні функціональні блоки на веб-сайт, наприклад, новинну стрічку, форум, каталог товарів і т.п. а також виконувати різні операції з обробки рядків, виконання математичних функцій і так далі. Комбінуючи макроси можна створювати практично будь-яку функціональність, спочатку в системі відсутню. Тим не менше, більшість речей, необхідних веб-майстрові для збірки сайтів вже реалізовані розробниками системи, і потрібно тільки викликати їх за допомогою відповідних макросів, задати параметри за допомогою ключів і налаштувати зовнішній вигляд визначивши дизайн в службових файлах якщо потрібно.
Макроси записуються в тілі шаблонів або в дизайнах інших макросів (файли в папці Templates), в файлах контенту (папка Content) і в шаблонах email сповіщень (з обмеженнями). З міркувань безпеки будь-макроси, що записуються в файлах з даними, виконуватися не будуть і виводяться звичайним текстом, оскільки вважається, що в загальному випадку дані можуть формуватися і з форм на сайті користувачами. Виняток становлять найпростіші макрозамени (шляху та інше все що без квадратних дужок).
Макроси можуть бути відключені в певних блоках примусово за допомогою локальних макрозамен # 036; NOMACRO_START $ і # 036; NOMACRO_FINISH $. Це застосовується зазвичай для документування та інших схожих цілей.
$ MacrosName # 091; key1: value1; key2: value2 ;. ; filter: fieldname = fieldvalue; condition: boolean; nocache: boolean # 093; $
Складний фільтр. Рядок, де через кому перераховуються умови, при виконанні яких запис буде передана з довідника в вибірку для подальшої обробки.
Зліва в умови (значення А) має бути ім'я поля, значення якого буде використовуватися при порівнянні, а праворуч (значення В) може бути як макросом, так і жорстко прописаної константою.
- A> B ( "більше")
- A!> B, A<=B ("не больше", синоним "меньше либо равно")
- A
- A!= B ( «не менше", синонім "більше або дорівнює")
- A = B ( "дорівнює")
- A! = B ( "не дорівнює")
- A in B (рядок A входить в рядок B)
- A! In B (рядок A не входить в рядок B)
- A rin B, A contains B (reverse in, рядок B входить в рядок A, або, що те ж саме, A містить B)
- A! Rin B, A! Contains B (not reverse in, рядок B не входить в рядок A, або, що те ж саме, A не містить B)
Якщо A і B є позитивними або негативними числами, або нулями, то порівняння значень буде вестися як числових (крім умов in і rin). Десятковим роздільником для заданих значень і для значень з бази можуть бути як точки, так і коми.
Якщо A і B задовольняють масці DD.MM.YYYY або hh: mm: ss DD.MM.YYYY. порівняння йде в форматі "дата-час" (крім умов in і rin).
У всіх інших випадках параметри будуть порівнюватися посимвольний як строкові значення.
Значення B не повинно бути обрамлене лапками, тому що лапки будуть вважатися за звичайний символ.
Значення B не може містити ком. Тому, якщо вони можливі в результаті виконання макросу або в константі, то їх необхідно замінювати на "\," (без лапок) за допомогою макросу Replace.
Значення B може містити кілька варіантів, які розцінюються як "логічне АБО", розділені "||", тобто A = B || B1 || B2. Дана можливість вживається рідко, тому що майже повна її емуляція досягається конструкцією виду A in "B.B1.B2", де точки потрібні тільки як роздільники різних значень, і замість них може бути що завгодно інше (пробіл, тире і так далі) в залежності від логіки проекту.
У довіднику є поле color, яке може набувати значень blue, red, green. Для чтого, щоб вивести записи зі значеннями green і blue в одній вибірці потрібно написати ключ filter так:
filter: color in blue.green (замість точки можна використовувати будь-який символ окрім коми, навіть пробіл).
Якщо ми хочемо перевірити одночасно кілька умов, пишемо їх через кому:
filter: color in blue.green, weight> = 20, weight <=100, brand != Prada
Режим сортування записів. Через кому перераховуються три параметра:
- ім'я поля за яким сортують або кілька імен полів через / в порядку використання при сортуванні;
- asc або desc (висхідна / спадна) сортування, якщо полів кілька - кілька asc або desc через / відповідно заданим в першому параметрі полях;
- режим порівняння значень: literal (строкові), numeric (числові), date (дд.мм.рррр), datetime (чч: мм: сс дд.мм.рррр), auto (автоматичне визначення типа по першому записі в довіднику), якщо полів кілька - перераховується кілька режимів через / для кожного з них.
Якщо ключ не заданий, його значення за замовчуванням дорівнюватиме "date, desc, auto".
Також, даний ключ може мати особливі, «не потрійні" значення:
- random. записи в вибірці будуть перемішані випадковим чином (після фільтрації);
- reverse. записи будуть виведені в зворотному порядку.
- extrafield. записи сортуються по створюваному на льоту, обчислюваних полю (тільки в макросі News).
sort: date, desc, auto
sort: state / created, desc / asc, literal / auto
sort: random
sort: reverse
Містить ім'я поля, по вмісту якої будуть видалені всі дублікати в вибірці. Якщо у вибірці є записи, які дублюють один одного повністю або частково, то використовуючи цей ключ можна задати ім'я поля, значення якого не повинно повторюватися. Наприклад, якщо в запису 1 є ім'я (поле firstname) Олексій і в запису 2 є таке ж ім'я в тому ж полі, то задавши ключ як distinct: firstname в вибірці з'явиться тільки запис 1, а друга буде проігнорована.
Складений умова виконання макросу. Спеціальний ключ, який зазвичай реалізується у будь-якого макросу (але може бути відсутнім якщо в ньому немає сенсу або якщо макрос написаний стороннім розробником). Як значення в нього передається рядок з boolean змінних через кому. Під boolean рядком розуміється будь-яке з значень on / 1 / true / yes. які будуть змушувати макрос виконуватися, або значень "порожній рядок" / 0 / false / no. які приведуть до того, що макрос не виконуватиметься і замість макросу буде виведена порожній рядок. У той же час, якщо ключ condition взагалі не заданий, макрос буде виконаний безумовно.
condition: 986F8D3F0489456781060C37BECD297B = 125. =, $ Attribute: id $ = "123456"
"Логічне І" в умовах виконання макросів
У condition можна передавати комбінацію умов, поділюваних запитом (і пробілами після ком, які будуть ігноруватися). Всі умови будуть об'єднані операцією "логічне І", тобто загальна умова буде істинно, якщо будуть істинні всі його складові. Наприклад, запис "condition: 1, 0, 1, 1" буде еквівалентна "condition: 0", а "condition: on, yes, 1, true" буде еквівалентна "condition: 1".
Таким чином, condition дозволяє просто реалізовувати ситуацію, коли макрос виконується тільки якщо всі умови істинні.
"Логічне АБО" в умовах виконання макросів і більш складні комбінації умов
Ситуація, коли макрос повинен бути виконаний якщо виконано одну з перерахованих умов, безпосередньо в ключі condition не реалізується, але її можна вирішити наступним чином:
- За допомогою запису кількох однакових макросів один за одним, кожен з яких буде виконаний тільки при виконанні якогось з умов. Зазвичай це досить зручно з точки зору читання коду, але якщо істинні будуть одночасно кілька умов, макроси спрацюють більше разів ніж потрібно. Тому цей спосіб годиться не завжди, хоча для переважної більшості ситуацій цього достатньо.
- Можна спочатку обчислити умови за допомогою інших макросів, а потім результат подати в ключ condition.
Наприклад, у нас є два атрибути $ Attribute: a $ і $ Attribute: b $, прив'язані до полів типу checkbox, і отже приймають значення on або "порожній рядок". Нам потрібно виконати макрос News тільки один раз за умови АБО (істинно будь-яка умова або обидва відразу). Запишемо атрибути поспіль: $ Attribute: a $$ Attribute: b $, отримавши в результаті рядок onon. Потім можна подати даний рядок всередину макросу $ NotEmpty # 091; # 093; $, який на виході дасть "істина" в разі будь-якої непорожній рядки, а в разі якщо обидва атрибута будуть порожніми - значення "брехня". В результаті шуканий результат ми отримаємо при такому записі:
$ News # 091; table. ; design. ; condition: $ NotEmpty # 091; $ Attribute: a $$ Attribute: b $ # 093; $ # 093; $
- Можна використовувати спеціальні можливості макросу Math, який дозволяє обчислювати логічні вирази в нотації мови Perl, наприклад, цілком легально можна обчислити вираз виду (1 || 1) 0. Єдине, всі параметри подібного вираження, звичайно, повинні будуть бути рядками, з якими можна проводити логічні операції, в даному випадку рядками "1" або "0".
Обробка макросів
- макроси обробляються "зсередини назовні", тобто якщо один макрос вкладений в інший, буде виконаний спочатку вкладений, а потім обрамляє. При цьому, всі макроси виконуються в міру появи в тексті сторінки, тобто той макрос, який знаходиться ближче до початку сторінки буде виконано раніше.
- макроси не можуть виконуватися паралельно, тобто кожен макрос який почав виконуватися, повинен завершити своє виконання до того як почнеться виконання іншого макросу.
- якщо макрос не отримає на вхід якихось критичних даних, його виконання призведе до відбитку результату в тілі сторінки. Зазвичай це означає, що помилка, яка зроблена розробником, носить критичний характер, але зроблена в синтаксисі (типу помилок часу компіляції, а не часу виконання). Тому, якщо тільки розробник сильно не перемудрили, такі помилки відвідувачі сайту не побачать.