Перейти к содержимому


d.stepachev

Регистрация: 23 авг. 2010
Offline Активность: 24 дек. 2014 23:23
*****

#72949 Внимание, Технические Работы

Отправлено d.stepachev на 13 Июнь 2013 - 10:22

Просмотр сообщенияvelena168 (13 Июнь 2013 - 10:18) писал:

Регистрировала домен через вас. Проверила в WHOIS и почему-то у меня
nserver:    ns1.reg.ru.
nserver:    ns2.reg.ru.

Значит будут проблеммы с доступностью?
Ни в коем случае, не хочу Вас отвлекать от важных дел.
Спасибо, за объявление в админке и на форуме.
Мы уже переводим домены на правильные DNS-ы, в течение часа они сменятся, к вечеру должны загружаться и проблем с этим не будет. Сейчас готовим рассылку + список обзвона, хочется верить что успеем.


#48013 Технические Работы

Отправлено d.stepachev на 28 Февраль 2013 - 02:37

Сервис полностью поднялся, проверяем работоспособность отдельных модулей. Если заметите странности - пишите, сегодня у нас круглосуточный режим работы


#47996 Технические Работы

Отправлено d.stepachev на 27 Февраль 2013 - 20:50

Просмотр сообщенияБотаникус (27 Февраль 2013 - 20:45) писал:

как , завтра не будет работать?????
Мы сделаем всё возможное, чтобы сайт заработал как можно быстрее


#47977 Технические Работы

Отправлено d.stepachev на 27 Февраль 2013 - 20:15

Просмотр сообщенияBardin (27 Февраль 2013 - 19:56) писал:

А с московским ДЦ больше не будете работать так ?
Мы с него потихоньку съезжаем, даже тестово запускали уже загрузку отдельных модулей, например поиска из ДЦ в Германии. Просто перекачать дизайн статику заняло чуть больше 2х недель, переименовать и частично пережать все картинки товаров до новых размеров летом занимало ~ 10 дней, сейчас для нас вопрос переезда очень октуален, просто перегнать те объемы данных что у нас есть занимает много времени, но с рашки целиком съедем в течение месяца-двух.

Просмотр сообщенияБотаникус (27 Февраль 2013 - 20:05) писал:

А переезд не повлияет на индексирование сайта и рейтинг?
Нет, не повлияет, технически изменится только IP адрес. Скорость загрузки из Германии ничуть не меньше чем из московского датацентра вебальты, но вот отказоустойчивость там выше. Проблемы которые пока там возникали - это не стабильная работа одного из серверов. В России было много чего, начиная от розеток и заканчивая форсмажорным отключением интернета у датацентра на несколько часов. Так что перенос структур сайта на новый хостинг может повлиять только в положительную сторону, значительно снизятся различные риски

Опять же о качестве сервиса. Новые сервера в Германии были заказаны в 20:15, в 20:22 нам пришли письма о том что они уже установлены и работают. Сейчас наш админ их настраивает.
Для сравнения в России делали подобный заказ несколько месяцев назад - он был готов через ~7 дней.


#29155 Поиск Google-Ом

Отправлено d.stepachev на 18 Октябрь 2012 - 13:14

Просмотр сообщенияpasiki (15 Октябрь 2012 - 08:46) писал:

сделайте, чтобы выбор пользователя запоминался, и каждый сам определится, что ему удобнее ).
К сожалению нормально запоминать вариант выбранный пользователем не представляется возможным, единственный вариант который нам доступен - сохранять выбора в cookie файл, но сам файл будет довольно часто сноситься браузером и при поиске через некоторое время всё равно понадобится переключать вариант выбора на "обсуждения".

Вероятно Вы так же замечали в прошлые месяцы большое число повторений и создание однотипных тем в форуме. Это как раз происходило из-за отсутствия релевантного поиска. Сейчас число подобных тем снизилось, что говорит о том что поиск гугла работает лучше и ищет точнее по старым веткам форума благодаря:
  • Учёту ссылок с других страниц интернета на указанную ветку, что говорит о её качестве ответа
  • Учитывает ошибки, возникающие при вводет текста пользователем
  • Учитывает морфологию
  • Ранжирует результаты по качеству ответа
  • Использует количественные показатели вхождений слов при сортировке результатов
  • Использует близость слов поискового запроса в документе, что так же делает поиск релевантней
  • Ищет запрос если он вбит транслитом, или не верной раскладкой
  • учитывает кликабельность каждого из результатов, что позволяет в будущем построить результаты в том порядке, который с наибольшей вероятностью удовлетворит пользователя
  • И ещё десятки и десятки приятных мелочей...

