/** * Return array with list of significant events in object life cycle as configured for * a ca_objects_history editor bundle. * * @param array $pa_bundle_settings The settings for a ca_objects_history editing BUNDLES * @param array $pa_options Array of options. Options include: * noCache = Don't use any cached history data. [Default is false] * currentOnly = Only return history entries dates before or on the current date. [Default is false] * limit = Only return a maximum number of history entries. [Default is null; no limit] * * @return array A list of life cycle events, indexed by historic timestamp for date of occurrrence. Each list value is an array of history entries. * * @used-by ca_objects::getObjectHistoryHTMLFormBundle */ public function getObjectHistory($pa_bundle_settings = null, $pa_options = null) { global $g_ui_locale; if (!is_array($pa_options)) { $pa_options = array(); } if (!is_array($pa_bundle_settings)) { $pa_bundle_settings = array(); } $vs_cache_key = caMakeCacheKeyFromOptions(array_merge($pa_bundle_settings, $pa_options, array('object_id' => $this->getPrimaryKey()))); $pb_no_cache = caGetOption('noCache', $pa_options, false); if (!$pb_no_cache && isset(ca_objects::$s_object_use_cache[$vs_cache_key])) { return ca_objects::$s_object_use_cache[$vs_cache_key]; } $pb_display_label_only = caGetOption('displayLabelOnly', $pa_options, false); $pb_get_current_only = caGetOption('currentOnly', $pa_options, false); $pn_limit = caGetOption('limit', $pa_options, null); $vs_display_template = caGetOption('display_template', $pa_bundle_settings, _t('No template defined')); $vs_history_template = caGetOption('history_template', $pa_bundle_settings, $vs_display_template); $vn_current_date = caDateToHistoricTimestamp(_t('now')); $o_media_coder = new MediaInfoCoder(); // // Get history // $va_history = array(); // Lots if (is_array($va_lot_types = caGetOption('ca_object_lots_showTypes', $pa_bundle_settings, null)) && ($vn_lot_id = $this->get('lot_id'))) { $t_lot = new ca_object_lots($vn_lot_id); if (!$t_lot->get('deleted')) { $va_lot_type_info = $t_lot->getTypeList(); $vn_type_id = $t_lot->get('type_id'); $vs_color = $va_lot_type_info[$vn_type_id]['color']; if (!$vs_color || $vs_color == '000000') { $vs_color = caGetOption("ca_object_lots_{$va_lot_type_info[$vn_type_id]['idno']}_color", $pa_bundle_settings, 'ffffff'); } $va_dates = array(); $va_date_elements = caGetOption("ca_object_lots_{$va_lot_type_info[$vn_type_id]['idno']}_dateElement", $pa_bundle_settings, null); if (!is_array($va_date_elements) && $va_date_elements) { $va_date_elements = array($va_date_elements); } if (is_array($va_date_elements) && sizeof($va_date_elements)) { foreach ($va_date_elements as $vs_date_element) { $va_dates[] = array('sortable' => $t_lot->get($vs_date_element, array('getDirectDate' => true)), 'display' => $t_lot->get($vs_date_element)); } } if (!sizeof($va_dates)) { $va_dates[] = array('sortable' => $vn_date = caUnixTimestampToHistoricTimestamps($t_lot->getCreationTimestamp(null, array('timestampOnly' => true))), 'display' => caGetLocalizedDate($vn_date)); } foreach ($va_dates as $va_date) { if (!$va_date['sortable']) { continue; } if (!in_array($vn_type_id, $va_lot_types)) { continue; } if ($pb_get_current_only && $va_date['sortable'] > $vn_current_date) { continue; } $vs_default_display_template = '^ca_object_lots.preferred_labels.name (^ca_object_lots.idno_stub)'; $vs_display_template = $pb_display_label_only ? "" : caGetOption("ca_object_lots_{$va_lot_type_info[$vn_type_id]['idno']}_displayTemplate", $pa_bundle_settings, $vs_default_display_template); $va_history[$va_date['sortable']][] = array('type' => 'ca_object_lots', 'id' => $vn_lot_id, 'display' => $t_lot->getWithTemplate($vs_display_template), 'color' => $vs_color, 'icon_url' => $vs_icon_url = $o_media_coder->getMediaTag($va_lot_type_info[$vn_type_id]['icon'], 'icon'), 'typename_singular' => $vs_typename = $va_lot_type_info[$vn_type_id]['name_singular'], 'typename_plural' => $va_lot_type_info[$vn_type_id]['name_plural'], 'type_id' => $vn_type_id, 'icon' => '<div class="caUseHistoryIconContainer" style="background-color: #' . $vs_color . '"><div class="caUseHistoryIcon">' . ($vs_icon_url ? $vs_icon_url : '<div class="caUseHistoryIconText">' . $vs_typename . '</div>') . '</div></div>', 'date' => $va_date['display']); } } } // Loans $va_loans = $this->get('ca_loans.loan_id', array('returnAsArray' => true)); if (is_array($va_loan_types = caGetOption('ca_loans_showTypes', $pa_bundle_settings, null)) && is_array($va_loans) && sizeof($va_loans)) { $qr_loans = caMakeSearchResult('ca_loans', $va_loans); $t_loan = new ca_loans(); $va_loan_type_info = $t_loan->getTypeList(); $va_date_elements_by_type = array(); foreach ($va_loan_types as $vn_type_id) { if (!is_array($va_date_elements = caGetOption("ca_loans_{$va_loan_type_info[$vn_type_id]['idno']}_dateElement", $pa_bundle_settings, null)) && $va_date_elements) { $va_date_elements = array($va_date_elements); } if (!$va_date_elements) { continue; } $va_date_elements_by_type[$vn_type_id] = $va_date_elements; } while ($qr_loans->nextHit()) { $vn_loan_id = $qr_loans->get('loan_id'); if ((string) $qr_loans->get('ca_loans.deleted') !== '0') { continue; } // filter out deleted $vn_type_id = $qr_loans->get('type_id'); $va_dates = array(); if (is_array($va_date_elements_by_type[$vn_type_id]) && sizeof($va_date_elements_by_type[$vn_type_id])) { foreach ($va_date_elements_by_type[$vn_type_id] as $vs_date_element) { $va_dates[] = array('sortable' => $qr_loans->get("ca_loans.{$vs_date_element}", array('getDirectDate' => true)), 'display' => $qr_loans->get("ca_loans.{$vs_date_element}")); } } if (!sizeof($va_dates)) { $va_dates[] = array('sortable' => $vn_date = caUnixTimestampToHistoricTimestamps($qr_loans->get('lastModified')), 'display' => caGetLocalizedDate($vn_date)); } $vs_default_display_template = '^ca_loans.preferred_labels.name (^ca_loans.idno)'; $vs_display_template = $pb_display_label_only ? $vs_default_display_template : caGetOption("ca_loans_{$va_loan_type_info[$vn_type_id]['idno']}_displayTemplate", $pa_bundle_settings, $vs_default_display_template); foreach ($va_dates as $va_date) { if (!$va_date['sortable']) { continue; } if (!in_array($vn_type_id, $va_loan_types)) { continue; } if ($pb_get_current_only && $va_date['sortable'] > $vn_current_date) { continue; } $vs_color = $va_loan_type_info[$vn_type_id]['color']; if (!$vs_color || $vs_color == '000000') { $vs_color = caGetOption("ca_loans_{$va_loan_type_info[$vn_type_id]['idno']}_color", $pa_bundle_settings, 'ffffff'); } $va_history[$va_date['sortable']][] = array('type' => 'ca_loans', 'id' => $vn_loan_id, 'display' => $qr_loans->getWithTemplate($vs_display_template), 'color' => $vs_color, 'icon_url' => $vs_icon_url = $o_media_coder->getMediaTag($va_loan_type_info[$vn_type_id]['icon'], 'icon'), 'typename_singular' => $vs_typename = $va_loan_type_info[$vn_type_id]['name_singular'], 'typename_plural' => $va_loan_type_info[$vn_type_id]['name_plural'], 'type_id' => $vn_type_id, 'icon' => '<div class="caUseHistoryIconContainer" style="background-color: #' . $vs_color . '"><div class="caUseHistoryIcon">' . ($vs_icon_url ? $vs_icon_url : '<div class="caUseHistoryIconText">' . $vs_typename . '</div>') . '</div></div>', 'date' => $va_date['display']); } } } // Movements $va_movements = $this->get('ca_movements.movement_id', array('returnAsArray' => true)); if (is_array($va_movement_types = caGetOption('ca_movements_showTypes', $pa_bundle_settings, null)) && is_array($va_movements) && sizeof($va_movements)) { $qr_movements = caMakeSearchResult('ca_movements', $va_movements); $t_movement = new ca_movements(); $va_movement_type_info = $t_movement->getTypeList(); $va_date_elements_by_type = array(); foreach ($va_movement_types as $vn_type_id) { if (!is_array($va_date_elements = caGetOption("ca_movements_{$va_movement_type_info[$vn_type_id]['idno']}_dateElement", $pa_bundle_settings, null)) && $va_date_elements) { $va_date_elements = array($va_date_elements); } if (!$va_date_elements) { continue; } $va_date_elements_by_type[$vn_type_id] = $va_date_elements; } while ($qr_movements->nextHit()) { $vn_movement_id = $qr_movements->get('movement_id'); if ((string) $qr_movements->get('ca_movements.deleted') !== '0') { continue; } // filter out deleted $vn_type_id = $qr_movements->get('type_id'); $va_dates = array(); if (is_array($va_date_elements_by_type[$vn_type_id]) && sizeof($va_date_elements_by_type[$vn_type_id])) { foreach ($va_date_elements_by_type[$vn_type_id] as $vs_date_element) { $va_dates[] = array('sortable' => $qr_movements->get("ca_movements.{$vs_date_element}", array('getDirectDate' => true)), 'display' => $qr_movements->get("ca_movements.{$vs_date_element}")); } } if (!sizeof($va_dates)) { $va_dates[] = array('sortable' => $vn_date = caUnixTimestampToHistoricTimestamps($qr_movements->get('lastModified')), 'display' => caGetLocalizedDate($vn_date)); } $vs_default_display_template = '^ca_movements.preferred_labels.name (^ca_movements.idno)'; $vs_display_template = $pb_display_label_only ? $vs_default_display_template : caGetOption("ca_movements_{$va_movement_type_info[$vn_type_id]['idno']}_displayTemplate", $pa_bundle_settings, $vs_default_display_template); foreach ($va_dates as $va_date) { if (!$va_date['sortable']) { continue; } if (!in_array($vn_type_id, $va_movement_types)) { continue; } if ($pb_get_current_only && $va_date['sortable'] > $vn_current_date) { continue; } $vs_color = $va_movement_type_info[$vn_type_id]['color']; if (!$vs_color || $vs_color == '000000') { $vs_color = caGetOption("ca_movements_{$va_movement_type_info[$vn_type_id]['idno']}_color", $pa_bundle_settings, 'ffffff'); } $va_history[$va_date['sortable']][] = array('type' => 'ca_movements', 'id' => $vn_movement_id, 'display' => $qr_movements->getWithTemplate($vs_display_template), 'color' => $vs_color, 'icon_url' => $vs_icon_url = $o_media_coder->getMediaTag($va_movement_type_info[$vn_type_id]['icon'], 'icon'), 'typename_singular' => $vs_typename = $va_movement_type_info[$vn_type_id]['name_singular'], 'typename_plural' => $va_movement_type_info[$vn_type_id]['name_plural'], 'type_id' => $vn_type_id, 'icon' => '<div class="caUseHistoryIconContainer" style="background-color: #' . $vs_color . '"><div class="caUseHistoryIcon">' . ($vs_icon_url ? $vs_icon_url : '<div class="caUseHistoryIconText">' . $vs_typename . '</div>') . '</div></div>', 'date' => $va_date['display']); } } } // Occurrences $va_occurrences = $this->get('ca_occurrences.occurrence_id', array('returnAsArray' => true)); if (is_array($va_occurrence_types = caGetOption('ca_occurrences_showTypes', $pa_bundle_settings, null)) && is_array($va_occurrences) && sizeof($va_occurrences)) { $qr_occurrences = caMakeSearchResult('ca_occurrences', $va_occurrences); $t_occurrence = new ca_occurrences(); $va_occurrence_type_info = $t_occurrence->getTypeList(); $va_date_elements_by_type = array(); foreach ($va_occurrence_types as $vn_type_id) { if (!is_array($va_date_elements = caGetOption("ca_occurrences_{$va_occurrence_type_info[$vn_type_id]['idno']}_dateElement", $pa_bundle_settings, null)) && $va_date_elements) { $va_date_elements = array($va_date_elements); } if (!$va_date_elements) { continue; } $va_date_elements_by_type[$vn_type_id] = $va_date_elements; } while ($qr_occurrences->nextHit()) { $vn_occurrence_id = $qr_occurrences->get('occurrence_id'); if ((string) $qr_occurrences->get('ca_occurrences.deleted') !== '0') { continue; } // filter out deleted $vn_type_id = $qr_occurrences->get('type_id'); $va_dates = array(); if (is_array($va_date_elements_by_type[$vn_type_id]) && sizeof($va_date_elements_by_type[$vn_type_id])) { foreach ($va_date_elements_by_type[$vn_type_id] as $vs_date_element) { $va_dates[] = array('sortable' => $qr_occurrences->get("ca_occurrences.{$vs_date_element}", array('getDirectDate' => true)), 'display' => $qr_occurrences->get("ca_occurrences.{$vs_date_element}")); } } if (!sizeof($va_dates)) { $va_dates[] = array('sortable' => $vn_date = caUnixTimestampToHistoricTimestamps($qr_occurrences->get('lastModified')), 'display' => caGetLocalizedDate($vn_date)); } $vs_default_display_template = '^ca_occurrences.preferred_labels.name (^ca_occurrences.idno)'; $vs_display_template = $pb_display_label_only ? $vs_default_display_template : caGetOption("ca_occurrences_{$va_occurrence_type_info[$vn_type_id]['idno']}_displayTemplate", $pa_bundle_settings, $vs_default_display_template); foreach ($va_dates as $va_date) { if (!$va_date['sortable']) { continue; } if (!in_array($vn_type_id, $va_occurrence_types)) { continue; } if ($pb_get_current_only && $va_date['sortable'] > $vn_current_date) { continue; } $vs_color = $va_occurrence_type_info[$vn_type_id]['color']; if (!$vs_color || $vs_color == '000000') { $vs_color = caGetOption("ca_occurrences_{$va_occurrence_type_info[$vn_type_id]['idno']}_color", $pa_bundle_settings, 'ffffff'); } $va_history[$va_date['sortable']][] = array('type' => 'ca_occurrences', 'id' => $vn_occurrence_id, 'display' => $qr_occurrences->getWithTemplate($vs_display_template), 'color' => $vs_color, 'icon_url' => $vs_icon_url = $o_media_coder->getMediaTag($va_occurrence_type_info[$vn_type_id]['icon'], 'icon'), 'typename_singular' => $vs_typename = $va_occurrence_type_info[$vn_type_id]['name_singular'], 'typename_plural' => $va_occurrence_type_info[$vn_type_id]['name_plural'], 'type_id' => $vn_type_id, 'icon' => '<div class="caUseHistoryIconContainer" style="background-color: #' . $vs_color . '"><div class="caUseHistoryIcon">' . ($vs_icon_url ? $vs_icon_url : '<div class="caUseHistoryIconText">' . $vs_typename . '</div>') . '</div></div>', 'date' => $va_date['display']); } } } // Storage locations $va_locations = $this->get('ca_objects_x_storage_locations.relation_id', array('returnAsArray' => true)); if (is_array($va_location_types = caGetOption('ca_storage_locations_showRelationshipTypes', $pa_bundle_settings, null)) && is_array($va_locations) && sizeof($va_locations)) { $t_location = new ca_storage_locations(); $va_location_type_info = $t_location->getTypeList(); $vs_name_singular = $t_location->getProperty('NAME_SINGULAR'); $vs_name_plural = $t_location->getProperty('NAME_PLURAL'); $qr_locations = caMakeSearchResult('ca_objects_x_storage_locations', $va_locations); $vs_default_display_template = '^ca_storage_locations.parent.preferred_labels.name ➜ ^ca_storage_locations.preferred_labels.name (^ca_storage_locations.idno)'; $vs_display_template = $pb_display_label_only ? $vs_default_display_template : caGetOption('ca_storage_locations_displayTemplate', $pa_bundle_settings, $vs_default_display_template); Debug::msg($qr_locations->numHits()); while ($qr_locations->nextHit()) { $vn_location_id = $qr_locations->get('ca_objects_x_storage_locations.location_id'); if ((string) $qr_locations->get('ca_storage_locations.deleted') !== '0') { continue; } // filter out deleted $va_date = array('sortable' => $qr_locations->get("ca_objects_x_storage_locations.effective_date", array('getDirectDate' => true)), 'display' => $qr_locations->get("ca_objects_x_storage_locations.effective_date")); if (!$va_date['sortable']) { continue; } if (!in_array($vn_rel_type_id = $qr_locations->get('ca_objects_x_storage_locations.type_id'), $va_location_types)) { continue; } $vn_type_id = $qr_locations->get('ca_storage_locations.type_id'); if ($pb_get_current_only && $va_date['sortable'] > $vn_current_date) { continue; } $vs_color = $va_location_type_info[$vn_type_id]['color']; if (!$vs_color || $vs_color == '000000') { $vs_color = caGetOption("ca_storage_locations_color", $pa_bundle_settings, 'ffffff'); } $va_history[$va_date['sortable']][] = array('type' => 'ca_storage_locations', 'id' => $vn_location_id, 'relation_id' => $qr_locations->get('relation_id'), 'display' => $qr_locations->getWithTemplate("<unit relativeTo='ca_storage_locations'>{$vs_display_template}</unit>"), 'color' => $vs_color, 'icon_url' => $vs_icon_url = $o_media_coder->getMediaTag($va_location_type_info[$vn_type_id]['icon'], 'icon'), 'typename_singular' => $vs_name_singular, 'typename_plural' => $vs_name_plural, 'type_id' => $vn_type_id, 'rel_type_id' => $vn_rel_type_id, 'icon' => '<div class="caUseHistoryIconContainer" style="background-color: #' . $vs_color . '"><div class="caUseHistoryIcon">' . ($vs_icon_url ? $vs_icon_url : '<div class="caUseHistoryIconText">' . $vs_name_singular . '</div>') . '</div></div>', 'date' => $va_date['display']); } } // Deaccession if ($this->get('is_deaccessioned') && caGetOption('showDeaccessionInformation', $pa_bundle_settings, false)) { $vs_color = caGetOption('deaccession_color', $pa_bundle_settings, 'cccccc'); $vn_date = $this->get('deaccession_date', array('getDirectDate' => true)); $vs_default_display_template = '^ca_objects.deaccession_notes'; $vs_display_template = $pb_display_label_only ? $vs_default_display_template : caGetOption('deaccession_displayTemplate', $pa_bundle_settings, $vs_default_display_template); if (!($pb_get_current_only && $vn_date > $vn_current_date)) { $va_history[$vn_date][] = array('type' => 'ca_objects_deaccession', 'id' => $this->getPrimaryKey(), 'display' => $this->getWithTemplate("<unit>{$vs_display_template}</unit>"), 'color' => $vs_color, 'icon_url' => '', 'typename_singular' => $vs_name_singular = _t('deaccession'), 'typename_plural' => $vs_name_plural = _t('deaccessions'), 'type_id' => null, 'icon' => '<div class="caUseHistoryIconContainer" style="background-color: #' . $vs_color . '"><div class="caUseHistoryIcon"><div class="caUseHistoryIconText">' . $vs_name_singular . '</div>' . '</div></div>', 'date' => $this->get('deaccession_date')); } } ksort($va_history); $va_history = array_reverse($va_history); if ($pn_limit > 0) { $va_history = array_slice($va_history, 0, $pn_limit); } if (sizeof(ca_objects::$s_object_use_cache[$vs_cache_key]) > 100) { ca_objects::$s_object_use_cache[$vs_cache_key] = array_slice(ca_objects::$s_object_use_cache[$vs_cache_key], 0, 50); } return ca_objects::$s_object_use_cache[$vs_cache_key] = $va_history; }