Две кнопки submit в ActiveForm

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Две кнопки submit в ActiveForm

Сообщение nihaha »

Имею простую форму с двумя кнопками сабмита:

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

<?php $form = ActiveForm::begin(); ?>
    <?= $form->field($model, 'name')->textInput() ?>
    <input type="submit" id="save" name="save" value="Сохранить">
    <input type="submit" id="save-exit" name="save-exit" value="Сохранить и выйти">
<?php ActiveForm::end(); ?>
При отправке я могу в экшене в $_POST по имени кнопки совершить проверку и сделать соответствующий редирект.
Мне нужно вынести кнопки сабмита за пределы формы, поэтому я использую <label> и цепляю его по ID к нужной кнопке:

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

<label for="save">Сохранить</label>
<label for="save-exit">Сохранить и выйти</label>
Происходит отправка формы, но всегда срабатывает первая кнопка в форме с id="save". Если поменять местами кнопки и выше поставить id="save-exit", то сработает она вне зависимости от того, на какую лейбу я нажал. Проверяю я в дебаггере в массиве $_POST.

Я думал, что это так в самом HTML устрона форма, но попробовал рядом создать такую же форму без ActiveForm и лейбы отработали как нужно.
В чем может быть проблема?
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Re: Две кнопки submit в ActiveForm

Сообщение nihaha »

Методом научного тыка я определил, что, если в форме установить параметр

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

'validateOnSubmit' => false,
то лейбы работают как нужно.
Подскажите, чем чревато отключение этой валидации?
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Две кнопки submit в ActiveForm

Сообщение andku83 »

Попробуйте вот такой вариант без отключения валидации:

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

<?php $form = ActiveForm::begin(); ?>
    <?= $form->field($model, 'name')->textInput() ?>
<?php ActiveForm::end(); ?>
<label>Сохранить<input type="submit" form="<?= $form->id ?>" id="save" name="save" value="Сохранить"></label>
<label>Сохранить и выйти<input type="submit" form="<?= $form->id ?> id="save-exit" name="save-exit" value="Сохранить и выйти"></label>
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Re: Две кнопки submit в ActiveForm

Сообщение nihaha »

Так не отправится имя инпута и я в контроллере не узнаю, какая кнопка была нажата
nickdenry
Сообщения: 99
Зарегистрирован: 2015.10.28, 04:55

Re: Две кнопки submit в ActiveForm

Сообщение nickdenry »

Вот аналогичный issue. Предполагается, что имя кнопок должны быть одинаковым, а проверять нужно value.

https://github.com/yiisoft/yii2/issues/10555
Ответственные программисты с высоким уровнем технического долга (c)
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Две кнопки submit в ActiveForm

Сообщение proctoleha »

Мне нужно вынести кнопки сабмита за пределы формы, поэтому я использую <label> и цепляю его по ID к нужной кнопке
то сработает она вне зависимости от того, на какую лейбу я нажал
Вообще то, хоть как ты по label ни щёлкай - событие submit не произойдёт. Для того, чтобы при клике по объекту label, DOM дерева, произошло событие submit, на него нужно навесить обработчик события click по объекту label. Причем этот объект должен быть идентифицирован с помощью к-л атрибута (class, id, name ... etc).

Иначе никак. При клике по label событие submit наступить не может.

Раз у вас событие submit наступает => есть обработчик? Вы про него не написали. Что вы хотите услышать в ответ? Ваша задача решается с помощью js.
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Две кнопки submit в ActiveForm

Сообщение andku83 »

proctoleha писал(а): 2018.03.21, 18:38 Иначе никак. При клике по label событие submit наступить не может.
клик по лейблу инициализирует клик по элементу на который ссылается лейбл
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Re: Две кнопки submit в ActiveForm

Сообщение nihaha »

proctoleha писал(а): 2018.03.21, 18:38 Раз у вас событие submit наступает => есть обработчик? Вы про него не написали. Что вы хотите услышать в ответ? Ваша задача решается с помощью js.
Моя задача прекрасно решается методом, который я описал в первом посте. Достаточно для лэйбы указать ID инпута внутри формы, который она будет триггерить. Советую проверить, очень удобно.
nickdenry писал(а): 2018.03.21, 16:40 Вот аналогичный issue. Предполагается, что имя кнопок должны быть одинаковым, а проверять нужно value.
https://github.com/yiisoft/yii2/issues/10555
Спасибо, я видел этот issue, но что-то у меня не получилось тогда сделать так, как описано в решении. Попробую еще раз и отпишусь о результатах.
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Re: Две кнопки submit в ActiveForm

Сообщение nihaha »

Перепроверил с одинаковыми именами инпутов и разными value, к сожалению, не работает.
Вне зависимоти от того, на какую лэйбу я нажимаю, все равно срабатывает первый инпут и именно его value улетает в $_POST
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Две кнопки submit в ActiveForm

