Browse Source

Merge pull request #1051 from cebe/validator-message-format

Validator message format
tags/2.0.0-beta
Qiang Xue 11 years ago
parent
commit
9f7ca5d222
  1. 41
      framework/yii/i18n/I18N.php
  2. 4
      framework/yii/validators/BooleanValidator.php
  3. 4
      framework/yii/validators/CompareValidator.php
  4. 10
      framework/yii/validators/FileValidator.php
  5. 4
      framework/yii/validators/NumberValidator.php
  6. 2
      framework/yii/validators/RequiredValidator.php
  7. 6
      framework/yii/validators/StringValidator.php
  8. 6
      framework/yii/validators/Validator.php
  9. 24
      framework/yii/widgets/BaseListView.php
  10. 6
      tests/unit/framework/validators/BooleanValidatorTest.php
  11. 5
      tests/unit/framework/validators/CompareValidatorTest.php
  12. 6
      tests/unit/framework/validators/DateValidatorTest.php
  13. 6
      tests/unit/framework/validators/DefaultValueValidatorTest.php
  14. 6
      tests/unit/framework/validators/EmailValidatorTest.php
  15. 1
      tests/unit/framework/validators/ExistValidatorTest.php
  16. 6
      tests/unit/framework/validators/FilterValidatorTest.php
  17. 6
      tests/unit/framework/validators/NumberValidatorTest.php
  18. 6
      tests/unit/framework/validators/RangeValidatorTest.php
  19. 6
      tests/unit/framework/validators/RegularExpressionValidatorTest.php
  20. 6
      tests/unit/framework/validators/RequiredValidatorTest.php
  21. 1
      tests/unit/framework/validators/UniqueValidatorTest.php
  22. 6
      tests/unit/framework/validators/UrlValidatorTest.php
  23. 7
      tests/unit/framework/validators/ValidatorTest.php

41
framework/yii/i18n/I18N.php

