Почему убрали beforeSubmit из ActiveForm

Уже исправленные репорты или принятые предложения
Ответить
de1phi
Сообщения: 145
Зарегистрирован: 2013.12.23, 20:02

Почему убрали beforeSubmit из ActiveForm

Сообщение de1phi »

Добрый день,

обновил релиз и все формы отвалились. Почему в ActiveForm убрали свойства beforeSubmit, beforeValidate, afterValidate?
Аватара пользователя
samdark
Администратор
Сообщения: 9466
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Почему убрали beforeSubmit из ActiveForm

Сообщение samdark »

Читайте в анонсе: http://habrahabr.ru/post/238447/
de1phi
Сообщения: 145
Зарегистрирован: 2013.12.23, 20:02

Re: Почему убрали beforeSubmit из ActiveForm

Сообщение de1phi »

Sam Dark писал(а):Читайте в анонсе: http://habrahabr.ru/post/238447/
ух е маё, больше 200 форм переделывать(((

И не очень это удобно. У меня есть стандартный callback, но есть и индивидуальный для некоторых форм. Думаю верну старую версию ActiveForm или допилю, чтобы callback брался из beforeSubmit =( я же не могу предвидеть, какие id будут у формы во всем проекте. К релизу можете вернете нормальный функционал?
Аватара пользователя
samdark
Администратор
Сообщения: 9466
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Почему убрали beforeSubmit из ActiveForm

Сообщение samdark »

Не знаю. Занимался этим Qiang, можете сформулировать в issue на github проблемы (переписывать 200 форм за проблему до финального релиза 2.0 не считается) текущего подхода, возможно он поправит.
Аватара пользователя
samdark
Администратор
Сообщения: 9466
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Почему убрали beforeSubmit из ActiveForm

Сообщение samdark »

Спасибо.
de1phi
Сообщения: 145
Зарегистрирован: 2013.12.23, 20:02

Re: Почему убрали beforeSubmit из ActiveForm

Сообщение de1phi »

Issue закрыли без объяснения. В итоге сейчас получается, что для каждой формы нужно прописывать event. Хотя раньше было достаточно написать один callback и указывать его при объявлении формы. Мда, формы потеряли свою гибкость.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Почему убрали beforeSubmit из ActiveForm

Сообщение slavcodev »

Раньше нужно было писать для каждой формы js-callback в виде строки, теперь можно написать один раз в js файле (можно даже оформить в виде jQuery плагина) и навешивать обработчик события например по атрибуту формы (class, data-*) и тд.
Выйгреш очивиден для меня.
Я думаю что и ты поймешь его, попробовав реализовать по новому, хотя понятно что это дополнительная работа, никому не нравится переделывать.
Может мы сможем тебе помочь с решением.
Жду Yii 3!
de1phi
Сообщения: 145
Зарегистрирован: 2013.12.23, 20:02

Re: Почему убрали beforeSubmit из ActiveForm

Сообщение de1phi »

slavcodev писал(а):Раньше нужно было писать для каждой формы js-callback в виде строки, теперь можно написать один раз в js файле (можно даже оформить в виде jQuery плагина) и навешивать обработчик события например по атрибуту формы (class, data-*) и тд.
Выйгреш очивиден для меня.
Я думаю что и ты поймешь его, попробовав реализовать по новому, хотя понятно что это дополнительная работа, никому не нравится переделывать.
Может мы сможем тебе помочь с решением.
у меня есть стандартный обработчик standartSubmit. Который просто делает сериализацию формы и отправляет постом на сервер. Для этого я просто пишу в 'beforeSubmit' название callback'a.
Далее часть форм имеет свою логику, для этого я просто пишу в js файл простую функцию и указываю в той же директиве.

Теперь, чтобы использовать события. Мне нужно в основной js файл написать основное действие, а если нужно переопределить callback, нужно добавлять код или во view или в контроллер, причем не просто одной строкой, а через $view->registerJs, чтобы код был после стандартного переопределения. И каким это образом сделает мой код чище (это объяснение на github)?

пока решил костылем:

Код: Выделить всё


<?php

namespace de1phi\widgets;

class ActiveForm extends \yii\widgets\ActiveForm
{
    /**
     * @var string|JsExpression a JS callback that will be called when the form is being submitted.
     * The signature of the callback should be:
     *
     * ~~~
     * function ($form) {
     *     ...return false to cancel submission...
     * }
     * ~~~
     */
    public $beforeSubmit;
    /**
     * @var string|JsExpression a JS callback that is called before validating an attribute.
     * The signature of the callback should be:
     *
     * ~~~
     * function ($form, attribute, messages) {
     *     ...return false to cancel the validation...
     * }
     * ~~~
     */
    public $beforeValidate;
    /**
     * @var string|JsExpression a JS callback that is called after validating an attribute.
     * The signature of the callback should be:
     *
     * ~~~
     * function ($form, attribute, messages) {
     * }
     * ~~~
     */
    public $afterValidate;

    public function run()
    {
        parent::run();

        if (!isset($this->options['id'])) {
            $this->options['id'] = $this->getId();
        }
        if($this->beforeSubmit) {
            $id = $this->options['id'];
            $view = $this->getView();
            $view->registerJs("jQuery('#$id').on('beforeSubmit', function() { return " . $this->beforeSubmit . "(this); });");
        }
    }
}

 


Что мешает добавить примерно такой же код разработчикам - я хз. У меня может быть на странице куча разных форм с различной логикой и я должен задумываться об их id? когда я могу просто указать callback и сам фреймверк сгенерирует идентификатор и переопределить событие. Мы вроде бы добиваемся отхода от ручного труда, но все равно возвращаемся от чего пришли.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Почему убрали beforeSubmit из ActiveForm

Сообщение slavcodev »

Код: Выделить всё

function standartSubmit(event) {
  // стандартный обработчик
}
function anotherHardSubmitLogic(event) {
  // один из других специальных обработчиков для определенных форм
}

// атачим обработчик для всех форм
$(document).on('submit', 'form', standartSubmit);
$(document).on('submit', 'form.special', anotherHardSubmitLogic);
далее форме устанавливаешь класс и обработчик подключается.

почему нельзя добавить просто параметр в ActiveForm, потому что как Тян объяснил дополнительная возможность только запутает разработчиков а не поможет.
Жду Yii 3!
de1phi
Сообщения: 145
Зарегистрирован: 2013.12.23, 20:02

Re: Почему убрали beforeSubmit из ActiveForm

Сообщение de1phi »

slavcodev писал(а):

Код: Выделить всё

function standartSubmit(event) {
  // стандартный обработчик
}
function anotherHardSubmitLogic(event) {
  // один из других специальных обработчиков для определенных форм
}

// атачим обработчик для всех форм
$(document).on('submit', 'form', standartSubmit);
$(document).on('submit', 'form.special', anotherHardSubmitLogic);
далее форме устанавливаешь класс и обработчик подключается.
спасибо за вариант, но это точно такой же костыль как я привел выше, не очень удобно. Тем более, указывая callback при объявлении формы, сразу же видно какая логика сработает. Тут же надо будет помнить какому классу какой обработчик установлен.
Аватара пользователя
search74
Сообщения: 17
Зарегистрирован: 2014.08.18, 08:30
Контактная информация:

Re: Почему убрали beforeSubmit из ActiveForm

Сообщение search74 »

Спасибо тебе de1phi за решение проблемы!! :P
Истина где-то рядом
Ответить