setDescription('Merge databox structure fields'); $this->addArgument('sbas_id', InputArgument::REQUIRED, 'Databox sbas_id'); $this->addArgument('destination', InputArgument::REQUIRED, 'Metadata structure id destination'); $this->addArgument('source', InputArgument::REQUIRED | InputArgument::IS_ARRAY, 'Metadata structure ids for source'); $this->addOption( 'separator' , '' , InputOption::VALUE_OPTIONAL , 'Separator for concatenation (if destination is monovalued)' , ';' ); return $this; } public function requireSetup() { return true; } protected function doExecute(InputInterface $input, OutputInterface $output) { $output->writeln(""); try { $databox = $this->getService('phraseanet.appbox')->get_databox((int) $input->getArgument('sbas_id')); } catch (\Exception $e) { $output->writeln("Invalid databox id "); return 1; } $sources = array(); foreach ($input->getArgument('source') as $source_id) { $sources[] = $databox->get_meta_structure()->get_element($source_id); } if (count($sources) === 0) { throw new \Exception('No sources to proceed'); } $separator = ' ' . $input->getOption('separator') . ' '; $destination = $databox->get_meta_structure()->get_element($input->getArgument('destination')); $types = $multis = array(); foreach ($sources as $source) { array_push($types, $source->get_type()); array_push($multis, $source->is_multi()); } $types = array_unique($types); $multis = array_unique($multis); if (count(array_unique($types)) > 1) { $output->writeln( sprintf("Warning, trying to merge inconsistent types : %s\n" , implode(', ', $types) ) ); } if (count(array_unique($multis)) > 1) { $output->writeln( sprintf( "Warning, trying to merge mono and multi values fields\n" ) ); } $field_names = array(); foreach ($sources as $source) { $field_names[] = $source->get_name(); } if (count($multis) == 1) { if ($multis[0] === false && ! $destination->is_multi()) { $output->writeln( sprintf( "You are going to merge mono valued fields in a " . "monovalued field, fields will be " . "concatenated in the following order : %s" , implode($separator, $field_names) ) ); $this->displayHelpConcatenation($output); } elseif ($multis[0] === true && ! $destination->is_multi()) { $output->writeln( sprintf( "You are going to merge multi valued fields in a " . "monovalued field, fields will be " . "concatenated in the following order : %s" , implode(' ', $field_names) ) ); $this->displayHelpConcatenation($output); } elseif ($multis[0] === false && $destination->is_multi()) { $output->writeln( sprintf( "You are going to merge mono valued fields in a " . "multivalued field" ) ); } elseif ($multis[0] === true && $destination->is_multi()) { $output->writeln( sprintf( "You are going to merge multi valued fields in a " . "multivalued field" ) ); } } elseif ($destination->is_multi()) { $output->writeln( sprintf( "You are going to merge mixed valued fields in a " . "multivalued field" ) ); } else { $output->writeln( sprintf( "You are going to merge mixed valued fields in a " . "monovalued field, fields will be " . "concatenated in the following order : %s" , implode($separator, $field_names) ) ); $this->displayHelpConcatenation($output); } $start = 0; $quantity = 100; do { $sql = 'SELECT record_id FROM record ORDER BY record_id LIMIT ' . $start . ', ' . $quantity; $stmt = $databox->get_connection()->prepare($sql); $stmt->execute(); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); $stmt->closeCursor(); foreach ($results as $row) { $record = $databox->get_record($row['record_id']); $datas = array(); foreach ($sources as $source) { try { $values = $record->get_caption()->get_field($source->get_name())->get_values(); foreach ($values as $captionValue) { $datas[] = $captionValue->getValue(); $captionValue->delete(); } } catch (\Exception $e) { } } $datas = array_unique($datas); if ( ! $destination->is_multi()) { $datas = implode($separator, $datas); } foreach ((array) $datas as $data) { $record->set_metadatas(array(array( 'meta_struct_id' => $destination->get_id(), 'meta_id' => null, 'value' => $data, )), true); } unset($record); } $start += $quantity; } while (count($results) > 0); return 0; } protected function displayHelpConcatenation(OutputInterface $output) { $output->writeln("\nYou can choose the concatenation order in the " . "commandline (first option is first value) and set a separator " . "with the --separator option)"); return $this; } }