/** * @param array $pa_options * progressCallback = * reportCallback = * sendMail = */ public static function saveBatchEditorFormForSet($po_request, $t_set, $t_subject, $pa_options = null) { $va_row_ids = $t_set->getItemRowIDs(); $vn_num_items = sizeof($va_row_ids); $va_notices = $va_errors = array(); if ($vb_perform_type_access_checking = (bool) $t_subject->getAppConfig()->get('perform_type_access_checking')) { $va_restrict_to_types = caGetTypeRestrictionsForUser($t_subject->tableName(), array('access' => __CA_BUNDLE_ACCESS_EDIT__)); } $vb_perform_item_level_access_checking = (bool) $t_subject->getAppConfig()->get('perform_item_level_access_checking'); $vb_we_set_transaction = false; $o_trans = isset($pa_options['transaction']) && $pa_options['transaction'] ? $pa_options['transaction'] : null; if (!$o_trans) { $vb_we_set_transaction = true; $o_trans = new Transaction($t_subject->getDb()); } $o_log = new Batchlog(array('user_id' => $po_request->getUserID(), 'batch_type' => 'BE', 'table_num' => (int) $t_set->get('table_num'), 'notes' => '', 'transaction' => $o_trans)); $vs_screen = $po_request->getActionExtra(); $t_screen = new ca_editor_ui_screens(str_replace("Screen", "", $vs_screen)); if ($t_screen->getPrimaryKey()) { $t_ui = new ca_editor_uis($t_screen->get('ui_id')); } else { $t_ui = null; } $va_save_opts = array('batch' => true, 'existingRepresentationMap' => array(), 'ui_instance' => $t_ui); $vn_c = 0; $vn_start_time = time(); foreach (array_keys($va_row_ids) as $vn_row_id) { $t_subject->setTransaction($o_trans); if ($t_subject->load($vn_row_id)) { $po_request->clearActionErrors(); // // Is record deleted? // if ($t_subject->hasField('deleted') && $t_subject->get('deleted')) { continue; // skip } // // Is record of correct type? // if ($vb_perform_type_access_checking && (is_array($va_restrict_to_types) && !in_array($t_subject->get('type_id'), $va_restrict_to_types))) { continue; // skip } // // Does user have access to row? // if ($vb_perform_item_level_access_checking && $t_subject->checkACLAccessForUser($po_request->user) == __CA_ACL_READ_WRITE_ACCESS__) { continue; // skip } // TODO: call plugins beforeBatchItemSave? $t_subject->saveBundlesForScreen($vs_screen, $po_request, $va_save_opts); // TODO: call plugins beforeAfterItemSave? $o_log->addItem($vn_row_id, $va_action_errors = $po_request->getActionErrors()); if (sizeof($va_action_errors) > 0) { $va_errors[$t_subject->getPrimaryKey()] = array('idno' => $t_subject->get($t_subject->getProperty('ID_NUMBERING_ID_FIELD')), 'label' => $t_subject->getLabelForDisplay(), 'errors' => $va_action_errors, 'status' => 'ERROR'); } else { $va_notices[$t_subject->getPrimaryKey()] = array('idno' => $t_subject->get($t_subject->getProperty('ID_NUMBERING_ID_FIELD')), 'label' => $t_subject->getLabelForDisplay(), 'status' => 'SUCCESS'); } if (isset($pa_options['progressCallback']) && ($ps_callback = $pa_options['progressCallback'])) { $ps_callback($po_request, $vn_c, $vn_num_items, _t("[%3/%4] Processing %1 (%2)", caTruncateStringWithEllipsis($t_subject->getLabelForDisplay(), 50), $t_subject->get($t_subject->getProperty('ID_NUMBERING_ID_FIELD')), $vn_c, $vn_num_items), time() - $vn_start_time, memory_get_usage(true), sizeof($va_notices), sizeof($va_errors)); } $vn_c++; } } if (isset($pa_options['progressCallback']) && ($ps_callback = $pa_options['progressCallback'])) { $ps_callback($po_request, $vn_num_items, $vn_num_items, _t("Processing completed"), time() - $vn_start_time, memory_get_usage(true), sizeof($va_notices), sizeof($va_errors)); } $vn_elapsed_time = time() - $vn_start_time; if (isset($pa_options['reportCallback']) && ($ps_callback = $pa_options['reportCallback'])) { $va_general = array('elapsedTime' => $vn_elapsed_time, 'numErrors' => sizeof($va_errors), 'numProcessed' => sizeof($va_notices), 'batchSize' => $vn_num_items, 'table' => $t_subject->tableName(), 'set_id' => $t_set->getPrimaryKey(), 'set_name' => $t_set->getLabelForDisplay()); $ps_callback($po_request, $va_general, $va_notices, $va_errors); } $o_log->close(); if ($vb_we_set_transaction) { if (sizeof($va_errors) > 0) { $o_trans->rollback(); } else { $o_trans->commit(); } } $vs_set_name = $t_set->getLabelForDisplay(); $vs_started_on = caGetLocalizedDate($vn_start_time); if (isset($pa_options['sendMail']) && $pa_options['sendMail']) { if ($vs_email = trim($po_request->user->get('email'))) { caSendMessageUsingView($po_request, array($vs_email => $po_request->user->get('fname') . ' ' . $po_request->user->get('lname')), __CA_ADMIN_EMAIL__, _t('[%1] Batch edit completed', $po_request->config->get('app_display_name')), 'batch_processing_completed.tpl', array('notices' => $va_notices, 'errors' => $va_errors, 'batchSize' => $vn_num_items, 'numErrors' => sizeof($va_errors), 'numProcessed' => sizeof($va_notices), 'subjectNameSingular' => $t_subject->getProperty('NAME_SINGULAR'), 'subjectNamePlural' => $t_subject->getProperty('NAME_PLURAL'), 'startedOn' => $vs_started_on, 'completedOn' => caGetLocalizedDate(time()), 'setName' => $vs_set_name, 'elapsedTime' => caFormatInterval($vn_elapsed_time))); } } if (isset($pa_options['sendSMS']) && $pa_options['sendSMS']) { SMS::send($po_request->getUserID(), _t("[%1] Batch processing for set %2 with %3 %4 begun at %5 is complete", $po_request->config->get('app_display_name'), caTruncateStringWithEllipsis($vs_set_name, 20), $vn_num_items, $t_subject->getProperty($vn_num_items == 1 ? 'NAME_SINGULAR' : 'NAME_PLURAL'), $vs_started_on)); } return array('errors' => $va_errors, 'notices' => $va_notices, 'processing_time' => caFormatInterval($vn_elapsed_time)); }
/** * Returns a list of ui id, screen id and placement id for a given setting key (editor_code/screen_idno/placement_code) * @param string $ps_key * @return array|bool */ public static function resolveHideIfSelectedKey($ps_key) { if (CompositeCache::contains($ps_key, 'ListAttrHideIfSelected')) { return CompositeCache::fetch($ps_key, 'ListAttrHideIfSelected'); } $va_tmp = explode('/', $ps_key); if (!sizeof($va_tmp) == 3) { return false; } // ui $t_ui = new ca_editor_uis(); if (!$t_ui->load(array('editor_code' => $va_tmp[0]))) { return false; } // screen $t_screen = new ca_editor_ui_screens(); if (!$t_screen->load(array('ui_id' => $t_ui->getPrimaryKey(), 'idno' => $va_tmp[1]))) { return false; } // placement $t_placement = new ca_editor_ui_bundle_placements(); if (!$t_placement->load(array('screen_id' => $t_screen->getPrimaryKey(), 'placement_code' => $va_tmp[2]))) { return false; } $va_ret = array($t_screen->getPrimaryKey(), $t_placement->getPrimaryKey()); CompositeCache::save($ps_key, $va_ret, 'ListAttrHideIfSelected'); return $va_ret; }