/** * Saves the content of a form editing new or existing records. It returns the same form + status messages rendered into the current view, inherited from ActionController * * @param array $pa_options Array of options passed through to _initView and saveBundlesForScreen() */ public function Save($pa_options = null) { if (!is_array($pa_options)) { $pa_options = array(); } list($t_subject, $t_ui, $vn_parent_id, $vn_above_id) = $this->_initView(array_merge($pa_options, array('loadSubject' => true))); if (!$t_subject) { $this->postError(1220, _t('Invalid table %1', $this->ops_table_name), "BaseInterstitalController->Edit()"); return false; } if (!is_array($pa_options)) { $pa_options = array(); } // // Is record of correct type? // $va_restrict_to_types = null; if ($t_subject->getAppConfig()->get('perform_type_access_checking')) { $va_restrict_to_types = caGetTypeRestrictionsForUser($this->ops_table_name, array('access' => __CA_BUNDLE_ACCESS_EDIT__)); } if (is_array($va_restrict_to_types) && !in_array($t_subject->get('type_id'), $va_restrict_to_types)) { $this->response->setRedirect($this->request->config->get('error_display_url') . '/n/2560?r=' . urlencode($this->request->getFullUrlPath())); return; } $pn_placement_id = $this->request->getParameter('placement_id', pInteger); // placement_id of bundle that launched interstitial editor $ps_primary_table = $this->request->getParameter('primary', pString); $pn_primary_id = $this->request->getParameter('primary_id', pInteger); // Make sure request isn't empty if (!sizeof($_POST)) { $va_response = array('status' => 20, 'id' => null, 'table' => $t_subject->tableName(), 'type_id' => null, 'display' => null, 'errors' => array(_t("Cannot save using empty request. Are you using a bookmark?") => _t("Cannot save using empty request. Are you using a bookmark?"))); $this->view->setVar('response', $va_response); $this->render('interstitial/interstitial_result_json.php'); return; } // Set type name for display if (!($vs_type_name = $t_subject->getTypeName())) { $vs_type_name = $t_subject->getProperty('NAME_SINGULAR'); } # trigger "BeforeSaveItem" hook $this->opo_app_plugin_manager->hookBeforeSaveItem(array('id' => null, 'table_num' => $t_subject->tableNum(), 'table_name' => $t_subject->tableName(), 'instance' => $t_subject, 'is_insert' => true)); $t_placement = new ca_editor_ui_bundle_placements($pn_placement_id); $pa_bundle_settings = $t_placement->getSettings(); $va_opts = array_merge($pa_options, array('ui_instance' => $t_ui)); $vb_save_rc = $t_subject->saveBundlesForScreen($this->request->getParameter('screen', pString), $this->request, $va_opts); $this->view->setVar('t_ui', $t_ui); $vs_message = _t("Saved changes to %1", $vs_type_name); // // Regenerate display template for bundle that launched the interstitial editor so it will reflect any changes // $vs_related_table = $t_placement->getEditorType(); $vs_template = caGetBundleDisplayTemplate($t_subject, $vs_related_table, $pa_bundle_settings); $qr_rel_items = caMakeSearchResult($t_subject->tableName(), array($t_subject->getPrimaryKey())); // // Handle case of self relationships where we need to figure out which direction things are going in // $va_bundle_values = array_shift(caProcessRelationshipLookupLabel($qr_rel_items, $t_subject, array('template' => $vs_template, 'primaryIDs' => array($ps_primary_table => array($pn_primary_id))))); if ($t_subject->hasField('type_id')) { if (method_exists($t_subject, "isSelfRelationship") && $t_subject->isSelfRelationship()) { $vn_left_id = $t_subject->get($t_subject->getLeftTableFieldName()); $vn_right_id = $t_subject->get($t_subject->getRightTableFieldName()); $va_bundle_values['relationship_typename'] = $t_subject->getRelationshipTypename($vn_left_id == $pn_primary_id ? 'ltol' : 'rtol'); } else { $va_bundle_values['relationship_typename'] = $t_subject->getRelationshipTypename($t_subject->getLeftTableFieldName() == $vs_related_table ? 'rtol' : 'ltor'); } $va_bundle_values['relationship_type_code'] = $t_subject->getRelationshipTypeCode(); } // // Report errors // $va_errors = $this->request->getActionErrors(); // all errors from all sources $va_general_errors = $this->request->getActionErrors('general'); // just "general" errors - ones that are not attached to a specific part of the form if (sizeof($va_errors) - sizeof($va_general_errors) > 0) { $va_error_list = array(); $vb_no_save_error = false; foreach ($va_errors as $o_e) { $va_error_list[$o_e->getErrorDescription()] = $o_e->getErrorDescription() . "\n"; switch ($o_e->getErrorNumber()) { case 1100: // duplicate/invalid idno if (!$vn_subject_id) { // can't save new record if idno is not valid (when updating everything but idno is saved if it is invalid) $vb_no_save_error = true; } break; } } } else { $this->opo_result_context->invalidateCache(); } $this->opo_result_context->saveContext(); # trigger "SaveItem" hook $this->opo_app_plugin_manager->hookSaveItem(array('id' => $vn_subject_id, 'table_num' => $t_subject->tableNum(), 'table_name' => $t_subject->tableName(), 'instance' => $t_subject, 'is_insert' => true)); $vn_id = $t_subject->getPrimaryKey(); $va_response = array('status' => sizeof($va_error_list) ? 10 : 0, 'id' => $vn_id, 'table' => $t_subject->tableName(), 'type_id' => method_exists($t_subject, "getTypeID") ? $t_subject->getTypeID() : null, 'display' => 'relation', 'bundleDisplay' => $va_bundle_values, 'errors' => $va_error_list); $this->view->setVar('response', $va_response); $this->render('interstitial/interstitial_result_json.php'); }
/** * */ public function getRelatedHTMLFormBundle($po_request, $ps_form_name, $ps_related_table, $ps_placement_code = null, $pa_bundle_settings = null, $pa_options = null) { global $g_ui_locale; AssetLoadManager::register('sortableUI'); if (!is_array($pa_bundle_settings)) { $pa_bundle_settings = array(); } if (!is_array($pa_options)) { $pa_options = array(); } $vs_view_path = isset($pa_options['viewPath']) && $pa_options['viewPath'] ? $pa_options['viewPath'] : $po_request->getViewsDirectoryPath(); $o_view = new View($po_request, "{$vs_view_path}/bundles/"); $t_item = $this->getAppDatamodel()->getTableInstance($ps_related_table); $vb_is_many_many = false; $va_path = array_keys($this->getAppDatamodel()->getPath($this->tableName(), $ps_related_table)); if ($this->tableName() == $ps_related_table) { // self relationship $t_item_rel = $this->getAppDatamodel()->getTableInstance($va_path[1]); $vb_is_many_many = true; } else { switch (sizeof($va_path)) { case 3: // many-many relationship $t_item_rel = $this->getAppDatamodel()->getTableInstance($va_path[1]); $vb_is_many_many = true; break; case 2: // many-one relationship $t_item_rel = $this->getAppDatamodel()->getTableInstance($va_path[1]); break; default: $t_item_rel = null; break; } } $o_view->setVar('id_prefix', $ps_form_name); $o_view->setVar('t_instance', $this); $o_view->setVar('t_item', $t_item); $o_view->setVar('t_item_rel', $t_item_rel); $vb_read_only = $po_request->user->getBundleAccessLevel($this->tableName(), $ps_related_table) == __CA_BUNDLE_ACCESS_READONLY__ ? true : false; if (!$pa_bundle_settings['readonly']) { $pa_bundle_settings['readonly'] = !isset($pa_bundle_settings['readonly']) || !$pa_bundle_settings['readonly'] ? $vb_read_only : true; } // pass bundle settings $o_view->setVar('settings', $pa_bundle_settings); $o_view->setVar('graphicsPath', $pa_options['graphicsPath']); // pass placement code $o_view->setVar('placement_code', $ps_placement_code); $o_view->setVar('add_label', isset($pa_bundle_settings['add_label'][$g_ui_locale]) ? $pa_bundle_settings['add_label'][$g_ui_locale] : null); $t_label = null; if ($t_item->getLabelTableName()) { $t_label = $this->_DATAMODEL->getInstanceByTableName($t_item->getLabelTableName(), true); } if (method_exists($t_item_rel, 'getRelationshipTypes')) { $o_view->setVar('relationship_types', $t_item_rel->getRelationshipTypes(null, null, array_merge($pa_options, $pa_bundle_settings))); $o_view->setVar('relationship_types_by_sub_type', $t_item_rel->getRelationshipTypesBySubtype($this->tableName(), $this->get('type_id'), array_merge($pa_options, $pa_bundle_settings))); } $o_view->setVar('t_subject', $this); $va_initial_values = array(); $va_get_related_opts = array_merge($pa_options, $pa_bundle_settings); if (isset($pa_bundle_settings['restrictToTermsRelatedToCollection']) && $pa_bundle_settings['restrictToTermsRelatedToCollection']) { $va_get_related_opts['restrict_to_relationship_types'] = $pa_bundle_settings['restrictToTermsOnCollectionUseRelationshipType']; } if ($pa_bundle_settings['sort']) { $va_get_related_opts['sort'] = $pa_bundle_settings['sort']; $va_get_related_opts['sortDirection'] = $pa_bundle_settings['sortDirection']; } if (sizeof($va_items = $this->getRelatedItems($ps_related_table, $va_get_related_opts))) { $t_rel = $this->getAppDatamodel()->getInstanceByTableName($ps_related_table, true); $vs_rel_pk = $t_rel->primaryKey(); $va_opts = array('stripTags' => true); if ($vb_is_many_many) { $va_ids = caExtractArrayValuesFromArrayOfArrays($va_items, 'relation_id'); $qr_rel_items = $t_item->makeSearchResult($t_item_rel->tableNum(), $va_ids); $va_opts['table'] = $t_rel->tableName(); $va_opts['primaryKey'] = $t_rel->primaryKey(); $va_opts['relatedItems'] = $va_items; } else { $va_ids = caExtractArrayValuesFromArrayOfArrays($va_items, $vs_rel_pk); $qr_rel_items = $t_item->makeSearchResult($t_rel->tableNum(), $va_ids); } $va_opts['template'] = caGetBundleDisplayTemplate($this, $ps_related_table, $pa_bundle_settings); $va_opts['primaryIDs'] = array($this->tableName() => array($this->getPrimaryKey())); $va_opts['request'] = $po_request; $va_initial_values = caProcessRelationshipLookupLabel($qr_rel_items, $t_item_rel, $va_opts); } $va_force_new_values = array(); if (isset($pa_options['force']) && is_array($pa_options['force'])) { foreach ($pa_options['force'] as $vn_id) { if ($t_item->load($vn_id)) { $va_item = $t_item->getFieldValuesArray(); if ($t_label) { $va_item[$t_label->getDisplayField()] = $t_item->getLabelForDisplay(); } $va_force_new_values[$vn_id] = array_merge($va_item, array('id' => $vn_id, 'idno' => ($vn_idno = $t_item->get('idno')) ? $vn_idno : null, 'idno_stub' => ($vn_idno_stub = $t_item->get('idno_stub')) ? $vn_idno_stub : null, 'relationship_type_id' => null)); } } } $o_view->setVar('defaultRepresentationUploadType', $po_request->user->getVar('defaultRepresentationUploadType')); $o_view->setVar('initialValues', $va_initial_values); $o_view->setVar('forceNewValues', $va_force_new_values); $o_view->setVar('batch', (bool) (isset($pa_options['batch']) && $pa_options['batch'])); return $o_view->render($ps_related_table . '.php'); }
/** * */ public function getRelatedBundleFormValues($po_request, $ps_form_name, $ps_related_table, $ps_placement_code = null, $pa_bundle_settings = null, $pa_options = null) { if (!is_array($pa_bundle_settings)) { $pa_bundle_settings = array(); } if (!is_array($pa_options)) { $pa_options = array(); } $t_item = $this->getAppDatamodel()->getTableInstance($ps_related_table); $vb_is_many_many = false; $va_path = array_keys($this->getAppDatamodel()->getPath($this->tableName(), $ps_related_table)); if ($this->tableName() == $ps_related_table) { // self relationship $t_item_rel = $this->getAppDatamodel()->getTableInstance($va_path[1]); $vb_is_many_many = true; } else { switch (sizeof($va_path)) { case 3: // many-many relationship $t_item_rel = $this->getAppDatamodel()->getTableInstance($va_path[1]); $vb_is_many_many = true; break; case 2: // many-one relationship $t_item_rel = $this->getAppDatamodel()->getTableInstance($va_path[1]); break; default: $t_item_rel = null; break; } } $va_get_related_opts = array_merge($pa_options, $pa_bundle_settings); if (isset($pa_bundle_settings['restrictToTermsRelatedToCollection']) && $pa_bundle_settings['restrictToTermsRelatedToCollection']) { $va_get_related_opts['restrict_to_relationship_types'] = $pa_bundle_settings['restrictToTermsOnCollectionUseRelationshipType']; } if ($pa_bundle_settings['sort']) { $va_get_related_opts['sort'] = $pa_bundle_settings['sort']; $va_get_related_opts['sortDirection'] = $pa_bundle_settings['sortDirection']; } if (sizeof($va_items = $this->getRelatedItems($ps_related_table, $va_get_related_opts))) { $t_rel = $this->getAppDatamodel()->getInstanceByTableName($ps_related_table, true); $vs_rel_pk = $t_rel->primaryKey(); $va_opts = array('relatedItems' => $va_items, 'stripTags' => true); if ($vb_is_many_many) { $va_ids = caExtractArrayValuesFromArrayOfArrays($va_items, 'relation_id'); $qr_rel_items = $t_item->makeSearchResult($t_item_rel->tableNum(), $va_ids); $va_opts['table'] = $t_rel->tableName(); $va_opts['primaryKey'] = $t_rel->primaryKey(); } else { $va_ids = caExtractArrayValuesFromArrayOfArrays($va_items, $vs_rel_pk); $qr_rel_items = $t_item->makeSearchResult($t_rel->tableNum(), $va_ids); } $va_opts['template'] = caGetBundleDisplayTemplate($this, $ps_related_table, $pa_bundle_settings); $va_opts['primaryIDs'] = array($this->tableName() => array($this->getPrimaryKey())); $va_opts['request'] = $po_request; $va_vals = caProcessRelationshipLookupLabel($qr_rel_items, $t_item_rel, $va_opts); return $va_vals; } return array(); }
/** * @param RequestHTTP $po_request * @param string $ps_form_name * @param string $ps_related_table * @param null|string $ps_placement_code * @param null|array $pa_bundle_settings * @param null|arrau $pa_options * @return array|mixed */ public function getRelatedBundleFormValues($po_request, $ps_form_name, $ps_related_table, $ps_placement_code = null, $pa_bundle_settings = null, $pa_options = null) { if (!is_array($pa_bundle_settings)) { $pa_bundle_settings = array(); } if (!is_array($pa_options)) { $pa_options = array(); } /** @var BundlableLabelableBaseModelWithAttributes $t_item */ $t_item = $this->getAppDatamodel()->getTableInstance($ps_related_table); $vb_is_many_many = false; $va_path = array_keys($this->getAppDatamodel()->getPath($this->tableName(), $ps_related_table)); if ($this->tableName() == $ps_related_table) { // self relationship $t_item_rel = $this->getAppDatamodel()->getTableInstance($va_path[1]); $vb_is_many_many = true; } else { switch (sizeof($va_path)) { case 3: // many-many relationship $t_item_rel = $this->getAppDatamodel()->getTableInstance($va_path[1]); $vb_is_many_many = true; break; case 2: // many-one relationship $t_item_rel = $this->getAppDatamodel()->getTableInstance($va_path[1]); break; default: $t_item_rel = null; break; } } $va_get_related_opts = array_merge($pa_options, $pa_bundle_settings); if (isset($pa_bundle_settings['restrictToTermsRelatedToCollection']) && $pa_bundle_settings['restrictToTermsRelatedToCollection']) { $va_get_related_opts['restrict_to_relationship_types'] = $pa_bundle_settings['restrictToTermsOnCollectionUseRelationshipType']; } if ($pa_bundle_settings['sort']) { $va_get_related_opts['sort'] = $pa_bundle_settings['sort']; $va_get_related_opts['sortDirection'] = $pa_bundle_settings['sortDirection']; } if ($ps_related_table == 'ca_sets') { $t_set = new ca_sets(); $va_items = caExtractValuesByUserLocale($t_set->getSetsForItem($this->tableNum(), $this->getPrimaryKey(), $va_get_related_opts)); // sort if ($ps_sort = caGetOption('sort', $va_get_related_opts, null)) { $va_items = caSortArrayByKeyInValue($va_items, array($ps_sort), caGetOption('sortDirectio ', $va_get_related_opts, 'ASC')); } $va_vals = array(); $vs_template = caGetBundleDisplayTemplate($this, 'ca_sets', $pa_bundle_settings); if (is_array($va_items) && sizeof($va_items)) { foreach ($va_items as $vn_id => $va_item) { $va_item['_display'] = caProcessTemplateForIDs($vs_template, 'ca_sets', array($vn_id)); $va_vals[$vn_id] = $va_item; } } return $va_vals; } else { if (sizeof($va_items = $this->getRelatedItems($ps_related_table, $va_get_related_opts))) { $t_rel = $this->getAppDatamodel()->getInstanceByTableName($ps_related_table, true); $vs_rel_pk = $t_rel->primaryKey(); $va_opts = array('relatedItems' => $va_items, 'stripTags' => true); if ($vb_is_many_many) { $va_ids = caExtractArrayValuesFromArrayOfArrays($va_items, 'relation_id'); $qr_rel_items = $t_item->makeSearchResult($t_item_rel->tableNum(), $va_ids); $va_opts['table'] = $t_rel->tableName(); $va_opts['primaryKey'] = $t_rel->primaryKey(); } else { $va_ids = caExtractArrayValuesFromArrayOfArrays($va_items, $vs_rel_pk); $qr_rel_items = $t_item->makeSearchResult($t_rel->tableNum(), $va_ids); } $va_opts['template'] = caGetBundleDisplayTemplate($this, $ps_related_table, $pa_bundle_settings); $va_opts['primaryIDs'] = array($this->tableName() => array($this->getPrimaryKey())); $va_opts['request'] = $po_request; $va_vals = caProcessRelationshipLookupLabel($qr_rel_items, $t_item_rel, $va_opts); return $va_vals; } } return array(); }