Основной минус который мы видим - это отсутствие мгновенного обновления индекса, так что искать новые темы приходится через обсуждения. Гуглу в индекс они попадают в течение ~недели. Старый поиск хорошо работал на небольших объёмах данных, сейчас же он изменил свой алгоритм на "облегчённый", в итоге поиск нужных тем не даёт результатов, либо выдаёт слишком много результатов, а нужные темы в результатах находятся в самом конце списка на последних страницах найденных тем.


#3741 Опыт A/B Тестирования

Отправлено d.stepachev на 25 Май 2011 - 16:28

В целях повышения общей конверсии магазинов предлагаем делиться в этой ветке с друг другом интересными примерами того как с помощью a/b и многовариантного тестирования различных элементов, можно сделать свой сайт лучше, повысить его конверсию. Эту информацию можно будет использовать как точные данные о том что нужно сделать в том или ином шаблоне/разделе, чтобы он продавал лучше, а так же как бесценный опыт повышения конверсии и более эффективных продаж.

Раньше проведение подобных тестов было довольно ресурсоёмким процессом, который могли позволить себе лишь крупные компании (Amazon, Google, Яндекс, OZON), с появлением сервиса abtest.ru проводить подобные тесты стало значительно проще. Для клиентов StoreLand проведение подобных тестов вовсе бесплатно, так что каждый может прямо сейчас начать тестирования того, что лучше работает и повышает конверсию своего магазина. Подключение магазина к сервису abtest.ru происходит одним кликом из раздела "Сайт" > "A/b тестирование".

Пример a/b теста, который мы проводили не так давно.

Задача:
Человек смотрел тарифы сервиса, где изменялся один элемент, после чего он должен был перейти на страницу регистрации.

Результат
Уже на первый день тестирования стало понятно что старый заголовок работал значительно хуже.

Сухие цифры
Заголовок		Просмотр страницы регистрации		  Переходов на страницу регистрации		В процентах		
Старый					  113										24						   21.23%			   
Новый					   109										43						   39.44%			   

Рост конверсии относительно старого варианта составил 85.7%. Цифры были весьма относительные, т.к тест проводился на очень маленькой выборке, но дальнейшее тестирование старого варианта просто не имело смысла. Было очевидно что новый заголовок работает значительно лучше.

Скриншоты тех страниц
Старая
abtest-storeland1.jpg

Новая
abtest-storeland1-success.jpg

Второй день - второй тест
На второй день мы запустили мультивариантное тестирование где немного изменялся заголовок. Задача теста не изменилась, нужно было понять какой текст должен быть в заголовке. Тестирование страницы проводилось в течение недели, цифры показали какой заголовок работает лучше.

Результат
Тот который победил в первом тесте оказался не столь эффективным среди новых заголовков.

Цифры
Заголовок		Просмотр страницы регистрации		  Переходов на страницу регистрации		В процентах		
1						  836										318						  38.03%			   
2						  918										340						  37.03%			   
3						  860										335						  38.95%   
4						  874										335						  38.32%

Скриншоты тех страниц:
Вариант 1
abtest-storeland2-1.jpg

Вариант 2
abtest-storeland2-2.jpg

Вариант 3
abtest-storeland2-3.jpg

Вариант 4
abtest-storeland2-4.jpg

Рост конверсии относительно самого первого варианта составил 83,46%.


#309 Упрощаем работу с шаблонами

Отправлено d.stepachev на 12 Ноябрь 2010 - 01:55

Довольно часто в нашей практике случается так что хочется изменить шаблон, сделать его под себя, более уютным и домашним, но возникает не разрешимая проблема когда нужно понять что это за не понятные конструкции вида
{VARIABLE}
или например:
{% IF VARIABLE %}
страшный код...
{% ELSE %}
еще более страшный код...
{% ENDIF %}
И видя этот хаос непонятных данных отпадает всякое желание что-то менять, более того спрашивать какие переменные есть на сайте, а каких нет, тоже довольно не удобно каждый раз задавай вопрос в техническую поддержку проекта и дожидаться ответа от нескольких минут до часа или двух.
Всё взвесив мы решили максимально сократить бюрократическую составляющую этого процесса и попытаться донести знания до людей. Для возможности каждому реализовывать свои самые смелые фантазии и воплощать палитру красочных идей в буйстве цветовых образов мы сделали две простых, но в то же время основополагающих вещи:

Ввели функции отображения всех переменные имеющиеся в шаблонах.
Вызываются они очень просто. Вставляете следующий код в любом из шаблонов, редактора тем:
{print_vars}
чтобы отобразить список всех доступных на сайте переменных.
{print_arrays}
чтобы отобразить список всех массивов доступных на сайте.
{print_r}
чтобы отобразить и переменные и массивы
И свет информации начнёт пробиваться сквозь туман непонимания.

Документация по функциональным возможностям в работе с переменными ну и конечно же примеры
Честно сказать мы долго тянули с выкладыванием этой информации в свет, за что приносим всем заинтересованным лицам глубочайшие извинения. Документация в разрозненном виде была готова в мае-июне, но никак руки не доходили собрать все в едином месте, да и места куда выложить и обсудить тогда не было, сейчас есть, поэтому постараюсь ёмко но без занудства рассказать о нашем шаблонизаторе.

Итак, шаблонизатор использует 2 основных вида конструкций:
1) Вывод данных в различном формате
2) Логические операции

Пойдём по порядку.

Вывод данных

Вывод основной переменной
{PAGE_TITLE}
выведет Заголовок страницы

Вывод переменной внутри цикла
{goods.name}
Такой вид записи используется в циклах и в данном виде выведет название товара.

Дополнительная функциональность переменных
Для каждой переменной вывода например {PAGE_TITLE} можно использовать дополнительные обработчики, для приведения переменной к нужному формату. Вызываются они так: {VARIABLE | function} или {VARIABLE | function("")} для случая если нужно передать какие-то параметры функции. Вот список возможных операций с переменными:
1) json или json_encode
Кодирует переменную в json формат
Пример использования для переменной "VARIABLE" со значением 'тест':
Код:
{VARIABLE | json}
{VARIABLE | json_encode}

Результат:
"\u0442\u0435\u0441\u0442"
"\u0442\u0435\u0441\u0442"


2) upper или strtoupper
Преобразует переменную к uppercase формату.
Пример использования для переменной "VARIABLE" со значением 'тест':
Код:
{VARIABLE | upper}
{VARIABLE | strtoupper}
Результат:
ТЕСТ
ТЕСТ


3) lower или strtolower
Преобразует переменную к lowercase формату.
Пример использования для переменной "VARIABLE" со значением 'TEST':
Код:
{VARIABLE | lower}
{VARIABLE | strtolower}
Результат:
test
test


4) length или strlen
Возвращает текстовую длину переменной
Пример использования для переменной "VARIABLE" со значением 'TEST':
Код:
{VARIABLE | length}
{VARIABLE | strlen}
Результат:
4
4


5) money или money_format
Форматирует цисло в строку валюты:
Пример использования для переменной "VARIABLE" со значением '1234.56' для локализации en_US
Код:
{VARIABLE | money}
{VARIABLE | money_format}
Результат:
USD 1,234.56
USD 1,234.56


6) stripslashes
удаляет слэши из переменной
Пример использования для переменной "VARIABLE" со значением 'текст \"тест\"'
Код:
{VARIABLE | stripslashes}
Результат:
текст "тест"

7) urlencode
Форматирует переменную в формат url и возвращает строку, в которой все не алфавитно-числовые символы (кроме -_.) заменены на знак процентов (%) с последующими двумя 16-ричными цифрами и пробелами, кодированными как знаки плюс (+).Она кодируется тем же способом, что и post данные WWW-формы
Пример использования для переменной "VARIABLE" со значением 'текст \"тест\"'
Код:
{VARIABLE | urlencode}
Результат:
%F2%E5%EA%F1%F2%20\%22%F2%E5%F1%F2\%22

8) urldecode
декодирует URL-закодированную строку.
Пример использования для переменной "VARIABLE" со значением '%F2%E5%EA%F1%F2%20\%22%F2%E5%F1%F2\%22'
Код:
{VARIABLE | urlencode}
Результат:
текст \"тест\"


