/** * */ public function reserve($pn_object_id, $pn_user_id, $ps_note, $pa_options = null) { global $g_ui_locale_id; $vb_we_set_transaction = false; if ($this->inTransaction()) { $o_trans = $this->getTransaction(); } else { $vb_we_set_transaction = true; $this->setTransaction($o_trans = new Transaction()); } $o_request = caGetOption('request', $pa_options, null); $t_object = new ca_objects($pn_object_id); $t_object->setTransaction($o_trans); if (!$t_object->getPrimaryKey()) { return null; } if ($o_request && !$t_object->isReadable($o_request)) { return null; } // is object out? if ($t_object->getCheckoutStatus() === __CA_OBJECTS_CHECKOUT_STATUS_AVAILABLE__) { throw new Exception(_t('Item is not out')); } $va_reservations = $this->objectHasReservations($pn_object_id); // is object already reserved by this user? if (is_array($va_reservations)) { foreach ($va_reservations as $va_reservation) { if ($va_reservation['user_id'] == $pn_user_id) { throw new Exception(_t('Item is already reserved by this user')); } } } $vs_uuid = $this->getTransactionUUID(); $va_checkout_config = ca_object_checkouts::getObjectCheckoutConfigForType($t_object->getTypeCode()); $this->setMode(ACCESS_WRITE); $this->set(array('group_uuid' => $vs_uuid, 'object_id' => $pn_object_id, 'user_id' => $pn_user_id, 'checkout_notes' => $ps_notes)); // Do we need to set values? if (is_array($va_checkout_config['set_values']) && sizeof($va_checkout_config['set_values'])) { $t_object->setMode(ACCESS_WRITE); foreach ($va_checkout_config['set_values'] as $vs_attr => $va_attr_values_by_event) { if (!is_array($va_attr_values_by_event['reserve'])) { if ($t_object->hasField($vs_attr)) { // Intrinsic $t_object->set($vs_attr, $va_attr_values_by_event['reserve']); } } else { $va_attr_values['locale_id'] = $g_ui_locale_id; $t_object->replaceAttribute($va_attr_values_by_event['reserve'], $vs_attr); } $t_object->update(); if ($t_object->numErrors()) { $this->errors = $t_object->errors; if ($vb_we_set_transaction) { $o_trans->rollback(); } return false; } } } $vn_rc = $this->insert(); if ($vb_we_set_transaction) { $vn_rc ? $o_trans->commit() : $o_trans->rollback(); } return $vn_rc; }