public function Save($pa_values = null) { $t_element = $this->getElementObject(false); $t_element->setMode(ACCESS_WRITE); $va_request = $_REQUEST; /* we don't want to modify $_REQUEST since this may cause ugly side-effects */ foreach ($t_element->getFormFields() as $vs_f => $va_field_info) { $t_element->set($vs_f, $_REQUEST[$vs_f]); unset($va_request[$vs_f]); if ($t_element->numErrors()) { foreach ($t_element->errors() as $o_e) { $this->request->addActionError($o_e, 'general'); $this->notification->addNotification($o_e->getErrorDescription(), __NOTIFICATION_TYPE_ERROR__); } } } if ($vn_parent_id = $this->request->getParameter('parent_id', pInteger)) { $t_element->set('parent_id', $vn_parent_id); } if (!$t_element->getPrimaryKey()) { $vb_new = true; $vo_db = $t_element->getDb(); if ($vn_parent_id) { $qr_tmp = $vo_db->query("\n\t\t\t\t\tSELECT MAX(rank) AS rank\n\t\t\t\t\tFROM ca_metadata_elements\n\t\t\t\t\tWHERE parent_id=?\n\t\t\t\t", $vn_parent_id); if (!$qr_tmp->nextRow()) { $t_element->set('rank', 1); } else { $t_element->set('rank', intval($qr_tmp->get('rank')) + 1); } } $t_element->insert(); $vs_message = _t("Added metadata element"); $this->request->setParameter('element_id', $t_element->getPrimaryKey()); } else { $t_element->update(); $vb_new = false; $vs_message = _t("Saved changes to metadata element"); } if ($t_element->numErrors()) { foreach ($t_element->errors() as $o_e) { $this->request->addActionError($o_e, 'general'); $this->notification->addNotification($o_e->getErrorDescription(), __NOTIFICATION_TYPE_ERROR__); } } else { $this->notification->addNotification($vs_message, __NOTIFICATION_TYPE_INFO__); } if ($t_element->getPrimaryKey()) { $va_new_labels = array(); $va_old_labels = array(); $va_delete_labels = array(); foreach ($va_request as $vs_key => $vs_val) { if (!(strpos($vs_key, 'element_labels_Pref') === false)) { /* label field */ $va_matches = array(); if (!(strpos($vs_key, '_new') === false)) { /* new label field */ preg_match('/element_labels_Pref(.*)_new_([0-9]+)/', $vs_key, $va_matches); $va_new_labels[$va_matches[2]][$va_matches[1]] = $vs_val; } else { if (!(strpos($vs_key, '_delete') === false)) { /* delete label */ preg_match('/element_labels_PrefLabel_([0-9]+)_delete/', $vs_key, $va_matches); $va_delete_labels[] = $va_matches[1]; } else { /* existing label field */ preg_match('/element_labels_Pref(.*)_([0-9]+)/', $vs_key, $va_matches); $va_old_labels[$va_matches[2]][$va_matches[1]] = $vs_val; } } unset($va_request[$vs_key]); } } /* insert new labels */ $t_element_label = new ca_metadata_element_labels(); foreach ($va_new_labels as $va_label) { $t_element_label->clear(); foreach ($va_label as $vs_f => $vs_val) { $t_element_label->set($vs_f, $vs_val); } $t_element_label->set('element_id', $t_element->getPrimaryKey()); $t_element_label->setMode(ACCESS_WRITE); $t_element_label->insert(); if ($t_element_label->numErrors()) { foreach ($t_element_label->errors() as $o_e) { $this->request->addActionError($o_e, 'general'); $this->notification->addNotification($o_e->getErrorDescription(), __NOTIFICATION_TYPE_ERROR__); } } } /* delete labels */ foreach ($va_delete_labels as $vn_label) { $t_element_label->load($vn_label); $t_element_label->setMode(ACCESS_WRITE); $t_element_label->delete(false); } /* process old labels */ foreach ($va_old_labels as $vn_key => $va_label) { $t_element_label->load($vn_key); foreach ($va_label as $vs_f => $vs_val) { $t_element_label->set($vs_f, $vs_val); } $t_element_label->set('element_id', $t_element->getPrimaryKey()); $t_element_label->setMode(ACCESS_WRITE); if ($vb_new) { $t_element_label->insert(); } else { $t_element_label->update(); } if ($t_element_label->numErrors()) { foreach ($t_element_label->errors() as $o_e) { $this->request->addActionError($o_e, 'general'); $this->notification->addNotification($o_e->getErrorDescription(), __NOTIFICATION_TYPE_ERROR__); } } } /* process settings */ if (is_array($va_settings = $t_element->getAvailableSettings())) { $vb_need_to_update = false; foreach ($va_settings as $vs_setting_key => $va_setting_info) { if (isset($va_setting_info['refreshOnChange']) && (bool) $va_setting_info['refreshOnChange']) { $t_element->setSetting($vs_setting_key, $va_request['setting_' . $vs_setting_key]); $vb_need_to_update = true; } } if ($vb_need_to_update) { $t_element->update(); $va_settings = $t_element->getAvailableSettings(); } // we need to unset the form timestamp to disable the 'Changes have been made since you loaded this data' warning // when we update() below. the warning makes sense because an update() is called before we get here, but if there // was an actual concurrent save problem , that very update above would have triggered the warning already $vn_timestamp = $_REQUEST['form_timestamp']; unset($_REQUEST['form_timestamp']); foreach ($va_settings as $vs_setting_key => $va_setting_info) { if (isset($va_request['setting_' . $vs_setting_key . '[]'])) { $vs_val = $va_request['setting_' . $vs_setting_key . '[]']; } else { $vs_val = $va_request['setting_' . $vs_setting_key]; } $vs_error = null; if (!$t_element->setSetting($vs_setting_key, $vs_val, $vs_error)) { $this->notification->addNotification(_t("Setting %2 is not valid: %1", $vs_error, $vs_setting_key), __NOTIFICATION_TYPE_ERROR__); continue; } $t_element->update(); } $_REQUEST['form_timestamp'] = $vn_timestamp; } /* process type restrictions */ $t_restriction = new ca_metadata_type_restrictions(null, true); $va_settings = array_keys($t_restriction->getAvailableSettings()); foreach ($_REQUEST as $vs_key => $vs_value) { if (preg_match('!^type_restrictions_table_num_([\\d]+)$!', $vs_key, $va_matches)) { // got one to update if ($t_restriction->load($va_matches[1])) { $t_restriction->setMode(ACCESS_WRITE); $t_restriction->set('table_num', $this->request->getParameter('type_restrictions_table_num_' . $va_matches[1], pInteger)); $t_restriction->set('type_id', ($vn_type_id = $this->request->getParameter('type_restrictions_type_id_' . $va_matches[1], pInteger)) ? $vn_type_id : null); $t_restriction->set('include_subtypes', ($vn_include_subtypes = $this->request->getParameter('type_restrictions_include_subtypes_' . $va_matches[1], pInteger)) ? $vn_include_subtypes : null); foreach ($va_settings as $vs_setting) { $t_restriction->setSetting($vs_setting, $this->request->getParameter('type_restrictions_setting_' . $vs_setting . '_' . $va_matches[1], pString)); } $t_restriction->update(); } continue; } if (preg_match('!^type_restrictions_table_num_new_([\\d]+)$!', $vs_key, $va_matches)) { // got one to create $t_restriction->setMode(ACCESS_WRITE); $t_restriction->set('element_id', $t_element->getPrimaryKey()); $t_restriction->set('table_num', $this->request->getParameter('type_restrictions_table_num_new_' . $va_matches[1], pInteger)); $t_restriction->set('type_id', ($vn_type_id = $this->request->getParameter('type_restrictions_type_id_new_' . $va_matches[1], pInteger)) ? $vn_type_id : null); $t_restriction->set('include_subtypes', ($vn_include_subtypes = $this->request->getParameter('type_restrictions_include_subtypes_new_' . $va_matches[1], pInteger)) ? $vn_include_subtypes : null); foreach ($va_settings as $vs_setting) { $t_restriction->setSetting($vs_setting, $this->request->getParameter('type_restrictions_setting_' . $vs_setting . '_new_' . $va_matches[1], pString)); } $t_restriction->insert(); continue; } if (preg_match('!^type_restrictions_([\\d]+)_delete$!', $vs_key, $va_matches)) { // got one to delete if ($t_restriction->load($va_matches[1])) { $t_restriction->setMode(ACCESS_WRITE); $t_restriction->delete(); } continue; } } CompositeCache::delete($t_element->getPrimaryKey(), 'ElementSets'); CompositeCache::delete($t_element->getPrimaryKey(), 'ElementSetIds'); } $this->Edit(); return; }
public function removeMetadataElementFromType($pm_element_code_or_id, $pn_type_id) { require_once __CA_APP_DIR__ . '/models/ca_metadata_elements.php'; require_once __CA_APP_DIR__ . '/models/ca_metadata_type_restrictions.php'; if (!($t_element = $this->_getElementInstance($pm_element_code_or_id))) { return false; } $t_restriction = new ca_metadata_type_restrictions(); if ($t_restriction->load(array('element_id' => $t_element->getPrimaryKey(), 'type_id' => $pn_type_id, 'table_num' => $this->tableNum()))) { $t_restriction->setMode(ACCESS_WRITE); $t_restriction->delete(); if ($t_restriction->numErrors()) { $this->postError(1981, _t("Couldn't remove element from restriction list: %1", join('; ', $t_restriction->getErrors())), 'BaseModelWithAttributes->addMetadataElementToType()'); return false; } } return true; }