/** * Sanitize post data, specifically handling any date and date time conversions from local format to the * database format. * @param string $importRulesType * @param array $postMappingData */ public static function sanitizePostByTypeForSavingMappingData($importRulesType, $postMappingData) { assert('is_string($importRulesType)'); assert('is_array($postMappingData)'); foreach ($postMappingData as $columnName => $mappingData) { if (!isset($mappingData['mappingRulesData'])) { $postMappingData[$columnName]['mappingRulesData'] = array(); } } foreach ($postMappingData as $columnName => $mappingData) { foreach ($mappingData['mappingRulesData'] as $mappingRuleFormClassName => $mappingRuleFormData) { $model = MappingRuleFormAndElementTypeUtil::makeForm($importRulesType, $mappingData['attributeIndexOrDerivedType'], $mappingRuleFormClassName); foreach ($mappingRuleFormData as $attributeName => $value) { if ($value !== null) { if (!is_array($value)) { if ($model->isAttribute($attributeName) && $model->isAttributeSafe($attributeName)) { $type = ModelAttributeToMixedTypeUtil::getTypeByModelUsingValidator($model, $model::getAttributeName()); if ($type == 'Date') { $postMappingData[$columnName]['mappingRulesData'][$mappingRuleFormClassName][$attributeName] = DateTimeUtil::resolveValueForDateDBFormatted($value); } if ($type == 'DateTime' && !empty($value)) { $postMappingData[$columnName]['mappingRulesData'][$mappingRuleFormClassName][$attributeName] = DateTimeUtil::convertDateTimeLocaleFormattedDisplayToDbFormattedDateTimeWithSecondsAsZero($value); } } } } } } } return $postMappingData; }
public function testMakeCollectionByAttributeImportRules() { //Contact $attributeImportRules = new ContactAttributeImportRules(new ImportModelTestItem(), 'hasOne'); $collection = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, 'hasOne', 'importColumn'); $this->assertEquals(2, count($collection)); $this->assertEquals('ImportMappingRuleDefaultModelNameId', $collection[0]['elementType']); $this->assertEquals('DefaultModelNameIdMappingRuleForm', get_class($collection[0]['mappingRuleForm'])); $this->assertEquals('ImportMappingRelatedModelValueTypeDropDown', $collection[1]['elementType']); $this->assertEquals('RelatedModelValueTypeMappingRuleForm', get_class($collection[1]['mappingRuleForm'])); //Contact Derived $attributeImportRules = new ContactDerivedAttributeImportRules(new ImportModelTestItem(), 'contactDerived'); $collection = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, 'contactDerived', 'importColumn'); $this->assertEquals(2, count($collection)); $this->assertEquals('ImportMappingRuleDefaultModelNameId', $collection[0]['elementType']); $this->assertEquals('DefaultModelNameIdDerivedAttributeMappingRuleForm', get_class($collection[0]['mappingRuleForm'])); $this->assertEquals('ImportMappingModelIdValueTypeDropDown', $collection[1]['elementType']); $this->assertEquals('IdValueTypeMappingRuleForm', get_class($collection[1]['mappingRuleForm'])); //Contact State ContactsModule::loadStartingData(); $attributeImportRules = new ContactStateAttributeImportRules(new ImportModelTestItem(), 'state'); $collection = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, 'state', 'importColumn'); $this->assertEquals(1, count($collection)); $this->assertEquals('ImportMappingRuleContactStatesDropDown', $collection[0]['elementType']); $this->assertEquals('DefaultContactStateIdMappingRuleForm', get_class($collection[0]['mappingRuleForm'])); }
public function testMakeCollectionByAttributeImportRules() { //Leads ContactsModule::loadStartingData(); $attributeImportRules = new LeadStateAttributeImportRules(new ImportModelTestItem(), 'state'); $collection = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, 'state', 'importColumn'); $this->assertEquals(1, count($collection)); $this->assertEquals('ImportMappingRuleContactStatesDropDown', $collection[0]['elementType']); $this->assertEquals('DefaultLeadStateIdMappingRuleForm', get_class($collection[0]['mappingRuleForm'])); }
public function testMakeCollectionByAttributeImportRules() { //User $attributeImportRules = new UserAttributeImportRules(new ImportModelTestItem(), 'owner'); $collection = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, 'owner', 'importColumn'); $this->assertEquals(2, count($collection)); $this->assertEquals('ImportMappingRuleDefaultModelNameId', $collection[0]['elementType']); $this->assertEquals('DefaultModelNameIdMappingRuleForm', get_class($collection[0]['mappingRuleForm'])); $this->assertEquals('ImportMappingUserValueTypeDropDown', $collection[1]['elementType']); $this->assertEquals('UserValueTypeModelAttributeMappingRuleForm', get_class($collection[1]['mappingRuleForm'])); //User Password $attributeImportRules = new PasswordAttributeImportRules(new User(), 'hash'); $collection = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, 'hash', 'importColumn'); $this->assertEquals(1, count($collection)); $this->assertEquals('Text', $collection[0]['elementType']); $this->assertEquals('PasswordDefaultValueModelAttributeMappingRuleForm', get_class($collection[0]['mappingRuleForm'])); }
public function testMakeCollectionByAttributeImportRules() { //Opportunity $attributeImportRules = new OpportunityAttributeImportRules(new ImportModelTestItem(), 'hasOne'); $collection = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, 'hasOne', 'importColumn'); $this->assertEquals(2, count($collection)); $this->assertEquals('ImportMappingRuleDefaultModelNameId', $collection[0]['elementType']); $this->assertEquals('DefaultModelNameIdMappingRuleForm', get_class($collection[0]['mappingRuleForm'])); $this->assertEquals('ImportMappingModelIdValueTypeDropDown', $collection[1]['elementType']); $this->assertEquals('IdValueTypeMappingRuleForm', get_class($collection[1]['mappingRuleForm'])); //OpportunityDerived $attributeImportRules = new OpportunityDerivedAttributeImportRules(new ImportModelTestItem(), 'opportunityDerived'); $collection = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, 'opportunityDerived', 'importColumn'); $this->assertEquals(2, count($collection)); $this->assertEquals('ImportMappingRuleDefaultModelNameId', $collection[0]['elementType']); $this->assertEquals('DefaultModelNameIdDerivedAttributeMappingRuleForm', get_class($collection[0]['mappingRuleForm'])); $this->assertEquals('ImportMappingModelIdValueTypeDropDown', $collection[1]['elementType']); $this->assertEquals('IdValueTypeMappingRuleForm', get_class($collection[1]['mappingRuleForm'])); }
/** * @param string $columnName * @param string $attributeIndexOrDerivedType * @param string $importRulesType * @param string $columnType * @param array $mappingRuleFormsAndElementTypes * @return string */ public function renderMappingRulesElements($columnName, $attributeIndexOrDerivedType, $importRulesType, $columnType, $mappingRuleFormsAndElementTypes) { assert('is_string($columnName)'); assert('is_string($attributeIndexOrDerivedType) || $attributeIndexOrDerivedType == null'); assert('is_string($importRulesType)'); assert('$columnType == "importColumn" || $columnType == "extraColumn"'); assert('is_array($mappingRuleFormsAndElementTypes) || $mappingRuleFormsAndElementTypes == null'); $content = null; $multipleMappingRulesCssClass = null; if ($attributeIndexOrDerivedType != null) { if ($mappingRuleFormsAndElementTypes == null) { $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType($importRulesType, $attributeIndexOrDerivedType); $mappingRuleFormsAndElementTypes = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, $attributeIndexOrDerivedType, $columnType); } if (count($mappingRuleFormsAndElementTypes) > 0) { $title = Zurmo::t('ImportModule', 'Rules'); } else { $title = null; } $content .= ZurmoHtml::tag('h4', array(), $title); foreach ($mappingRuleFormsAndElementTypes as $notUsed => $ruleFormAndElementType) { $mappingRuleForm = $ruleFormAndElementType['mappingRuleForm']; $elementClassName = $ruleFormAndElementType['elementType'] . 'Element'; $classToEvaluate = new ReflectionClass($elementClassName); if ($classToEvaluate->implementsInterface('DerivedElementInterface')) { $attributeName = 'null'; } else { $attributeName = $mappingRuleForm::getAttributeName(); } $params = array(); $params['inputPrefix'] = array($this->mappingFormModelClassName, $columnName, 'mappingRulesData', get_class($mappingRuleForm)); $element = new $elementClassName($mappingRuleForm, $attributeName, $this->form, $params); $element->editableTemplate = '<div>{label}{content}{error}</div>'; $content .= $element->render(); } } $subDivsCssClass = 'has' . count($mappingRuleFormsAndElementTypes); $content = ZurmoHtml::tag('div', array('id' => self::getMappingRulesDivIdByColumnName($columnName), 'class' => 'mapping-rules ' . $subDivsCssClass), $content); // Not Coding Standard return $content; }
/** * Step 4. Import mapping */ public function actionStep4($id) { $import = Import::getById((int) $id); $importWizardForm = ImportWizardUtil::makeFormByImport($import); $importWizardForm->setScenario('saveMappingData'); $importRulesClassName = ImportRulesUtil::getImportRulesClassNameByType($importWizardForm->importRulesType); if (isset($_POST[get_class($importWizardForm)])) { $reIndexedPostData = ImportMappingUtil::reIndexExtraColumnNamesByPostData($_POST[get_class($importWizardForm)]); $sanitizedPostData = ImportWizardFormPostUtil::sanitizePostByTypeForSavingMappingData($importWizardForm->importRulesType, $reIndexedPostData); ImportWizardUtil::setFormByPostForStep4($importWizardForm, $sanitizedPostData); $mappingDataMappingRuleFormsAndElementTypes = MappingRuleFormAndElementTypeUtil::makeFormsAndElementTypesByMappingDataAndImportRulesType($importWizardForm->mappingData, $importWizardForm->importRulesType); $validated = MappingRuleFormAndElementTypeUtil::validateMappingRuleForms($mappingDataMappingRuleFormsAndElementTypes); if ($validated) { //Still validate even if MappingRuleForms fails, so all errors are captured and returned. $this->attemptToValidateImportWizardFormAndSave($importWizardForm, $import, 'step5'); } else { $importWizardForm->validate(); $importWizardForm->addError('mappingData', Zurmo::t('ImportModule', 'There are errors with some of your mapping rules. Please fix.')); } } else { $mappingDataMappingRuleFormsAndElementTypes = MappingRuleFormAndElementTypeUtil::makeFormsAndElementTypesByMappingDataAndImportRulesType($importWizardForm->mappingData, $importWizardForm->importRulesType); } $dataProvider = $this->makeDataProviderForSampleRow($import, (bool) $importWizardForm->firstRowIsHeaderRow); if ($importWizardForm->firstRowIsHeaderRow) { $headerRow = ZurmoRedBean::$writer->getFirstRowByTableName($import->getTempTableName()); assert('$headerRow != null'); } else { $headerRow = null; } $sampleData = $dataProvider->getData(); assert('count($sampleData) == 1'); $sample = current($sampleData); $pagerUrl = Yii::app()->createUrl('import/default/sampleRow', array('id' => $import->id)); $pagerContent = ImportDataProviderPagerUtil::renderPagerAndHeaderTextContent($dataProvider, $pagerUrl); $mappingDataMetadata = ImportWizardMappingViewUtil::resolveMappingDataForView($importWizardForm->mappingData, $sample, $headerRow); $mappableAttributeIndicesAndDerivedTypes = $importRulesClassName::getMappableAttributeIndicesAndDerivedTypes(); $title = Zurmo::t('ImportModule', 'Import Wizard - Map Fields'); $importRulesClassName = ImportRulesUtil::getImportRulesClassNameByType($importWizardForm->importRulesType); $stepToUse = ImportStepsAndProgressBarForWizardView::resolveAfterUploadStepByImportClassName(3, $importRulesClassName); $progressBarAndStepsView = new ImportStepsAndProgressBarForWizardView($importRulesClassName, $stepToUse); $importView = new ImportWizardMappingView($this->getId(), $this->getModule()->getId(), $importWizardForm, $pagerContent, $mappingDataMetadata, $mappingDataMappingRuleFormsAndElementTypes, $mappableAttributeIndicesAndDerivedTypes, $importRulesClassName::getRequiredAttributesLabelsData(), $title); echo $this->getImportPageView($progressBarAndStepsView, $importView)->render(); }
public function testResolveAttributeIndexAndTheFormsAreUsingTheCorrectModelClassNameAndAttributeName() { $attributeImportRules = new EmailAttributeImportRules(new Email(), 'emailAddress'); $collection = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, 'primaryEmail__emailAddress', 'importColumn'); $this->assertEquals(1, count($collection)); $this->assertEquals('Text', $collection[0]['elementType']); $this->assertEquals('DefaultValueModelAttributeMappingRuleForm', get_class($collection[0]['mappingRuleForm'])); $this->assertEquals('Email', static::getReflectedPropertyValue($collection[0]['mappingRuleForm'], 'modelClassName')); $this->assertEquals('emailAddress', static::getReflectedPropertyValue($collection[0]['mappingRuleForm'], 'modelAttributeName')); }
/** * @param string $columnName * @param string $attributeIndexOrDerivedType * @param string $importRulesType * @param string $columnType * @param array $mappingRuleFormsAndElementTypes * @return string */ public function renderMappingRulesElements($columnName, $attributeIndexOrDerivedType, $importRulesType, $columnType, $mappingRuleFormsAndElementTypes) { assert('is_string($columnName)'); assert('is_string($attributeIndexOrDerivedType) || $attributeIndexOrDerivedType == null'); assert('is_string($importRulesType)'); assert('$columnType == "importColumn" || $columnType == "extraColumn"'); assert('is_array($mappingRuleFormsAndElementTypes) || $mappingRuleFormsAndElementTypes == null'); $content = null; $multipleMappingRulesCssClass = null; if ($attributeIndexOrDerivedType != null) { if ($mappingRuleFormsAndElementTypes == null) { $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType($importRulesType, $attributeIndexOrDerivedType); $mappingRuleFormsAndElementTypes = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, $attributeIndexOrDerivedType, $columnType); } if (count($mappingRuleFormsAndElementTypes) > 0) { $title = Zurmo::t('ImportModule', 'Rules'); } else { $title = null; } $content .= ZurmoHtml::tag('h4', array(), $title); foreach ($mappingRuleFormsAndElementTypes as $notUsed => $ruleFormAndElementType) { $mappingRuleForm = $ruleFormAndElementType['mappingRuleForm']; $elementClassName = $ruleFormAndElementType['elementType'] . 'Element'; $classToEvaluate = new ReflectionClass($elementClassName); if ($classToEvaluate->implementsInterface('DerivedElementInterface')) { $attributeName = 'null'; } else { $attributeName = $mappingRuleForm::getAttributeName(); } $params = array(); $params['inputPrefix'] = array($this->mappingFormModelClassName, $columnName, 'mappingRulesData', get_class($mappingRuleForm)); $element = new $elementClassName($mappingRuleForm, $attributeName, $this->form, $params); $element->editableTemplate = '<div>{label}{content}{error}</div>'; // In case of TagCloud or MultiSelectDropbox inform user that in cas of updating existing model, original values will be overwritten. // Prepend this text before content, so it will appear before "Rules" title if ($element instanceof ImportMappingRuleDefaultMultiSelectDropDownFormElement) { $content = $this->resolveTextAboutOverwritingMultiselectOrTagCloudValues($columnName . $attributeIndexOrDerivedType) . $content; } $content .= $element->render(); } } $subDivsCssClass = 'has' . count($mappingRuleFormsAndElementTypes); $content = ZurmoHtml::tag('div', array('id' => self::getMappingRulesDivIdByColumnName($columnName), 'class' => 'mapping-rules ' . $subDivsCssClass), $content); // Not Coding Standard return $content; }
public function renderMappingRulesElements($columnName, $attributeIndexOrDerivedType, $importRulesType, $columnType, $mappingRuleFormsAndElementTypes) { assert('is_string($columnName)'); assert('is_string($attributeIndexOrDerivedType) || $attributeIndexOrDerivedType == null'); assert('is_string($importRulesType)'); assert('$columnType == "importColumn" || $columnType == "extraColumn"'); assert('is_array($mappingRuleFormsAndElementTypes) || $mappingRuleFormsAndElementTypes == null'); $content = '<div id="' . self::getMappingRulesDivIdByColumnName($columnName) . '" class="mapping-rules">'; if ($attributeIndexOrDerivedType != null) { if ($mappingRuleFormsAndElementTypes == null) { $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType($importRulesType, $attributeIndexOrDerivedType); $mappingRuleFormsAndElementTypes = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, $attributeIndexOrDerivedType, $columnType); } foreach ($mappingRuleFormsAndElementTypes as $notUsed => $ruleFormAndElementType) { $mappingRuleForm = $ruleFormAndElementType['mappingRuleForm']; $elementClassName = $ruleFormAndElementType['elementType'] . 'Element'; $classToEvaluate = new ReflectionClass($elementClassName); if ($classToEvaluate->implementsInterface('DerivedElementInterface')) { $attributeName = 'null'; } else { $attributeName = $mappingRuleForm::getAttributeName(); } $params = array(); $params['inputPrefix'] = array($this->mappingFormModelClassName, $columnName, 'mappingRulesData', get_class($mappingRuleForm)); $element = new $elementClassName($mappingRuleForm, $attributeName, $this->form, $params); $content .= '<table><tbody><tr>'; $content .= $element->render(); $content .= '</tr></tbody></table>'; } } $content .= '</div>'; return $content; }