9) addslashes
Добавляет слэши для переменной
Пример использования для переменной "VARIABLE" со значением 'текст "тест"'
Код:
{VARIABLE | addslashes}
Результат:
текст \"тест\"

10) nl2br
Заменяет все знаки переноса строки "\n" на "<br />"
Пример использования для переменной "VARIABLE" со значением "текст \n текст"
Код:
{VARIABLE | nl2br}
Результат:
текст <br /> текст


11) strip_tags
Удаляет теги из строки. Наличие параметра в скобках обязательно
Пример использования для переменной "VARIABLE" со значением "<b>текст</b> <br /> текст"
А) Код:
{VARIABLE | strip_tags("")}
Результат:
текст текст
Б) Код:
{VARIABLE | strip_tags("<b>")}
Результат:
текст <br /> текст


12) str_repeat
Возвращает повторяющуюся строку. Наличие параметра в скобках обязательно
Пример использования для переменной "VARIABLE" со значением "Текст"
А) Код:
{VARIABLE | str_repeat("2")}
Результат:
ТекстТекст
Б) Код:
{VARIABLE | str_repeat("4")}
Результат:
ТекстТекстТекстТекст

13) number или number_format
Форматирует число с разделением групп. Наличие 3х параметров в скобках обязательно. Работает аналогично функции php number_format. Использует 3 параметра: точность округления, разделитель целого числа с дробной его частью, разделитель тысяч.
Пример использования для переменной "VARIABLE" со значением "1234.56"
А) Код:
{VARIABLE | number_format("2",","," ")}
{VARIABLE | number_format("2",","," ")}
Результат:
1 234,56
1 234,56

Б) Код:
{VARIABLE | number_format("3",".",",")}
{VARIABLE | number_format("3",".",",")}
Результат:
1,234.560
1,234.560


14) date
Форматирует дату/время из unix timestamp. Наличие параметра в скобках обязательно
Пример использования для переменной "VARIABLE" со значением "1289575231"
Код:
{VARIABLE | date("d.m.Y H:i:s")}
Результат:
12.11.2010 15:20:31


15) is_divided
Делится ли переменная на число без остатка? Наличие 3х параметров в скобках обязательно. 1й параметр - число, на которое делим переменную, 2й параметр - результат в случае если переменная делится, 3й параметр - результат в случае если не делится
Пример использования для переменной "VARIABLE" со значением "5"
А) Код:
{VARIABLE | is_divided("5","</tr><tr>","")}
Результат:
</tr><tr>
Б) Код:
{VARIABLE | is_divided("4","</tr><tr>","")}
Результат:
Ничего не выведет


16) multiply
Умножить переменную на параметр указанный в скобках. Наличие параметра в скобках обязательно
Пример использования для переменной "VARIABLE" со значением "3"
Код:
{VARIABLE | multiply("4")}
Результат:
12

17) divide
Разделить переменную на параметр указанный в скобках. Наличие параметра в скобках обязательно
Пример использования для переменной "VARIABLE" со значением "12"
Код:
{VARIABLE | divide("3")}
Результат:
4

18) minus
Уменьшить переменную на параметр указанный в скобках. Наличие параметра в скобках обязательно
Пример использования для переменной "VARIABLE" со значением "12"
Код:
{VARIABLE | minus("3")}
Результат:
9

19) plus
Увеличить переменную на параметр указанный в скобках. Наличие параметра в скобках обязательно
Пример использования для переменной "VARIABLE" со значением "12"
Код:
{VARIABLE | plus("8")}
Результат:
20

20) gen_word_end
Дописать соответствующее окончание для слов, используется для отображения цифр с описанием. Наличие 3х параметров в скобках обязательно
Пример использования для переменной "VARIABLE" с различными занчениями "1", "2", "5", "11", "18", "21", "23" на примере количества товаров в категории
А) Значение "1".
Код:
{VARIABLE} товар{VARIABLE| gen_word_end("","а","ов")} в категории
Результат:
1 товар в категории
б) Значение "2".
Код:
{VARIABLE} товар{VARIABLE| gen_word_end("","а","ов")} в категории
Результат:
2 товара в категории
в) Значение "5".
Код:
{VARIABLE} товар{VARIABLE| gen_word_end("","а","ов")} в категории
Результат:
5 товаров в категории
г) Значение "11".
Код:
{VARIABLE} товар{VARIABLE| gen_word_end("","а","ов")} в категории
Результат:
11 товаров в категории
д) Значение "18".
Код:
{VARIABLE} товар{VARIABLE| gen_word_end("","а","ов")} в категории
Результат:
18 товаров в категории
е) Значение "21".
Код:
{VARIABLE} товар{VARIABLE| gen_word_end("","а","ов")} в категории
Результат:
21 товар в категории
ж) Значение "23".
Код:
{VARIABLE} товар{VARIABLE| gen_word_end("","а","ов")} в категории
Результат:
23 товара в категории

