UMIhelp

Разработка сайта на UMI.CMS => Настройка системы и модулей => Тема начата: sinneren от 01 Сентября 2014, 14:50:28

Название: Не работает событие активности
Отправлено: sinneren от 01 Сентября 2014, 14:50:28
UMI.CMS Commerce
Версия системы   2.9.1
Ревизия   2215

Тип данных "новость" в "новостная лента".
Устанавлиаю Дату публикации, начала и окончания активности. Но материал в лучшем случае не скрывается, в худшем - даже не появляется. Активность включалась на RUS версии, на ENG даже это не работает.
В чём может быть причина. Утверждают, что ранее это работало. С тех пор обновлений не было и не могло быть ввиду окончания срока лицензии.

Настройки макроса: %news lastlist(/actions/,npc_index_actions,3,1,0,1)%

Контроль актуальности поставил, продублировал тамвремя снятия с публикации - вижу только,что меняется сортировка,но активность не снимается.

UPD: До этого контроль актуальности не был включен, уверяли, что работало и так. С ним на публикацию не отправляет, но иногда снимает,а иногда нет.
UPD2:Крон стоит на 59мин. Менял на шустрее, не вышло. Главное, чтоб включал новости.
Название: Re:Не работает событие активности
Отправлено: admin от 01 Сентября 2014, 19:25:04
механизм простой.

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
Название: Re:Не работает событие активности
Отправлено: sinneren от 02 Сентября 2014, 12:42:18
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();
}
}
Название: Re:Не работает событие активности
Отправлено: sinneren от 02 Сентября 2014, 12:43:37
Ответ ручного запуска крон. Новость не появилась.
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. news::cronDeactivateNews (umiEventPoint), priority = 5, not critial
   5. dispatches::onAutosendDispathes (umiEventPoint), priority = 5, not critial
   6. emarket::onCronSyncCurrency (umiEventPoint), priority = 5, not critial
   7. config::runGarbageCollector (umiEventPoint), priority = 5, not critial
Название: Re:Не работает событие активности
Отправлено: sinneren от 02 Сентября 2014, 13:05:19
Опробовал твой код активации, с режимом контроля публикаций и без. Запускал вручную. Эффекта ноль.
Название: Re:Не работает событие активности
Отправлено: admin от 02 Сентября 2014, 13:29:17
попробуй отрубить cron

Цитировать
1. news::cronDeactivateNews (umiEventPoint), priority = 5, not critial
   2. news::feedsImportListener (umiEventPoint), priority = 5, not critial

если они не глушат (то есть не ломают что-то), то смотри дело остается только в макросе) 

P.S. еще у тебя почему-то 2 раза запускается cronDeactivateNews , причем второй после cronActivateNews , может он его перекрывает))
Название: Re:Не работает событие активности
Отправлено: sinneren от 02 Сентября 2014, 15:31:44
А где-то есть еще файл, где пишутся кастомные обработчики, вроде как у битрикса 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();
}

Можно полный код стандартного файла получить?
Название: Re:Не работает событие активности
Отправлено: admin от 02 Сентября 2014, 15:38:23
у меня нет макроса cronDeactivateNews  и нет eventlistner который вызывал бы такой макрос (версия 2.9.x)

попробуйте отключить строчку
new umiEventListener("cron", "news", "cronDeactivateNews");

в файлу events.php и снова запустить cron.php

P.S. Это конечно вряд ли, но проверьте у той новости, включение которой вы ожидаете, содержимое полей begin_time и end_time. Не противоречат ли они друг другу? Если можете, приведите сюда их значение.
Название: Re:Не работает событие активности
Отправлено: sinneren от 02 Сентября 2014, 15:46:57
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
Название: Re:Не работает событие активности
Отправлено: sinneren от 02 Сентября 2014, 15:54:34
Добавление новости, может что тут
<?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);
}
}
?>
Название: Re:Не работает событие активности
Отправлено: sinneren от 02 Сентября 2014, 16:05:44
есть еще custom_events.php с
new umiEventListener("cron", "news", "cronDeactivateNews");
может потому дважды в отчете крона идет
Название: Re:Не работает событие активности
Отправлено: admin от 02 Сентября 2014, 16:09:31
Добавление новости, может что тут
<?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);
}
}
?>

вот это, не понятно к чему, вы добавляете новость не через админку?

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

я правильно понял, что вы вначале заккоментировали event в файле events.php (код которого вы привели 2 блоком)
потом вы запустили cron.php (код которого вы привели 1 блоком)

при этом строчка
Цитировать
1. news::cronDeactivateNews (umiEventPoint), priority = 5, not critial
показывает что у вас где-то еще срабатывает event деактивации новости.

