Такая же проблема встала.
Добавил обработку события umiObjectProperty_loadPriceValue, для поиска объектов с ценой = 0.
Далее, по логике, нужно как-то получить ID страницы с найденым объектом и передать ей setIsActive(0) - но как это сделать ума не приложу)
public function noprice(iUmiEventPoint $oEventPoint) {
$price = &$oEventPoint->getRef('price');
$object_id = $oEventPoint->getParam('object_id');
if($price == 0){
??? -> setIsActive(0);
}
}
Подскажите - как получить ID страницы с объектом?
Я думаю, правильнее было бы отлавливать событие сохранение изменений страницы в админке или создание новой страницы (тоже в админке).
Но если отвечать на ваш вопрос, то вот функцию, для получения страницы по id объекта:
/*получим информацию о странице по id объекта*/
public function pageByObjectId($object_id = NULL){
if(!$object_id) return ;
$arr_helements = umiHierarchy::getInstance()->getObjectInstances($object_id,true);
$line_arr = array();
$line_arr['attribute:object-id'] = $object_id;
if(isset($arr_helements[0])) {
$element_id = $arr_helements[0];
$line_arr['attribute:id'] = $element_id;
$element = umiHierarchy::getInstance()->getElement($element_id, true);
if($element instanceof umiHierarchyElement) {
$line_arr['attribute:alt_name'] = $element->getAltName();
$line_arr['attribute:link'] = umiHierarchy::getInstance()->getPathById($element_id);
$line_arr['xlink:href'] = "upage://" . $element_id;
$line_arr['node:text'] = $element->getName();
}
}
return array('nodes:page'=>array($line_arr));
}
Да, при отлавливании изменении цены в админке - все ок, работает. Хотел сделать тоже самое, только автоматически - то есть чтобы при загрузке обновленного прайс листа с новыми ценами - выключались страницы с ценой = 0.
public function noprice(iUmiEventPoint $oEventPoint) {
$price = &$oEventPoint->getRef('price');
$object_id = $oEventPoint->getParam('object_id');
$element_id = umiHierarchy::getInstance()->getObjectInstances($object_id,true);
if($price == 0){
$element_id -> setIsActive(0);
}
}
Ура, теперь ID страницы видно, а как ей передать setIsActive(0) ?
Просто так $element_id -> setIsActive(0);
не работает(
Методом "тыка" удалось получить следующее:
public function noprice(iUmiEventPoint $oEventPoint) {
$price = &$oEventPoint->getRef('price');
$object_id = $oEventPoint->getParam('object_id');
$arr_helements = umiHierarchy::getInstance()->getObjectInstances($object_id,true);
$line_arr = array();
$line_arr['attribute:object-id'] = $object_id;
if(isset($arr_helements[0])) {
$element_id = $arr_helements[0];
$line_arr['attribute:id'] = $element_id;
$element = umiHierarchy::getInstance()->getElement($element_id, true);
if($price == 0){
$line_arr['attribute:IsActive'] = $element->setIsActive(0);
}
}
}
Вроде работает, но почему-то не все объекты с ценой = 0 сразу скрываются. Потестирую еще. Может что-то тут не верно?