Сегодня мне посчастливилось делать акции для одного из клиентских сайтов, причем не просто картинки с текстом, а с необходимостью указывать даты их проведения в виде плашек с определенными текстами. Об этом и хочу вам рассказать.

Для работы был создан новый тип страниц и 3 акции в нем. В двух из них я добавил меты с ключом date_end и датами в прошлом и будущем. Поля с ключами date_end и date_start автоматически подгружают датапикер, так что не пришлось даже настраивать.
Далее в корневую страницу акций вставил инфоблок pages с кастомным шаблоном на основе шаблона grid, который позволяет выводить элементы в виде сетки. Весь код шаблона приводить не буду, но покажу самую сложную часть этого кода.
foreach ($result as $item){
$class = '';
if (isset($item['date_end'])){
$until = strtotime($item['date_end']);
if ($until > time()){
$promo_date = 'До ' . tDate($this->locale, 'j F', $until);
} else {
$promo_date = 'Завершена';
$class = 'expired';
}
} else {
$promo_date = 'БЕССРОЧНАЯ';
}
?>
...
<div class="item <?=$class;?>">
...
<div class="until"><?=$promo_date;?></div>
...
</div>
...
<?php
}
Как видите, даже тут ничего сложного. Просто проверяем наличие меты и на основе сравнения с текущей датой применяем нужное решение. Обратите внимание, для вывода локализованной даты используется специальная функция tDate(), которая идентична стандартной date() за исключением наличия первого аргумента, в котором передается текущая локаль сайта, и переводом названий месяцев и недель на выбранный язык.
Что бы не потерять бессрочные акции в общем потоке, им достаточно указать статус "Закреплено". Тогда они всегда будут выводиться перед акциями со сроком.