/** * 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_web_set_transaction = false; if (!$this->inTransaction()) { $o_trans = new Transaction($this->getDb()); $vb_web_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]) && $va_row_ranks[$vn_row_id] != $vn_rank_inc) { $va_rank_updates[$vn_row_id] = $vn_rank_inc; } elseif (!isset($va_row_ranks[$vn_row_id])) { // 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_web_set_transaction) { $o_trans->rollback(); } } else { if ($vb_web_set_transaction) { $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] * deleteExludedItems = 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('deleteExludedItems', $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_web_set_transaction = false; if (!$this->inTransaction()) { $o_trans = new Transaction($this->getDb()); $vb_web_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); } } } } } // rewrite ranks foreach ($pa_row_ids as $vn_rank => $vn_row_id) { $vn_rank_inc = $vn_rank + 1; 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); } } if (!$vb_delete_excluded_items) { # --- don't delete items whose id's where not passed to this function, foreach ($va_excluded_item_ids as $vn_item_id) { $vn_rank_inc++; $t_set_item->load($vn_item_id); $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())); } } } if (sizeof($va_errors)) { if ($vb_web_set_transaction) { $o_trans->rollback(); } } else { if ($vb_web_set_transaction) { $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 * @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; }
/** * 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())); } }