Почему убрали beforeSubmit из ActiveForm
Почему убрали beforeSubmit из ActiveForm
Добрый день,
обновил релиз и все формы отвалились. Почему в ActiveForm убрали свойства beforeSubmit, beforeValidate, afterValidate?
обновил релиз и все формы отвалились. Почему в ActiveForm убрали свойства beforeSubmit, beforeValidate, afterValidate?
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Почему убрали beforeSubmit из ActiveForm
Читайте в анонсе: http://habrahabr.ru/post/238447/
Нравится Yii? Давайте сделаем его лучше!.
Re: Почему убрали beforeSubmit из ActiveForm
ух е маё, больше 200 форм переделывать(((Sam Dark писал(а):Читайте в анонсе: http://habrahabr.ru/post/238447/
И не очень это удобно. У меня есть стандартный callback, но есть и индивидуальный для некоторых форм. Думаю верну старую версию ActiveForm или допилю, чтобы callback брался из beforeSubmit =( я же не могу предвидеть, какие id будут у формы во всем проекте. К релизу можете вернете нормальный функционал?
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Почему убрали beforeSubmit из ActiveForm
Не знаю. Занимался этим Qiang, можете сформулировать в issue на github проблемы (переписывать 200 форм за проблему до финального релиза 2.0 не считается) текущего подхода, возможно он поправит.
Нравится Yii? Давайте сделаем его лучше!.
Re: Почему убрали beforeSubmit из ActiveForm
Issue закрыли без объяснения. В итоге сейчас получается, что для каждой формы нужно прописывать event. Хотя раньше было достаточно написать один callback и указывать его при объявлении формы. Мда, формы потеряли свою гибкость.
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Почему убрали beforeSubmit из ActiveForm
Раньше нужно было писать для каждой формы js-callback в виде строки, теперь можно написать один раз в js файле (можно даже оформить в виде jQuery плагина) и навешивать обработчик события например по атрибуту формы (class, data-*) и тд.
Выйгреш очивиден для меня.
Я думаю что и ты поймешь его, попробовав реализовать по новому, хотя понятно что это дополнительная работа, никому не нравится переделывать.
Может мы сможем тебе помочь с решением.
Выйгреш очивиден для меня.
Я думаю что и ты поймешь его, попробовав реализовать по новому, хотя понятно что это дополнительная работа, никому не нравится переделывать.
Может мы сможем тебе помочь с решением.
Жду Yii 3!
Re: Почему убрали beforeSubmit из ActiveForm
у меня есть стандартный обработчик standartSubmit. Который просто делает сериализацию формы и отправляет постом на сервер. Для этого я просто пишу в 'beforeSubmit' название callback'a.slavcodev писал(а):Раньше нужно было писать для каждой формы js-callback в виде строки, теперь можно написать один раз в js файле (можно даже оформить в виде jQuery плагина) и навешивать обработчик события например по атрибуту формы (class, data-*) и тд.
Выйгреш очивиден для меня.
Я думаю что и ты поймешь его, попробовав реализовать по новому, хотя понятно что это дополнительная работа, никому не нравится переделывать.
Может мы сможем тебе помочь с решением.
Далее часть форм имеет свою логику, для этого я просто пишу в 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
Код: Выделить всё
function standartSubmit(event) {
// стандартный обработчик
}
function anotherHardSubmitLogic(event) {
// один из других специальных обработчиков для определенных форм
}
// атачим обработчик для всех форм
$(document).on('submit', 'form', standartSubmit);
$(document).on('submit', 'form.special', anotherHardSubmitLogic);
почему нельзя добавить просто параметр в ActiveForm, потому что как Тян объяснил дополнительная возможность только запутает разработчиков а не поможет.
Жду Yii 3!
Re: Почему убрали beforeSubmit из ActiveForm
спасибо за вариант, но это точно такой же костыль как я привел выше, не очень удобно. Тем более, указывая callback при объявлении формы, сразу же видно какая логика сработает. Тут же надо будет помнить какому классу какой обработчик установлен.slavcodev писал(а):далее форме устанавливаешь класс и обработчик подключается.Код: Выделить всё
function standartSubmit(event) { // стандартный обработчик } function anotherHardSubmitLogic(event) { // один из других специальных обработчиков для определенных форм } // атачим обработчик для всех форм $(document).on('submit', 'form', standartSubmit); $(document).on('submit', 'form.special', anotherHardSubmitLogic);
Re: Почему убрали beforeSubmit из ActiveForm
Спасибо тебе de1phi за решение проблемы!!
Истина где-то рядом