Если яправильно понял ваше сообщение, то поищите по другим модулям в файлах events.php или custom_event.php

Второй момент, у вас поставлен очень маленький диапазон времени между begin и end time, а что есть time() в функции активации новости, возвращает время сервера, у которого другая time_zone (особенно если хостинг за раничный). Проверьте, что возвращает вам php функция time(). Может стоить скорректировать begin_time?
Название: Re:Не работает событие активности
Отправлено: sinneren от 02 Сентября 2014, 16:14:21
Так... по порядку. Код добавления я привел просто кстати, чтоб посмотерть может там какая лишняя обработка.

Сначала я закомментировал umiEventListener,потом вручную запустил крон.пхп.

Строчка news::cronDeactivateNews исчезла,когда закомментировал строку в файле custom_event.php
Название: Re:Не работает событие активности
Отправлено: sinneren от 02 Сентября 2014, 16:15:52
Текущее время сервера 16:14:54 (1409660094). Реальное совпадает.
Название: Re:Не работает событие активности
Отправлено: admin от 02 Сентября 2014, 16:17:51
просто ради интереса, запустите udata://news/cronActivateNews на вашем сайте. чтобы без всякого крона убедиться работает ли активация новости, а потом уже копать в сторону крона или events
Название: Re:Не работает событие активности
Отправлено: sinneren от 02 Сентября 2014, 16:18:23
Но,как я полнял, 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();
}
}
};
Название: Re:Не работает событие активности
Отправлено: sinneren от 02 Сентября 2014, 16:19:16
Вот это не понял. Как,что и где запустить.
Цитировать
запустите udata://news/cronActivateNews
Название: Re:Не работает событие активности
Отправлено: sinneren от 02 Сентября 2014, 16:28:51
Если имелось ввиду сайт.ру/udata/news/cronActivateNews
то ответ такой
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="news" method="cronActivateNew" generation-time="0.020110"/>
<!--
 This page generated in 0.130268 secs by XSLT, HTTP SCHEME MODE
-->
Название: Re:Не работает событие активности
Отправлено: admin от 02 Сентября 2014, 17:33:12
неважно какой ответ, важно просто запцустить макрос. Новость, активной стала? Если нет, то проблема в макросе.

P.S. какой тип данных у многострадальной новости, которую мы пытаемся включить?
Название: Re:Не работает событие активности
Отправлено: sinneren от 02 Сентября 2014, 17:42:56
тип данных новость, родитель лента новостей.
Нет,активной не стала. В каком именно макросе. Они же лишь в шаблонах, выводят что-то, обрабатывают инфу,но не управляют в целом. Новость остается неактивной и в админке,а не просто не отображается.
Название: Re:Не работает событие активности
Отправлено: admin от 03 Сентября 2014, 07:59:27
Они же лишь в шаблонах, выводят что-то, обрабатывают инфу,но не управляют в целом. Новость остается неактивной и в админке,а не просто не отображается.

в umi версии 2.x макросы не только выводят, но и могут менять данные (отправка форм, создание объектов редактирвоание данных)

ваш макрос cronActivateNews, например ищет все страницы относящиеся к иерархическому типу данных "Новость" со значением поля begin_time меньше чем текущее время и делает их активными. Ну, по крайней мере должен делать.
Название: Re:Не работает событие активности
Отправлено: sinneren от 03 Сентября 2014, 12:26:06
В общем, я залогировал $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 времени. Что, по моему, и является причиной(или одной из).
Название: Re:Не работает событие активности
Отправлено: sinneren от 03 Сентября 2014, 12:32:07
(https://ps.vk.me/c609421/u9794062/docs/91cf25ad8dd4/11.png?extra=bSvvfLxoFJ-1upL2LeLs_8h3QkqjhnnCbUtsesTx7aVxJrB8iKBLGtbvx9-h3_PhvX5O81sgr2T0swZXNHDbWNLp1SjSemA)
Вот скрин настройки типа данных
Название: Re:Не работает событие активности
Отправлено: sinneren от 03 Сентября 2014, 14:03:29
Переделал с правильной(по идее) датой и временем, но тоже не сработало
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();
}
}
Название: Re:Не работает событие активности
Отправлено: sinneren от 03 Сентября 2014, 14:59:38
Попробовал поиграться с выборкой
$pages->where('is_active')->equals(false);
      $pages->where('begin_time')->eqless(time());
      $pages->where('end_time')->more(time()); и без этой строки. с ней вообще ноль.
При выборке $pages->where('begin_time')->eqless(date("Y-m-d H:i:s", time())); и старой eqless(time()) выборка аналогична. НО,если убрать вообще, то она колоссальна,160 метров лог. странно.
Выборка по ID не дает результата