diff --git a/lib/Models/Model.php b/lib/Models/Model.php index 7c6ebdaf51..a9763fc78d 100644 --- a/lib/Models/Model.php +++ b/lib/Models/Model.php @@ -5,6 +5,8 @@ namespace MailPoet\Models; if(!defined('ABSPATH')) exit; class Model extends \Sudzy\ValidModel { + const DUPLICATE_RECORD = 23000; + protected $_errors; protected $_new_record; @@ -26,13 +28,16 @@ class Model extends \Sudzy\ValidModel { } } - function setError($error = '') { + function setError($error = '', $error_code = null) { + if(!$error_code) { + $error_code = count($this->_errors); + } if(!empty($error)) { if(is_array($error)) { $this->_errors = array_merge($this->_errors, $error); $this->_errors = array_unique($this->_errors); } else { - $this->_errors[] = $error; + $this->_errors[$error_code] = $error; } } } @@ -54,7 +59,8 @@ class Model extends \Sudzy\ValidModel { sprintf( __('Another record already exists. Please specify a different "%1$s".', 'mailpoet'), $column - ) + ), + Model::DUPLICATE_RECORD ); } else { $this->setError($e->getMessage()); diff --git a/tests/unit/Models/ModelTest.php b/tests/unit/Models/ModelTest.php index 626a9c1ab4..51c9a0dc4c 100644 --- a/tests/unit/Models/ModelTest.php +++ b/tests/unit/Models/ModelTest.php @@ -43,6 +43,46 @@ class ModelTest extends \MailPoetTest { ); } + function testSetErrorsWithoutCode() { + $model = MPModel::create(); + $model->setError('error1'); + $model->setError('error2'); + expect($model->getErrors())->equals(array('error1', 'error2')); + } + + function testSetErrorsAsArray() { + $model = MPModel::create(); + $model->setError(array('error1')); + $model->setError(array('error2', 'error1')); + expect($model->getErrors())->equals(array('error1', 'error2')); + } + + function testSetErrorsWithCode() { + $model = MPModel::create(); + $model->setError('error1'); + $model->setError('error2', 5); + expect($model->getErrors())->equals(array('error1', 5 => 'error2')); + } + + function testSetErrorCodeForDuplicateRecords() { + $orm = Stub::makeEmpty( + 'ORM', + array( + 'save' => function() { + throw new \PDOException("error for key 'name'", MPModel::DUPLICATE_RECORD); + } + ) + ); + $model = MPModel::create(); + $model->setError('error1'); + $model->setError('error2', 5); + $model->set_orm($orm); + $model->save(); + $errors = $model->getErrors(); + expect($errors)->hasKey(MPModel::DUPLICATE_RECORD); + expect($errors[MPModel::DUPLICATE_RECORD])->contains('Please specify a different "name".'); + } + function _after() { \ORM::setDb(null); }