getObject(); if (substr($event->Special, 0, 10) == 'duplicates') { $object->removeFilter('category_filter'); $grouping = $this->getGrouping($event); switch ($event->Special) { case 'duplicates': foreach ($grouping as $group_field) { $object->AddGroupByField($group_field); } $object->addFilter('has_dupes_filter', 'DupeCount > 1', AGGREGATE_FILTER, FLT_SYSTEM); break; case 'duplicates-sub': $main_object =& $this->Application->recallObject($event->Prefix.'.duplicates'); foreach ($grouping as $field_index => $group_field) { $object->addFilter('dupe_filter_'.$field_index, '%1$s.`'.$group_field.'` = '.$this->Conn->qstr($main_object->GetDBField($group_field)) ); } break; } $object->addFilter('primary_filter', TABLE_PREFIX.'CategoryItems.PrimaryCat = 1'); } } /** * Gets grouping fields * * @param kEvent $event * @return Array */ function getGrouping(&$event) { // cut "sub" postfix from special $prefix_special = preg_replace('/(.*)-sub$/', '\\1', $event->getPrefixSpecial()); $grouping = $this->Application->RecallVar($prefix_special.'_dupe_fields'); if (!$grouping) { $grouping = '|Url|'; $this->Application->StoreVar($prefix_special.'_dupe_fields', $grouping); } $grouping = explode('|', substr($grouping, 1, -1)); return $grouping; } /** * Set groping fields for link duplicate checker * * @param kEvent $event */ function OnSetGrouping(&$event) { $this->Application->LinkVar($event->getPrefixSpecial(true).'_dupe_fields', $event->getPrefixSpecial().'_dupe_fields'); } /** * Merge duplicate links together (only categories) & delete duplicates * * @param kEvent $event */ function OnMerge(&$event) { $grouping = $this->getGrouping($event); $ids = $this->StoreSelectedIDs($event); if (!$ids) return true; // check, that user has not selected multiple links from same group $primary_links = Array(); $id_field = $this->Application->getUnitOption($event->Prefix, 'IDField'); $table_name = $this->Application->getUnitOption($event->Prefix, 'TableName'); $sql = 'SELECT * FROM '.$table_name.' WHERE '.$id_field.' IN ('.implode(',', $ids).')'; $links = $this->Conn->Query($sql, $id_field); $groping_error = false; foreach ($links as $link_id => $link_data) { $group_key = ''; foreach ($grouping as $grouping_field) { $group_key .= 'main_table.`'.$grouping_field.'` = '.$this->Conn->qstr($link_data[$grouping_field]).' AND '; } $group_key = preg_replace('/(.*) AND $/', '\\1', $group_key); if (isset($primary_links[$group_key])) { $groping_error = true; break; } else { $primary_links[$group_key] = $link_data['ResourceId']; } } if (!$groping_error) { $temp =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler'); $categories_sql = 'SELECT main_table.ResourceId, ci.CategoryId, main_table.'.$id_field.' FROM '.$table_name.' main_table LEFT JOIN '.TABLE_PREFIX.'CategoryItems ci ON main_table.ResourceId = ci.ItemResourceId WHERE %s'; foreach ($primary_links as $group_key => $primary_resource_id) { $categories = Array(); $group_links = Array(); $group_categories = $this->Conn->Query(sprintf($categories_sql, $group_key)); foreach ($group_categories as $category_data) { $group_links[ $category_data['ResourceId'] ] = $category_data[$id_field]; $categories[$category_data['ResourceId'] == $primary_resource_id ? 'remove' : 'add'][] = $category_data['CategoryId']; } unset($group_links[$primary_resource_id]); $categories = array_unique( array_diff($categories['add'], $categories['remove']) ); if ($categories) { // add link to other link categories $values_sql = ''; foreach ($categories as $category_id) { $values_sql .= '('.$category_id.','.$primary_resource_id.',0),'; } $values_sql = preg_replace('/(.*),$/', '\\1', $values_sql); $insert_sql = 'INSERT INTO '.TABLE_PREFIX.'CategoryItems (CategoryId,ItemResourceId,PrimaryCat) VALUES '.$values_sql; $this->Conn->Query($insert_sql); } // delete all links from group except primary $temp->DeleteItems($event->Prefix, $event->Special, array_values($group_links)); } } else { $event->status = erFAIL; $event->redirect = false; $this->Application->SetVar($event->getPrefixSpecial().'_error', 1); } } } ?>