diff --git a/_data/sidebars/flexberry-ember-2_sidebar.yml b/_data/sidebars/flexberry-ember-2_sidebar.yml index 8956add8b..a18789414 100644 --- a/_data/sidebars/flexberry-ember-2_sidebar.yml +++ b/_data/sidebars/flexberry-ember-2_sidebar.yml @@ -160,9 +160,9 @@ entries: url: /efd2_enum.html output: web, pdf - - title: Model validation - title_ru: Валидация модели - url: /efd2_model-validation.html + - title: Data validation + title_ru: Валидация данных + url: /efd3_validations.html output: web, pdf - title: Date and time validation diff --git a/_data/sidebars/flexberry-ember-3_sidebar.yml b/_data/sidebars/flexberry-ember-3_sidebar.yml index 35345a87f..4ccb7ff50 100644 --- a/_data/sidebars/flexberry-ember-3_sidebar.yml +++ b/_data/sidebars/flexberry-ember-3_sidebar.yml @@ -51,9 +51,9 @@ entries: url: /efd3_query-language.html output: web, pdf - - title: Model validation - title_ru: Валидация моделей - url: /efd3_model-validation.html + - title: Data validation + title_ru: Валидация данных + url: /efd3_validations.html output: web, pdf - title: Components diff --git a/pages/products/flexberry-ember/2.x/work-with-data/efd2_model-validation.en.md b/pages/products/flexberry-ember/2.x/work-with-data/efd2_model-validation.en.md deleted file mode 100644 index f3f25a8b6..000000000 --- a/pages/products/flexberry-ember/2.x/work-with-data/efd2_model-validation.en.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: validation of the model -sidebar: flexberry-ember-2_sidebar -keywords: Flexberry Ember -toc: true -permalink: en/efd2_model-validation.html -folder: products/ember-flexberry-data/models-and-projections/ -lang: en -autotranslated: true -hash: f06cc56f55bd72bc15d30ca679b8e40b944bf27e0aa5e8cb32ee2dee9c139ae4 -summary: Describes the basic steps for configuring validation ---- - -## Description - -Client validation is configured in the application based on addon [Ember Validations](https://github.com/dockyard/ember-validations) (the documentation for this addon more than the capacity to define rules). - -The validation set of the model (other manipulation of configuration are sewn in technology Flexberry ASP.NET Ember): - -```javascript -var Model = BaseModel.extend({ - номерПроекта: DS.attr('string'), - краткоеСодержание: DS.attr('string'), - визирование: DS.attr('boolean', {defaultValue: false}), - примечание: DS.attr('string'), - - // Validation rules. - validations: { - номерПроекта: { presence: true }, - краткоеСодержание: { presence: true, length: { maximum: 255 } }, - визирование: { presence: true }, - примечание: { length: { maximum: 255 } }, - } -}); -``` - -To display the validation on the edit form in the corresponding template you must write about the following (styles and position of elements may be different): - -```html -
-
- -
-
- `model.errors.номерПроекта` - `input type="text" placeholder="(no value)" value=model.номерПроекта` -
-
-``` - -{% include note.html content="Since validation initially, it is believed that fields of type Boolean the value `null`, to not show the message validation, you can specify [default value](http://guides.emberjs.com/v2.4.0/models/defining-models/) (as is done in the example above)." %} - -## Types of validators - -There are standard validators provided by the addon Ember Validations and custom validators provided with the addon [ember-flexberry](https://github.com/Flexberry/ember-flexberry). - -### Standard validators - -Addon Ember Validations include the following validators: - -* `absence` - verifying that validated the property must be empty. [Read more](https://github.com/dockyard/ember-validations#absence). -* `acceptance` - verifying that validated the property is a valid value (set in the validator). [Read more](https://github.com/dockyard/ember-validations#acceptance). -* `confirmation` - check that the value of the validated property is the value of the property propertyConfirmation, where property is the name you want to validate properties. [Read more](https://github.com/dockyard/ember-validations#confirmation). -* `exclusion` - check that the value of validated properties are not included in the list of invalid values. [Read more](https://github.com/dockyard/ember-validations#exclusion). -* `format` - check that the value you want to validate the property match the given regular expression. [Read more](https://github.com/dockyard/ember-validations#format). -* `inclusion` - check that the value you want to validate the properties included in the list of valid values. [Read more](https://github.com/dockyard/ember-validations#inclusion). -* `length` - check that the value of validated properties is the specified length. [Read more](https://github.com/dockyard/ember-validations#length). -* `numericality` - check that the value of the validated property is numeric. [Read more](https://github.com/dockyard/ember-validations#numericality). -* `presence` - verifying that validated the property must not be empty. [Read more](https://github.com/dockyard/ember-validations#presence). - -### Custom validators - -In the framework of the addon ember-flexberry implemented the following validators: - -* `datetime` - validation of date input/date / time. [Read more](efd2_date-time-validator.html). - -### Conditional validators - -All validators can work in the mode of conditional validation - their operation will depend either on an additional logical function, or Boolean property of an object. [Read more](https://github.com/dockyard/ember-validations#conditional-validators). - -## Development of custom validators - -Application developers can also create their own custom validators if the validator is not enough to implement the application logic. -There are 2 ways to implement custom validators: - -* Implement your own validator, which can be reused for different entities -* Implement inline validator that checks the correctness of the data model for one specific entity - -Read more about the process of creating custom validators can be viewed [here](https://github.com/dockyard/ember-validations#custom-validators). - -In addition, you can view the source code of validators in the [repository addon Ember Validations on GitHub](https://github.com/dockyard/ember-validations/tree/master/addon/validators). - - - diff --git a/pages/products/flexberry-ember/2.x/work-with-data/efd2_model-validation.ru.md b/pages/products/flexberry-ember/2.x/work-with-data/efd2_model-validation.ru.md deleted file mode 100644 index f3f4caebe..000000000 --- a/pages/products/flexberry-ember/2.x/work-with-data/efd2_model-validation.ru.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Валидация модели -sidebar: flexberry-ember-2_sidebar -keywords: Flexberry Ember -toc: true -permalink: ru/efd2_model-validation.html -folder: products/ember-flexberry-data/models-and-projections/ -lang: ru -summary: Описаны основные шаги по настройке валидации ---- - -## Описание - -Клиентская валидация настраивается в приложении на базе аддона [Ember Validations](https://github.com/dockyard/ember-validations) (в документации к данному аддону указано больше возможностей по заданию правил). - -Валидация задаётся на уровне модели (остальные манипуляции с настройкой компонента зашиты в технологию Flexberry ASP.NET Ember): - -```javascript -var Model = BaseModel.extend({ - номерПроекта: DS.attr('string'), - краткоеСодержание: DS.attr('string'), - визирование: DS.attr('boolean', {defaultValue: false}), - примечание: DS.attr('string'), - - // Validation rules. - validations: { - номерПроекта: { presence: true }, - краткоеСодержание: { presence: true, length: { maximum: 255 } }, - визирование: { presence: true }, - примечание: { length: { maximum: 255 } }, - } -}); -``` - -Для отображения валидации на форме редактирования в соответствующем шаблоне необходимо написать примерно следующее (стили и расположение элементов может отличаться): - -```html -
-
- -
-
- `model.errors.номерПроекта` - `input type="text" placeholder="(no value)" value=model.номерПроекта` -
-
-``` - -{% include note.html content="Поскольку при валидации изначально считается, что у полей логического типа значение `null`, то, чтобы не отображались сообщения валидации, можно задать [значение по умолчанию](http://guides.emberjs.com/v2.4.0/models/defining-models/) (как это сделано в примере выше)." %} - -## Типы валидаторов - -Существуют "стандартные" валидаторы, предоставляемые аддоном Ember Validations, а также кастомные валидаторы, предоставляемые вместе с аддоном [ember-flexberry](https://github.com/Flexberry/ember-flexberry). - -### "Стандартные" валидаторы - -Аддоном Ember Validations предоставляются следующие валидаторы: - -* `absence` - проверка того, что валидируемое свойство должно быть пустым. [Подробнее](https://github.com/dockyard/ember-validations#absence). -* `acceptance` - проверка того, что в валидируемое свойство введено допустимое значение (задается в валидаторе). [Подробнее](https://github.com/dockyard/ember-validations#acceptance). -* `confirmation` - проверка того, что значение валидируемого свойства совпадает со значением свойства propertyConfirmation, где property-имя валидируемого свойства. [Подробнее](https://github.com/dockyard/ember-validations#confirmation). -* `exclusion` - проверка того, что значение валидируемого свойства не входит в перечень недопустимых значений. [Подробнее](https://github.com/dockyard/ember-validations#exclusion). -* `format` - проверка того, что значение валидируемого свойства соответствует заданному регулярному выражению. [Подробнее](https://github.com/dockyard/ember-validations#format). -* `inclusion` - проверка того, что значение валидируемого свойства входит в перечень допустимых значений. [Подробнее](https://github.com/dockyard/ember-validations#inclusion). -* `length` - проверка того, что значение валидируемого свойства имеет заданную длину. [Подробнее](https://github.com/dockyard/ember-validations#length). -* `numericality` - проверка того, что значение валидируемого свойства является числовым. [Подробнее](https://github.com/dockyard/ember-validations#numericality). -* `presence` - проверка того, что валидируемое свойство должно быть не пустым. [Подробнее](https://github.com/dockyard/ember-validations#presence). - -### Кастомные валидаторы - -В рамках аддона ember-flexberry реализованы следующие валидаторы: - -* `datetime` - проверка корректности ввода даты/даты-времени. [Подробнее](efd2_date-time-validator.html). - -### Условные валидаторы - -Все валидаторы могут работать также в режиме условной валидации - их срабатывание будет зависеть либо от дополнительной логической функции, либо от логического свойства объекта. [Подробнее](https://github.com/dockyard/ember-validations#conditional-validators). - -## Разработка кастомных валидаторов - -Прикладные разработчики также могут создавать свои кастомные валидаторы, если имеющихся валидаторов не достаточно для реализации прикладной логики. -Существует 2 способа реализовать кастомные валидаторы: - -* Реализовать отдельный валидатор, который будет возможно переиспользовать для моделей разных сущностей -* Реализовать inline-валидатор, который будет проверять корректность данных для модели одной конкретной сущности - -Подробнее о процессе создания кастомных валидаторов можно посмотреть [здесь](https://github.com/dockyard/ember-validations#custom-validators). - -Кроме этого, можно посмотреть исходный код валидаторов в [репозитории аддона Ember Validations на GitHub](https://github.com/dockyard/ember-validations/tree/master/addon/validators). diff --git a/pages/products/flexberry-ember/3.x/work-with-data/efd3_model-validation.ru.md b/pages/products/flexberry-ember/3.x/work-with-data/efd3_model-validation.ru.md deleted file mode 100644 index a61062368..000000000 --- a/pages/products/flexberry-ember/3.x/work-with-data/efd3_model-validation.ru.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: Валидация моделей -sidebar: flexberry-ember-3_sidebar -keywords: Flexberry Ember -toc: true -permalink: ru/efd3_model-validation.html -folder: products/ember-flexberry-data/models-and-projections/ -lang: ru -summary: Описаны основные шаги по настройке валидации в приложении ---- - -## Описание - -Клиентская валидация настраивается в приложении с использовнием аддона [ember-cp-validations](https://github.com/offirgolan/ember-cp-validations) (в документации к данному аддону можно более подробно познакомиться со всеми его возможностями). - -По умолчанию валидация задаётся на уровне модели в объекте `ValidationRules`, при этом определеный набор валидаторов генерируется в автогенерируемый миксин модели на основании заданных настроек на уровне модели предметной области во Flexberry Designer. - -## Типы валидаторов - -Аддон `ember-cp-validations` предоставляет следующие валидаторы (более подробную информацию можно посмотреть в [документации аддона](https://rawgit.com/offirgolan/ember-cp-validations/c4123c983e54f24dd790ffa1bad66cfdf2f47ec6/docs/modules/Validators.html)): - -* `alias` - связывает текущий атрибут с каким-нибудь другим в качестве псевдонима, позволяет получить все его сообщения валидации и ошибки. -* `belongs-to` - позволяет указать, что атрибут является `belongs-to` связью, и позволяет получить все сообщения валидации связанной модели. -* `collection` - проверяет, что значение атрибута является массивом (или не является, в зависимости от параметров валидатора). -* `confirmation` - позволяет проверить, что значение атрибута совпадает со значением другого указанного в параметрах атрибута. -* `date` - проверяет, что значение атрибута является датой, также содержит дополнительные проверки в зависимости от переданных параметров. -* `dependent` - позволяет указать, что атрибут будет являться валидным, если валидными являются другие связанные атрибуты. -* `ds-error` - позволяет получить ошибки из [DS.Errors](https://api.emberjs.com/ember-data/3.1/classes/DS.Errors) аддона [ember-data](https://api.emberjs.com/ember-data/3.1). -* `exclusion` - проверяет, что значение атрибута не содержится в заданном списке. -* `format` - проверяет значение атрибута на соответствие регулярному выражению. -* `has-many` - позволяет указать, что атрибут является `has-many` связью, и позволяет получить все сообщения валидации связанных моделей. -* `inclusion` - проверяет, что значение атрибута содержится в заданном списке. -* `length` - проверяет длину значения атрибута на равенство числу, либо на вхождение в интервал. -* `number` - проверяет, что значение атрибута является числом, также содержит дополнительные проверки в зависимости от переданных параметров. -* `presence` - проверяет, что значение атрибута не явяется пустым (но можно проверить и то, что значение - пустое). - -## Генерируемые валидаторы - -Валидаторы, которые создаются автоматически при генерации приложения из Flexberry Designer, находятся в автогенерируемом миксине модели (`mixins/regenerated/models`): - -```javascript -export let ValidationRules = { - propName: { - descriptionKey: 'localization_path', - validators: [ - validator('presence', true), - validator('length', { is: 15 }), - ... - ], - }, - ... -}; -``` - -Где `propName` - имя валидируемого свойста, `localization_path` - путь в locales до сообщения валидатора. - -В рассмотренном выше примере используются слудующие валидаторы: - -* `validator('presence', true)` - проверка того, что значение свойства не пустое. -* `validator('length', { is: 15 })` - проверка того, что длина значения свойства равна 15. - -Автоматически из Flexberry Designer генрируются следующие валидаторы: - -* Для всех типов полей: `validator('ds-error')` и `validator('presence', true)` (если для соответствующего атрибута на уровне модели предметной области во Flexberry Designer указано, что он не может иметь пустое значение). -* Для полей с типом дата: `validator('date')`. -* Для числовых типов: `validator('number', { allowString: true, allowBlank: true, integer: true })`. Значения параметров зависят от свойств атрибута в модели Flexberry Designer: `allowString` - может ли число быть задано в виде строки; `allowBlank` - может ли значение быть пустым; `integer` - если `true`, то допускаются только целые числа. -* Для `hasMany` связи: `validator('has-many')`. - -### Дополнительные валидаторы - -Для добавления собственных правил валидации, которые не генерируются автоматически из Flexberry Designer, нужно в модели (в папке `models`) добавить их в объект `ValidationRules`. -Все собственные валидаторы нужно добавлять до строки с определением `const Validations = buildValidations(...)`. - -Например: - -```javascript -ValidationRules.name = { - descriptionKey: 'models.testModel.validations.name.__caption__', - validators: [ - validator('length', { min: 5 }) - ], -}; -``` - -В этом примере для поля `name` добавляется валидатор для проверки минимальной длины строки - не менее 5 символов. В `descriptionKey` при этом указывается путь в locales до сообщения валидатора. - -## Компоненты для валидации - -Для отображения сообщений валидации в аддоне `ember-flexberry` есть два компонента - `flexberry-validationmessage` и `flexberry-validationsummary`. - -### Компонент flexberry-validationmessage - -Компонент `flexberry-validationmessage` предназначен для отображения сообщений валидации у определенного свойства модели. В шаблоне роута этот компонент объявляется следующим образом: - -```hbs -{% raw %} -{{flexberry-validationmessage error=(v-get validationObject "propertyName" "messages")}} -{% endraw %} -``` - -Где `validationObject` - валидируемая модель, `propertyName` - имя свойства модели, сообщения валидаторов которого отображаются в данном компоненте. `messages` - имя свойства с сообщениями валидации (по умолчанию все сообщения хранятся в свойстве `messages`, также в `message` можно получить наиболее приоритетное сообщение, тогда будет отображаться только 1 сообщение валидации, которое будет меняться по мере выполнения условий валидаторов). `v-get` - хелпер из аддона валидации, который позволяет получить значение указанного свойства некоторого объекта (в документации аддона `ember-cp-validations`, ссылка на которую указана выше, можно найти о нем дополнительную информацию). - -{% include note.html content="Важно! Имя свойства не должно быть многоуровневым, т.е. если нужно отображать валидацию для поля мастера, то нельзя использовать в качестве имени свойства \"master.propertyName\", в этом случае необходимо в качестве модели брать именно модель мастера:" %} - -```hbs -{% raw %} -{{flexberry-validationmessage error=(v-get validationObject.master "propertyName" "messages")}} -{% endraw %} -``` - -### Компонент flexberry-validationsummary - -Компонент `flexberry-validationsummary` предназначен для отображения списка сообщений валидации. По умолчанию он используется на формах редактирования для отображения всех сообщений валидации редактируемой модели. Например: - -```hbs -{% raw %} -{{flexberry-validationsummary errors=(v-get validationObject "messages")}} -{% endraw %} -``` - -### Валидация на формах редактирования - -Для валидации на формах редактирования используются описанные выше компоненты, которые генерируются автоматически в шаблонах форм редактирования: - -* `flexberry-validationmessage` в шаблоне формы располагается после каждого компонента для редактирования атрибута модели. -* `flexberry-validationsummary` - по умолчанию в шаблоне формы располагается перед всеми полями на форме (компонентами для редактирования атрибутов модели). - -Компоненты для редактирования атрибутов модели из аддона `ember-flexberry` меняют свой цвет, если валидация соответствующего атрибута модели не является успешной (по умолчанию используется красный цвет). Для этого компоненту при ошибках валидации устанавливается класс `error`. Например: - -```hbs -{% raw %} -{{flexberry-field - ... - class=(if (v-get validationObject "propertyName" "isInvalid") "error") -}} -{% endraw %} -``` - -Где `validationObject` - валидируемая модель, `propertyName` - имя свойства, а `isInvalid` - флаг, определяющий, что хотя бы один валидатор у данного свойства не выполнился успешно. - -## Кастомные валидаторы - -Аддон [ember-cp-validations](https://github.com/offirgolan/ember-cp-validations) позволяет создавать собственные валидаторы. Для этого необходимо в консоли в папке с приложением выполнить команду `ember g validator validator-name`, где `validator-name` - имя создаваемого валидатора. - -Данная команда генерирует файл `app/validators/validator-name.js`, а также тест для него. В сгенерированном валидаторе необходимо доработать логику валидации в методе `validate` - он должен возвращать либо `true`, если валидатор выполняется успешно, либо сообщение валидации в виде строки. Также можно возвращать `Promise`, который разрешается в `true`, или в сообщение валидации. - -Более подробную информации о кастомных валидаторах можно получить в [документации аддона](https://rawgit.com/offirgolan/ember-cp-validations/c4123c983e54f24dd790ffa1bad66cfdf2f47ec6/docs/classes/Custom.html). \ No newline at end of file diff --git a/pages/products/flexberry-ember/3.x/work-with-data/efd3_validations.ru.md b/pages/products/flexberry-ember/3.x/work-with-data/efd3_validations.ru.md new file mode 100644 index 000000000..f8e916e2b --- /dev/null +++ b/pages/products/flexberry-ember/3.x/work-with-data/efd3_validations.ru.md @@ -0,0 +1,205 @@ +--- +title: Валидация данных +sidebar: flexberry-ember-3_sidebar +keywords: Flexberry Ember Validations +toc: true +permalink: ru/efd3_validations.html +folder: products/flexberry-ember/3.x/work-with-data/ +lang: ru +summary: Описание валидации и её настройки в приложениях ember-flexberry +--- + +Практически неотъемлемой частью любого приложения, работающего с пользовательским вводом данных, является валидация этих данных. Валидация служит не только для предотвращения ошибок в приложении, но и для облегчения работы пользователя с приложением, предоставляя ему подсказки по ожидаемым форматам и ограничениям вводимых данных. + +Валидация данных в приложениях на основе `Flexberry Ember` дополняет серверную валидацию, обычно реализуемую с помощью [бизнес-сервера объектов данных Flexberry ORM](fo_business-server.html). + +По умолчанию, валидация данных осуществляется на уровне модели, поскольку модель является основной единицой пользовательского ввода. Валидация модели описывается в виде набора правил для свойств модели, которые должны соблюдатся, чтобы объект модели считался валидным. В контроллере формы редактирования, перед сохранением объекта модели, проверяется валидность этого объекта, по описанным правилам. + +## Описание правил валидации + +Способ описания правил валидации зависит от используемого в приложении аддона для валидации, это может быть [`ember-cp-validations`](#ember-cp-validations) или [`ember-validations`](#ember-validations). При генерации модели по её метаданным, также генерируется набор правил для её валидации, который зависит от различных параметров, указанных для атрибутов модели. + +### ember-cp-validations + +Аддон [`ember-cp-validations`](https://github.com/offirgolan/ember-cp-validations) имеет большой набор встроенных валидаторов гибко настраиваемых с помощью параметров, что позволяет описывать сложные правила валидации модели. + +Чтобы реализвать валидацию модели с использованием аддона `ember-cp-validations`, необходимо использовать функцию `buildValidations`, предоставляемую этим аддоном, функция создаёт миксин, который нужно добавить к классу модели. + +Если в приложении установлен аддон `ember-cp-validations`, вместе с миксином модели, будет сгенерирован объект `ValidationRules`, содержащий валидаторы для свойств модели. На основе объекта `ValidationRules` будет создан миксин, и добавлен к классу модели. По умолчанию генерируются следующие правила валидации: + +* [`presence`](http://offirgolan.github.io/ember-cp-validations/docs/classes/Presence.html) - для свойств с типами `string` и `boolean` и установленным атрибутом `NotNull`, а так же обязательных связей один к одному +* [`number`](http://offirgolan.github.io/ember-cp-validations/docs/classes/Number.html) - для свойств с типами `number` и `decimal` +* [`date`](http://offirgolan.github.io/ember-cp-validations/docs/classes/Date.html) - для свойств с типом `date` +* [`has-many`](http://offirgolan.github.io/ember-cp-validations/docs/classes/Has%20Many.html) - для множественных связей +* [`ds-error`](http://offirgolan.github.io/ember-cp-validations/docs/classes/DS%20Error.html) - для всех свойств модели + +Чтобы изменить правила валидации для модели, можно расширить объект `ValidationRules`, или описать новый объект с нужными правилами, например: + +```js +// app/models/user.js +import DS from 'ember-data'; +import { buildValidations, validator } from 'ember-cp-validations'; +import BaseModel from 'ember-flexberry-data/models/model-without-validation'; + +import { + ValidationRules, + Model as UserMixin +} from '../mixins/regenerated/models/user'; + +const Validations = buildValidations({ + ...ValidationRules, + firstName: null, // Убрать сгенерированные правила + lastName: { + descriptionKey: 'models.user.lastName-caption', // Путь для локализации имени свойства + validators: [ + validator('ds-error'), + validator('presence', true), + validator('length', { min: 2, max: 50 }), + ], + }, +}); + +const Model = BaseModel.extend(UserMixin, Validations, { +}); + +export default Model; +``` + +Полный список доступных валидаторов [смотрите в документации аддона `ember-cp-validations`](http://offirgolan.github.io/ember-cp-validations/docs/modules/Validators.html). + +Для отображения ошибок валидации пользователю, используются компоненты `{% raw %}{{flexberry/validation-summary}}{% endraw %}` и `{% raw %}{{flexberry-validationmessage}}{% endraw %}`. Компонент `{% raw %}{{flexberry/validation-summary}}{% endraw %}` используется для отображания списока всех ошибок валидации, а компонент `{% raw %}{{flexberry-validationmessage}}{% endraw %}` для отображения ошибки валидации одного свойства. Пример использования этих компонентов в шаблоне формы редактирования: + +```hbs +{% raw %}{{!-- app/templates/user-edit.hbs --}}{% endraw %} +
+
+ {% raw %}{{flexberry/validation-summary errors=(v-get validationModel "messages")}}{% endraw %} +
+ +
+ {% raw %}{{flexberry-field{% endraw %} + value=model.lastName + label=(t "forms.user-edit.lastName-caption") + readonly=readonly + {% raw %}}}{% endraw %} + {% raw %}{{flexberry-validationmessage error=(v-get validationModel "lastName" "message")}}{% endraw %} +
+
+``` + +Обратите внимание что для отображения ошибок валидации одного свойства, в компоненте `{% raw %}{{flexberry-validationmessage}}{% endraw %}`, по умолчанию используется выражение `(v-get validationModel "lastName" "message")`. Таким образом будет отображена ошибка валидации только об одном не выполненном правиле валидации для этого свойства. Если необходимо выводить сразу все ошибки, можно использовать выражение `(v-get validationModel "lastName" "messages")`. + +### ember-validations + +Аддон [`ember-validations`](https://github.com/DavyJonesLocker/ember-validations) ранее использовался по умолчанию, при генерации приложения с использованием аддона `ember-flexberry`. Сейчас аддон `ember-validations` не поддерживается, и не рекомендуется к использованию. + +Чтобы реализвать валидацию модели с использованием аддона `ember-validations`, необходимо добавить к классу модели миксин `EmberValidations`, предоставляемый этим аддоном, и описать правила валидации в свойстве `validations` класса модели. + +При генерации модели, в качестве базового класса используется модель из аддона `ember-flexberry-data`, в которой уже добавлен миксин из аддона `ember-validations`, поэтому можно сразу описать правила валидации в свойстве `validations` класса модели, например: + +```js +// app/models/user.js +import DS from 'ember-data'; +import BaseModel from 'ember-flexberry-data/models/model'; + +import { Model as UserMixin } from '../mixins/regenerated/models/user'; + +const Model = BaseModel.extend(UserMixin, { + validations: { + lastName: { + presence: true, + length: { minimum: 2, maximum: 50 }, + }, + }, +}); + +export default Model; +``` + +Полный список доступных валидаторов [смотрите в документации аддона `ember-validations`](https://github.com/DavyJonesLocker/ember-validations#validators). + +Для отображения ошибок валидации пользователю, используются компоненты `{% raw %}{{flexberry-validationsummary}}{% endraw %}` и `{% raw %}{{flexberry-validationmessage}}{% endraw %}`. Компонент `{% raw %}{{flexberry-validationsummary}}{% endraw %}` используется для отображания списока всех ошибок валидации, а компонент `{% raw %}{{flexberry-validationmessage}}{% endraw %}` для отображения ошибки валидации одного свойства. Пример использования этих компонентов в шаблоне формы редактирования: + +```hbs +{% raw %}{{!-- app/templates/user-edit.hbs --}}{% endraw %} +
+
+ {% raw %}{{flexberry-validationsummary errors=(validationModel.errors)}}{% endraw %} +
+ +
+ {% raw %}{{flexberry-field{% endraw %} + value=model.lastName + label=(t "forms.user-edit.lastName-caption") + readonly=readonly + {% raw %}}}{% endraw %} + {% raw %}{{flexberry-validationmessage error=(validationModel.errors.lastName)}}{% endraw %} +
+
+``` + +## Валидация на уровне контроллера + +При наличии нескольких форм редактрования для одной модели, например, если разные пользователи приложения должны заполнять разные части одной модели, может быть трудно описать все правила валидации в модели. В таких случаях можно перенести валидацию на уровень контроллера, и описать правила валидации для каждой формы отдельно. + +Чтобы перенести валидацию на уровень контроллера, необходимо в контроллере формы редактирования изменить значение свойства `validationModel`. Для этого можно использовать вычислимое свойство, которое возвращает ссылку на сам контроллер. По умолчанию, свойство `validationModel` является алиасом для совойства `model`. После того как свойство `validationModel` стало ссылатся на контроллер, миксин с правилами валидации можно добавлять к контроллеру. + +Для более гибкой настройки поведения валидации, можно переопределить метод контроллера `validateModel`, например: + +```js +// app/controllers/user-edit.js +import { computed } from '@ember/object'; +import { resolve } from 'rsvp'; +import { buildValidations, validator } from 'ember-cp-validations'; + +import EditFormController from 'ember-flexberry/controllers/edit-form'; + +const Validations = buildValidations({ + 'model.lastName': { // Правило для свойства модели относительно контроллера + descriptionKey: 'models.user.lastName-caption', + validators: [ + validator('ds-error'), + validator('presence', true), + validator('length', { min: 2, max: 50 }), + ], + }, +}); + +export default EditFormController.extend(Validations, { + validationModel: computed(function () { + return this; + }), + + validateModel() { + // Игнорировать ошибки валидации для новых моделей + if (this.get('model.isNew')) { + return resolve(); + } + + // Выполнять валидацию в остальных случаях + return this._super(...arguments); + }, +}); +``` + +Чтобы отключить валидацию в какой либо форме, необходимо установить `null` в значение свойства `validationModel` контроллера этой формы. + +## Одновременное использование ember-cp-validations и ember-validations + +При необходимости можно установить в приложении оба аддона для валидации, и `ember-cp-validations`, и `ember-validations`, генерация моделей при этом будет выполнятся для аддона `ember-cp-validations`. + +Если в приложении стауновен аддон `ember-validations`, и вы хотите дополнительно установить `ember-cp-validations`, выполните команду: + +```cmd +ember generate use-ember-cp-validations +``` + +При выполнении этой команды, в приложение будет установлен аддон `ember-cp-validations`, и добавлен сервис `validations` для совместимости аддонов. + +Если в приложении стауновен аддон `ember-cp-validations`, и вы хотите дополнительно установить `ember-validations`, выполните команду: + +```cmd +ember generate use-ember-validations +``` + +При выполнении этой команды, в приложение будет установлен аддон `ember-validations`, и добавлен сервис `validations` для совместимости аддонов.