public function save_relationships() { $flash = Flash::Instance(); $errors = array(); $itemlink = array(); $selectedlinks = array(); $db = DB::Instance(); $db->StartTrans(); $selected_items = $_SESSION['selected_items']['data']; $deleted_items = $_SESSION['selected_items']['delete']; $selected_targets = $_SESSION['selected_targets']['data']; $deleted_targets = $_SESSION['selected_targets']['delete']; if (!empty($deleted_targets) || !empty($deleted_items)) { // Need to delete any relationship that are just about to be saved $do = new DataObject($this->linkTableName); $doc = new DataObjectCollection($do); $sh = new SearchHandler($doc, false); $cc1 = new ConstraintChain(); if (!empty($deleted_targets)) { $cc1->add(new Constraint('item_id', 'IN', '(' . implode(',', array_keys($selected_items)) . ')')); $cc1->add(new Constraint('target_id', 'IN', '(' . implode(',', array_keys($deleted_targets)) . ')')); } $cc2 = new ConstraintChain(); if (!empty($deleted_items)) { $cc2->add(new Constraint('item_id', 'IN', '(' . implode(',', array_keys($deleted_items)) . ')')); $cc2->add(new Constraint('target_id', 'IN', '(' . implode(',', array_keys($selected_targets)) . ')')); } $sh->addConstraint($cc1); $sh->addConstraint($cc2, 'OR'); $deleted = $doc->delete($sh); if ($deleted > 0) { $flash->addWarning($deleted . ' relationships deleted'); } } $selectedlinks = array(); foreach ($selected_items as $item_key => $item_data) { foreach ($selected_targets as $target_key => $target_data) { $do = new DataObject($this->linkTableName); $cc = new ConstraintChain(); $cc->add(new Constraint('item_id', '=', $item_key)); $cc->add(new Constraint('target_id', '=', $target_key)); $do->loadBy($cc); if (!$do->isLoaded()) { // Only save links that do not exist $selectedlinks[] = array('item_id' => $item_key, 'target_id' => $target_key); } } } if (count($selectedlinks) > 0) { $result = SelectorCollection::saveAssociations($selectedlinks, $this->linkTableName, $errors); } else { $flash->addWarning('These relationships already exist - no data saved'); $result = true; } if ($result) { $db->CompleteTrans(); unset($_SESSION['selected_items']); unset($_SESSION['selected_targets']); $flash->addMessage(count($selectedlinks) . " relationships saved successfully"); sendTo($this->name, 'index', $this->_modules); } else { $db->FailTrans(); $db->CompleteTrans(); $flash->addErrors($errors); $flash->addError("Error saving relationships"); sendTo($this->name, 'confirm_relationships', $this->_modules); } }