ZendFramework Zend_Form с удаленным запросом формы

iceman

говнокодер
Допустим, есть такой экшен:
PHP:
/**
  * @return array
  */
public function indexAction()
{
    $product = new Product();
    $form = new CreateProduct($product->getAttrsFromWebService());
    if ($this->request->isPost()) {
        $form->setData($this->request->getPost());
        if ($form->isValid()) {
              /***/
        }
    }
    return array(
        'form' => $form
    );
}
Есть ситуация, когда форму во время прорисовки нужно запросить у Веб-Сервиса.

Например, в CreateProduct в конструкторе - происходит обращение и по результатам ответа добавляю элементы в форму.

При загрузке экшена index - инициализировали эту "тяжелую" форму и нарисовали.
Далее пользователь заполнил ее и сабмитит.
На сабмите опять идет обращение к веб-сервису, так как есть строчка $form = new CreateProduct(); которая сделает запрос.Что лишнее, зачем ведь еще раз просить форму, когда мы ее запрашивали.

У меня пока в голове только одна мысль, закешировать результат первого запроса к веб-сервису.
Если так, то куда его засунуть? в Модель?
Что еще можно придумать?
 

WMix

герр M:)ller
Партнер клуба
iceman, не совсем понял проблему. один раз вызывается форма для прорисовки элементов, один раз после отправки для валидации. хуже если валидация не пройдет нужно будеть заного зарендеть форму, заполнить данными, показать ошибки.
в чем вопрос? закешировать результат первого запроса к веб-сервису. можно. куда засунуть? кеш засунуть в папку data на мой взгляд самое правильное, а класс в папку модель. но я бы просто пользовался вебсервисом это он же записывает? пусть и проверяет. можно заранее сделать препроверку, но это доп задание.
PHP:
public function indexAction(){
    $product = new Product();

    if ($this->request->isPost()) {
        $data = $this->request->getPost();
        if ($product->setDataToWebService( $data )) {
            // redirect
            // return;
        }
        else{
            $errors = $product->getErrorsFromWebService( );
        }
    }

    $form = new CreateProduct($product->getAttrsFromWebService());
    if ($this->request->isPost()) {
        $form->populate($data);
        $form->setErrors($errors);
    }

    return array('form' => $form );
}
 
Последнее редактирование:

AmdY

Пью пиво
Команда форума

iceman

говнокодер
WMix,
PHP:
$errors = $product->getErrorsFromWebService( );
а если мне нужен будет вывод ошибок по полям, т.е. на против каждого поля еще вставлять текст ошибки,
допустим метод этот вернул массив ошибок для каждого элемента формы, но ниже, опять произойдет запрос формы.
PHP:
$form = new CreateProduct($product->getAttrsFromWebService());
я хочу этого избежать. Валидация данных тоже должна проиходить на стороне веб-сервиса.
 

WMix

герр M:)ller
Партнер клуба
я не понимаю твоей дилемы. сделай для начала с повторным вызовом, после посмотришь на все и поймешь что до кеша тебя отделяет всего 2 строки
если есть кеш бери иначе создай!
 

Тугай

Новичок
iceman, форму(как шаблон) или данные для формы запрашиваются.

Если данные, то это редактирование, в примере на сайте там добавление. Для редактирования нужен свой экшен.
 

iceman

говнокодер
WMix,
Вопрос в том, куда засунуть кеширование - в модель или контроллер?
 

WMix

герр M:)ller
Партнер клуба
в форму. еёж кешируем
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
Absinthe, он кеширует некий array который возвращает webservice, с помощью которого строится формуляр с сообщениями. html-cache точно не при делах
 

iceman

говнокодер
Возник новый вопрос.

1) Допустим формы хранятся в БД, т.е. один контроллер должен рисовать разные формы относительно formID в Request.
- Структура простая, Таблица Form (id, name) и таблица Element (id, form_id, name, type) - элементы связаны с формой.
- Поле type в таблице Element - признак принадлежности, к какому шагу мастера относятся эти элементы.
- В каждой форме свои элементы.

