Реализация в TYPO3/Fluid простой математики непосредственно в шаблонах html
Реализация стандартных операций с использованием 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}
Спасибо всем за внимание.