21) money или money_format
Форматирует число с разделением групп. Наличие 1го и 2го параметра в скобках не обязательно. Если он или они указаны, то первый параметр определяет тэг, в котором будет отображаться информация о цене. По умолчанию это "span". Второй параметр определяет количество знаков после запятой. По умолчанию берёт количество знаков и формат отображения из настроек на сайте (Вкладка "Настройки" -> "Валюты").

Пример использования для переменной "VARIABLE" со значением "1234.56"
Пример использования для переменной "VARIABLE2" со значением "11"
Код:
{VARIABLE | money}
{VARIABLE2 | money}
{VARIABLE2 | money("div")}
{VARIABLE2 | money("div", "5")}
Результат видимый пользователю:
  • 1234.56 рубля
  • 11.00 рублей
  • 11.00
    рублей

  • 11.00000 рублей
Результат в HTML коде:
  • <span title="1 234 российских рубля 56 копеек"><span class="num">1 234,56</span><span>рублей</span></span>
  • <spantitle="11,00 российских рублей"><spanclass="num">11,00</span> <span>рублей</span></span>
  • <div title="11,00 российских рублей"><div class="num">11,00</div> <div>рублей</div></div>
  • <div title="11,00000 российских рублей"><div class="num">11,00000</div><div>рублей</div></div>
22) htmlspecialchars_decode
Превращает код текстовых полей в HTML код
Пример использования для переменной "VARIABLE" со значением '&lt;a href=&quote;http://{NET_DOMAIN}/...ная&#60;/a&#62;'
Код:
{VARIABLE | htmlspecialchars_decode}
Результат:
<a href="http://{NET_DOMAIN}/...}/">Главная</a>

P.S. Будьте осторожны при использовании декодирования в HTML, т.к. если превращать в код те поля, которые может редактировать пользователь, то может возникнуть проблема с безопасностью связанная с XSS.
Для отсутствия подобных проблем используйте данную возможность только для полей которые редактирует лишь администратор и не использовать её для отображения полей редактируемых пользователем.

23) convenient_date
Эта функция, которая позволяет рисовать красивую дату на основе шаблона результирующей строки.
Например для шаблона 'd (n) Y H:i' функция будет выводить
из "2015-05-16 12:53:28" > "16 мая 2015 12:53"
из "2020-06-03 15:20:58" > "3 июня 15:20"
Если же от текущего момента прошло меньше суток, например сейчас "2020-06-27 18:31:13" а дата вывода "2020-06-27 15:18:02", то результатом будет > "3 часа назад".

Всего функция принимает 3 аргумента, 2 аргумента, 1 аргумент, либо без указания любых аргументов:
{VARIABLE_TIME | convenient_date("d (n) Y", "d (n)", "0")}
{VARIABLE_TIME | convenient_date("d (n) Y", "d (n)")}
{VARIABLE_TIME | convenient_date("d (n) Y")}
{VARIABLE_TIME | convenient_date}

Данные аргументов используются форматирования даты:https://www.php.net/...nction.date.php, а особый формат "(n)" - это красивое написание месяца на понятном человеку языке.

Первый аргумент используется для дат от 6 месяцев назад.
Второй аргумент используется для дат от текущего момента и до времени пол года назад.
Третий аргумент указывает нужно ли использовать особое форматирование дат для разницы во времени меньше 24 часов. Если значение равно 1, то будет включено форматирование для времени, которое было менее 24 часов назад. Формат вывода будет вот в таком виде:
17 часов назад
17 минут назад
17 секунд назад.

Если значение 3-го аргумента равно нулю, то дата будет выведена по формату дат от текущего момента до полугода назад, формат используется от второго аргумента.

