/** * get() value for attribute * * @param array $pa_value_list * @param BaseModel $pt_instance * @param array Options * * @return array|string */ private function _getAttributeValue($pa_value_list, $pt_instance, $pa_options) { $va_path_components =& $pa_options['pathComponents']; $vs_delimiter = isset($pa_options['delimiter']) ? $pa_options['delimiter'] : ';'; $va_return_values = array(); $vn_id = $this->get($pt_instance->primaryKey(true)); $vs_table_name = $pt_instance->tableName(); if (is_array($pa_value_list) && sizeof($pa_value_list)) { $va_val_proc = array(); foreach ($pa_value_list as $o_attribute) { $t_attr_element = $pt_instance->_getElementInstance($o_attribute->getElementID()); $vn_attr_type = $t_attr_element->get('datatype'); $va_acc = array(); $va_values = $o_attribute->getValues(); if ($pa_options['useLocaleCodes']) { if (!$o_attribute->getLocaleID() || !($vm_locale_id = SearchResult::$opo_locales->localeIDToCode($o_attribute->getLocaleID()))) { $vm_locale_id = __CA_DEFAULT_LOCALE__; } } else { if (!($vm_locale_id = $o_attribute->getLocaleID())) { $vm_locale_id = SearchResult::$opo_locales->localeCodeToID(__CA_DEFAULT_LOCALE__); } } $vb_did_return_value = false; foreach ($va_values as $o_value) { $vs_val_proc = null; $vb_dont_return_value = false; $vs_element_code = $o_value->getElementCode(); $va_auth_spec = null; if (is_a($o_value, "AuthorityAttributeValue")) { $va_auth_spec = $va_path_components['components']; if ($pt_instance->hasElement($va_path_components['subfield_name'], null, true, array('dontCache' => false))) { array_shift($va_auth_spec); array_shift($va_auth_spec); array_shift($va_auth_spec); } elseif ($pt_instance->hasElement($va_path_components['field_name'], null, true, array('dontCache' => false))) { array_shift($va_auth_spec); array_shift($va_auth_spec); $va_path_components['subfield_name'] = null; } } if ($va_path_components['subfield_name'] && $va_path_components['subfield_name'] !== $vs_element_code && !$o_value instanceof InformationServiceAttributeValue) { $vb_dont_return_value = true; if (!$pa_options['filter']) { continue; } } if (is_a($o_value, "AuthorityAttributeValue") && sizeof($va_auth_spec) > 0) { array_unshift($va_auth_spec, $vs_auth_table_name = $o_value->tableName()); if ($qr_res = caMakeSearchResult($vs_auth_table_name, array($o_value->getID()))) { if ($qr_res->nextHit()) { unset($pa_options['returnWithStructure']); $va_options['returnAsArray'] = true; $va_val_proc = $qr_res->get(join(".", $va_auth_spec), $pa_options); if (is_array($va_val_proc)) { foreach ($va_val_proc as $vn_i => $vs_v) { $va_return_values[(int) $vn_id][$vm_locale_id][(int) $o_attribute->getAttributeID() . "_{$vn_i}"][$vs_element_code] = $vs_v; } } } } continue; } if (is_null($vs_val_proc)) { switch ($o_value->getType()) { case __CA_ATTRIBUTE_VALUE_LIST__: $t_element = $pt_instance->_getElementInstance($o_value->getElementID()); $vn_list_id = $t_element->get('list_id'); $vs_val_proc = $o_value->getDisplayValue(array_merge($pa_options, array('output' => $pa_options['output'], 'list_id' => $vn_list_id))); break; case __CA_ATTRIBUTE_VALUE_INFORMATIONSERVICE__: //ca_objects.informationservice.ulan_container // support subfield notations like ca_objects.wikipedia.abstract, but only if we're not already at subfield-level, e.g. ca_objects.container.wikipedia if ($va_path_components['subfield_name'] && $vs_element_code != $va_path_components['subfield_name'] && $vs_element_code == $va_path_components['field_name']) { $vs_val_proc = $o_value->getExtraInfo($va_path_components['subfield_name']); $vb_dont_return_value = false; break; } // support ca_objects.container.wikipedia.abstract if ($vs_element_code == $va_path_components['subfield_name'] && $va_path_components['num_components'] == 4) { $vs_val_proc = $o_value->getExtraInfo($va_path_components['components'][3]); $vb_dont_return_value = false; break; } // support ca_objects.wikipedia or ca_objects.container.wikipedia (Eg. no "extra" value specified) if ($vs_element_code == $va_path_components['field_name'] || $vs_element_code == $va_path_components['subfield_name']) { $vs_val_proc = $o_value->getDisplayValue(array_merge($pa_options, array('output' => $pa_options['output']))); $vb_dont_return_value = false; break; } continue 2; default: $vs_val_proc = $o_value->getDisplayValue(array_merge($pa_options, array('output' => $pa_options['output']))); break; } } if ($vn_attr_type == __CA_ATTRIBUTE_VALUE_CONTAINER__ && !$va_path_components['subfield_name'] && !$pa_options['returnWithStructure']) { if (strlen($vs_val_proc) > 0) { $va_val_proc[] = $vs_val_proc; } $vs_val_proc = join($vs_delimiter, $va_val_proc); } $va_spec = $va_path_components['components']; array_pop($va_spec); $va_acc[join('.', $va_spec) . '.' . $vs_element_code] = $o_value->getDisplayValue(array_merge($pa_options, array('output' => 'idno'))); if (!$vb_dont_return_value) { $vb_did_return_value = true; if ($pa_options['makeLink']) { $vs_val_proc = array_shift(caCreateLinksFromText(array($vs_val_proc), $vs_table_name, array($vn_id))); } if ($pa_options['returnWithStructure']) { $va_return_values[(int) $vn_id][$vm_locale_id][(int) $o_attribute->getAttributeID()][$vs_element_code] = $vs_val_proc; } else { $va_return_values[(int) $vn_id][$vm_locale_id][(int) $o_attribute->getAttributeID()] = $vs_val_proc; } } } if ($va_path_components['subfield_name'] && $pa_options['returnBlankValues'] && !$vb_did_return_value) { // value is missing so insert blank if ($pa_options['returnWithStructure']) { $va_return_values[(int) $vn_id][$vm_locale_id][(int) $o_attribute->getAttributeID()][$va_path_components['subfield_name']] = ''; } else { $va_return_values[(int) $vn_id][$vm_locale_id][(int) $o_attribute->getAttributeID()] = ''; } } if ($pa_options['filter']) { $va_tags = caGetTemplateTags($pa_options['filter']); $va_vars = array(); foreach ($va_tags as $vs_tag) { if (isset($va_acc[$vs_tag])) { $va_vars[$vs_tag] = $va_acc[$vs_tag]; } else { $va_vars[$vs_tag] = $this->get($vs_tag, array('convertCodesToIdno' => true)); } } if (ExpressionParser::evaluate($pa_options['filter'], $va_vars)) { unset($va_return_values[(int) $vn_id][$vm_locale_id][(int) $o_attribute->getAttributeID()]); continue; } } } } else { // is blank if ($pa_options['returnWithStructure'] && $pa_options['returnBlankValues']) { $va_return_values[(int) $vn_id][null][null][$va_path_components['subfield_name'] ? $va_path_components['subfield_name'] : $va_path_components['field_name']] = ''; } } if (!$pa_options['returnAllLocales']) { $va_return_values = caExtractValuesByUserLocale($va_return_values); } if ($pa_options['returnWithStructure']) { return is_array($va_return_values) ? $va_return_values : array(); } // // Flatten array for return as string or simple array value // $va_flattened_values = $this->_flattenArray($va_return_values, $pa_options); if ($pa_options['returnAsArray']) { return $va_flattened_values; } else { return sizeof($va_flattened_values) > 0 ? join($pa_options['delimiter'], $va_flattened_values) : null; } }
/** * get() value for attribute * * @param array $pa_value_list * @param BaseModel $pt_instance * @param array Options * * @return array|string */ private function _getAttributeValue($pa_value_list, $pt_instance, $pa_options) { $va_path_components =& $pa_options['pathComponents']; $va_return_values = array(); $vn_id = $this->get($pt_instance->primaryKey(true)); $vs_table_name = $pt_instance->tableName(); if (is_array($pa_value_list) && sizeof($pa_value_list)) { foreach ($pa_value_list as $o_attribute) { $va_values = $o_attribute->getValues(); if ($pa_options['useLocaleCodes']) { if (!$o_attribute->getLocaleID() || !($vm_locale_id = $this->opo_locales->localeIDToCode($o_attribute->getLocaleID()))) { $vm_locale_id = __CA_DEFAULT_LOCALE__; } } else { if (!($vm_locale_id = $o_attribute->getLocaleID())) { $vm_locale_id = $this->opo_locales->localeCodeToID(__CA_DEFAULT_LOCALE__); } } foreach ($va_values as $o_value) { $vs_element_code = $o_value->getElementCode(); if ($va_path_components['subfield_name']) { if ($va_path_components['subfield_name'] && $va_path_components['subfield_name'] !== $vs_element_code && !$o_value instanceof InformationServiceAttributeValue) { continue; } } switch ($o_value->getType()) { case __CA_ATTRIBUTE_VALUE_LIST__: $t_element = $pt_instance->_getElementInstance($o_value->getElementID()); $vn_list_id = $t_element->get('list_id'); $vs_val_proc = $o_value->getDisplayValue(array_merge($pa_options, array('output' => $pa_options['output'], 'list_id' => $vn_list_id))); break; case __CA_ATTRIBUTE_VALUE_INFORMATIONSERVICE__: //ca_objects.informationservice.ulan_container // support subfield notations like ca_objects.wikipedia.abstract, but only if we're not already at subfield-level, e.g. ca_objects.container.wikipedia if ($va_path_components['subfield_name'] && $vs_element_code != $va_path_components['subfield_name'] && $vs_element_code == $va_path_components['field_name']) { $vs_val_proc = $o_value->getExtraInfo($va_path_components['subfield_name']); break; } // support ca_objects.container.wikipedia.abstract if ($vs_element_code == $va_path_components['subfield_name'] && $va_path_components['num_components'] == 4) { $vs_val_proc = $o_value->getExtraInfo($va_path_components['components'][3]); break; } // support ca_objects.wikipedia or ca_objects.container.wikipedia (Eg. no "extra" value specified) if ($vs_element_code == $va_path_components['field_name'] || $vs_element_code == $va_path_components['subfield_name']) { $vs_val_proc = $o_value->getDisplayValue(array_merge($pa_options, array('output' => $pa_options['output']))); break; } continue; default: $vs_val_proc = $o_value->getDisplayValue(array_merge($pa_options, array('output' => $pa_options['output']))); break; } if ($pa_options['makeLink']) { $vs_val_proc = array_shift(caCreateLinksFromText(array($vs_val_proc), $vs_table_name, array($vn_id))); } if ($pa_options['returnWithStructure']) { $va_return_values[(int) $vn_id][$vm_locale_id][(int) $o_attribute->getAttributeID()][$vs_element_code] = $vs_val_proc; } else { $va_return_values[(int) $vn_id][$vm_locale_id][(int) $o_attribute->getAttributeID()] = $vs_val_proc; } } } } else { // is blank if ($pa_options['returnWithStructure'] && $pa_options['returnBlankValues']) { $va_return_values[(int) $vn_id][null][null][$va_path_components['subfield_name'] ? $va_path_components['subfield_name'] : $va_path_components['field_name']] = ''; } } if (!$pa_options['returnAllLocales']) { $va_return_values = caExtractValuesByUserLocale($va_return_values); } if ($pa_options['returnWithStructure']) { return is_array($va_return_values) ? $va_return_values : array(); } // // Flatten array for return as string or simple array value // $va_flattened_values = $this->_flattenArray($va_return_values, $pa_options); if ($pa_options['returnAsArray']) { return $va_flattened_values; } else { return sizeof($va_flattened_values) > 0 ? join($pa_options['delimiter'], $va_flattened_values) : null; } }
/** * Perform mapping of extracted media metadata to CollectiveAccess bundles. * * @param BaseModel $po_instance Model instance to insert extracted metadata into * @param array $pa_metadata Extracted metadata * @param int $pn_locale_id The current locale as a numeric locale_id * @return bool True extracted metadata was mapped and the model changed, false if no change was made to the model */ function caExtractEmbeddedMetadata($po_instance, $pa_metadata, $pn_locale_id) { if (!is_array($pa_metadata)) { return false; } $vb_did_mapping = false; if (!($vs_media_metadata_config = $po_instance->getAppConfig()->get('media_metadata'))) { return false; } $o_metadata_config = Configuration::load($vs_media_metadata_config); $va_mappings = $o_metadata_config->getAssoc('import_mappings'); $vs_tablename = $po_instance->tableName(); // set extracted georef? $va_georef_elements = $o_metadata_config->getList('extract_embedded_exif_georeferencing_to'); $va_georef_containers = $o_metadata_config->getAssoc('extract_embedded_exif_georeferencing_to_container'); $va_date_elements = $o_metadata_config->getList('extract_embedded_exif_creation_date_to'); $va_date_containers = $o_metadata_config->getAssoc('extract_embedded_exif_creation_date_to_container'); if (isset($pa_metadata['EXIF']) && is_array($pa_metadata['EXIF']) && (is_array($va_georef_elements) && sizeof($va_georef_elements) || is_array($va_georef_containers) && sizeof($va_georef_containers) || is_array($va_date_elements) && sizeof($va_date_elements) || is_array($va_date_containers) && sizeof($va_date_containers))) { $va_exif_data = $pa_metadata['EXIF']; if (is_array($va_georef_elements)) { if (is_array($va_coords = caParseEXIFLatLong($va_exif_data))) { foreach ($va_georef_elements as $vs_element) { $va_tmp = explode('.', $vs_element); $po_instance->addAttribute(array($va_tmp[1] => "[" . $va_coords['latitude'] . ", " . $va_coords['longitude'] . "]", 'locale_id' => $pn_locale_id), $va_tmp[1]); } $vb_did_mapping = true; } } if (is_array($va_georef_containers)) { if (is_array($va_coords = caParseEXIFLatLong($va_exif_data))) { foreach ($va_georef_containers as $vs_container => $va_info) { $va_tmp = explode('.', $vs_container); $vs_value_element = array_pop(explode('.', $va_info['value'])); $va_data = array($vs_value_element => "[" . $va_coords['latitude'] . ", " . $va_coords['longitude'] . "]", 'locale_id' => $pn_locale_id); if (isset($va_info['map']) && is_array($va_info['map'])) { foreach ($va_info['map'] as $vs_sub_element => $vs_value) { $va_tmp2 = explode('.', $vs_sub_element); $vs_sub_element = array_pop($va_tmp2); if ($t_element = $po_instance->_getElementInstance($vs_sub_element)) { switch ($t_element->get('datatype')) { case 3: // List $t_list = new ca_lists(); $va_data[$vs_sub_element] = $t_list->getItemIDFromList($t_element->get('list_id'), $vs_value); break; default: $va_data[$vs_sub_element] = $vs_value; break; } } } } $po_instance->addAttribute($va_data, $va_tmp[1]); } $vb_did_mapping = true; } } if (is_array($va_date_elements)) { if (($vs_raw_date = $va_exif_data['IFD0']['DateTimeOriginal']) || ($vs_raw_date = $va_exif_data['EXIF']['DateTimeOriginal'])) { $va_date_tmp = preg_split('![: ]+!', $vs_raw_date); $vs_date = $va_date_tmp[0] . '-' . $va_date_tmp[1] . '-' . $va_date_tmp[2] . 'T' . $va_date_tmp[3] . ':' . $va_date_tmp[4] . ':' . $va_date_tmp[5]; foreach ($va_date_elements as $vs_element) { $va_tmp = explode('.', $vs_element); $po_instance->addAttribute(array($va_tmp[1] => $vs_date, 'locale_id' => $pn_locale_id), $va_tmp[1]); } $vb_did_mapping = true; } } if (is_array($va_date_containers)) { $t_list = new ca_lists(); if (($vs_raw_date = $va_exif_data['IFD0']['DateTimeOriginal']) || ($vs_raw_date = $va_exif_data['EXIF']['DateTimeOriginal'])) { $va_date_tmp = preg_split('![: ]+!', $vs_raw_date); $vs_date = $va_date_tmp[0] . '-' . $va_date_tmp[1] . '-' . $va_date_tmp[2] . 'T' . $va_date_tmp[3] . ':' . $va_date_tmp[4] . ':' . $va_date_tmp[5]; foreach ($va_date_containers as $vs_container => $va_info) { $va_tmp = explode('.', $vs_container); $vs_value_element = array_pop(explode('.', $va_info['value'])); $va_data = array($vs_value_element => $vs_date, 'locale_id' => $pn_locale_id); if (isset($va_info['map']) && is_array($va_info['map'])) { foreach ($va_info['map'] as $vs_sub_element => $vs_value) { $va_tmp2 = explode('.', $vs_sub_element); $vs_sub_element = array_pop($va_tmp2); if ($t_element = $po_instance->_getElementInstance($vs_sub_element)) { switch ($t_element->get('datatype')) { case 3: // List $va_data[$vs_sub_element] = $t_list->getItemIDFromList($t_element->get('list_id'), $vs_value); break; default: $va_data[$vs_sub_element] = $vs_value; break; } } } } $po_instance->addAttribute($va_data, $va_tmp[1]); } $vb_did_mapping = true; } } } if (!isset($va_mappings[$po_instance->tableName()])) { return $vb_did_mapping; } $va_mapping = $va_mappings[$vs_tablename]; $vs_type = $po_instance->getTypeCode(); if (isset($va_mapping[$vs_type]) && is_array($va_mapping[$vs_type])) { $va_mapping = $va_mapping[$vs_type]; } else { if (isset($va_mapping['__default__']) && is_array($va_mapping['__default__'])) { $va_mapping = $va_mapping['__default__']; } else { return $vb_did_mapping; } } foreach ($va_mapping as $vs_metadata => $va_attr) { $va_tmp = explode(":", $vs_metadata); foreach ($va_attr as $vs_attr) { $va_metadata =& $pa_metadata; foreach ($va_tmp as $vs_el) { if (isset($va_metadata[$vs_el])) { $va_metadata =& $va_metadata[$vs_el]; } else { continue 2; } } if (is_array($va_metadata)) { $va_metadata = join(";", $va_metadata); } if (!is_int($va_metadata)) { // pass ints through for values like WhiteBalance = 0 if (!trim($va_metadata)) { continue 2; } } $va_tmp2 = explode(".", $vs_attr); switch ($va_tmp2[0]) { case 'preferred_labels': $po_instance->replaceLabel(array($va_tmp2[1] => $va_metadata), $pn_locale_id, null, true); break; case 'nonpreferred_labels': $po_instance->replaceLabel(array($va_tmp2[1] => $va_metadata), $pn_locale_id, null, false); break; default: if ($po_instance->hasField($vs_attr)) { $po_instance->set($vs_attr, $va_metadata); } else { // try as attribute if (sizeof($va_tmp2) == 2) { // format ca_objects.foo, we only want "foo" $po_instance->replaceAttribute(array($va_tmp2[1] => $va_metadata, 'locale_id' => $pn_locale_id), $va_tmp2[1]); } } } $vb_did_mapping = true; } } return $vb_did_mapping; }