@ -62,6 +62,9 @@ class I18N extends Component
/**
* Translates a message to the specified language.
*
* After translation the message will be formatted using [[MessageFormatter]] if it contains
* ICU message format and `$params` are not empty.
*
* @param string $category the message category.
* @param string $message the message to be translated.
* @param array $params the parameters that will be used to replace the corresponding placeholders in the message.
@ -101,6 +104,44 @@ class I18N extends Component
}
/**
* Formats a message using using [[MessageFormatter]].
*
* @param string $message the message to be formatted.
* @param array $params the parameters that will be used to replace the corresponding placeholders in the message.
* @param string $language the language code (e.g. `en_US`, `en`).
* @return string the formatted message.
*/
public function format($message, $params, $language)
{
$params = (array)$params;
if ($params === []) {
return $message;
}
if (preg_match('~{\s*[\d\w]+\s*,~u', $message)) {
$formatter = new MessageFormatter($language, $message);
if ($formatter === null) {
Yii::warning("Message for $language is invalid: $message.");
return $message;
}
$result = $formatter->format($params);
if ($result === false) {
$errorMessage = $formatter->getErrorMessage();
Yii::warning("Formatting message for $language failed with error: $errorMessage. Message is: $message.");
return $message;
} else {
return $result;
}
}
$p = [];
foreach($params as $name => $value) {
$p['{' . $name . '}'] = $value;
}
return strtr($message, $p);
}
/**
* Returns the message source for the given category.
* @param string $category the category name.
* @return MessageSource the message source for the given category.

4
framework/yii/validators/BooleanValidator.php

@ -58,8 +58,8 @@ class BooleanValidator extends Validator
$value = $object->$attribute;
if (!$this->validateValue($value)) {
$this->addError($object, $attribute, $this->message, [
'{true}' => $this->trueValue,
'{false}' => $this->falseValue,
'true' => $this->trueValue,
'false' => $this->falseValue,
]);
}
}

4
framework/yii/validators/CompareValidator.php

@ -143,8 +143,8 @@ class CompareValidator extends Validator
}
if (!$valid) {
$this->addError($object, $attribute, $this->message, [
'{compareAttribute}' => $compareLabel,
'{compareValue}' => $compareValue,
'compareAttribute' => $compareLabel,
'compareValue' => $compareValue,
]);
}
}

10
framework/yii/validators/FileValidator.php

@ -144,7 +144,7 @@ class FileValidator extends Validator
$this->addError($object, $attribute, $this->uploadRequired);
}
if (count($files) > $this->maxFiles) {
$this->addError($object, $attribute, $this->tooMany, ['{attribute}' => $attribute, '{limit}' => $this->maxFiles]);
$this->addError($object, $attribute, $this->tooMany, ['limit' => $this->maxFiles]);
} else {
foreach ($files as $file) {
$this->validateFile($object, $attribute, $file);
@ -171,18 +171,18 @@ class FileValidator extends Validator
switch ($file->error) {
case UPLOAD_ERR_OK:
if ($this->maxSize !== null && $file->size > $this->maxSize) {
$this->addError($object, $attribute, $this->tooBig, ['{file}' => $file->name, '{limit}' => $this->getSizeLimit()]);
$this->addError($object, $attribute, $this->tooBig, ['file' => $file->name, 'limit' => $this->getSizeLimit()]);
}
if ($this->minSize !== null && $file->size < $this->minSize) {
$this->addError($object, $attribute, $this->tooSmall, ['{file}' => $file->name, '{limit}' => $this->minSize]);
$this->addError($object, $attribute, $this->tooSmall, ['file' => $file->name, 'limit' => $this->minSize]);
}
if (!empty($this->types) && !in_array(strtolower(pathinfo($file->name, PATHINFO_EXTENSION)), $this->types, true)) {
$this->addError($object, $attribute, $this->wrongType, ['{file}' => $file->name, '{extensions}' => implode(', ', $this->types)]);
$this->addError($object, $attribute, $this->wrongType, ['file' => $file->name, 'extensions' => implode(', ', $this->types)]);
}
break;
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
$this->addError($object, $attribute, $this->tooBig, ['{file}' => $file->name, '{limit}' => $this->getSizeLimit()]);
$this->addError($object, $attribute, $this->tooBig, ['file' => $file->name, 'limit' => $this->getSizeLimit()]);
break;
case UPLOAD_ERR_PARTIAL:
$this->addError($object, $attribute, $this->message);

4
framework/yii/validators/NumberValidator.php

@ -91,10 +91,10 @@ class NumberValidator extends Validator
$this->addError($object, $attribute, $this->message);
}
if ($this->min !== null && $value < $this->min) {
$this->addError($object, $attribute, $this->tooSmall, ['{min}' => $this->min]);
$this->addError($object, $attribute, $this->tooSmall, ['min' => $this->min]);
}
if ($this->max !== null && $value > $this->max) {
$this->addError($object, $attribute, $this->tooBig, ['{max}' => $this->max]);
$this->addError($object, $attribute, $this->tooBig, ['max' => $this->max]);
}
}

2
framework/yii/validators/RequiredValidator.php

@ -75,7 +75,7 @@ class RequiredValidator extends Validator
$this->addError($object, $attribute, $this->message);
} else {
$this->addError($object, $attribute, $this->message, [
'{requiredValue}' => $this->requiredValue,
'requiredValue' => $this->requiredValue,
]);
}
}

6
framework/yii/validators/StringValidator.php

@ -112,13 +112,13 @@ class StringValidator extends Validator
$length = mb_strlen($value, $this->encoding);
if ($this->min !== null && $length < $this->min) {
$this->addError($object, $attribute, $this->tooShort, ['{min}' => $this->min]);
$this->addError($object, $attribute, $this->tooShort, ['min' => $this->min]);
}
if ($this->max !== null && $length > $this->max) {
$this->addError($object, $attribute, $this->tooLong, ['{max}' => $this->max]);
$this->addError($object, $attribute, $this->tooLong, ['max' => $this->max]);
}
if ($this->length !== null && $length !== $this->length) {
$this->addError($object, $attribute, $this->notEqual, ['{length}' => $this->length]);
$this->addError($object, $attribute, $this->notEqual, ['length' => $this->length]);
}
}

6
framework/yii/validators/Validator.php

@ -251,9 +251,9 @@ abstract class Validator extends Component
public function addError($object, $attribute, $message, $params = [])
{
$value = $object->$attribute;
$params['{attribute}'] = $object->getAttributeLabel($attribute);
$params['{value}'] = is_array($value) ? 'array()' : $value;
$object->addError($attribute, strtr($message, $params));
$params['attribute'] = $object->getAttributeLabel($attribute);
$params['value'] = is_array($value) ? 'array()' : $value;
$object->addError($attribute, Yii::$app->getI18n()->format($message, $params, Yii::$app->language));
}
/**

24
framework/yii/widgets/BaseListView.php

@ -131,30 +131,32 @@ abstract class BaseListView extends Widget
public function renderSummary()
{
$count = $this->dataProvider->getCount();
if (($pagination = $this->dataProvider->getPagination()) !== false && $count > 0) {
if (($pagination = $this->dataProvider->getPagination()) !== false) {
$totalCount = $this->dataProvider->getTotalCount();
$begin = $pagination->getPage() * $pagination->pageSize + 1;
$end = $begin + $count - 1;
$page = $pagination->getPage() + 1;
$pageCount = $pagination->pageCount;
if (($summaryContent = $this->summary) === null) {
$summaryContent = '<div class="summary">' . Yii::t('yii', 'Showing <b>{begin}-{end}</b> of <b>{totalCount}</b> {0, plural, =1{item} other{items}}.', $totalCount) . '</div>';
$summaryContent = '<div class="summary">'
. Yii::t('yii', 'Showing <b>{totalCount, plural, =0{0} other{{begin}-{end}}}</b> of <b>{totalCount}</b> {totalCount, plural, one{item} other{items}}.')
. '</div>';
}
} else {
$begin = $page = $pageCount = 1;
$end = $totalCount = $count;
if (($summaryContent = $this->summary) === null) {
$summaryContent = '<div class="summary">' . Yii::t('yii', 'Total <b>{count}</b> {0, plural, =1{item} other{items}}.', $count) . '</div>';
$summaryContent = '<div class="summary">' . Yii::t('yii', 'Total <b>{count}</b> {count, plural, one{item} other{items}}.') . '</div>';
}
}
return strtr($summaryContent, [
'{begin}' => $begin,
'{end}' => $end,
'{count}' => $count,
'{totalCount}' => $totalCount,
'{page}' => $page,
'{pageCount}' => $pageCount,
]);
return Yii::$app->getI18n()->format($summaryContent, [
'begin' => $begin,
'end' => $end,
'count' => $count,
'totalCount' => $totalCount,
'page' => $page,
'pageCount' => $pageCount,
], Yii::$app->language);
}
/**

6
tests/unit/framework/validators/BooleanValidatorTest.php

@ -10,6 +10,12 @@ use yiiunit\TestCase;
*/
class BooleanValidatorTest extends TestCase
{
protected function setUp()
{
parent::setUp();
$this->mockApplication();
}
public function testValidateValue()
{
$val = new BooleanValidator;

5
tests/unit/framework/validators/CompareValidatorTest.php

@ -10,6 +10,11 @@ use yiiunit\TestCase;
class CompareValidatorTest extends TestCase
{
protected function setUp()
{
parent::setUp();
$this->mockApplication();
}
public function testValidateValueException()
{

6
tests/unit/framework/validators/DateValidatorTest.php

@ -10,6 +10,12 @@ use yiiunit\TestCase;
class DateValidatorTest extends TestCase
{
protected function setUp()
{
parent::setUp();
$this->mockApplication();
}
public function testEnsureMessageIsSet()
{
$val = new DateValidator;

6
tests/unit/framework/validators/DefaultValueValidatorTest.php

@ -8,6 +8,12 @@ use yiiunit\TestCase;
*/
class DefaultValueValidatorTest extends TestCase
{
protected function setUp()
{
parent::setUp();
$this->mockApplication();
}
public function testValidateAttribute()
{
$val = new DefaultValueValidator;

6
tests/unit/framework/validators/EmailValidatorTest.php

@ -11,6 +11,12 @@ use yiiunit\TestCase;
*/
class EmailValidatorTest extends TestCase
{
protected function setUp()
{
parent::setUp();
$this->mockApplication();
}
public function testValidateValue()
{
$validator = new EmailValidator();

1
tests/unit/framework/validators/ExistValidatorTest.php

@ -18,6 +18,7 @@ class ExistValidatorTest extends DatabaseTestCase
public function setUp()
{
parent::setUp();
$this->mockApplication();
ActiveRecord::$db = $this->getConnection();
}

6
tests/unit/framework/validators/FilterValidatorTest.php

@ -9,6 +9,12 @@ use yiiunit\TestCase;
class FilterValidatorTest extends TestCase
{
protected function setUp()
{
parent::setUp();
$this->mockApplication();
}
public function testAssureExceptionOnInit()
{
$this->setExpectedException('yii\base\InvalidConfigException');

6
tests/unit/framework/validators/NumberValidatorTest.php

@ -9,6 +9,12 @@ use yiiunit\TestCase;
class NumberValidatorTest extends TestCase
{
protected function setUp()
{
parent::setUp();
$this->mockApplication();
}
public function testEnsureMessageOnInit()
{
$val = new NumberValidator;

6
tests/unit/framework/validators/RangeValidatorTest.php

@ -9,6 +9,12 @@ use yiiunit\TestCase;
class RangeValidatorTest extends TestCase
{
protected function setUp()
{
parent::setUp();
$this->mockApplication();
}
public function testInitException()
{
$this->setExpectedException('yii\base\InvalidConfigException', 'The "range" property must be set.');

6
tests/unit/framework/validators/RegularExpressionValidatorTest.php

@ -9,6 +9,12 @@ use yiiunit\TestCase;
class RegularExpressionValidatorTest extends TestCase
{
protected function setUp()
{
parent::setUp();
$this->mockApplication();
}
public function testValidateValue()
{
$val = new RegularExpressionValidator(['pattern' => '/^[a-zA-Z0-9](\.)?([^\/]*)$/m']);

6
tests/unit/framework/validators/RequiredValidatorTest.php

@ -8,6 +8,12 @@ use yiiunit\TestCase;
class RequiredValidatorTest extends TestCase
{
protected function setUp()
{
parent::setUp();
$this->mockApplication();
}
public function testValidateValueWithDefaults()
{
$val = new RequiredValidator();

1
tests/unit/framework/validators/UniqueValidatorTest.php

@ -18,6 +18,7 @@ class UniqueValidatorTest extends DatabaseTestCase
public function setUp()
{
parent::setUp();
$this->mockApplication();
ActiveRecord::$db = $this->getConnection();
}

6
tests/unit/framework/validators/UrlValidatorTest.php

@ -9,6 +9,12 @@ use yiiunit\TestCase;
*/
class UrlValidatorTest extends TestCase
{
protected function setUp()
{
parent::setUp();
$this->mockApplication();
}
public function testValidateValue()
{
$val = new UrlValidator;

7
tests/unit/framework/validators/ValidatorTest.php

@ -12,6 +12,11 @@ use yiiunit\TestCase;
class ValidatorTest extends TestCase
{
protected function setUp()
{
parent::setUp();
$this->mockApplication();
}
protected function getTestModel($additionalAttributes = [])
{
@ -220,7 +225,7 @@ class ValidatorTest extends TestCase
$errors = $m->getErrors('attr_msg_val');
$this->assertEquals('attr_msg_val::array()', $errors[0]);
$m = $this->getTestModel(['attr_msg_val' => 'abc']);
$val->addError($m, 'attr_msg_val', '{attribute}::{value}::{param}', ['{param}' => 'param_value']);
$val->addError($m, 'attr_msg_val', '{attribute}::{value}::{param}', ['param' => 'param_value']);
$errors = $m->getErrors('attr_msg_val');
$this->assertEquals('attr_msg_val::abc::param_value', $errors[0]);
}

Loading…
Cancel
Save