Ошибки входа для Zend_Form_Element

В этой статье показано решение общей проблемы, которая возникает, когда разработчик должен создать не английский веб-сайт или приложение, основанное на Zend Framework. Поле Zend_Form которым является недействительным Zend_Form_Element, показывает одно или несколько сообщений об ошибках?

Проблема в основном связана с нелогичным методом класса Zend_Form_Element. Подробное описание проблемы и решение её обсуждается в этой статье, для Zend Framework версии 1.12 и ниже.

Пример разработки

Давайте предположим, что у нас есть форма с различными полями, например, поле ввода имени пользователя. Валидаторы для проверки, которые можно использовать, разные, для примера мы будем ограничивать длину имени, что позволит ввести только буквы и пробелы. Говоря языком Zend Framework, мы будем использовать классы Zend_Validate_String Length и Zend_Validate_Alpha.

Как вы уже знаете, Zend Framework принадлежит американской компании Zend и все сообщения, он показывает на английском языке. По умолчанию Framework предназначен для отображения одного или нескольких сообщений об ошибках для каждого валидатора при нарушении ввода пользователем. Итак, для тех, кто делает сайт не на английском языке, есть два способа сделать сообщения читаемые для всех пользователей:

  1. Переводить каждое сообщение об ошибке Framework
  2. Объяснить, одним или несколькими сообщениями о том, что вход является недопустимым и показать примеры для правильного ввода

Первый вариант более-сложный, особенно для малых и средних проектов, поэтому я покажу, как использовать второй вариант. Чтобы сохранить его легкость, мы сделаем только одно специальное сообщение: «вход является недействительным». Это значение должно иметь только буквы и пробелы, а его длина должна быть от 3 до 50 символов.

Код формы для входа

Эта форма, содержит поле для ввода имени и валидаторы необходимых для проверки данных. Код, который мы будем использовать:



<?php
class Application_Form_User extends Zend_Form
{
    public function init() {
        // create the field
        $element = new Zend_Form_Element_Text("name");
        $element->setLabel("Имя");

        // валидатор
        $element->setValidators(array(
            new Zend_Validate_Alpha(true),
            new Zend_Validate_StringLength(
                array("min" => 3, "max" => 50))
        ));
        $element->setRequired();

        // элемент формы
        $this->addElement($element);

        // кнопка Отправить
        $element = new Zend_Form_Element_Submit("submit");
        $element->setLabel("Отправить");
        $this->addElement($element);
    }
}


В контроллере мы проверили, являются ли данные в поле действительным, и действия соответственно. Обычно вы не будете использовать IndexController и, вероятно, у вас есть эта проверка в определенном контроллере. Для упрощения примера, Я буду использовать его.



<?php
class IndexController extends Zend_Controller_Action
{
    public function init() {
    }

    public function indexAction() {
        $form = new Application_Form_User();

        if ($this->getRequest()->isPost() &&
            $form->isValid($this->getRequest()->getPost())) {
            $this->view->message = "Вход выполнен";
        }
        else {
            $this->view->form = $form;
        }
    }
}


Вид использования довольно прост, он только показывает сообщение и формы.



<?php
if (isset($this->message)) {
    echo $this->message;
}
if (isset($this->form)) {
    echo $this->form;
}


Исходный код выше, без каких-либо стилей CSS, будет выглядеть так:

Ошибки пользовательских установок для Zend_Form_Element

Кроме того, если вы вставляете недопустимое значение «88» в поле Имя вы увидите сообщение:

Ошибки пользовательских установок для Zend_Form_Element

Анализируя методы Framework

Хороший вопрос, чтобы спросить, если уже есть методы, доступные такой ситуации. Ответ на этот вопрос:  практически . Имеется в виду есть методы, но они не всегда работают так, как ожидается (по крайней мере, как хотелось бы). Методы управления сообщений об ошибках:

  • setErrors(array $messages)
  • setErrorMessages(array $messages)

Метод setErrors() имеет только один параметр, который является массивом и использует элементы в виде сообщений, чтобы показать, в случае неправильного ввода. Пример использования:



<?php
// Установить пользовательское сообщение в случае ошибки
$element->setErrors(array("Ввод недействительных значение должно иметь только буквенные символы и пробелы и его длина должна быть от 3 ​​до 50 букв."));


Этот метод, а также отображать данную строку (и), также обозначает области ввода недействительными.

Он может быть использован для логики приложения два раза, но в обоих он имеет поведение, которое не является полезным для нашей цели. Во-первых, при создании элемента формы метода Init() . В этом случае появляется соответствующее сообщение, когда форма была загружена, и, прежде чем пользователь вставил данные. Не то что нужно. В этом случае в соответствующей части изменим код на этот:



<?php
// set the validators
$element->setValidators(array(
    new Zend_Validate_Alpha(true),
    new Zend_Validate_StringLength(
        array("min" => 3, "max" => 50))
));
$element->setRequired();

// добавить пользовательские сообщения в случае ошибки
$element->setErrors(array("Ввод недействительных значений, вводите только буквы и пробелы и длина должна быть от 3 ​​до 50 символов."));


Второй раз происходит после того, информация была отправлена ​​во время обычной проверки данных внутри контроллера. Что происходит, а то, что собственное сообщение добавляется к умолчанию, при возникновении ошибки. В этом случае, indexAction() из IndexController изменяется следующим образом:



<?php
public function indexAction() {
    $form = new Application_Form_User();
    if ($this->getRequest()->isPost()) {
        // Если вход пользователя является действительным, сообщение
        // вход успешный. В противном случае, настроить пользовательские ошибки и показать
        // форму снова.
        if ($form->isValid($this->getRequest()->getPost())) {
            $this->view->message = "Вход выполнен";
        }
        else {
            $form->getElement("Имя")->setErrors(array("Ввод недействительных значений, вводите только буквы и пробелы и длина должна быть от 3 ​​до 50 букв."));
            $this->view->form = $form;
        }
    }
    else {
        $this->view->form = $form;
    }
}


Так же, методы такие как setErrors() , setErrorMessages() принимают в качестве параметра массив строк, которые будут показаны пользователю в случае неправильного ввода. Пример использования:



<?php
$element->setErrorMessages(array("Ввод недействительных значений, вводите только буквы и пробелы и длина должна быть от 3 ​​до 50 букв."));


Эта строка кода все равно не решит проблему beucase он будет показывать либо те же сообщение об ошибке для каждого ввода или будет иметь никакого эффекта. Если строка показана используется метод Init() , таким же образом  setErrors() , в случае ошибки, специальное сообщение будет показано столько раз, сколько ряд условий нарушено пользователем при вводе. Если строка вставляется во время обычной проверки данных так же внутри контроллера, то не будет никакого эффекта. Это означает, что сообщение пользователя не будет отображаться а будет показано только сообщение по умолчанию.

Решение

Теперь, чтобы понять , когда и как вставить специальное сообщение, так что пользователь мог иметь представление о том, какой ввод был принят а какой нет. Определить, когда в поле лежит внутри ​​метода Init() и как это связано с методом  setErrorMessages() с использовании свойства валидатора из Zend Framework с называнием  breakChainOnFailure() . Он позволяет остановить процесс проверки при первом удачном вводе. Если мы установим пять валидаторов, и если первый из них выходит из строя, остальные четыре не будут использоваться.

Чтобы применить это свойство, используя наименьшее возможное число строк кода, Я изменю немного код который иллюстрировал в самом начале. Я добавлю к методу init() строку кода, который использует метод setErrorMessages() , и я воспользуюсь одним из возможных конфигураций вводных setValidators() , которая ожидает массив массивов. Массив, содержащиеся в основных можно иметь не более трёх параметров, которыми являются:

  1. string (обязательно), чтобы определить валидатор для пользователей.
  2. boolean (опционально, по умолчанию его значение false ), чтобы указать, если есть ограничения проверки для первой неудачи или нет. Таким образом, этот параметр задает значение свойства breakChainOnFailure которых является то, что поможет нам в достижении нашей цели.
  3. Множество дополнительных опций (опция, по умолчанию пустой массив) различны для каждого выбранного валидатора

С помощью второго параметра, передается правило для каждого из валидаторов, которые вы хотите использовать.

Согласно тому, что мы видели до сих пор, получается код:



<?php
class Application_Form_User extends Zend_Form
{
    public function init() {
        // создать файл
        $element = new Zend_Form_Element_Text("name");
        $element->setLabel("Имя");

        // проверка
        $element->setValidators(array(
            array("Alpha", true, array("allowWhiteSpace" => true)),
            array("StringLength", true, array(
                "min" => 3, "max" => 50))
        ));
        $element->setRequired();

        // добавить пользовательские сообщения в случае ошибки
        $element->setErrorMessages(array("Ввод недействительных значений, вводите только буквы и пробелы и длина должна быть от 3 ​​до 50 букв."));

        // элемент формы
        $this->addElement($element);

        // кнопка Отправить
        $element = new Zend_Form_Element_Submit("submit");
        $element->setLabel("Отправить");
        $this->addElement($element);
    }
}


Заключение

Использование кода выше, форма будет показывать только пользовательские сообщения, если неверный ввод … именно то, что мы хотели! В случае, если вам нужно использовать несколько сообщений, например, предложения в несколько этапов, просто добавьте несколько строк в массив, для метода setErrorMessages() . Проверить данные веб-форм, также можно и с помощью HTML5 .

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML -теги и атрибуты: <a href= http://pixelcom.crimea.ua/"" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>