Документация BILLmanager 6

Операторы условий в EJS-шаблонизаторе

EJS (Express.js) — каркас веб-приложений для Node.js. В BILLmanager работа EJS реализована с помощью скрипта /usr/local/mgr5/etc/scripts/template_ejs.js. Для корректной работы шаблонизатора входящий XML-файл преобразуется в JSON. Шаблоны документов и сообщений в BILLmanager описываются с помощью языка EJS. Добавление и редактирование шаблонов выполняется в разделе НастройкиШаблоны документов.

Статья описывает применение операторов условий для EJS-шаблонизатора. Операторы условий позволяют обработать несколько возможных сценариев построения печатной формы документа. В процессе формирования шаблона система проверяет заданные условия и на основе полученного результата выполняет подходящий фрагмент кода. 

В данной статье описаны некоторые операторы для реализации условий:

  • операторы сравнения;
  • логические операторы;
  • оператор if ... else;
  • условный оператор;
  • оператор switch.

Операторы сравнения

Для проверки условия на истинность используются операторы сравнения. Они служат для сравнения двух значений между собой.

ОператорИСТИНАОписание
===Если значения равны

Проверка на идентичность без типизации данных.

При сравнении числа и строки всегда ложно, так как сравниваются данные разных типов.

!==Если значения не равны
==Если значения равны

Проверка на идентичность с типизацией данных.

При сравнении числа и строки преобразует текст в число и выполнит сравнение двух чисел.

!=Если значения не равны
>Если левое значение большеВыявление большего значения.
<Если левое значение меньше
>=Если левое значение больше или равно правому
<=Если левое значение меньше или равно правому

Логические операторы

Логические операторы служат для объединения двух и более условий по правилам логических выражений:

  • && — логическое И. Чтобы логическое выражение было истинным (true), все условия должны быть истинны (true);
  • || — логическое ИЛИ. Чтобы логическое выражение было истинным (true), хотя бы одно условие должно быть истинным (true);
  • ! — логическое НЕ. Возвращает противоположное значение результата. Ложное (false) условие будет считаться истинным (true), истинное условие (true) будет считаться ложным (false).

Результат логического выражения в коде обозначается ключевыми словами true и false. Логическое выражение возвращает значение true, если оно истинно и значение false, если выражение ложно. 

Оператор if ... else

Базовый синтаксис конструкции:

if (логическое выражение) {
	фрагмент кода 1 //выполняется если логическое выражение истинно.
} else {
	фрагмент кода 2  //выполняется если логическое выражение ложно.
}

Использование ключевого слова else не является обязательным:

if (логическое выражение) {
	фрагмент кода 1 //выполняется если логическое выражение истинно.
}
фрагмент кода 2 //выполняется в любом случае, независимо от результата логического выражения. 

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

if (_second_num == 1 & _first_num != 1) _string += ' копейка'; //Первое условие. Если истинно, то выполняется описанный код и выход из условия. 
	else if (_second_num > 1 && _second_num < 5) _string += ' копейки'; //Второе условие. Проверяется, если первое условие ложно. 
else _string += ' копеек';// Выполняется, если ни одно из условий не оказалось истинным. 

Пример использования

В стандартном шаблоне счёта с помощью конструкции "if ... else" реализован вывод информации о плательщике:

<% if ((findu(payment.customer.profiletype) == 2) || (findu(payment.customer.profiletype) == 3)) { %> // Если плательщик является юр. лицом или ИП, тогда
	<div class="title">Покупатель:&nbsp;</div>
	<div class="company"><%= findu(payment.customer.name) %></div>
	<div>ИНН <%= findu(payment.customer.vatnum) %>, КПП <%= findu(payment.customer.kpp) %></div> // Вывести на печатную форму документа ИНН и КПП. 
   	<div class="line">&nbsp;</div>
   	<div><%= findu(payment.customer.postcode_legal) %>, <%= findu(payment.customer.country_legal_name) %>, 
	<%= findu(payment.customer.city_legal) %>, <%= findu(payment.customer.address_legal) %></div>
<% } else { %> // Иначе плательщик счиатется физ. лицом
	<div class="title">Покупатель:&nbsp;</div>
   	<div class="company"><%= findu(payment.customer.person) %></div>
   	<div class="line">&nbsp;</div>
   	<div><%= findu(payment.customer.postcode_physical) %>, <%= findu(payment.customer.country_physical_name) %>, 
	<%= findu(payment.customer.city_physical) %>, <%= findu(payment.customer.address_physical) %></div> // Вывести на печатную форму документа адрес плательщика.
<% } %>

В приведённом фрагменте кода проверяется тип плательщика. Если это юридическое лицо или индивидуальный предприниматель, то на печатную форму счёта выводится его ИНН и КПП. Иначе плательщик считается физическим лицом и на печатную форму счёта выводится его адрес. 

Условный оператор

Условный оператор — удобная альтернатива конструкции "if ... else". Оператор выполняет действие X, если логическое выражение истинно, и действие Y, если выражение ложно. Базовый синтаксис:

(условие)?фрагмент кода 1:фрагмент кода 2

Фрагмент кода 1 выполняется, если условие истинно. Фрагмент кода 2 выполняется, если условие ложно. 

Пример использования

В функции приведения числа к строковому написанию содержится код:

var n=!isFinite(+number)?0:+number

Его можно расшифровать как "если выражение +number не является конечным числом, то переменной n присваивается 0, иначе n присваивается выражение +number". 

Оператор switch

Оператор switch принимает одну переменную или выражение и в зависимости от полученного результата выполняет необходимый фрагмент кода. Базовый синтаксис выглядит следующим образом:

switch (выражение) {
  case 1:
    фрагмент кода 1
    break; // завершает выполнение оператора case

  case 2: // конструкций case (вариантов) может быть любое количество
    фрагмент кода 2
    break;
  
  default: // выполняется, если полученное значение не соответствует ни одному результату. 
    фрагмент кода 3
}

Фрагмент кода 1 выполняется, если результатом выражения стало число 1. Фрагмент кода 2 выполняется, если результатом выражения стало число 2. Фрагмент кода 3 выполнится, если результатом выражения станет любое значение, кроме чисел 1 и 2. 

Пример использования

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

switch (word) {
  case 'hi':
    phrase = 'Hello my dear friend';
    break;

  case 'bye':
    phrase = 'Goodbye, i hope to see you again';
    break;

  case 'joke':
    phrase = 'I dont know jokes';
    break;

  case 'day':
    phrase = 'Have a nice day!';
    break;

  default:
    phrase = 'I dont understand you';
}

Данный фрагмент кода сопоставляет значение входной переменной word с возможными значениями:

  • если в переменной "word" содержится слово "hi", то переменной "phrase" будет присвоено значение "Hello my dear friend";
  • если в переменной "word" содержится слово "bye", то переменной "phrase" будет присвоено значение "Goodbye, i hope to see you again";
  • если в переменной "word" содержится слово "joke", то переменной "phrase" будет присвоено значение "I dont know jokes";
  • если в переменной "word" содержится слово "day", то переменной "phrase" будет присвоено значение "Have a nice day";
  • если совпадения не найдены, то переменной phrase будет присвоено значение "I dont understand you".