コード例 #1
0
 /**
  * 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');
 }
コード例 #2
0
 /**
  *
  */
 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();
 }