* @package tao */ class tao_models_classes_import_CsvImporter extends CsvAbstractImporter implements tao_models_classes_import_ImportHandler, ServiceLocatorAwareInterface, TaskParameterProviderInterface { use EventManagerAwareTrait; use ImportHandlerHelperTrait { getTaskParameters as getDefaultTaskParameters; } const OPTION_POSTFIX = '_O'; /** * (non-PHPdoc) * @see tao_models_classes_import_ImportHandler::getLabel() */ public function getLabel() { return __('CSV'); } /** * (non-PHPdoc) * @see tao_models_classes_import_ImportHandler::getForm() */ public function getForm() { $form = empty($_POST['source']) && empty($_POST['importFile']) ? new tao_models_classes_import_CsvUploadForm() : $this->createImportFormContainer(); return $form->getForm(); } /** * Constructs the Import form container * In need of a major refactoring, which will * probably involve refactoring the Form engine as well * * @return tao_models_classes_import_CSVMappingForm * @throws \oat\generis\model\fileReference\FileSerializerException * @throws common_exception_NotAcceptable */ private function createImportFormContainer() { $sourceContainer = new tao_models_classes_import_CsvUploadForm(); $sourceForm = $sourceContainer->getForm(); /** @var tao_helpers_form_FormElement $element */ foreach ($sourceForm->getElements() as $element) { $element->feed(); } $sourceForm->getElement('source')->feed(); $fileInfo = $sourceForm->getValue('source'); if (isset($_POST['importFile'])) { $serial = $_POST['importFile']; } else { $serial = $fileInfo['uploaded_file']; } if (!is_string($serial)) { throw new InvalidArgumentException('Import file has to be a valid file serial.'); } /** @var UploadService $uploadService */ $uploadService = $this->getServiceManager()->get(UploadService::SERVICE_ID); $file = $uploadService->getUploadedFlyFile($serial); $properties = [tao_helpers_Uri::encode(OntologyRdfs::RDFS_LABEL) => __('Label')]; $rangedProperties = []; $classUri = \tao_helpers_Uri::decode($_POST['classUri']); $class = new core_kernel_classes_Class($classUri); $classProperties = $this->getClassProperties($class); foreach ($classProperties as $property) { if (!in_array($property->getUri(), $this->getExludedProperties())) { //@todo manage the properties with range $range = $property->getRange(); $properties[tao_helpers_Uri::encode($property->getUri())] = $property->getLabel(); if ($range instanceof core_kernel_classes_Resource && $range->getUri() != OntologyRdfs::RDFS_LITERAL) { $rangedProperties[tao_helpers_Uri::encode($property->getUri())] = $property->getLabel(); } } } //load the csv data from the file (uploaded in the upload form) to get the columns $csv_data = new tao_helpers_data_CsvFile($sourceForm->getValues()); $csv_data->load($file); $values = $sourceForm->getValues(); $values[tao_helpers_data_CsvFile::FIRST_ROW_COLUMN_NAMES] = !empty($values[tao_helpers_data_CsvFile::FIRST_ROW_COLUMN_NAMES]); $values['importFile'] = $serial; $myFormContainer = new tao_models_classes_import_CSVMappingForm($values, [ 'class_properties' => $properties, 'ranged_properties' => $rangedProperties, 'csv_column' => $this->getColumnMapping($csv_data, $sourceForm->getValue(tao_helpers_data_CsvFile::FIRST_ROW_COLUMN_NAMES)), tao_helpers_data_CsvFile::FIRST_ROW_COLUMN_NAMES => $sourceForm->getValue(tao_helpers_data_CsvFile::FIRST_ROW_COLUMN_NAMES), ]); return $myFormContainer; } /** * (non-PHPdoc) * @see tao_models_classes_import_ImportHandler::import() * @param core_kernel_classes_Class $class * @param tao_helpers_form_Form|array $form * @param string|null $userId owner of the resource * @return common_report_Report * @throws \oat\oatbox\service\ServiceNotFoundException * @throws \common_Exception */ public function import($class, $form, $userId = null) { // for backward compatibility $options = $form instanceof \tao_helpers_form_Form ? $form->getValues() : $form; $options['file'] = $this->fetchUploadedFile($form); // Clean "csv_select" values from form view. // Transform any "csv_select" in "csv_null" in order to // have the same importation behaviour for both because // semantics are the same. // for backward compatibility $map = $form instanceof \tao_helpers_form_Form ? $form->getValues('property_mapping') : $form['property_mapping']; $newMap = []; foreach ($map as $k => $m) { if ($m !== 'csv_select') { $newMap[$k] = $map[$k]; } else { $newMap[$k] = 'csv_null'; } $newMap[$k] = str_replace(self::OPTION_POSTFIX, '', $newMap[$k]); common_Logger::d('map: ' . $k . ' => ' . $newMap[$k]); } $options['map'] = $newMap; $staticMap = []; // for backward compatibility $rangedProperties = $form instanceof \tao_helpers_form_Form ? $form->getValues('ranged_property') : $form['ranged_property']; foreach ($rangedProperties as $propUri => $value) { if (strpos($propUri, tao_models_classes_import_CSVMappingForm::DEFAULT_VALUES_SUFFIX) !== false) { $cleanUri = str_replace(tao_models_classes_import_CSVMappingForm::DEFAULT_VALUES_SUFFIX, '', $propUri); $staticMap[$cleanUri] = $value; } } $options['staticMap'] = array_merge($staticMap, $this->getStaticData()); $report = parent::importFile($class, $options, $userId); if ($report->getType() == common_report_Report::TYPE_SUCCESS) { $this->getEventManager()->trigger(new CsvImportEvent($report)); } return $report; } /** * Defines the task parameters to be stored for later use. * * @param tao_helpers_form_Form $form * @return array */ public function getTaskParameters(tao_helpers_form_Form $form) { return array_merge( $form->getValues(), [ 'property_mapping' => $form->getValues('property_mapping'), 'ranged_property' => $form->getValues('ranged_property') ], $this->getDefaultTaskParameters($form) ); } /** * @return ServiceManager */ private function getServiceManager() { return ServiceManager::getServiceManager(); } }