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 формат даты до которого действует акция и можно сделать обратный счетчик на странице.