Сообщение Dominus »

Как вариант можно сделать так:
_form.php

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

<?php
$script = new \yii\web\JsExpression("
    function handleSubmitButton(e) {
        var name = e.name;
        var hiddenInput = $('#button-name');
        hiddenInput.val(name);
    }
");
$this->registerJs($script, \yii\web\View::POS_HEAD);
?>
<div>
    <?php $form = ActiveForm::begin([
        'id' => 'form-test',
    ]); ?>

    <?= $form->field($model, 'name')->textInput([
        'placeholder' => true,
    ]) ?>
    <!-- В модели добавить публичную переменную button и обозначить её в правилах -->
    <?= $form->field($model, 'button')->hiddenInput(['id' => 'button-name'])->label(false) ?>
    <?php ActiveForm::end(); ?>

    <div class="form-group">
        <?= Html::submitButton('Save', [
            'class' => 'btn btn-success',
            'name' => 'save',
            'form' => 'form-test',
            'onclick' => 'handleSubmitButton(this)',
        ]) ?>

        <?= Html::submitButton('Save and exit', [
            'class' => 'btn btn-success',
            'name' => 'save-and-exit',
            'form' => 'form-test',
            'onclick' => 'handleSubmitButton(this)',
        ]) ?>
    </div>

</div>
Controller:

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

public function actionTest()
{
    $model = new TestForm();
    if ($model->load(Yii::$app->request->post())) {            
        if ($model->button == 'save') {
            Yii::$app->session->setFlash('success', 'Сохраняем');
            //...
        }
        if ($model->button == 'save-and-exit') {
            Yii::$app->session->setFlash('success', 'Сохраняем и выходим');
            //...
        }
        return $this->refresh();
    }
    return $this->render('test', ['model' => $model]);
}
Что то типа этого.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Две кнопки submit в ActiveForm

Сообщение maleks »

Dominus писал(а): 2018.03.23, 13:35

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

<?php
$script = new \yii\web\JsExpression("
    function handleSubmitButton(e) {
        var name = e.name;
        var hiddenInput = $('#button-name');
        hiddenInput.val(name);
    }
");
$this->registerJs($script, \yii\web\View::POS_HEAD);
?>
Интересно, оно так работает что ли? Вроде строку только ожидает
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Две кнопки submit в ActiveForm

Сообщение Dominus »

maleks писал(а): 2018.03.23, 15:01
Dominus писал(а): 2018.03.23, 13:35

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

<?php
$script = new \yii\web\JsExpression("
    function handleSubmitButton(e) {
        var name = e.name;
        var hiddenInput = $('#button-name');
        hiddenInput.val(name);
    }
");
$this->registerJs($script, \yii\web\View::POS_HEAD);
?>
Интересно, оно так работает что ли? Вроде строку только ожидает
Работает)
https://www.yiiframework.com/doc/api/2. ... expression
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Две кнопки submit в ActiveForm

Сообщение maleks »

Dominus писал(а): 2018.03.23, 15:12 Работает)
Да, вижу, php там дальше привел объект к строке, но в доках просто строки передают.
nickdenry
Сообщения: 99
Зарегистрирован: 2015.10.28, 04:55

Re: Две кнопки submit в ActiveForm

Сообщение nickdenry »

Перепроверил с одинаковыми именами инпутов и разными value, к сожалению, не работает.
Можно разбить action на два отдельных и каждой кнопке назначить свой с помощью атрибута formaction.

Поддерживается везде https://caniuse.com/#search=formaction

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

use yii\helpers\Url;

<?php $form = ActiveForm::begin(); ?>
    <div class="form-group">
        <?= Html::submitButton('Сохранить', [
            'class' => 'btn btn-success',
            'formaction' => Url::to(['controller/save']),
        ]); ?>
        <?= Html::submitButton('Сохранить и выйти', [
            'class' => 'btn btn-default',
            'formaction' => Url::to(['controller/save-and-exit']),
        ]); ?>
    </div>
<?php ActiveForm::end(); ?>
Общий для action код вынести, например, в хелпер.

Либо с параметром для одного action

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

<?php $form = ActiveForm::begin(); ?>
    <div class="form-group">
        <?= Html::submitButton('Сохранить', [
            'class' => 'btn btn-success',
            'formaction' => Url::to(['controller/save']),
        ]); ?>
        <?= Html::submitButton('Сохранить и выйти', [
            'class' => 'btn btn-default',
            'formaction' => Url::to(['controller/save', 'exit' => true]),
        ]); ?>
    </div>
<?php ActiveForm::end(); ?>
Думаю это немного нарушает Yii2 концепцию, но не сильно. И в таких случаях рекомендуют использовать radiobutton и одну кнопку, что тоже, в принципе, не обязательно.
Ответственные программисты с высоким уровнем технического долга (c)
Ответить