public function replaceMetadata($metadataCollection, \record_adapter $record) { $metadatas = []; $tagnameToFieldnameMapping = []; $arrayStructure = iterator_to_array($record->get_databox()->get_meta_structure()); array_walk($arrayStructure, function ($databoxField) use(&$tagnameToFieldnameMapping) { $tagname = $databoxField->get_tag()->getTagname(); $tagnameToFieldnameMapping[$tagname][] = $databoxField->get_name(); }); array_walk($metadataCollection, function (Metadata $metadata) use(&$metadatas, $tagnameToFieldnameMapping) { $tagname = $metadata->getTag()->getTagname(); if (!isset($tagnameToFieldnameMapping[$tagname])) { return; } foreach ($tagnameToFieldnameMapping[$tagname] as $fieldname) { if (!isset($metadatas[$fieldname])) { $metadatas[$fieldname] = []; } $metadatas[$fieldname] = array_merge($metadatas[$fieldname], $metadata->getValue()->asArray()); } }); $metas = []; array_walk($arrayStructure, function (\databox_field $field) use(&$metas, $metadatas, $record) { $fieldname = $field->get_name(); if (!isset($metadatas[$fieldname])) { return; } $values = $metadatas[$fieldname]; if ($record->get_caption()->has_field($fieldname)) { foreach ($record->get_caption()->get_field($fieldname)->get_values() as $value) { $value->delete(); } } if ($field->is_multi()) { $tmpValues = []; foreach ($values as $value) { $tmpValues = array_merge($tmpValues, \caption_field::get_multi_values($value, $field->get_separator())); } $values = array_unique($tmpValues); foreach ($values as $value) { if (trim($value) === '') { continue; } $metas[] = ['meta_struct_id' => $field->get_id(), 'meta_id' => null, 'value' => $value]; } } else { $value = array_pop($values); if (trim($value) === '') { return; } $metas[] = ['meta_struct_id' => $field->get_id(), 'meta_id' => null, 'value' => $value]; } }); if (count($metas) > 0) { $record->set_metadatas($metas, true); } }
protected function injectMetadatas(\record_adapter $record) { foreach ($record->get_databox()->get_meta_structure()->get_elements() as $field) { try { $values = $record->get_caption()->get_field($field->get_name())->get_values(); $value = array_pop($values); $meta_id = $value->getId(); } catch (\Exception $e) { $meta_id = null; } $toupdate[$field->get_id()] = ['meta_id' => $meta_id, 'meta_struct_id' => $field->get_id(), 'value' => 'podom pom pom ' . $field->get_id()]; } $record->set_metadatas($toupdate); }
protected function editRecord($string2add, \record_adapter &$record, $indexable = true, $business = false) { $toupdate = []; $field = null; foreach ($record->get_databox()->get_meta_structure()->get_elements() as $field) { if ($indexable !== $field->is_indexable() || $field->isBusiness() !== $business) { continue; } try { $values = $record->get_caption()->get_field($field->get_name())->get_values(); $value = array_pop($values); $meta_id = $value->getId(); } catch (\Exception $e) { $meta_id = null; } $toupdate[$field->get_id()] = ['meta_id' => $meta_id, 'meta_struct_id' => $field->get_id(), 'value' => $string2add]; break; } $record->set_metadatas($toupdate); return $field; }
/** * Update the metadatas of a record * * @param \record_adapter $record * @param string $xml */ protected function updateMetadatas(\record_adapter $record, $xml) { $metas = $record->get_databox()->get_meta_structure(); $datas = $metadatas = []; if (false !== ($sxe = simplexml_load_string($xml))) { $fields = $sxe->xpath('/record/description'); if ($fields && is_array($fields)) { foreach ($fields[0] as $fieldname => $value) { $fieldname = trim($fieldname); $value = trim($value); if (null === ($databox_field = $metas->get_element_by_name($fieldname))) { continue; } if ($databox_field->is_multi()) { $new_value = \caption_field::get_multi_values($value, $databox_field->get_separator()); if (isset($datas[$databox_field->get_id()])) { $value = array_unique(array_merge($datas[$databox_field->get_id()], $new_value)); } else { $value = $new_value; } } else { $new_value = $value; if (isset($datas[$databox_field->get_id()])) { $value = $datas[$databox_field->get_id()] . ' ' . $new_value; } else { $value = $new_value; } } $datas[$databox_field->get_id()] = $value; } } } foreach ($datas as $meta_struct_id => $values) { if (is_array($values)) { foreach ($values as $value) { $metadatas[] = ['meta_struct_id' => $meta_struct_id, 'meta_id' => null, 'value' => $value]; } } else { $metadatas[] = ['meta_struct_id' => $meta_struct_id, 'meta_id' => null, 'value' => $values]; } } $record->set_metadatas($metadatas, true); }