public function testMessages() { $resultsUtil = new ImportRowDataResultsUtil(55); $this->assertEquals(55, $resultsUtil->getId()); $this->assertEquals(0, count($resultsUtil->getMessages())); $resultsUtil->addMessage('some message'); $messages = $resultsUtil->getMessages(); $this->assertEquals(1, count($messages)); $this->assertEquals('some message', $messages[0]); $resultsUtil->addMessages(array('some message2', 'something else')); $messages = $resultsUtil->getMessages(); $this->assertEquals(3, count($messages)); }
/** * Process mapped columns to check for matched record by column * @param ImportRules $importRules * @param RedBeanModel $model * @param array $mappingData * @param RedBean_OODBBean $rowBean * @param ImportSanitizeResultsUtil $importSanitizeResultsUtil * @param array $skippedColumns */ protected static function processDedupeAttributesToCheckForSkipIfRequired(ImportRules $importRules, RedBeanModel $model, $mappingData, $rowBean, ImportRowDataResultsUtil $importRowDataResultsUtil, ImportSanitizeResultsUtil $importSanitizeResultsUtil, &$skippedColumns) { assert('$rowBean instanceof RedBean_OODBBean'); $isSkipped = false; //Process the dedupe fields foreach ($importRules->getDedupeAttributes() as $dedupeField) { $sourceColumnName = static::getMappedColumnNameByMappingData($dedupeField, $mappingData); if (false !== $sourceColumnName) { $columnMappingData = $mappingData[$sourceColumnName]; $attributeValueData = static::getAttributeValueData($importRules, $sourceColumnName, $columnMappingData, $rowBean, $importSanitizeResultsUtil); if (!$importSanitizeResultsUtil->shouldSaveModel()) { $importRowDataResultsUtil->addMessages($importSanitizeResultsUtil->getMessages()); $importRowDataResultsUtil->setStatusToError(); $isSkipped = true; } $skippedColumns[] = $sourceColumnName; } } return $isSkipped; }
/** * Given a row of data, resolve each value of the row for import and either create or update an existing model. * @param object $importRules * @param array $rowData * @param array $mappingData * @param object $importRowDataResultsUtil */ public static function importByImportRulesRowData(ImportRules $importRules, $rowBean, $mappingData, ImportRowDataResultsUtil $importRowDataResultsUtil, ExplicitReadWriteModelPermissions $explicitReadWriteModelPermissions) { assert('$rowBean instanceof RedBean_OODBBean'); assert('is_array($mappingData)'); $makeNewModel = true; $modelClassName = $importRules->getModelClassName(); $externalSystemId = null; $importSanitizeResultsUtil = new ImportSanitizeResultsUtil(); $afterSaveActionsData = array(); //Process the 'id' column first if available. if (false !== ($idColumnName = static::getIdColumnNameByMappingData($mappingData))) { $columnMappingData = $mappingData[$idColumnName]; $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType($importRules::getType(), $columnMappingData['attributeIndexOrDerivedType']); $valueReadyToSanitize = static::resolveValueToSanitizeByValueAndColumnType($rowBean->{$idColumnName}, $columnMappingData['type']); $attributeValueData = $attributeImportRules->resolveValueForImport($valueReadyToSanitize, $idColumnName, $columnMappingData, $importSanitizeResultsUtil); assert('count($attributeValueData) == 0 || count($attributeValueData) == 1'); if (isset($attributeValueData['id']) && $attributeValueData['id'] != null) { $model = $modelClassName::getById($attributeValueData['id']); $makeNewModel = false; } elseif (isset($attributeValueData[ExternalSystemIdUtil::EXTERNAL_SYSTEM_ID_COLUMN_NAME]) && $attributeValueData[ExternalSystemIdUtil::EXTERNAL_SYSTEM_ID_COLUMN_NAME] != null) { $externalSystemId = $attributeValueData[ExternalSystemIdUtil::EXTERNAL_SYSTEM_ID_COLUMN_NAME]; } } if ($makeNewModel) { $model = new $modelClassName(); $model->setScenario('importModel'); } //Process the rest of the mapped colummns. ignoring owner. foreach ($mappingData as $columnName => $columnMappingData) { if ($columnMappingData['attributeIndexOrDerivedType'] != null && $columnMappingData['attributeIndexOrDerivedType'] != 'owner' && $idColumnName != $columnName) { static::sanitizeValueAndPopulateModel($rowBean, $importRules, $model, $columnName, $modelClassName, $columnMappingData, $importSanitizeResultsUtil, $afterSaveActionsData); } } //Process the owner column if present foreach ($mappingData as $columnName => $columnMappingData) { if ($columnMappingData['attributeIndexOrDerivedType'] != null && $columnMappingData['attributeIndexOrDerivedType'] == 'owner' && $idColumnName != $columnName) { static::sanitizeValueAndPopulateModel($rowBean, $importRules, $model, $columnName, $modelClassName, $columnMappingData, $importSanitizeResultsUtil, $afterSaveActionsData); } } $validated = $model->validate(); if ($validated && $importSanitizeResultsUtil->shouldSaveModel()) { $saved = $model->save(); if ($saved) { static::processAfterSaveActions($afterSaveActionsData, $model); if ($externalSystemId != null) { ExternalSystemIdUtil::updateByModel($model, $externalSystemId); } $importRowDataResultsUtil->addMessage(Zurmo::t('ImportModule', '{modelLabel} saved correctly: {linkToModel}', array('{modelLabel}' => $model->getModelLabelByTypeAndLanguage('Singular'), '{linkToModel}' => static::resolveLinkMessageToModel($model)))); if ($makeNewModel) { if ($model instanceof SecurableItem) { try { $resolved = ExplicitReadWriteModelPermissionsUtil::resolveExplicitReadWriteModelPermissions($model, $explicitReadWriteModelPermissions); $importRowDataResultsUtil->setStatusToCreated(); if (!$resolved) { $importRowDataResultsUtil->addMessage('The record saved, but there was a problem ' . 'setting the security permissions. It will at least be viewable by the owner.'); $importRowDataResultsUtil->setStatusToError(); } } catch (AccessDeniedSecurityException $e) { $importRowDataResultsUtil->addMessage('The record saved, but you do not have permissions ' . 'to set the security the way you did. The record will only be viewable by the owner.'); $importRowDataResultsUtil->setStatusToError(); } } else { $importRowDataResultsUtil->setStatusToCreated(); } } else { $importRowDataResultsUtil->setStatusToUpdated(); } } else { $importRowDataResultsUtil->addMessage('The record failed to save. Reason unknown.'); $importRowDataResultsUtil->setStatusToError(); } } else { if (!$importSanitizeResultsUtil->shouldSaveModel()) { $importRowDataResultsUtil->addMessages($importSanitizeResultsUtil->getMessages()); } $messages = RedBeanModelErrorsToMessagesUtil::makeMessagesByModel($model); if (count($messages) > 0) { $importRowDataResultsUtil->addMessages($messages); } $importRowDataResultsUtil->setStatusToError(); } }