2) Элементы формы могут загружаться из шлюза, да и вообще иметь различные источники.

Например, на сайте реализовано 2 шага. Первый шаг - предварительный поиск, Второй - ввод данных пользователя.

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

Создаю абстрактный класс SearchHadler, в котором определяю абстрактные методы, которые потомок должен реализовать.
createForm (получаю форму), validateForm (получаю массив ошибок), proccessForm (процедура), getResultSet (получаю массив результата поиска), checkResult (получаю массив данных из выбранного элемента результатов поиска).

В контроллер работают только с ним, а метод createSearchHandler(formID) - выдаст мне нужный экземпляр, например CommonSearchHandler.

Далее делаю реализацию CommonSearchHandler.

Вопрос, должен ли лезть CommonSearchHandler в бд и доставать данные отуда, либо нужно передавать, например абстрактную фабрику в конструктор CommonSearchHandler, а уже внутри работать с ней? Но, а что если, нужен обработчик, который будет выводить форму, проводить валидацию - не стандартно, а по своему. И атрибуты ему, например, нужно взять из шлюза. Так, что при вводе нового обработчика, придется писать и новую фабрику. Либо же можно сделать метод в SearchHadler, например, getDefaultForm, который будет подгружать данные из БД, а в нужном обработчике при желание - дергать этот метод, либо переопределять его?
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
итак метод создай_искателя_обработчиков возвращает основного_искателя_обработчиков. чисто симантически ожидаю от основного_искателя что он найдет и вернет обработчик. думая о "Элементы формы могут загружаться из шлюза, да и вообще иметь различные источники." понимаю что максимум что может знать основной_искатель это некий шлюз.
 

iceman

говнокодер
WMix, не понял идеи с основным искателем обработчика, какой функцию он несет?
 

WMix

герр M:)ller
Партнер клуба
это ты так классы назвал, я просто пытаюсь представить что таится за этими словами
CommonSearchHandler == основной_искатель_обработчиков ну или основной обработчик пойска ) не важно
 
Последнее редактирование:

iceman

говнокодер
WMix,
Я имел ввиду страницу для поиска (Шаг 1)

в общем есть страница, на нее приходят с конкретным formID из бд.

Ее дело, отобразить список полей (глобально назавем ее Формой) для ввода критериев поиска (поиска "чего либо", хоть где.), сделать валидацию данных введеных в эти поля, Вывести результат (массив данных), при нажатие кнопки НАЙТИ, и отдать результат (конкретный элемент из найденного массива данных).

CommonSearchHandler - используется как стандартный обработчик.
Что он делает, выводит форму из БД, делает валидацию на основе настройки Element (в данной таблице есть поля, которые определяют размер поля, обязательность, маску и куча другой фигни), ищет данные в одной таблице и выводит результат.
Он работает стандартно (конечно раньше и класса такого то не было, он появился после рефакторинга), как и предполагалось при создание системы.

Далее заказчик хочет интергировать функционал похожей системы (назавем ее RemoteSystem) с нашей, взаимодействия с ней посредством веб-сервиса.
Я создаю класс RemoteSearchHandler, он наследник SearchHandler. Загрузка формы, валидация и поиск данных для вывода результата происходит с помощью клиента к Веб-сервису.

Далее появляется вторая удаленная система RemoteTwoSystem, которая уже является гибридной, т.е. формы с полями реплицирует к нам.
Все так же, создаю наследника RemoteTwoSearchHandler, который форму грузит из бд, валидацию делает как CommonSearchHandler, но если ошибок нету, то обращается в удаленную систему.

Как то все так...
 

WMix

герр M:)ller
Партнер клуба
думая о "Элементы формы могут загружаться из шлюза, да и вообще иметь различные источники." понимаю что максимум что может знать основной_искатель это некий шлюз.
ну я и ответил, что он содержит не базу а некий шлюз где может спросить, шлюз->дайElements() или чтото в этом роде. кем будет этот шлюз совершенно не важно (база, вебсервис) главное что там есть дайElements() или что тебе необходимо
 
Сверху