Работает она так для сегодняшней даты 27.06.2020 17:00:00,форматирование данных за сутки выключено:
  {VARIABLE_TIME | convenient_date("d (n) Y", "d (n)", "0")}
результат для 18.06.2020: 18 июня
результат для 18.06.2019: 18 июня 2019
результат для 27.06.2020 : 27 июня

Для сегодняшней даты 27.06.2020 17:00:00, форматирование данных за сутки включено:
{VARIABLE_TIME | convenient_date("d (n) Y", "d (n)", "1")}
либо
{VARIABLE_TIME | convenient_date("d (n) Y", "d (n)")}

результат для 18.06.2020: 18 июня
результат для 18.06.2019: 18 июня 2019
результат для 27.06.2020 : 17 часов назад.

Если второй аргумент не указан, то он будет установлен такой же как первый аргумент:
{VARIABLE_TIME | convenient_date("d (n) Y")}
результат для 18.06.2020: 18 июня 2019
результат для 18.06.2019: 18 июня 2019
результат для 27.06.2020 : 17 часов назад.

Результат для отсутствия указания аргументов - будут указаны настройки дат по умолчанию, а именно ("d (n) Y", "d (n)") - для старых дат указывается год. Для новых дат год не указывается:
{VARIABLE_TIME | convenient_date)}
результат для 18.06.2020: 18 июня
результат для 18.06.2019: 18 июня 2019
результат для 27.06.2020 : 17 часов назад


Логические операции
Они бывают следующих видов:
1) условия:
   А) IF - условие используется для сравнения каких-либо данных. По умолчанию оно проверяет существование переменной и чтобы значение переменной было отлично от нуля. Так же сравнение может происходить с условиями
       >=      Значение должно быть больше или равно
       <=      Значение должно быть меньше или равно
       >       Значение должно быть больше
       <       Значение должно быть меньше
       =       Значение должно равняться
       !=      Значение не должно равняться
   Для условия IF обязательно наличие закрывающего тега {% ENDIF %}


   Примеры использования условия IF для переменной "VARIABLE" равной 1:

     А)  код:
            
{% IF VARIABLE %}Переменная указана{% ENDIF %}
          Результат:
             Переменная указана
     Б)  код:
            
{% IF VARIABLE=1 %}Переменная равна единице{% ENDIF %}
          Результат:
             Переменная равна единице
     В)  код:
            
{% IF VARIABLE!=2 %}Переменная не равна двум{% ENDIF %}
          Результат:
             Переменная не равна двум
     Г)  код:
            
{% IF VARIABLE>=1 %}Переменная больше или равна 1{% ENDIF %}
          Результат:
             Переменная больше или равна 1
     Д)  код:
            
{% IF VARIABLE>1 %}Переменная больше 1{% ENDIF %}
          Результат:
             Ничего не выведет
     Е)  код:
            
{% IF VARIABLE<1 %}Переменная меньше 1{% ENDIF %}
          Результат:
             Ничего не выведет

Примеры использования условия IF для переменной "VARIABLE" равной 0:

     А)  код:
            
{% IF VARIABLE %}Переменная указана{% ENDIF %}
          Результат:
             Ничего не выведет
     Б)  код:
            
{% IF VARIABLE=1 %}Переменная равна единице{% ENDIF %}
          Результат:
             Ничего не выведет
     В)  код:
            
{% IF VARIABLE==1 %}Переменная равна единице{% ENDIF %}
          Результат:
             Ничего не выведет
     Г)  код:
            
{% IF VARIABLE!=2 %}Переменная не равна двум{% ENDIF %}
          Результат:
             Переменная не равна двум
     Д)  код:
             [code]{% IF VARIABLE>=1 %}Переменная больше или равна 1{% ENDIF %}[/code]
          Результат:
             Ничего не выведет
     Е)  код:
             [code]{% IF VARIABLE>1 %}Переменная больше 1{% ENDIF %}[/code]
          Результат:
             Ничего не выведет
     Ж)  код:
             [code]{% IF VARIABLE<1 %}Переменная меньше 1{% ENDIF %}[/code]
          Результат:
             Переменная меньше 1

