Pull to refresh

Реализация в 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}

Спасибо всем за внимание.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.