Реализация стандартных операций с использованием php ни у кого не вызывает трудностей. Но часто возникают ситуации когда обычные логические и вычислительные операции необходимо задействовать для полученных данных из базы данных при формировании непосредственно шаблона сайта.


Логические операции


В официальной документации TYPO3 версии 9.5 использование логических операторов детально показаны с примерами (см. на docs.typo3.org) для условных выражений if/else:


  • «XX == YY» — истина, если XX равно YY
  • «XX != YY» — истина, если XX не равно YY
  • «XX < YY» — истина, если XX меньше YY
  • «XX <= YY» — истина, если XX меньше или равно YY
  • «XX > YY» — истина, если XX больше YY
  • «XX >= YY» — истина, если XX больше или равно YY
  • «XX % YY» — истина, если есть остаток от целочисленного деления XX на YY (пример: 40 % 7 = 5)

Необходимо отметить, что XX и YY могут быть одним из: а) число; б) объект; в) массив. Строки рассматриваются как массивы. Приведем несколько примеров:


<f:if condition="{rank} > 100">
    Истина, если rank > 100
</f:if>
<f:if condition="{rank} % 2">
    Истина, если rank % 2 != 0.
</f:if>
<f:if condition="{rank} == {k:bar()}">
   Истина, если ли rank равен результату выполнения ViewHelper "k:bar"  
</f:if>
<f:if condition="{0: foo.bar} == {0: 'stringToCompare'}">
   Истина, если представленное значение {foo.bar} равно 'stringToCompare'.  
</f:if>

Вычислительные операции (простая математика)


Еще в 2015 году математические выражения были продемонстрированы в примерах, но в официальной документации TYPO3 нет описания возможности использования операций:


  • «XX * YY» — умножение
  • «XX / YY» — деление
  • «XX % YY» — остаток от целочисленного деления
  • «XX ^ YY» — возведение в степень

Остаток от деления: $number % 4 = {number % 4}
Умножение: 4 * $number = {4 * number}
Деление: 4 / $number = {4 / number}
Деление: $number1 / $number2 = {number1 / number2}
Степень: 10 ^ $number = {10 ^ number}

Использование именно этих операций облегчает решение многих задач. Например, при разработке карусели услуг для сайта pr-typo3.com появилось условие, чтобы демонстрируемая первая услуга выводилась из общего списка произвольным образом (рандом). Обычно для получения произвольного числа-индекса массива (рандом) используется функция расширения VHS:


{v:random.number(minimum: 1, maximum: 3, minimumDecimals: 0, maximumDecimals: 0)}

Но подключение дополнительного расширения сказывается на производительность всего сайта и скорости выдачи информации. Поэтому в данном случае проблема получения произвольного индекса массива была решена с помощью операции целочисленного деления (секунд текущего времени на общее количество элементов массива):


<f:variable name="sec4random" value="{f:format.date(date:'0 seconds', format:'s')}"/>
<f:variable name="count4random" value="{f:count(subject: images)}"/>
Random index for iterator: {sec4random % count4random}

Спасибо всем за внимание.