/** * Acme\UsersBundle\Entity\User */ class User implements JsonSerializable { /** * @var string $name . * * @ORM\Column(name="name", type="string", length=255, unique = true, nullable=false) * * @Assert\NotBlank(message=" ") * @Assert\MinLength(limit=3, message=" ") * @Assert\MaxLength(limit=15, message=" ") * @Assert\Regex(pattern="/^[A-z0-9_-]+$/ui", match=true, message=" ") */ private $name; // .... }
/** * . * * @param string $bundle "Bundle". * @param string $entity . * @param string $env ("dev" "prod"). * @param string $namespace ( "Acme"). * @return array . */ private function readEntityAnnotations($bundle, $entity, $env = 'prod', $namespace = 'Acme') { $result = array(); $files = glob($_SERVER['DOCUMENT_ROOT'] . '/../app/cache/' . $env . '/annotations/' . $namespace . '-' . $bundle .'Bundle-Entity-' . $bundle . $entity .'$*.php'); foreach ($files as $path) { // preg_match('/\\$(.*?)\\./', $path, $matches); // foreach (include $path as $annotation) { // if (get_parent_class($annotation) === 'Symfony\\Component\\Validator\\Constraint') { $type = preg_replace('/^.*\\\/', '', get_class($annotation)); $annotation = (array)$annotation; unset($annotation['charset']); $result[$matches[1]][$type] = (array)$annotation; } } } return $result; }
var myComplexValue = ko.observable() myComplexValue.extend({ required: true }) .extend({ minLength: 42 }) .extend({ pattern: { message: 'Hey this doesnt match my pattern', params: '^[A-Z0-9].$' }});
var name = ko.observable('habrahabr').extend({MinLength: 42});
ko.extenders.MinLength = function(observavle, params) { // .... };
var AppViewModel = new (function () { var self = this; // this.name = ko.observable(''); // this.mail = ko.observable(''); // E-mail // ko.validation.init(self, _ANNOTATIONS_); // this.submit = function () { if (self.isValid()) { alert(' '); } else { alert(' '); } }; })();
<form action="#"> <p> <label for=""></label> <input type="text" data-bind="value: name, valueUpdate: 'keyup'"> <span data-bind="visible: name.isError, text: name.message"></span> </p> <p> <label for="">E-mail</label> <input type="text" data-bind="value: mail, valueUpdate: 'keyup'"> <span data-bind="visible: mail.isError, text: mail.message"></span> </p> <button data-bind="click: submit"></button> </form>
AppViewModel.name.isError = ko.observable(); // AppViewModel.name.message = ko.observable(); // AppViewModel.name.typeError = ''; //
ko.validation = new (function () { /** * . * @return {Boolean} */ var isValid = function () { this.validate(true); // for (var opt in this) if (ko.isObservable(this[opt])) { // if (this[opt].isError !== undefined && this[opt].isError() === true) { return false; } } return true; }; return { /** * . * @param {object} AppViewModel . * @param {object} annotations . */ init: function (AppViewModel, annotations) { var asserts, options; AppViewModel.validate = ko.observable(false); // for (var field in annotations) if (annotations.hasOwnProperty(field)) { asserts = annotations[field]; // (AppViewModel) if (AppViewModel[field] !== undefined && ko.isObservable(AppViewModel[field])) { AppViewModel[field].isError = ko.observable(); // AppViewModel[field].message = ko.observable(); // // for (var i in asserts) if (asserts.hasOwnProperty(i)) { options = {}; options[i] = asserts[i]; // options[i]['asserts'] = asserts; // options[i]['AppViewModel'] = AppViewModel; // // AppViewModel[field].extend(options); } } } // AppViewModel.isValid = isValid; }, /** * . * @param name . * @param validate . * @param checkAsserts */ addAssert: function (name, validate, checkAsserts) { // extender' ko.extenders[name] = function(target, option) { // "AppViewModel.validate" ko.computed(function () { // if (validate(target, option) === false && option.AppViewModel.validate()) { checkAsserts = checkAsserts || new Function('t,o', 'return false'); // if (checkAsserts(target, option) === false) { target.isError(true); // target.message(option.message); // target.typeError = name; // } return; } // if (target.isError.peek() === true && target.typeError === name) { target.isError(false); } }); return target; }; } } })();
// NotBlank ko.validation.addAssert('NotBlank', function (target, option) { return (target().length > 0); }); // MaxLength ko.validation.addAssert('MaxLength', function (target, option) { return (target().length <= option.limit); });
// MinLength ko.validation.addAssert( 'MinLength', function (target, option) { return (target().length >= option.limit); }, function (target, option) { // "NotBlank" return (target().length === 0 && option.asserts.NotBlank !== undefined); } );
// "name" "User" $validator = $this->get('validator'); $metadata = $validator->getMetadataFactory()->getClassMetadata("Acme\\UsersBundle\\Entity\\User"); var_dump($metadata->properties['name']->constraints);
Source: https://habr.com/ru/post/188720/
All Articles