механизм простой.
1. по крону запускается event
$onCronActivateNews = new umiEventListener("cron", "news", "cronActivateNews");
проверьте его в файле /classes/modules/news/events.php
2. данный event выполняет функцию в файле /classes/modules/news/class.php
public function cronActivateNews() {
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('news', 'item');
$pages->where('is_active')->notequals(true);
$pages->where('begin_time')->eqless(time());
foreach ($pages as $page){
$page->setIsActive(true);
$page->commit();
}
}
Её тоже проверьте
P.S. попробуй запустить вручную cron события через http://site.ru/cron.php
Возможно, есть какой-то еще event, который возвращает fatal errore и не дает выполниться тому, что идет после него. То есть, посмотри что перед твоим event'ом и попробуй отключить эти event (просто найди их в файлах системы и закомментируй). Если при ручном запуске http://site.ru/cron.php станут активные новости? которые были выключены, но имели begin_time меньше текущего времени, значит что-то с запуском cron
1.
$onCronNewsRead = new umiEventListener("cron", "news", "feedsImportListener");
$onCronActivateNews = new umiEventListener("cron", "news", "cronActivateNews");
new umiEventListener("cron", "news", "cronDeactivateNews");
2.Немного отличается
public function cronActivateNews() {
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('news', 'item');
$pages->where('is_active')->notequals(true);
$pages->where('begin_time')->eqless(time());
foreach ($pages as $page){
if(strtotime($page->getValue("end_time")) <= time()){
$page->setIsActive(false);
} else {
$page->setIsActive(true);
}
$page->commit();
}
}
public function cronDeactivateNews(){
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('news', 'item');
$pages->where('end_time')->eqless(time());
foreach ($pages as $page){
$page->setValue("test",date("h:i:s"));
$page->setIsActive(false);
$page->commit();
}
}
А где-то есть еще файл, где пишутся кастомные обработчики, вроде как у битрикса init.php?
В файле class.php один раз объявлена cronDeactivateNews и нигде и ничто к ней не ссылается там.
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('news', 'item');
$pages->where('end_time')->eqless(time());
foreach ($pages as $page){
$page->setValue("test",date("h:i:s"));
$page->setIsActive(false);
$page->commit();
}
Можно полный код стандартного файла получить?
у меня нет макроса cronDeactivateNews и нет eventlistner который вызывал бы такой макрос (версия 2.9.x)
попробуйте отключить строчку
new umiEventListener("cron", "news", "cronDeactivateNews");
в файлу events.php и снова запустить cron.php
P.S. Это конечно вряд ли, но проверьте у той новости, включение которой вы ожидаете, содержимое полей begin_time и end_time. Не противоречат ли они друг другу? Если можете, приведите сюда их значение.
Executed event handlers:
1. news::cronDeactivateNews (umiEventPoint), priority = 5, not critial
2. news::feedsImportListener (umiEventPoint), priority = 5, not critial
3. news::cronActivateNews (umiEventPoint), priority = 5, not critial
4. dispatches::onAutosendDispathes (umiEventPoint), priority = 5, not critial
5. emarket::onCronSyncCurrency (umiEventPoint), priority = 5, not critial
6. config::runGarbageCollector (umiEventPoint), priority = 5, not critial
<?php
$onCronNewsRead = new umiEventListener("cron", "news", "feedsImportListener");
$onCronActivateNews = new umiEventListener("cron", "news", "cronActivateNews");
//new umiEventListener("cron", "news", "cronDeactivateNews");
?>
Дата публикации - 2014-09-02 15:38:00
Дата начала активности - 2014-09-02 15:46:00
Дата окончания активности - 2014-09-02 15:49:00
Добавление новости, может что тут
<?php
public function addNewsItem() {
$hierarchy = umiHierarchy::getInstance();
$hierarchyTypes = umiHierarchyTypesCollection::getInstance();
$objectTypes = umiObjectTypesCollection::getInstance();
$cmsController = cmsController::getInstance();
$parent_id = (int) getRequest('param0');
$object_type_id = (int) getRequest('param1');
$title = htmlspecialchars(trim(getRequest('title')));
$parentElement = $hierarchy->getElement($parent_id);
$tpl_id = $parentElement->getTplId();
$domain_id = $parentElement->getDomainId();
$lang_id = $parentElement->getLangId();
$hierarchy_type_id = $hierarchyTypes->getTypeByName("news", "item")->getId();
if(!$object_type_id) {
$object_type_id = $objectTypes->getBaseType("news", "item");
}
$object_type = $objectTypes->getType($object_type_id);
if($object_type->getHierarchyTypeId() != $hierarchy_type_id) {
$this->errorNewMessage("Object type and hierarchy type doesn't match");
$this->errorPanic();
}
$element_id = $hierarchy->addElement($parent_id, $hierarchy_type_id, $title, $title, $object_type_id, $domain_id, $lang_id, $tpl_id);
$users = $cmsController->getModule("users");
if($users instanceof def_module) {
$users->setDefaultPermissions($element_id);
}
$element = $hierarchy->getElement($element_id, true);
$element->setIsActive(true);
$element->setIsVisible(false);
$element->setName($title);
$element->commit();
$parentElement->setUpdateTime(time());
$parentElement->commit();
if($is_xslt) {
return Array("node:result" => "ok");
} else {
$this->redirect($referer_url);
}
}
?>
Но,как я полнял, custom_event.php
запускает фунцию из __custom.php
код которой в принципе не отличается от обычной
abstract class __custom_news {
//TODO: Write here your own macroses
public function cronDeactivateNews(){
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('news', 'item');
$pages->where('end_time')->eqless(time());
foreach ($pages as $page){
$page->setValue(date("h:i:s"));
$page->setIsActive(false);
$page->commit();
}
}
};
В общем, я залогировал $page массив и получил такое нечто:
umiHierarchyElement Object
(
[rel:private] => 21
[alt_name:private] => set_qualification_august
[ord:private] => 18098
[object_id:private] => 28302
[type_id:private] => 24
[domain_id:private] => 1
[lang_id:private] => 1
[tpl_id:private] => 12
[is_deleted:private] =>
[is_active:private] =>
[is_visible:private] =>
[is_default:private] =>
[name:private] => Набор Квалификация (1 августа - 31 августа)
[update_time:private] => 1409659797
[object:private] =>
[is_broken:private] =>
[store_type:protected] => element
[id:protected] => 20430
[is_updated:protected] =>
[bNeedUpdateCache:protected] =>
)
Это пример одной из акций. В целом тут не много не мало разные материалы, НО все они из RU версии, и ни одной деактивированной. Во-вторых нет нигде в массиве begin\end времени. Что, по моему, и является причиной(или одной из).
Переделал с правильной(по идее) датой и временем, но тоже не сработало
public function cronActivateNews() {
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('news', 'item');
$pages->where('is_active')->notequals(true);
$pages->where('begin_time')->eqless(date("Y-m-d H:i:s", time()));
foreach ($pages as $page){
if($page->getValue("end_time") <= date("Y-m-d H:i:s", time())){
$page->setIsActive(false);
} else {
$page->setIsActive(true);
}
$page->commit();
}
}