/** * Removes the specified set item as specified by row_id from all sets in which it is a member. * * @param mixed $pm_table_name_or_num Name or number of table * @param int $pn_row_id The row_id of the item to remove from sets * @param int $pn_user_id Option user_id of user to check set access for; if no user_id is specified then no access checking is done * @return bool True on success, false if item was not removed from one or more sets due to error or access restrictions */ public function removeItemFromAllSets($pm_table_name_or_num, $pn_row_id, $pn_user_id = null) { if (!($vn_table_num = $this->_getTableNum($pm_table_name_or_num))) { return null; } $t_item = new ca_set_items(); $t_item->setMode(ACCESS_WRITE); $va_set_ids = $this->getSetIDsForItem($vn_table_num, $pn_row_id); $vb_skipped = false; foreach ($va_set_ids as $vn_set_id) { if ($pn_user_id && !$this->haveAccessToSet($pn_user_id, __CA_SET_EDIT_ACCESS__, $vn_set_id)) { $vb_skipped = true; continue; } if ($t_item->load(array('set_id' => $vn_set_id, 'row_id' => $pn_row_id))) { $t_item->delete(true); if ($t_item->numErrors()) { $this->errors = $t_item->errors; return false; } } } return !$vb_skipped; }
/** * Sets order of items in the currently loaded set to the order of row_ids as set in $pa_row_ids * * @param array $pa_row_ids A list of row_ids in the set, in the order in which they should be displayed in the set * @param array $pa_options An optional array of options. Supported options include: * user_id = the user_id of the current user; used to determine which sets the user has access to * @return array An array of errors. If the array is empty then no errors occurred */ public function reorderItems($pa_row_ids, $pa_options = null) { if (!($vn_set_id = $this->getPrimaryKey())) { return null; } $vn_user_id = isset($pa_options['user_id']) ? (int) $pa_options['user_id'] : null; // does user have edit access to set? if ($vn_user_id && !$this->haveAccessToSet($vn_user_id, __CA_SET_EDIT_ACCESS__)) { return false; } $va_row_ranks = $this->getRowIDRanks($pa_options); // get current ranks $vn_i = 0; $o_trans = new Transaction(); $t_set_item = new ca_set_items(); $t_set_item->setTransaction($o_trans); $t_set_item->setMode(ACCESS_WRITE); $va_errors = array(); // delete rows not present in $pa_row_ids $va_to_delete = array(); foreach ($va_row_ranks as $vn_row_id => $va_rank) { if (!in_array($vn_row_id, $pa_row_ids)) { if ($t_set_item->load(array('set_id' => $vn_set_id, 'row_id' => $vn_row_id))) { $t_set_item->delete(true); } } } // rewrite ranks foreach ($pa_row_ids as $vn_rank => $vn_row_id) { if (isset($va_row_ranks[$vn_row_id]) && $t_set_item->load(array('set_id' => $vn_set_id, 'row_id' => $vn_row_id))) { if ($va_row_ranks[$vn_row_id] != $vn_rank) { $t_set_item->set('rank', $vn_rank); $t_set_item->update(); if ($t_set_item->numErrors()) { $va_errors[$vn_row_id] = _t('Could not reorder item %1: %2', $vn_row_id, join('; ', $t_set_item->getErrors())); } } } else { // add item to set $this->addItem($vn_row_id, null, $vn_user_id, $vn_rank); } } if (sizeof($va_errors)) { $o_trans->rollback(); } else { $o_trans->commit(); } return $va_errors; }
/** * Sets order of items in the currently loaded set to the order of row_ids as set in $pa_row_ids * * @param array $pa_row_ids A list of row_ids in the set, in the order in which they should be displayed in the set * @param array $pa_options An optional array of options. Supported options include: * user_id = the user_id of the current user; used to determine which sets the user has access to * treatRowIDsAsRIDs = assume combination row_id/item_id indices in $pa_row_ids array instead of solely row_ids. Since a set can potentially contain multiple instances of the same row_id, only "rIDs" – a combination of the row_id and the set item_id (row_id + "_" + item_id) – are guaranteed to be unique. [Default=false] * deleteExcludedItems = should the set items not passed in pa_row_ids be deleted? default is false * @return array An array of errors. If the array is empty then no errors occurred */ public function reorderItems($pa_row_ids, $pa_options = null) { if (!($vn_set_id = $this->getPrimaryKey())) { return null; } $vn_user_id = isset($pa_options['user_id']) ? (int) $pa_options['user_id'] : null; $vb_treat_row_ids_as_rids = caGetOption('treatRowIDsAsRIDs', $pa_options, false); $vb_delete_excluded_items = caGetOption('deleteExcludedItems', $pa_options, false); // does user have edit access to set? if ($vn_user_id && !$this->haveAccessToSet($vn_user_id, __CA_SET_EDIT_ACCESS__)) { return false; } $va_row_ranks = $this->getRowIDRanks($pa_options); // get current ranks $vn_i = 0; $vb_we_set_transaction = false; if (!$this->inTransaction()) { $o_trans = new Transaction($this->getDb()); $vb_we_set_transaction = true; } else { $o_trans = $this->getTransaction(); } $t_set_item = new ca_set_items(); $t_set_item->setTransaction($o_trans); $t_set_item->setMode(ACCESS_WRITE); $va_errors = array(); // delete rows not present in $pa_row_ids $va_excluded_item_ids = array(); foreach ($va_row_ranks as $vn_row_id => $va_rank) { if (!in_array($vn_row_id, $pa_row_ids)) { if ($vb_treat_row_ids_as_rids) { $va_tmp = explode("_", $vn_row_id); if ($t_set_item->load(array('set_id' => $vn_set_id, 'row_id' => $va_tmp[0], 'item_id' => $va_tmp[1]))) { $va_excluded_item_ids[$t_set_item->get("rank")] = $t_set_item->get("item_id"); if ($vb_delete_excluded_items) { $t_set_item->delete(true); } } } else { if ($t_set_item->load(array('set_id' => $vn_set_id, 'row_id' => $vn_row_id))) { $va_excluded_item_ids[$t_set_item->get("rank")] = $t_set_item->get("item_id"); if ($vb_delete_excluded_items) { $t_set_item->delete(true); } } } if (($vn_k = array_search($pa_row_ids, $pa_row_ids)) !== false) { unset($pa_row_ids[$vn_k]); } unset($va_row_ranks[$vn_row_id]); } } // rewrite ranks $va_existing_ranks = array_values($va_row_ranks); $vn_rank_acc = end(array_values($va_row_ranks)); $va_rank_updates = array(); foreach ($pa_row_ids as $vn_rank => $vn_row_id) { if (isset($va_existing_ranks[$vn_rank])) { $vn_rank_inc = $va_existing_ranks[$vn_rank]; } else { $vn_rank_acc++; $vn_rank_inc = $vn_rank_acc; } if ($vb_treat_row_ids_as_rids) { $va_tmp = explode("_", $vn_row_id); } if (isset($va_row_ranks[$vn_row_id]) && $t_set_item->load($vb_treat_row_ids_as_rids ? array('set_id' => $vn_set_id, 'row_id' => $va_tmp[0], 'item_id' => $va_tmp[1]) : array('set_id' => $vn_set_id, 'row_id' => $vn_row_id))) { if ($va_row_ranks[$vn_row_id] != $vn_rank_inc) { $t_set_item->set('rank', $vn_rank_inc); $t_set_item->update(); if ($t_set_item->numErrors()) { $va_errors[$vn_row_id] = _t('Could not reorder item %1: %2', $vn_row_id, join('; ', $t_set_item->getErrors())); } } } else { // add item to set $this->addItem($vb_treat_row_ids_as_rids ? $va_tmp[0] : $vn_row_id, null, $vn_user_id, $vn_rank_inc); } } foreach ($va_rank_updates as $vn_row_id => $vn_new_rank) { if ($vb_treat_row_ids_as_rids) { $va_tmp = explode("_", $vn_row_id); $this->getDb()->query("UPDATE ca_set_items SET rank = ? WHERE set_id = ? AND row_id = ? AND item_id = ?", $x = array($vn_new_rank, $vn_set_id, $va_tmp[0], $va_tmp[1])); } else { $this->getDb()->query("UPDATE ca_set_items SET rank = ? WHERE set_id = ? AND row_id = ?", array($vn_set_id, $vn_new_rank)); } } if (sizeof($va_errors)) { if ($vb_we_set_transaction) { $o_trans->rollback(); } } else { if ($vb_we_set_transaction) { $o_trans->commit(); } } return $va_errors; }
public function ReorderItems() { if ($this->request->isLoggedIn()) { $t_set = $this->_getSet(); if (!$t_set->getPrimaryKey()) { $this->notification->addNotification(_t("The collection does not exist"), __NOTIFICATION_TYPE_ERROR__); return; } // does user have edit access to set? if (!$t_set->haveAccessToSet($this->request->getUserID(), __CA_SET_EDIT_ACCESS__)) { $this->notification->addNotification(_t("You cannot edit this collection"), __NOTIFICATION_TYPE_ERROR__); $this->Edit(); return; } $va_item_ids = explode(';', $this->request->getParameter('sort', pString)); for ($vn_i = 0; $vn_i < sizeof($va_item_ids); $vn_i++) { $va_item_ids[$vn_i] = str_replace('setItem', '', $va_item_ids[$vn_i]); } // get ranks $va_item_ranks = $t_set->getItemRanks(array('user_id' => $this->request->getUserID())); // rewrite ranks $vn_i = 0; $o_trans = new Transaction(); $t_set_item = new ca_set_items(); $t_set_item->setTransaction($o_trans); $t_set_item->setMode(ACCESS_WRITE); $va_errors = array(); foreach ($va_item_ranks as $vn_item_id => $vn_rank) { if ($vn_item_id != $va_item_ids[$vn_i]) { if ($t_set_item->load($va_item_ids[$vn_i])) { $t_set_item->set('rank', $vn_rank); $t_set_item->update(); if ($t_set_item->numErrors()) { $va_errors[$va_item_ids[$vn_i]] = _t('Could not reorder item %1: %2', $va_item_ids[$vn_i], join('; ', $t_set_item->getErrors())); } } } $vn_i++; } if (sizeof($va_errors)) { $o_trans->rollback(); } else { $o_trans->commit(); } } else { $va_errors['general'] = 'Must be logged in'; } $this->view->setVar('errors', $va_errors); $this->render('Sets/ajax_reorder_items_json.php'); }
/** * Removes item from set * * @param int $set_id * @param int $set_item_id * @return boolean * @throws SoapFault */ public function removeItemFromSet($set_id, $set_item_id) { $t_set_item = new ca_set_items(); if (!$t_set_item->load($set_item_id)) { throw new SoapFault("Server", "Invalid set_item id"); } $t_set_item->setMode(ACCESS_WRITE); $t_set_item->delete(); if ($t_set_item->numErrors() == 0) { return true; } else { throw new SoapFault("Server", "There were errors while updating the item: " . join(";", $t_set_item->getErrors())); } }