Index: trunk/kernel/units/categories/categories_event_handler.php =================================================================== diff -u -N -r2190 -r2586 --- trunk/kernel/units/categories/categories_event_handler.php (.../categories_event_handler.php) (revision 2190) +++ trunk/kernel/units/categories/categories_event_handler.php (.../categories_event_handler.php) (revision 2586) @@ -43,8 +43,15 @@ */ function SetCustomQuery(&$event) { + parent::SetCustomQuery($event); + + $types=$event->getEventParam('types'); + $except_types=$event->getEventParam('except'); $object =& $event->getObject(); + $type_clauses = Array(); + $object =& $event->getObject(); + if ( $event->getEventParam('parent_cat_id') ) { $parent_cat_id = $event->getEventParam('parent_cat_id'); } @@ -85,6 +92,124 @@ if (!defined('ADMIN')) { $object->addFilter('status_filter', $object->TableName.'.Status = 1'); } + + if(strpos($types, 'category_related') !== false) + { + $object->removeFilter('parent_filter'); + $resource_id = $this->Conn->GetOne(' + SELECT ResourceId FROM '.$this->Application->getUnitOption($event->Prefix, 'TableName').' + WHERE CategoryId = '.$parent_cat_id + ); + + $sql = 'SELECT DISTINCT(TargetId) FROM '.TABLE_PREFIX.'Relationship + WHERE SourceId = '.$resource_id.' AND SourceType = 1'; + $related_cats = $this->Conn->GetCol($sql); + $related_cats = is_array($related_cats) ? $related_cats : Array(); + $sql = 'SELECT DISTINCT(SourceId) FROM '.TABLE_PREFIX.'Relationship + WHERE TargetId = '.$resource_id.' AND TargetType = 1 AND Type = 1'; + $related_cats2 = $this->Conn->GetCol($sql); + $related_cats2 = is_array($related_cats2) ? $related_cats2 : Array(); + $related_cats = array_unique( array_merge( $related_cats2, $related_cats ) ); + + if($related_cats) + { + $type_clauses['category_related']['include'] = '%1$s.ResourceId IN ('.implode(',', $related_cats).')'; + $type_clauses['category_related']['except'] = '%1$s.ResourceId NOT IN ('.implode(',', $related_cats).')'; + } + else + { + $type_clauses['category_related']['include'] = '0'; + $type_clauses['category_related']['except'] = '1'; + } + $type_clauses['category_related']['having_filter'] = false; + } + + if(strpos($types, 'product_related') !== false) + { + $object->removeFilter('parent_filter'); + + $product_id = $event->getEventParam('product_id') ? $event->getEventParam('product_id') : $this->Application->GetVar('p_id'); + $resource_id = $this->Conn->GetOne(' + SELECT ResourceId FROM '.$this->Application->getUnitOption('p', 'TableName').' + WHERE ProductId = '.$product_id + ); + + $sql = 'SELECT DISTINCT(TargetId) FROM '.TABLE_PREFIX.'Relationship + WHERE SourceId = '.$resource_id.' AND TargetType = 1'; + $related_cats = $this->Conn->GetCol($sql); + $related_cats = is_array($related_cats) ? $related_cats : Array(); + $sql = 'SELECT DISTINCT(SourceId) FROM '.TABLE_PREFIX.'Relationship + WHERE TargetId = '.$resource_id.' AND SourceType = 1 AND Type = 1'; + $related_cats2 = $this->Conn->GetCol($sql); + $related_cats2 = is_array($related_cats2) ? $related_cats2 : Array(); + $related_cats = array_unique( array_merge( $related_cats2, $related_cats ) ); + + if($related_cats) + { + $type_clauses['product_related']['include'] = '%1$s.ResourceId IN ('.implode(',', $related_cats).')'; + $type_clauses['product_related']['except'] = '%1$s.ResourceId NOT IN ('.implode(',', $related_cats).')'; + } + else + { + $type_clauses['product_related']['include'] = '0'; + $type_clauses['product_related']['except'] = '1'; + } + $type_clauses['product_related']['having_filter'] = false; + } + + /********************************************/ + + $includes_or_filter =& $this->Application->makeClass('kMultipleFilter'); + $includes_or_filter->setType(FLT_TYPE_OR); + + $excepts_and_filter =& $this->Application->makeClass('kMultipleFilter'); + $excepts_and_filter->setType(FLT_TYPE_AND); + + $includes_or_filter_h =& $this->Application->makeClass('kMultipleFilter'); + $includes_or_filter_h->setType(FLT_TYPE_OR); + + $excepts_and_filter_h =& $this->Application->makeClass('kMultipleFilter'); + $excepts_and_filter_h->setType(FLT_TYPE_AND); + + $except_types_array=explode(',', $types); + + if ($types){ + $types_array=explode(',', $types); + for ($i=0; $iremoveFilter('filter_'.$type); + $includes_or_filter_h->addFilter('filter_'.$type, $type_clauses[$type]['include']); + }else{ + $includes_or_filter->removeFilter('filter_'.$type); + $includes_or_filter->addFilter('filter_'.$type, $type_clauses[$type]['include']); + } + } + } + } + + if ($except_types){ + $except_types_array=explode(',', $except_types); + for ($i=0; $iremoveFilter('filter_'.$type); + $excepts_and_filter_h->addFilter('filter_'.$type, $type_clauses[$type]['except']); + }else{ + $excepts_and_filter->removeFilter('filter_'.$type); + $excepts_and_filter->addFilter('filter_'.$type, $type_clauses[$type]['except']); + } + } + } + } + + $object->addFilter('includes_filter', $includes_or_filter); + $object->addFilter('excepts_filter', $excepts_and_filter); + + $object->addFilter('includes_filter_h', $includes_or_filter_h, HAVING_FILTER); + $object->addFilter('excepts_filter_h', $excepts_and_filter_h, HAVING_FILTER); } function GetPassedId(&$event)