tao-test/app/tao/models/classes/import/class.CSVMappingForm.php

201 lines
8.4 KiB
PHP

<?php
/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; under version 2
* of the License (non-upgradable).
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Copyright (c) 2008-2010 (original work) Deutsche Institut für Internationale Pädagogische Forschung (under the project TAO-TRANSFER);
* 2009-2012 (update and modification) Public Research Centre Henri Tudor (under the project TAO-SUSTAIN & TAO-DEV);
*
*/
use oat\generis\model\OntologyRdfs;
/**
* This container initialize the form used to map class properties to data to be
*
* @access public
* @author Bertrand Chevrier, <bertrand.chevrier@tudor.lu>
* @package tao
*/
class tao_models_classes_import_CSVMappingForm extends tao_helpers_form_FormContainer
{
// --- ASSOCIATIONS ---
// --- ATTRIBUTES ---
// --- OPERATIONS ---
/**
* Suffix to append to the default values of the properties
* @var string
*/
const DEFAULT_VALUES_SUFFIX = '-taocsvdef';
/**
* Short description of method initForm
*
* @access public
* @author Bertrand Chevrier, <bertrand.chevrier@tudor.lu>
* @return mixed
*/
public function initForm()
{
$this->form = tao_helpers_form_FormFactory::getForm('mapping');
$importElt = tao_helpers_form_FormFactory::getElement('import', 'Free');
$importElt->setValue('<a href="#" class="form-submitter btn-success small"><span class="icon-import"></span> ' . __('Import') . '</a>');
$this->form->setActions([$importElt], 'bottom');
$this->form->setActions([], 'top');
}
/**
* Short description of method initElements
*
* @access public
* @author Bertrand Chevrier, <bertrand.chevrier@tudor.lu>
* @throws Exception
* @throws common_Exception
* @return mixed
*/
public function initElements()
{
if (!isset($this->options['class_properties'])) {
throw new Exception('No class properties found');
}
if (!isset($this->options['csv_column'])) {
throw new Exception('No csv columns found');
}
$columnsOptions = [];
$columnsOptionsLabels = [];
$columnsOptionsLiteral = [];
$columnsOptionsLiteral['csv_select'] = ' --- ' . __('Select') . ' --- ';
$columnsOptionsLiteral['csv_null'] = ' --- ' . __("Don't set");
$columnsOptionsRanged = [];
$columnsOptionsRanged['csv_select'] = ' --- ' . __('Select') . ' --- ';
$columnsOptionsRanged['csv_null'] = ' --- ' . __('Use default value');
// We build the list of CSV columns that can be mapped to
// the target class properties.
if (
isset($this->options[tao_helpers_data_CsvFile::FIRST_ROW_COLUMN_NAMES])
&& $this->options[tao_helpers_data_CsvFile::FIRST_ROW_COLUMN_NAMES]
) {
foreach ($this->options['csv_column'] as $i => $column) {
$columnsOptions[$i . tao_models_classes_import_CsvImporter::OPTION_POSTFIX] = __('Column') . ' ' . ($i + 1) . ' : ' . $column;
$columnsOptionsLabels[$i . tao_models_classes_import_CsvImporter::OPTION_POSTFIX] = $this->prepareString($column);
}
} else {
// We do not know column so we display more neutral information
// about columns to the end user.
for ($i = 0; $i < count($this->options['csv_column']); $i++) {
$columnsOptions[$i . tao_models_classes_import_CsvImporter::OPTION_POSTFIX] = __('Column') . ' ' . ($i + 1);
}
}
foreach ($this->options['class_properties'] as $propertyUri => $propertyLabel) {
$propElt = tao_helpers_form_FormFactory::getElement($propertyUri, 'Combobox');
$propElt->setDescription($propertyLabel);
// literal or ranged?
$options = array_key_exists($propertyUri, $this->options['ranged_properties'])
? array_merge($columnsOptionsRanged, $columnsOptions)
: array_merge($columnsOptionsLiteral, $columnsOptions);
$value = 'csv_select';
if (isset($_POST[$propertyUri]) && isset($options[$_POST[$propertyUri]])) {
$value = $_POST[$propertyUri];
}
// We trying compare current label with option labels from file and set most suitable
$label = $this->prepareString($propertyLabel);
$value = key(preg_grep("/^$label$/", $columnsOptionsLabels)) ?: $value;
$propElt->setOptions($options);
$propElt->setValue($value);
/** Add mandatory label */
if (tao_helpers_Uri::decode($propertyUri) == OntologyRdfs::RDFS_LABEL) {
$elementEqualsToCsvSelect = new tao_helpers_form_elements_xhtml_Hidden();
$elementEqualsToCsvSelect->setValue('csv_select');
$elementEqualsToCsvSelect->setDescription(' to null');
$propElt->addValidator(tao_helpers_form_FormFactory::getValidator(
'Equals',
[
'reference' => $elementEqualsToCsvSelect,
'invert' => true
]
));
}
$this->form->addElement($propElt);
}
if (count($this->options['class_properties']) > 0) {
$this->form->createGroup('property_mapping', __('Map the properties to the CSV columns'), array_keys($this->options['class_properties']));
}
$ranged = [];
foreach ($this->options['ranged_properties'] as $propertyUri => $propertyLabel) {
$property = new core_kernel_classes_Property(tao_helpers_Uri::decode($propertyUri));
$propElt = tao_helpers_form_GenerisFormFactory::elementMap($property);
if (!is_null($propElt)) {
$defName = tao_helpers_Uri::encode($property->getUri()) . self::DEFAULT_VALUES_SUFFIX;
$propElt->setName($defName);
if ($this->form->getElement($propertyUri)->getRawValue() == 'csv_null') {
$propElt->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty'));
}
$this->form->addElement($propElt);
$ranged[$defName] = $propElt;
}
}
if (count($this->options['ranged_properties']) > 0) {
$this->form->createGroup('ranged_property', __('Define the default values'), array_keys($ranged));
}
$importFileEle = tao_helpers_form_FormFactory::getElement('importFile', 'Hidden');
$this->form->addElement($importFileEle);
$optDelimiter = tao_helpers_form_FormFactory::getElement(tao_helpers_data_CsvFile::FIELD_DELIMITER, 'Hidden');
$this->form->addElement($optDelimiter);
$optEncloser = tao_helpers_form_FormFactory::getElement(tao_helpers_data_CsvFile::FIELD_ENCLOSER, 'Hidden');
$this->form->addElement($optEncloser);
$optMulti = tao_helpers_form_FormFactory::getElement(tao_helpers_data_CsvFile::MULTI_VALUES_DELIMITER, 'Hidden');
$this->form->addElement($optMulti);
if (isset($this->options[tao_models_classes_import_CsvUploadForm::IS_OPTION_FIRST_COLUMN_ENABLE])) {
if ($this->options[tao_models_classes_import_CsvUploadForm::IS_OPTION_FIRST_COLUMN_ENABLE] === true) {
$optFirstColumn = tao_helpers_form_FormFactory::getElement(tao_helpers_data_CsvFile::FIRST_ROW_COLUMN_NAMES, 'Hidden');
$this->form->addElement($optFirstColumn);
}
} else {
$optFirstColumn = tao_helpers_form_FormFactory::getElement(tao_helpers_data_CsvFile::FIRST_ROW_COLUMN_NAMES, 'Hidden');
$this->form->addElement($optFirstColumn);
}
}
protected function prepareString($value)
{
return mb_strtolower(preg_replace('/[\s\t\r\n-]/', '', $value));
}
}