Under construction
24 Жов./2013 2013

math.modulo або додаємо кожному N-му елементу списку клас "last"

Верстальники HTML сторінок дуже часто використовують клас "last" для того, щоб позбавити останній елемент списку певних властивостей - відступів, меж і тому подібне. Для чого це робиться і чому виникає така необхідність? Подивимося на малюнок № 1 . Як бачимо, кожен елемент списку має правий відступ. В принципі, криміналу тут ніякого немає, але проблема виникає тоді, коли список розміщується в області фіксованої ширини і відступ останнього елемента вже є зайвим. Тобто ми хочемо отримати результат зображений на малюнку № 2, коли правий і лівий блок щільно притиснуті до країв свого контейнера

Аби домогтися поставленої мети нам потрібно кожному 4-му елементу списку надати якийсь клас, який буде відповідати за видалення правого відступу. Нехай цей клас так і називається - "last".

Малюнок 1
Малюнок 2

Зрозуміло, що це завдання можна вирішити різними способами, наприклад, за допомогою javascript, але ми розповімо про те, як це можна зробити за допомогою вьюхелпера (viewhelper) modulo, який є в пакеті VHS у розділі математичних функцій - math.

Ідея проста - знаходимо елементи списку номери яких кратні 4-му, тобто діляться на 4 без залишку і додаємо їм потрібний нам клас. Подібними характеристиками володіють - 4-й, 8-й, 12-й і їм подібні елементи.

Отже готовий фрагмент коду:

Код:  Виділити усе  |  Нумерація рядків увімкнути/вимкнути
  1. <ul class="items-container thumbnails">
  2.     <f:for each="{listItems}" as="items" iteration="iteration">
  3.         <li class="list-item{f:if(condition: '{v:math.modulo(a:iteration.cycle , b: 4)}==0', then: ' last')}">
  4.             <div class="thumbnail">
  5.                 <f:link.action action="show" arguments="{items : items}">
  6.                     <f:image src="uploads/tx_plugin/{items.itemImage}" alt="{items.itemImagealttext}" title="{items.itemImagetitletext}"  maxWidth="180" maxHeight="180" />
  7.                 </f:link.action>
  8.                 <h3><f:link.action action="show" arguments="{items : items}">{items.itemTitle}</f:link.action></h3>
  9.                 <p><f:format.crop maxCharacters="{cropchar}">{items.itemBodytext}</f:format.crop></p>
  10.             </div>
  11.         </li>
  12.     </f:for>
  13. </ul>

Для видалення відступів у CSS-файл додаємо наступний рядок:

Код:  Виділити усе  |  Нумерація рядків увімкнути/вимкнути
  1. .items-container .last{
  2.     margin-right:0;
  3. }

Хотілося б звернути увагу на те, що "хелпер" modulo не є стандартним "хелпером" fluid, тому для його використання необхідно підключити пакет VHS за допомогою рядка - {namespace v=Tx_Vhs_ViewHelpers}, який повинен бути першим рядком у нашому HTML-шаблоні.

І ще. Можливо ви будете мати таку верстку, як зображено на малюнку № 3 (з правим і лівим відступом у кожного елемента). Тоді у Вас може виникнути необхідність встановити і клас - "first" для кожного першого елементу рядка. Зробити це зовсім просто. Для цього потрібно використовувати не iteration.cycle, як ми це зробили вище, а iteration.index. Справа в тому, що index у відмінності від cycle починає нумеруватися з нуля, а не з одиниці. Саме тому 0-й, 4-й, 8-й і їм подібні елементи будуть першими елементами наших рядків.

Малюнок 3

Ось готове рішення зі списком у якого є класи "first" і "last":

Код:  Виділити усе  |  Нумерація рядків увімкнути/вимкнути
  1. {namespace v=Tx_Vhs_ViewHelpers}
  2. <ul class="items-container thumbnails">
  3.     <f:for each="{listItems}" as="items" iteration="iteration">
  4.         <li class="list-item{f:if(condition: '{v:math.modulo(a:iteration.index , b: 4)}==0', then: ' first')}{f:if(condition: '{v:math.modulo(a:iteration.cycle , b: 4)}==0', then: ' last')}">
  5.             <div class="thumbnail">
  6.                 <f:link.action action="show" arguments="{items : items}">
  7.                     <f:image src="uploads/tx_plugin/{items.itemImage}" alt="{items.itemImagealttext}" title="{items.itemImagetitletext}"  maxWidth="180" maxHeight="180" />
  8.                 </f:link.action>
  9.                 <h3><f:link.action action="show" arguments="{items : items}">{items.itemTitle}</f:link.action></h3>
  10.                 <p><f:format.crop maxCharacters="{cropchar}">{items.itemBodytext}</f:format.crop></p>
  11.             </div>
  12.         </li>
  13.     </f:for>
  14. </ul>