/** * Process relationships on the refinery * * @param $ps_related_table * @param $pa_related_option_list * @param array $pa_source_data * @param array $pa_item * @param int $pn_c * @param null $pa_options * * @return array */ function caProcessRefineryRelated($ps_related_table, $pa_related_option_list, $pa_source_data, $pa_item, $pn_c, $pa_options = null) { $o_reader = caGetOption('reader', $pa_options, null); $o_log = caGetOption('log', $pa_options, null); $o_trans = caGetOption('transaction', $pa_options, null); global $g_ui_locale_id; $va_attr_vals = array(); if (!$pa_related_option_list || !is_array($pa_related_option_list)) { return $va_attr_vals; } foreach ($pa_related_option_list as $vn_i => $pa_related_options) { $vn_id = null; $va_name = null; $vs_name = caGetOption('name', $pa_related_options, null); $vs_name = BaseRefinery::parsePlaceholder($pa_related_options['name'], $pa_source_data, $pa_item, $pn_c, array('reader' => $o_reader, 'returnAsString' => true, 'delimiter' => ' ')); $vs_idno = BaseRefinery::parsePlaceholder($pa_related_options['idno'], $pa_source_data, $pa_item, $pn_c, array('reader' => $o_reader, 'returnAsString' => true, 'delimiter' => ' ')); $vs_type = BaseRefinery::parsePlaceholder($pa_related_options['type'], $pa_source_data, $pa_item, $pn_c, array('reader' => $o_reader, 'returnAsString' => true, 'delimiter' => ' ')); $vn_parent_id = BaseRefinery::parsePlaceholder($pa_related_options['parent_id'], $pa_source_data, $pa_item, $pn_c, array('reader' => $o_reader, 'returnAsString' => true, 'delimiter' => ' ')); if (!$vs_name) { $vs_name = $vs_idno; } if ($ps_related_table == 'ca_entities') { $t_entity = new ca_entities(); if ($o_trans) { $t_entity->setTransaction($o_trans); } if (!$vs_name) { $va_name = array(); foreach ($t_entity->getLabelUIFields() as $vs_label_fld) { if (!isset($pa_related_options[$vs_label_fld])) { $pa_related_options[$vs_label_fld] = ''; } $va_name[$vs_label_fld] = BaseRefinery::parsePlaceholder($pa_related_options[$vs_label_fld], $pa_source_data, $pa_item, $pn_c, array('reader' => $o_reader)); } } else { $va_name = DataMigrationUtils::splitEntityName($vs_name, $pa_options); } if (!is_array($va_name) || !$va_name) { if ($o_log) { $o_log->logDebug(_t('[importHelpers:caProcessRefineryRelated] No name specified for table %1', $ps_related_table)); } return null; } } if (!$vs_name) { if ($o_log) { $o_log->logDebug(_t('[importHelpers:caProcessRefineryRelated] No name specified for table %1', $ps_related_table)); } return null; } $vs_name = BaseRefinery::parsePlaceholder($vs_name, $pa_source_data, $pa_item, $pn_c, array('reader' => $o_reader)); $va_attributes = isset($pa_related_options['attributes']) && is_array($pa_related_options['attributes']) ? $pa_related_options['attributes'] : array(); foreach ($va_attributes as $vs_element_code => $va_attrs) { if (is_array($va_attrs)) { foreach ($va_attrs as $vs_k => $vs_v) { // BaseRefinery::parsePlaceholder may return an array if the input format supports repeated values (as XML does) // DataMigrationUtils::getCollectionID(), which ca_data_importers::importDataFromSource() uses to create related collections // only supports non-repeating attribute values, so we join any values here and call it a day. $va_attributes[$vs_element_code][$vs_k] = BaseRefinery::parsePlaceholder($vs_v, $pa_source_data, $pa_item, $pn_c, array('reader' => $o_reader, 'returnAsString' => true, 'delimiter' => ' ')); } } else { $va_attributes[$vs_element_code] = array($vs_element_code => BaseRefinery::parsePlaceholder($va_attrs, $pa_source_data, $pa_item, $pn_c, array('reader' => $o_reader, 'returnAsString' => true, 'delimiter' => ' '))); } } if ($ps_related_table != 'ca_object_lots') { $va_attributes['idno'] = $vs_idno; $va_attributes['parent_id'] = $vn_parent_id; } else { $vs_idno_stub = BaseRefinery::parsePlaceholder($pa_related_options['idno_stub'], $pa_source_data, $pa_item, $pn_c, array('reader' => $o_reader, 'returnAsString' => true, 'delimiter' => ' ')); } $pa_options = array_merge(array('matchOn' => array('idno', 'label'), $pa_options)); switch ($ps_related_table) { case 'ca_objects': $vn_id = DataMigrationUtils::getObjectID($vs_name, $vn_parent_id, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options); break; case 'ca_object_lots': $vn_id = DataMigrationUtils::getObjectLotID($vs_idno_stub, $vs_name, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options); break; case 'ca_entities': $vn_id = DataMigrationUtils::getEntityID($va_name, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options); break; case 'ca_places': $vn_id = DataMigrationUtils::getPlaceID($vs_name, $vn_parent_id, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options); break; case 'ca_occurrences': $vn_id = DataMigrationUtils::getOccurrenceID($vs_name, $vn_parent_id, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options); break; case 'ca_collections': $vn_id = DataMigrationUtils::getCollectionID($vs_name, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options); break; case 'ca_loans': $vn_id = DataMigrationUtils::getLoanID($vs_name, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options); break; case 'ca_movements': $vn_id = DataMigrationUtils::getMovementID($vs_name, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options); break; case 'ca_list_items': if (!($vn_list_id = caGetOption('list_id', $pa_options, null))) { if ($o_log) { $o_log->logDebug(_t('[importHelpers:caProcessRefineryRelated] List was not specified')); } return null; } $vn_id = DataMigrationUtils::getListItemID($vn_list_id, $vs_name, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options); break; case 'ca_storage_locations': $vn_id = DataMigrationUtils::getStorageLocationID($vs_name, $vn_parent_id, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options); break; default: if ($o_log) { $o_log->logDebug(_t('[importHelpers:caProcessRefineryRelated] Invalid table %1', $ps_related_table)); } return null; break; } if ($vn_id) { $va_attr_vals['_related_related'][$ps_related_table][] = array('id' => $vn_id, '_relationship_type' => $pa_related_options['relationshipType']); } } return $va_attr_vals; }
/** * */ public function refine(&$pa_destination_data, $pa_group, $pa_item, $pa_source_data, $pa_options = null) { $o_log = isset($pa_options['log']) && is_object($pa_options['log']) ? $pa_options['log'] : null; $va_group_dest = explode(".", $pa_group['destination']); $vs_terminal = array_pop($va_group_dest); $pm_value = $pa_source_data[$pa_item['source']]; if (is_array($pm_value)) { $va_entities = $pm_value; // for input formats that support repeating values } else { $va_entities = array($pm_value); } $va_vals = array(); $vn_c = 0; $t_entity = new ca_entities(); foreach ($va_entities as $pm_value) { if (!($vs_entity = trim($pm_value))) { return array(); } if (is_array($va_skip_values = $pa_item['settings']['entityJoiner_skipIfValue']) && in_array($vs_entity, $va_skip_values)) { return array(); } $va_name = array(); foreach ($t_entity->getLabelUIFields() as $vs_fld) { $va_name[$vs_fld] = BaseRefinery::parsePlaceholder($pa_item['settings']['entityJoiner_' . $vs_fld], $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' ')); } if (isset($va_name[$vs_terminal])) { return $va_name[$vs_terminal]; } if (in_array($vs_terminal, array('preferred_labels', 'nonpreferred_labels'))) { return $va_name; } // Set label $va_val = array('preferred_labels' => $va_name); // Set relationship type if ($vs_rel_type_opt = $pa_item['settings']['entityJoiner_relationshipType']) { $va_val['_relationship_type'] = BaseRefinery::parsePlaceholder($vs_rel_type_opt, $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' ')); } if ((!isset($va_val['_relationship_type']) || !$va_val['_relationship_type']) && ($vs_rel_type_opt = $pa_item['settings']['entityJoiner_relationshipTypeDefault'])) { $va_val['_relationship_type'] = BaseRefinery::parsePlaceholder($vs_rel_type_opt, $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' ')); } if ((!isset($va_val['_relationship_type']) || !$va_val['_relationship_type']) && $o_log) { $o_log->logWarn(_t('[entityJoinerRefinery] No relationship type is set for entity %1', $vs_entity)); } // Set entity_type if ($vs_type_opt = $pa_item['settings']['entityJoiner_entityType']) { $va_val['_type'] = BaseRefinery::parsePlaceholder($vs_type_opt, $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' ')); } if ((!isset($va_val['_type']) || !$va_val['_type']) && ($vs_type_opt = $pa_item['settings']['entityJoiner_entityTypeDefault'])) { $va_val['_type'] = BaseRefinery::parsePlaceholder($vs_type_opt, $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' ')); } if ((!isset($va_val['_type']) || !$va_val['_type']) && $o_log) { $o_log->logWarn(_t('[entityJoinerRefinery] No entity type is set for entity %1', $vs_entity)); } // Set attributes if (is_array($va_attr_vals = caProcessRefineryAttributes($pa_item['settings']['entityJoiner_attributes'], $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'log' => $o_log)))) { $va_val = array_merge($va_val, $va_attr_vals); } // Set interstitials if (isset($pa_options['mapping']) && is_array($va_attr_vals = caProcessInterstitialAttributes('entityJoiner', $pa_options['mapping']->get('table_num'), 'ca_entities', $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'log' => $o_log)))) { $va_val = array_merge($va_val, $va_attr_vals); } caProcessRefineryRelatedMultiple($this, $pa_item, $pa_source_data, $vn_c, $o_log, caGetOption('reader', $pa_options, null), $va_val, $va_vals); // nonpreferred labels if (is_array($pa_item['settings']['entityJoiner_nonpreferred_labels'])) { $va_non_preferred_labels = array(); foreach ($pa_item['settings']['entityJoiner_nonpreferred_labels'] as $vn_index => $va_elements) { if (is_array($va_elements)) { $vb_non_pref_label_was_set = false; foreach ($va_elements as $vs_k => $vs_v) { if (!trim($vs_v)) { continue; } if ($vs_k == 'split') { if (!is_array($va_non_preferred_labels[$vn_index])) { $va_non_preferred_labels[$vn_index] = array(); } if ($vs_name = BaseRefinery::parsePlaceholder($vs_v, $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' '))) { $va_non_preferred_labels[$vn_index] = array_merge($va_non_preferred_labels[$vn_index], DataMigrationUtils::splitEntityName($vs_name)); $vb_non_pref_label_was_set = true; } } else { if ($va_non_preferred_labels[$vn_index][$vs_k] = trim(BaseRefinery::parsePlaceholder($vs_v, $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' ')))) { $vb_non_pref_label_was_set = true; } } } } if (!$vb_non_pref_label_was_set) { unset($va_non_preferred_labels[$vn_index]); } } if (sizeof($va_non_preferred_labels)) { $va_val['nonpreferred_labels'] = $va_non_preferred_labels; } } $va_vals[] = $va_val; $vn_c++; } return $va_vals; }