б) ELSEIF Другое условие, если не прошло предыдущее. Работает точно так же как и условие IF, используется для удобства записи.
     Пример использования для переменной "VARIABLE" равной 1
     А)  код:
             [code]
{% IF VARIABLE=2 %}
Переменная равна двум
{% ELSEIF VARIABLE=1 %}
Переменная равна единице
{% ENDIF %}[/code]
          Результат:
             Переменная равна единице
     Б)  код:
             [code]
{% IF VARIABLE>2 %}
Переменная больше двух
{% ELSEIF VARIABLE<1 %}
Переменная меньше единицы
{% ENDIF %}[/code]
          Результат:
             Ничего не выведет

   в) IFNOT Условие отрицания. Работает так же как и IF условие, с той лишь разницей что условие не должно выполниться
     Примеры использования для переменной "VARIABLE" равной 1
     А)  код:
             [code]
{% IFNOT VARIABLE=2 %}
Переменная не равняется двум
{% ENDIF %}[/code]
          Результат:
             Переменная не равняется двум
     Б)  код:
             [code]
{% IFNOT VARIABLE %}
Переменная не указана
{% ENDIF %}[/code]
          Результат:
             Ничего не выведет

   г) ELSE условие которое выполниться если предыдущие условия не выполнились.
     Пример использования для переменной "VARIABLE" равной 1
     А)  код:
             [code]
{% IF VARIABLE=2 %}
Переменная равна двум
{% ELSE %}
Переменная не равна двум
{% ENDIF %}[/code]
          Результат:
             Переменная не равна двум
     Б)  код:
[code]
{% IF VARIABLE>5 %}
Переменная больше двух
{% ELSEIF VARIABLE<-5 %}
Переменная меньше единицы
{% ELSE %}
Переменная находится в диапазоне от -5 до 5
{% ENDIF %}
[/code]
          Результат:
             Переменная находится в диапазоне от -5 до 5
   д) ENDIF закрывающий тег любых условий. Обязателен для нормальной работы условия.

   е) Использование нескольких условий в одном.
     Пример использования для переменной "VARIABLE1" равной 1 и VARIABLE2 равной 0
     А)  код:
             [code]
{% IF VARIABLE1=1 && VARIABLE2<1 %}
Переменная VARIABLE1 равна 1, а VARIABLE2 меньше единицы
{% ELSE %}
Переменная VARIABLE1 не равна 1 либо VARIABLE2 Больше нуля
{% ENDIF %}[/code]
          Результат:
             Переменная VARIABLE1 равна 1, а VARIABLE2 меньше единицы
     Б)  код:
             [code]
{% IF VARIABLE1 || VARIABLE2 %}
Одна из двух переменных указана
{% ELSEIF VARIABLE1<-5 && VARIABLE2=="тест" %}
Переменная VARIABLE1 меньше -5, а переменная VARIABLE2 равна тексту "тест"
{% ENDIF %}[/code]
          Результат:
             Одна из двух переменных указана
     В)  код:
             [code]
{% IF VARIABLE1 && VARIABLE2 < 1 && VARIABLE3 < 1 %}
Переменная VARIABLE1 указана, а VARIABLE2 и VARIABLE3 не указаны, либо их значение равно нулю
{% ELSE %}
Не выполнилось одно из условий, это означает что либо не указана VARIABLE1, либо указана и больше нуля VARIABLE2, либо указана и больше нуля VARIABLE3
{% ENDIF %}[/code]
          Результат:
             Переменная VARIABLE1 указана, а VARIABLE2 и VARIABLE3 не указаны, либо их значение равно нулю
     Г)  код:
             [code]
{% IFNOT VARIABLE1 && VARIABLE2 < 1 && VARIABLE3 < 1 %}
Переменная VARIABLE1 НЕ указана, а VARIABLE2 и VARIABLE3 не указаны, либо их значение равно нулю
{% ELSE %}
Не выполнилось одно из условий, это означает что либо УКАЗАНА VARIABLE1, либо указана и больше нуля VARIABLE2, либо указана и больше нуля VARIABLE3
{% ENDIF %}[/code]
          Результат:
             Не выполнилось одно из условий, это означает что либо УКАЗАНА VARIABLE1, либо указана и больше нуля VARIABLE2, либо указана и больше нуля VARIABLE3
     Д)  код:
             [code]
{% IFNOT VARIABLE1 %}
Переменная VARIABLE1 НЕ указана
{% ELSEIF VARIABLE2 < 1 && VARIABLE3 < 1 %}
VARIABLE1 указана. Выполнилось второе условие, т.к. VARIABLE2 и VARIABLE3 не указаны, либо их значение равно нулю
{% ELSE %}
Не выполнилось одно из условий, это означает что либо УКАЗАНА VARIABLE1, либо указана и больше нуля VARIABLE2, либо указана и больше нуля VARIABLE3
{% ENDIF %}[/code]
          Результат:
             VARIABLE1 указана. Выполнилось второе условие, т.к. VARIABLE2 и VARIABLE3 не указаны, либо их значение равно нулю

