Вывод даты msTimeStamp полей MiniShop2: new, favorite, popular...

И снова, всем привет! Попросили меня на днях сделать вывод дат msTimeStamp, чего по какой то причине нет из коробки… Потратив некоторое время, получилось решение в виде сниппета, за помощь в написании которого, выражаю большую благодарность Степану Гончарову!



Итак, начнём:

1) Создаём сниппет msTimeStamp:
<?php
$id = $modx->getOption('id', $scriptProperties, $modx->resource->id);
$field = $modx->getOption('field', $scriptProperties);
$tpl = $modx->getOption('tpl', $scriptProperties, 'msTimeStampTpl');
if ($modx->getObject('msProduct', $id )->get($field) == null) {
    return false;  
}
$date = $modx->getObject('msTimeStampProduct', ['product_id' => $id, 'field' => $field]);
if($date == null) {
    return $modx->lexicon('ms2_product_'.$field);
}
if($date->get('valid_until') == null) {
    return $modx->lexicon('ms2_product_'.$date->get('field'));
}
return $modx->getChunk($tpl, ['field' => $modx->lexicon('ms2_product_'.$date->get('field')), 'date' => $modx->runSnippet('RusDate', ['input' => strtotime($date->get('valid_until')), 'options' => '%j %month %Yг.']),]);

2) Создаём стандартный чанк вывода msTimeStampTpl:
<p>[[+field]] до: [[+date]]</p>

3) Вызываем сниппет где нужно показать дату:

На странице товара
[[msTimeStamp?field=`new`]]

В карточке товара
[[msTimeStamp?id=`[[+id]]`&field=`new`]]

Так же, можно сделать свой чанк и указать в сниппете параметром tpl, в чанке используется всего 2 плейсхолдера: field — выбранное поле, и date — дата.

И тут надо отметить, что дата у меня обрабатывается ещё одним сниппетом-русификатором: RusDate от quasi-art.ru, за что им так же, отдельная благодарность!

И напоследок, если у поля new/favorite/popular не указана дата, сниппет будет возвращать только название поля. Название полей он берёт из словарей.

В данный момент ведётся активная работа над MiniShop3 силами сообщества и руками @Николай Савин, поэтому призываю всех неравнодушных поддержать эту работу финансово.
Денис Усманов
05 октября 2023, 17:01
modx.pro
3
515
+8

Комментарии: 1

Дмитрий
16 октября 2023, 17:04
+2
Дополню пост. Возникла проблема при выводе даты на странице категории товаров. При использовании mFilter после фильтрации товаров дата «слетает». Сниппет переписан следующим образом:

<?php
$id = $modx->getOption('id', $scriptProperties, $modx->resource->id);
$field = $modx->getOption('field', $scriptProperties);
$tpl = $modx->getOption('tpl', $scriptProperties, 'msTimeStampTpl');
if ($modx->getObject('msProduct', $id )->get($field) == null) {
    return false;  
}

$tablePrefix = $modx->getOption('table_prefix');
$table = $tablePrefix.'mstimestamp_product';
$sql = "SELECT * FROM $table WHERE product_id = $id AND field = '$field'";
$statement = $modx->query($sql);
$date = $statement->fetch(PDO::FETCH_ASSOC);
if(!empty($date)){
    return $modx->getChunk($tpl, ['date' => $date['valid_until']]);
}
return false;

Также, вместо отображения даты, может быть удобнее вывести оставшееся количество дней. Я сделал это прямо в шаблоне на fenom:

{if $favorite}
{set $favoriteDate = '!msTimeStampDate' | snippet: ['id' => $id, 'field' => 'favorite']}

{if $favoriteDate != ''}
{set $nowDate = $date | date_format:"%s"}
{set $daysLeft = (($favoriteDate - $nowDate)/60/60/24) | number : 0 : '' : ''}

{if $daysLeft > 0}Ещё {$daysLeft | declension : 'день|дня|дней' : true}{else}Успейте сегодня!{/if}

{/if}
{/if}

Спасибо @Артур Шевченко за помощь и @Денис Усманов за данное полезное дополнение.

Критика и комментарии приветствуются.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    1