public function testMakeByImportRulesTypeAndAttributeIndexOrDerivedType() { //Make a non-derived attributeImportRules object. $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType('ImportModelTestItem', 'string'); $this->assertTrue($attributeImportRules instanceof TextAttributeImportRules); //Make a derived attributeImportRules object. $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType('ImportModelTestItem', 'FullName'); $this->assertTrue($attributeImportRules instanceof FullNameAttributeImportRules); }
protected function resolveHeaderColumnContent($columnName, $label) { $content = static::resolveHeaderLabelByColumnNameAndLabel($columnName, $label); if ($this->mappingData[$columnName]['attributeIndexOrDerivedType'] != null) { $attributeIndexOrDerivedType = $this->mappingData[$columnName]['attributeIndexOrDerivedType']; $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType($this->importRulesType, $attributeIndexOrDerivedType); $content .= ZurmoHtml::tag('span', array('class' => 'icon-import-mapping'), '↓'); $content .= $attributeImportRules->getDisplayLabel(); } return $content; }
/** * Get attribute import rules * @param ImportRules $importRules * @param array $columnMappingData * @return object containing attribute import rules * @throws NotSupportedException */ protected static function getAttributeImportRules(ImportRules $importRules, $columnMappingData) { $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType($importRules::getType(), $columnMappingData['attributeIndexOrDerivedType'], self::getPenultimateModelClassNameByImportRules($importRules)); if ($attributeImportRules->getModelClassName() == null) { throw new NotSupportedException(); } return $attributeImportRules; }
public function testParentAccountHasCorrectAttributeImportType() { $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType('Accounts', 'account'); $this->assertTrue($attributeImportRules instanceof AccountAttributeImportRules); }
public function analyzePage() { $data = $this->dataProvider->getData(true); foreach ($data as $rowBean) { assert('$rowBean->id != null'); $columnMessages = array(); $shouldSkipRow = false; foreach ($this->sanitizableColumnNames as $columnName) { $attributeIndexOrDerivedType = $this->mappingData[$columnName]['attributeIndexOrDerivedType']; $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType($this->importRules->getType(), $attributeIndexOrDerivedType); $modelClassName = $attributeImportRules->getModelClassName(); $attributeName = static::resolveAttributeNameByRules($attributeImportRules); if (null != ($attributeValueSanitizerUtilTypes = $attributeImportRules->getSanitizerUtilTypesInProcessingOrder())) { assert('is_array($attributeValueSanitizerUtilTypes)'); foreach ($attributeValueSanitizerUtilTypes as $attributeValueSanitizerUtilType) { $sanitizer = ImportSanitizerUtilFactory::make($attributeValueSanitizerUtilType, $modelClassName, $attributeName, $columnName, $this->mappingData[$columnName]); $sanitizer->analyzeByRow($rowBean); if ($sanitizer->getShouldSkipRow()) { $shouldSkipRow = true; } foreach ($sanitizer->getAnalysisMessages() as $message) { $columnMessages[$columnName][] = $message; } $classToEvaluate = new ReflectionClass($sanitizer); if ($classToEvaluate->implementsInterface('ImportSanitizerHasCustomFieldValuesInterface')) { $missingCustomFieldValues = $sanitizer->getMissingCustomFieldValues(); $this->getCustomFieldsInstructionData()->addMissingValuesByColumnName($missingCustomFieldValues, $columnName); } } } } if (!empty($columnMessages)) { $rowBean->serializedAnalysisMessages = serialize($columnMessages); if ($shouldSkipRow) { $rowBean->analysisStatus = static::STATUS_SKIP; } else { $rowBean->analysisStatus = static::STATUS_WARN; } } else { $rowBean->serializedAnalysisMessages = null; $rowBean->analysisStatus = static::STATUS_CLEAN; } R::store($rowBean); } }
protected static function sanitizeValueAndPopulateModel(RedBean_OODBBean $rowBean, ImportRules $importRules, RedBeanModel $model, $columnName, $modelClassName, $columnMappingData, ImportSanitizeResultsUtil $importSanitizeResultsUtil, &$afterSaveActionsData) { assert('is_array($afterSaveActionsData)'); assert('is_string($columnName)'); assert('is_string($modelClassName)'); assert('$columnMappingData["type"] == "importColumn" || $columnMappingData["type"] == "extraColumn"'); $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType($importRules::getType(), $columnMappingData['attributeIndexOrDerivedType']); $valueReadyToSanitize = static::resolveValueToSanitizeByValueAndColumnType($rowBean->{$columnName}, $columnMappingData['type']); if ($attributeImportRules instanceof NonDerivedAttributeImportRules && $attributeImportRules->getModelClassName() != $modelClassName) { static::resolveModelForAttributeIndexWithMultipleNonDerivedAttributes($model, $attributeImportRules, $valueReadyToSanitize, $columnName, $columnMappingData, $importSanitizeResultsUtil); } elseif ($attributeImportRules instanceof ModelDerivedAttributeImportRules) { static::resolveModelForModelDerivedAttribute($model, $importRules::getType(), $attributeImportRules, $valueReadyToSanitize, $columnName, $columnMappingData, $importSanitizeResultsUtil); } elseif ($attributeImportRules instanceof AfterSaveActionDerivedAttributeImportRules) { static::resolveAfterSaveActionDerivedAttributeImportRules($afterSaveActionsData, $attributeImportRules, $valueReadyToSanitize, $columnName, $columnMappingData, $importSanitizeResultsUtil); } elseif ($attributeImportRules instanceof AfterSaveActionNonDerivedAttributeImportRules) { static::resolveAfterSaveActionNonDerivedAttributeImportRules($afterSaveActionsData, $attributeImportRules, $valueReadyToSanitize, $columnName, $columnMappingData, $importSanitizeResultsUtil); } else { static::resolveModelForAttributeIndexWithSingleAttributeOrDerivedAttribute($model, $attributeImportRules, $valueReadyToSanitize, $columnName, $columnMappingData, $importSanitizeResultsUtil); } }
/** * Given a column name and column mapping data, perform data analysis on the column based on the mapped * attribute index or derived type. The attribute index or derived type will correspond with an attribute * import rules which will have information on what sanitizers to use. Based on this, the correct sanitizers * will be called and their appropriate analyzers will be used. * NOTE - Analysis is only performed on mapped import columns and not extra columns with mapping rules. * @param string $columnName * @param array $columnMappingData */ public function analyzeByColumnNameAndColumnMappingData($columnName, $columnMappingData) { assert('is_string($columnMappingData["attributeIndexOrDerivedType"]) || $columnMappingData["attributeIndexOrDerivedType"] == null'); assert('$columnMappingData["type"] == "importColumn" || $columnMappingData["type"] == "extraColumn"'); if ($columnMappingData['attributeIndexOrDerivedType'] == null) { return; } //Currently does not support data analysis on extra columns. if ($columnMappingData['type'] == 'extraColumn') { return; } $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType($this->importRules->getType(), $columnMappingData['attributeIndexOrDerivedType']); $modelClassName = $attributeImportRules->getModelClassName(); $attributeNames = $attributeImportRules->getRealModelAttributeNames(); if (count($attributeNames) > 1 || $attributeNames == null) { $dataAnalyzerAttributeName = null; } else { $dataAnalyzerAttributeName = $attributeNames[0]; } if (null != ($attributeValueSanitizerUtilTypes = $attributeImportRules->getSanitizerUtilTypesInProcessingOrder())) { assert('is_array($attributeValueSanitizerUtilTypes)'); foreach ($attributeValueSanitizerUtilTypes as $attributeValueSanitizerUtilType) { $attributeValueSanitizerUtilClassName = $attributeValueSanitizerUtilType . 'SanitizerUtil'; if ($attributeValueSanitizerUtilClassName::supportsSqlAttributeValuesDataAnalysis()) { $sanitizerUtilType = $attributeValueSanitizerUtilClassName::getType(); $sqlAttributeValuesDataAnalyzer = $attributeValueSanitizerUtilClassName::makeSqlAttributeValueDataAnalyzer($modelClassName, $dataAnalyzerAttributeName); assert('$sqlAttributeValuesDataAnalyzer != null'); $this->resolveRun($columnName, $columnMappingData, $attributeValueSanitizerUtilClassName, $sqlAttributeValuesDataAnalyzer); $messages = $sqlAttributeValuesDataAnalyzer->getMessages(); if ($messages != null) { foreach ($messages as $message) { $moreAvailable = $sqlAttributeValuesDataAnalyzer::supportsAdditionalResultInformation(); $this->addMessageDataByColumnName($columnName, $message, $sanitizerUtilType, $moreAvailable); } } $instructionsData = $sqlAttributeValuesDataAnalyzer->getInstructionsData(); if (!empty($instructionsData)) { $this->addInstructionDataByColumnName($columnName, $instructionsData, $sanitizerUtilType); } } elseif ($attributeValueSanitizerUtilClassName::supportsBatchAttributeValuesDataAnalysis()) { $sanitizerUtilType = $attributeValueSanitizerUtilClassName::getType(); $batchAttributeValuesDataAnalyzer = $attributeValueSanitizerUtilClassName::makeBatchAttributeValueDataAnalyzer($modelClassName, $dataAnalyzerAttributeName); assert('$batchAttributeValuesDataAnalyzer != null'); $this->resolveRun($columnName, $columnMappingData, $attributeValueSanitizerUtilClassName, $batchAttributeValuesDataAnalyzer); $messages = $batchAttributeValuesDataAnalyzer->getMessages(); if ($messages != null) { foreach ($messages as $message) { $moreAvailable = $batchAttributeValuesDataAnalyzer::supportsAdditionalResultInformation(); $this->addMessageDataByColumnName($columnName, $message, $sanitizerUtilType, $moreAvailable); } } $instructionsData = $batchAttributeValuesDataAnalyzer->getInstructionsData(); if (!empty($instructionsData)) { $this->addInstructionDataByColumnName($columnName, $instructionsData, $sanitizerUtilType); } } } } }
/** * @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; }
protected function processColumns($params) { $completionPosition = 1; if (!isset($params["columnNameToProcess"])) { $params["columnNameToProcess"] = $this->getNextMappedColumnName($this->mappingData); } else { assert('is_string($params["columnNameToProcess"])'); } $completionPosition = array_search($params["columnNameToProcess"], $this->sanitizableColumnNames) + 1; if ($completionPosition != count($this->sanitizableColumnNames)) { $completionPosition++; } $this->subSequenceCompletionPercentage = $completionPosition / count($this->sanitizableColumnNames) * 100; //Run data analyzer if ($this->mappingData[$params["columnNameToProcess"]]['attributeIndexOrDerivedType'] == null) { throw new NotSupportedException(); } $importDataAnalyzer = new ImportDataAnalyzer($this->importRules, $this->dataProvider); $importDataAnalyzer->analyzeByColumnNameAndColumnMappingData($params["columnNameToProcess"], $this->mappingData[$params["columnNameToProcess"]]); $messagesData = $importDataAnalyzer->getMessagesData(); $importInstructionsData = $importDataAnalyzer->getImportInstructionsData(); $unserializedData = unserialize($this->import->serializedData); $unserializedData['mappingData'] = ImportMappingUtil::resolveImportInstructionsDataIntoMappingData($this->mappingData, $importInstructionsData); $this->import->serializedData = serialize($unserializedData); ImportUtil::setDataAnalyzerMessagesDataToImport($this->import, $messagesData, true); $saved = $this->import->save(); if (!$saved) { throw new FailedToSaveModelException(); } $nextColumnName = $this->getNextMappedColumnName($this->mappingData, $params['columnNameToProcess']); if ($nextColumnName == null) { $this->nextStep = null; $this->nextMessage = null; $this->complete = true; return null; } else { $params['columnNameToProcess'] = $nextColumnName; $this->nextStep = 'processColumns'; $this->setNextMessageByStep($this->nextStep); $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType($this->importRules->getType(), $this->mappingData[$params["columnNameToProcess"]]['attributeIndexOrDerivedType']); $this->nextMessage .= ' ' . $attributeImportRules->getDisplayLabel(); return $params; } }
/** * * Make an array of index/values that are the column names and their respective labels. * @param array $mappingData * @param array $importRulesType */ public static function makeColumnNamesAndAttributeIndexOrDerivedTypeLabels($mappingData, $importRulesType) { assert('is_array($mappingData)'); assert('is_string($importRulesType)'); $columnNamesAndAttributeIndexOrDerivedTypeLabels = array(); foreach ($mappingData as $columnName => $columnData) { if ($columnData['attributeIndexOrDerivedType'] != null) { $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType($importRulesType, $columnData['attributeIndexOrDerivedType']); $columnNamesAndAttributeIndexOrDerivedTypeLabels[$columnName] = $attributeImportRules->getDisplayLabel(); } else { $columnNamesAndAttributeIndexOrDerivedTypeLabels[$columnName] = null; } } return $columnNamesAndAttributeIndexOrDerivedTypeLabels; }
/** * @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 testGetExtraColumnUsableCountOfModelAttributeMappingRuleFormTypesAndElementTypes() { $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType('ImportModelTestItem', 'modifiedByUser'); $count = $attributeImportRules->getExtraColumnUsableCountOfModelAttributeMappingRuleFormTypesAndElementTypes(); $this->assertEquals(0, $count); $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType('ImportModelTestItem', 'dropDown'); $count = $attributeImportRules->getExtraColumnUsableCountOfModelAttributeMappingRuleFormTypesAndElementTypes(); $this->assertEquals(1, $count); }
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; }