2) Циклы:
   А) Оператор FOR используется для массивов данных вида "data_array" мы в своей работе все переменные массивов стараемся называть в lowercase формате для удобства и лучшего понимания.
   Примеры использования для массива "data_array" со списком из 2х элементов в которых используются переменные "ID" и "NAME"
     1й элемент - "ID" = "1" , "NAME" "Название 1"
     2й элемент - "ID" = "2" , "NAME" "Название 2"

   Код:
     [code]{% FOR data_array %}
Идентификатор - {data_array.ID}
Название - {data_array.NAME}
<hr />
{% ENDFOR %}[/code]
   Результат:
     Идентификатор - 1
     Название - Название 1
     <hr />
     Идентификатор - 2
     Название - Название 2
     <hr />


   Для выдачи списка данных вложенного массива используется вызов вложенного массива, без указания родительского массива. Для переменных же используется полный путь!
   Например для массива  "data_array" есть вложенный массив "sub_data_array" в котором есть 2 элемента как в предыдущем примере ("ID" и "NAME")
     1й элемент - "ID" = "1" , "NAME" "Вложенное название 1"
     2й элемент - "ID" = "2" , "NAME" "Вложенное Название 2"

   Код:
     [code]{% FOR data_array %}
{% FOR sub_data_array %}
Идентификатор - {data_array.sub_data_array.ID}
Название - {data_array.sub_data_array.NAME}
<br />
{% ENDFOR %}
<hr />
{% ENDFOR %}[/code]
   Результат:
       Идентификатор - 1
       Название - Вложенное название 1
       <br />
       Идентификатор - 2
       Название - Вложенное название 2
       <br />
       <hr />


   б) ENDFOR закрывающий тег для циклов, если открыли цикл, не забывайте его закрывать, это фатально для работы шаблона.


   в) Дополнительная функциональность для массивов. Для любого массива кроме основных данных создаются дополнительные переменны, в lowercase формате для понимания, что они служебные. Вот список этих переменных:
      - length   количество элементов в массиве
      - index    номер текущей итерации
      - index0   номер текущей итерации (считая от нуля)
      - rindex   сколько элементов осталось
      - rindex0  сколько элементов осталось (считая от нуля)
      - first    является ли итерация первой?
      - last     является ли итерация последней?
    Пример использовния для массива "data_array" со списком из 2х элементов в которых используются переменные "ID" и "NAME" так же как в первом примере
    Код:
      [code]{% FOR data_array %}
количество элементов в массиве - {data_array.length}<br />
номер текущей итерации - {data_array.index}<br />
номер текущей итерации (считая от нуля) - {data_array.index0}<br />
сколько элементов осталось - {data_array.rindex}<br />
сколько элементов осталось (считая от нуля) - {data_array.rindex0}<br />
является ли итерация первой? - {data_array.first}<br />
является ли итерация последней? - {data_array.last}<br />
<hr />
{% ENDFOR %}[/code]
    Результат:
      количество элементов в массиве              - 2<br />
      номер текущей итерации                      - 1<br />
      номер текущей итерации (считая от нуля)     - 0<br />
      сколько элементов осталось                  - 1<br />
      сколько элементов осталось (считая от нуля) - 2<br />
      является ли итерация первой?                - 1<br />
      является ли итерация последней?             - 0<br />
      <hr />
      количество элементов в массиве              - 2<br />
      номер текущей итерации                      - 2<br />
      номер текущей итерации (считая от нуля)     - 1<br />
      сколько элементов осталось                  - 0<br />
      сколько элементов осталось (считая от нуля) - 1<br />
      является ли итерация первой?                - 0<br />
      является ли итерация последней?             - 1<br />
      <hr />