public function testMakeMessagesByModel() { $e = new E(); $e->e = 'whduahsdiuhiuashdiuauishduihaiushdiuhaisudhiuasd'; $m = new TestModelToMessagesModel(); $m->e = $e; $this->assertFalse($m->validate()); $messages = RedBeanModelErrorsToMessagesUtil::makeMessagesByModel($m); $compareData = array('TestModelToMessagesModel - Name - Name cannot be blank.', 'TestModelToMessagesModel - E - E is too long (maximum is 16 characters).'); $this->assertEquals($compareData, $messages); }
/** * 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(); $attributeValueData = array(); $skippedColumns = array(); $model = new $modelClassName(); $model->setScenario('importModel'); //Process the 'id' column first if available. if (false !== ($idColumnName = static::getMappedColumnNameByMappingData('id', $mappingData))) { $columnMappingData = $mappingData[$idColumnName]; $attributeValueData = static::getAttributeValueData($importRules, $idColumnName, $columnMappingData, $rowBean, $importSanitizeResultsUtil); assert('count($attributeValueData) == 0 || count($attributeValueData) == 1'); if (isset($attributeValueData['id']) && $attributeValueData['id'] != null) { $model = $modelClassName::getById($attributeValueData['id']); } 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]; } $skippedColumns[] = $idColumnName; } //Dedupe fields processing if (static::processDedupeAttributesToCheckForSkipIfRequired($importRules, $model, $mappingData, $rowBean, $importRowDataResultsUtil, $importSanitizeResultsUtil, $skippedColumns) !== true) { if (null != ($matchedModel = $importSanitizeResultsUtil->getMatchedModel())) { $model = $matchedModel; $makeNewModel = false; } //Process the dedupe fields foreach ($importRules->getDedupeAttributes() as $dedupeField) { $sourceColumnName = static::getMappedColumnNameByMappingData($dedupeField, $mappingData); if (false !== $sourceColumnName) { $columnMappingData = $mappingData[$sourceColumnName]; static::processImportInformationForAttributeDataAndPopulateModel($importRules, $sourceColumnName, $columnMappingData, $rowBean, $importSanitizeResultsUtil, $model, $afterSaveActionsData); } } } else { //as the row should be skipped return; } //Process the rest of the mapped colummns. ignoring owner. foreach ($mappingData as $columnName => $columnMappingData) { if ($columnMappingData['attributeIndexOrDerivedType'] != null && $columnMappingData['attributeIndexOrDerivedType'] != 'owner' && in_array($columnName, $skippedColumns) === false) { static::processImportInformationForAttributeDataAndPopulateModel($importRules, $columnName, $columnMappingData, $rowBean, $importSanitizeResultsUtil, $model, $afterSaveActionsData); } } //Process the owner column if present foreach ($mappingData as $columnName => $columnMappingData) { if ($columnMappingData['attributeIndexOrDerivedType'] != null && $columnMappingData['attributeIndexOrDerivedType'] == 'owner' && in_array($columnName, $skippedColumns) === false) { static::processImportInformationForAttributeDataAndPopulateModel($importRules, $columnName, $columnMappingData, $rowBean, $importSanitizeResultsUtil, $model, $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)))); $importRowDataResultsUtil->addMessages($importSanitizeResultsUtil->getRelatedModelMessages()); if ($makeNewModel) { if ($model instanceof SecurableItem) { $model->setScenario('doNotSetModifiedDateTimeOrUser'); 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(); } $model->setScenario('importModel'); } 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(); } }
/** * 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, $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', 'Record saved correctly.')); 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(); } }