HostCMS элементы ИС вывести даже если дата публикации завершена

В «Информационные системы» для записи элемента можно указать «Дата завершения публикации». Штатно элемент перестанет быть виден и доступен когда наступит указанная дата завершения публикации. Иногда хочется что бы в списке были видны те элементы которые уже завершены дата публикации.

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

В свой ТДС пишем пере определение:

class My_Informationsystem_Controller_Show extends Informationsystem_Controller_Show
{
    protected function _applyItemConditions(Informationsystem_Item_Model $oInformationsystem_Items)
    {
        $dateTime = Core_Date::timestamp2sql(time());
        $oInformationsystem_Items
            ->queryBuilder()
            ->open()
            ->where('informationsystem_items.start_datetime', '<', $dateTime)
            ->setOr()
            ->where('informationsystem_items.start_datetime', '=', '0000-00-00 00:00:00')
            ->close()
            ->where('informationsystem_items.siteuser_group_id', 'IN', $this->_aSiteuserGroups);

        return $this;
    }

}

class Info_Item_Observer
{
    static public function onBeforeGetXml($object, $args)
    {
        $bRightTime =
            ($object->start_datetime == '0000-00-00 00:00:00' || time() > Core_Date::sql2timestamp($object->start_datetime))
            && ($object->end_datetime == '0000-00-00 00:00:00' || time() < Core_Date::sql2timestamp($object->end_datetime));

        !$bRightTime && $object->addXmlTag('wrongTime', 1);
        $bRightTime && $object->addXmlTag('countDown', date('Y/m/d H:i:s', Core_Date::datetime2timestamp($object->end_datetime)));
    }
}

$oInformationsystem = Core_Entity::factory('Informationsystem', Core_Array::get(Core_Page::instance()->libParams, 'informationsystemId'));

$Informationsystem_Controller_Show = new My_Informationsystem_Controller_Show($oInformationsystem);

$Informationsystem_Controller_Show
    ->limit($oInformationsystem->items_on_page)
    ->parseUrl();

if ($Informationsystem_Controller_Show->item > 0) {
    $oInformationsystem_Item = Core_Entity::factory('Informationsystem_Item', $Informationsystem_Controller_Show->item);
    if ($oInformationsystem_Item->end_datetime < Core_Date::timestamp2sql(time()) && $oInformationsystem_Item->end_datetime != '0000-00-00 00:00:00') {
        $Informationsystem_Controller_Show->error404();
    }
}

Core_Event::attach('informationsystem_item.onBeforeGetXml', array ('Info_Item_Observer', 'onBeforeGetXml'));

Core_Page::instance()->object = $Informationsystem_Controller_Show;

В коде есть Тег wrongTime которая определяет у элемента истек дата публикации. Если же еще не завершена то передаем в Тег countDown формат даты до которого действует акция и можно сделать обратный счетчик на странице.

обратный счетчик на странице

  • 14 391 просмотр