Немножко не понял про определение структурой.
Т.е. нужно брать соседние внутри родителя ?
Гуляют по форумам пара решений.
Я когда-то делал это, сейчас смотрю код - мне за него стыдно, сейчас намного быстрее и проще сделаю.. Надо будет переписать...
Скину говнокод, в нём сама идея будет понятна. В коде присутствуют лишние моменты в виде $prop_name, полей parent и т.п. - нужно почистить
public function getNextProduct($path, $template = "default", $prop_name = "", $order = 0) {
if(!$template) $template = "default";
$element_id = def_module::analyzeRequiredPath($path);
if($element_id === false) {
throw new publicException(getLabel('error-page-does-not-exist', null, $path));
}
$element = umiHierarchy::getInstance()->getElement($element_id);
if($element instanceof iUmiHierarchyElement == false) {
throw new publicException('error-require-more-permissions');
}
$parent_id = $element->getParentId();
$objectTypes = umiObjectTypesCollection::getInstance();
$objectTypeId = $objectTypes->getBaseType("catalog", "object");
$objectType = $objectTypes->getType($objectTypeId);
if($prop_name) {
$sel = new umiSelection;
$sel->addHierarchyFilter($parent_id);
$sel->addActiveFilter(true);
$sel->addPermissions();
$sel->addPropertyFilterIsNull($objectType->getFieldId('parent'));
$object_type_id = $element->getObject()->getTypeId();
$object_type = umiObjectTypesCollection::getInstance()->getType($object_type_id);
$order_field_id = $object_type->getFieldId($prop_name);
if(!$order_field_id) {
throw new publicException(getLabel('error-prop-not-found', null, $prop_name));
}
$sel->setOrderByProperty($order_field_id, $order);
$sort_array = umiSelectionsParser::runSelection($sel);
} else {
$sel = new umiSelection;
$sel->addHierarchyFilter($parent_id);
$sel->addActiveFilter(true);
$sel->addPermissions();
$sort_array = umiSelectionsParser::runSelection($sel);
}
$next_id = false;
$is_matched = false;
foreach($sort_array as $id) {
if($is_matched) {
$next_id = $id;
break;
}
if($id == $element_id) {
$is_matched = true;
}
}
list($tpl, $tpl_last) = def_module::loadTemplates("content/slider/".$template, "next", "next_last");
if($next_id !== false) {
$block_arr = Array();
$block_arr['id'] = $next_id;
$block_arr['link'] = umiHierarchy::getInstance()->getPathById($next_id);
return def_module::parseTemplate($tpl, $block_arr, $next_id);
} else {
return $tpl_last;
}
return $element_id;
}
public function getPreviousProduct($path, $template = "default", $prop_name = "", $order = 0) {
if(!$template) $template = "default";
$element_id = def_module::analyzeRequiredPath($path);
if($element_id === false) {
throw new publicException(getLabel('error-page-does-not-exist', null, $path));
}
$element = umiHierarchy::getInstance()->getElement($element_id);
$parent_id = $element->getParentId();
$objectTypes = umiObjectTypesCollection::getInstance();
$objectTypeId = $objectTypes->getBaseType("catalog", "object");
$objectType = $objectTypes->getType($objectTypeId);
if($prop_name) {
$sel = new umiSelection;
$sel->addHierarchyFilter($parent_id);
$sel->addActiveFilter(true);
$sel->addPermissions();
$objectTypes = umiObjectTypesCollection::getInstance();
$objectTypeId = $objectTypes->getBaseType("catalog", "object");
$objectType = $objectTypes->getType($objectTypeId);
$object_type_id = $element->getObject()->getTypeId();
$object_type = umiObjectTypesCollection::getInstance()->getType($object_type_id);
$order_field_id = $object_type->getFieldId($prop_name);
if(!$order_field_id) {
throw new publicException(getLabel('error-prop-not-found', null, $prop_name));
}
$sel->setOrderByProperty($order_field_id, $order);
$sort_array = umiSelectionsParser::runSelection($sel);
} else {
$sel = new umiSelection;
$sel->addPropertyFilterIsNull($objectType->getFieldId('parent'));
$sel->addHierarchyFilter($parent_id);
$sel->addActiveFilter(true);
$sel->addPermissions();
$sort_array = umiSelectionsParser::runSelection($sel);
}
$prev_id = false;
foreach($sort_array as $id) {
if($id == $element_id) {
break;
} else {
$prev_id = $id;
}
}
list($tpl, $tpl_first) = def_module::loadTemplates("content/slider/".$template, "previous", "previous_first");
if($prev_id !== false) {
$block_arr = Array();
$block_arr['id'] = $prev_id;
$block_arr['link'] = umiHierarchy::getInstance()->getPathById($prev_id);
return def_module::parseTemplate($tpl, $block_arr, $prev_id);
} else {
return (def_module::isXSLTResultMode()) ? "" : $tpl_first;
}
}