Оставить выбранным параметр из выпадающего списка

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
andrej3337
Сообщения: 46
Зарегистрирован: 2019.11.03, 16:02

Оставить выбранным параметр из выпадающего списка

Сообщение andrej3337 »

Сделал форму с несколькими dropDownList. После отправки данных в обычных инпутных полях сохраняются введенные данные, а в выпадающих остается либо первое значение либо значение, заданное через 'prompt' (пробовал и так, и эдак), но не то что выбрал пользователь перед отправкой формы.

Каким способом можно оставить выбранное значение в dropDownList?

На php эту проблему if-else решил - получилось вот так zachet.pro, но на yii2 ничего не понимаю, гуглю безрезультатно уже неделю.

Спасибо
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Оставить выбранным параметр из выпадающего списка

Сообщение skynin »

-- Каким способом можно оставить выбранное значение в dropDownList?
при создании списка для выбора - добавляю то значение которое было выбрано перед этим.

-- После отправки данных в обычных инпутных полях сохраняются введенные данные
->load их копирует. Как и выбранное из списка значение.
А вот сам список формируется... посмотрите, где и как он у вас формируется.
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Оставить выбранным параметр из выпадающего списка

Сообщение unknownby »

andrej3337 писал(а): 2020.08.30, 21:27 Сделал форму с несколькими dropDownList. После отправки данных в обычных инпутных полях сохраняются введенные данные, а в выпадающих остается либо первое значение либо значение, заданное через 'prompt' (пробовал и так, и эдак), но не то что выбрал пользователь перед отправкой формы.

Каким способом можно оставить выбранное значение в dropDownList?

На php эту проблему if-else решил - получилось вот так zachet.pro, но на yii2 ничего не понимаю, гуглю безрезультатно уже неделю.

Спасибо
Я проверил и у меня всё сохраняется после нажатия на "Закрыть цепочку".
andrej3337
Сообщения: 46
Зарегистрирован: 2019.11.03, 16:02

Re: Оставить выбранным параметр из выпадающего списка

Сообщение andrej3337 »

unknownby писал(а): 2020.08.31, 08:53 Я проверил и у меня всё сохраняется после нажатия на "Закрыть цепочку".
Пример руками написан на чистом php, а не при помощи yii. Хочу сейчас перенести это все на фреймворк.
andrej3337
Сообщения: 46
Зарегистрирован: 2019.11.03, 16:02

Re: Оставить выбранным параметр из выпадающего списка

Сообщение andrej3337 »

skynin писал(а): 2020.08.30, 21:58 -- Каким способом можно оставить выбранное значение в dropDownList?
при создании списка для выбора - добавляю то значение которое было выбрано перед этим.

-- После отправки данных в обычных инпутных полях сохраняются введенные данные
->load их копирует. Как и выбранное из списка значение.
А вот сам список формируется... посмотрите, где и как он у вас формируется.
А где можно сделать, в контролере перед отправкой полученных данных в вид?
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Оставить выбранным параметр из выпадающего списка

Сообщение skynin »

andrej3337 писал(а): 2020.08.31, 14:55 А где можно сделать, в контролере перед отправкой полученных данных в вид?
Да, по идее лучшее место, у меня в контроллере.

Фильтры вот зависимые недавно делал
Можно отобрать по виду спорта, тогда логично показывать только лиги этого вида спорта.
А если ранее была выбрана лига с другого вида спорта?

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

public function actionIndex() { 

$dataProvider = $searchModel->search($this->request->queryParams);

SportLeagueFM::listLeagues($searchModel->sport_id, $searchModel->lea_id);
Вот и создаем список для выбора
правильных лиг:
listLeagues($searchModel->sport_id // первый параметр
и добавляем ту что была выбрана, вторым параметром:

$searchModel->lea_id);

lea_id будет заполнена внутри вызова
$searchModel->search($this->request->queryParams)
как обычно search формы заполняются
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
andrej3337
Сообщения: 46
Зарегистрирован: 2019.11.03, 16:02

Re: Оставить выбранным параметр из выпадающего списка

Сообщение andrej3337 »

Блин, у меня там из базы ничего не тянется. Что пользователь заполнил - отправляем в PОST и валидируем - возвращаем форму пользователю.
Только надо как-то исходя из выбранного варианта после отправки ПОСТ запроса вернуть пользователю в том числе и выбранный пункт из выпадающего списка
andrej3337
Сообщения: 46
Зарегистрирован: 2019.11.03, 16:02

Re: Оставить выбранным параметр из выпадающего списка

Сообщение andrej3337 »

Да, позже, пока доступа к коду нет
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Оставить выбранным параметр из выпадающего списка

Сообщение skynin »

-- Блин, у меня там из базы ничего не тянется

потому и спросил
А вот сам список формируется... посмотрите, где и как он у вас формируется.

Вобщем суть процесса:

Есть поле, например числовое
Список для пользователя - первые 5 четных чисел
Он выбрал, реальное число записалось

Меняем список на первые 5 нечетных
Открываем с заполенным ранее - а в списке то такого числа нет.

Поэтому ответ на вопрос
Оставить выбранным параметр из выпадающего списка

Добавить в этот список значение что есть в поле.

И поэтому:
список - где и как он у вас формируется.

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

Или, вообще какой-то баг, не тот список, не туда подцепляете, не так инициализируете виджет, не так работаете с ActiveForm, заполняете одну модель, возвращаете другую и т.п.
Тогда - Yii Guide и посмотрите на чистом проекте как генерит формы Gii
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
andrej3337
Сообщения: 46
Зарегистрирован: 2019.11.03, 16:02

Re: Оставить выбранным параметр из выпадающего списка

Сообщение andrej3337 »

Контролер

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

<?php

namespace frontend\controllers;

use app\models\ZachetForm;
use Yii;
use yii\web\Controller;

class ServiceController extends Controller
{
    public function actionIndex()
    {
        return $this->render('index');
    }

    public function actionZachet()
    {
        $model = new ZachetForm();
        if ($model->load(Yii::$app->request->post()) && $model->validate()) {


            }
        return $this->render('zachet', compact('model'));
    }

}
Представление

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

<?php
use yii\bootstrap4\ActiveForm;
use yii\bootstrap4\Html;

?>
<section class="content" id="content">
    <div class="container container-fluid">
        <div class="row">
            <div class="col-12 col-sm-12 col-md-12 col-lg-1 col-xl-1"></div>
            <div class="col-12 col-sm-12 col-md-12 col-lg-10 col-xl-10 p-2">

        <?php $form = ActiveForm::begin([
                'id' => 'ajax_form',
                'options' => [
                //'data-pjax' => true,
                ],
            ]);
        ?>
                <div class="form-row bg-light" id="row"> <!-- первый ряд формы row-->
                    <div class="col-md-4 mb-3"> <!--первый кол первого ряда-->
                        <?= $form->field($model, 'k1', ['enableLabel' => false])->textInput(['placeholder' => '1-й контрагент', 'class' => 'form-control form-control-lg']); ?>
                    </div>

                    <div class="col-md-4 mb-3"><!-- второй кол первого ряда -->
                        <?= $form->field($model, 'status1[]', ['enableLabel' => false])->dropDownList([
                            '1' => 'Кредитор', '2' => 'Должник'
                        ],
                            [
                                'class' => 'custom-select custom-select-lg mb-3',
                                'prompt' => 'Выберете статус контрагента',
                            ]); ?>
                    </div>
                    <div class="col-md-4 mb-3"><!-- третий кол первого ряда -->
                        <?= $form->field($model, 'sum1', ['enableLabel' => false])->textInput(['placeholder' => '00.0', 'class' => 'form-control form-control-lg']); ?>
                    </div>
                </div><!-- конец первого ряда формы -->

                <div class="form-row" id="row"> <!-- второй ряд формы row-->

                    <div class="col-md-4 mb-3"> <!--первый кол второго ряда-->
                        <?= $form->field($model, 'k2', ['enableLabel' => false])->textInput(['placeholder' => '2-й контрагент', 'class' => 'form-control form-control-lg']); ?>
                    </div>

                    <div class="col-md-2 mb-3"><!-- второй кол второго ряда -->
                        <?= $form->field($model, 'status2[]', ['enableLabel' => false])->dropDownList([
                            '1' => 'Кредитор', '2' => 'Должник'
                        ],
                            [
                                'class' => 'custom-select custom-select-lg mb-3',
                                'prompt' => 'Статус к первому',
                            ]); ?>
                    </div>

                    <div class="col-md-2 mb-3"><!-- третий кол второго ряда -->
                        <?= $form->field($model, 'sum2', ['enableLabel' => false])->textInput(['placeholder' => '00.0', 'class' => 'form-control form-control-lg']) ?>
                    </div>

                    <div class="col-md-2 mb-3"><!-- четвертый кол второго ряда -->
                        <?= $form->field($model, 'status3[]', ['enableLabel' => false])->dropDownList([
                                '1' => 'Кредитор', '2' => 'Должник'
                        ],
                            [
                                'class' => 'custom-select custom-select-lg mb-3',
                                'prompt' => 'Статус к третьему',
                            ]); ?>
                    </div>

                    <div class="col-md-2 mb-3"><!-- пятый кол второго ряда -->
                        <?= $form->field($model, 'sum3', ['enableLabel' => false])->textInput(['placeholder' => '00.0', 'class' => 'form-control form-control-lg']) ?>
                    </div>
                </div><!-- конец первого ряда формы -->

                <div class="form-row bg-light" id="row"> <!-- третий ряд формы row-->

                    <div class="col-md-4 mb-3"> <!--первый кол третьего ряда-->
                        <?= $form->field($model, 'k3', ['enableLabel' => false])->textInput(['placeholder' => '3-й контрагента', 'class' => 'form-control form-control-lg']); ?>
                    </div>

                    <div class="col-md-4 mb-3"><!-- второй кол третьего ряда -->
                        <?= $form->field($model, 'status4[]', ['enableLabel' => false])->dropDownList([
                                '1' => 'Кредитор', '2' => 'Должник'
                        ],
                              [
                                  'class' => 'custom-select custom-select-lg mb-3',
                                  'prompt' => 'Выберете статус контрагента'

                              ]);
                            ?>
                    </div>

                    <div class="col-md-4 mb-3"><!-- третий кол третьего ряда -->
                        <?= $form->field($model, 'sum4', ['enableLabel' => false])->textInput(['placeholder' => '00.0', 'class' => 'form-control form-control-lg']) ?>
                    </div>
                </div><!-- конец первого ряда формы -->

        <div class = "form-group">
            <?= Html::submitButton('Закрыть цепочку', ['class' => 'btn btn-outline-dark btn-lg']) ?>
        </div>
            <?php ActiveForm::end(); ?>


                        </div>
                        <div class="col-12 col-sm-12 col-md-12 col-lg-1 col-xl-1"></div>

        </div>
    </div>
</section>
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Оставить выбранным параметр из выпадающего списка

Сообщение skynin »

мдя. я то думал...

$model = new ZachetForm();
создаете новую модель.

Первое открытие, загружать нечего, отдали пустой,
Пользователь заполнил, нажал "Закрыть цепочку"

$model->load(Yii::$app->request->post()) && $model->validate()
загрузили, провалидировали.

И?
Вернули ее.

Пользователь закрыл форму ввода.
И?
Я может что пропустил, вы где сохраняете то что ввел пользователь?

Вобщем вторая проблема
Читайте Yii Guide и учитесь у кода что генерит Gii

А списки у вас неизменяющиеся
['1' => 'Кредитор', '2' => 'Должник']

Просто незнание Yii.
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Оставить выбранным параметр из выпадающего списка

Сообщение skynin »

а, еще что может быть
ZachetForm

sum1, status3 и прочие поля - неправильно настроены.
и load в них ничего не грузит.

Ответы как правильно, там же, в Yii guide - https://www.yiiframework.com/doc/guide/2.0/ru
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
andrej3337
Сообщения: 46
Зарегистрирован: 2019.11.03, 16:02

Re: Оставить выбранным параметр из выпадающего списка

Сообщение andrej3337 »

Пост данные принимает все из формы

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

$_POST
Name 	Value
_csrf 	'-uR7Sy0lYCBeAMfZa5qEbr2zjy9wl_Pysy72MYLBNACztTg_RQhWWS9rrK4HqepXytT_ZUjUiYL2bbd_sYBycw=='
ZachetForm 	[
    'k1' => 'sdfgsdf'
    'status1' => [
        0 => '1'
    ]
    'sum1' => '34534'
    'k2' => 'asdfasdf'
    'status2' => [
        0 => '1'
    ]
    'sum2' => '234234'
    'status3' => [
        0 => '1'
    ]
    'sum3' => '234234'
    'k3' => 'sdafasdf'
    'status4' => [
        0 => '1'
    ]
    'sum4' => '345345'
]
В контролере:
создаем экземпляр ZachetForm - $model = new ZachetForm();
далее если получили данные в пост и провалидировали - if ($model->load(Yii::$app->request->post()) && $model->validate())
возвращаем пользователю форму обратно return $this->render('zachet', compact('model'));

Все по букварю https://www.yiiframework.com/doc/guide/ ... tart-forms, только не вижу смысла в возвращении ошибки валидации, у меня форма просто не отправляется с ошибками.

То что я выше скопировал, возвращает мне все заполненные поля кроме выпадающих списков - там отображаются строка по умолчанию т.е. то что в 'prompt'
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Оставить выбранным параметр из выпадающего списка

Сообщение skynin »

'status1' => [
0 => '1'
]
А что должно быть в status1?
Что вы хотите чтобы там было?

Как понимаю из
dropDownList([
'1' => 'Кредитор', '2' => 'Должник'
]
Вы хотите чтобы там был 1 или 2?

Но если вы хотите чтобы пользователь ввел с помощью предопределенного списка 1 или 2, и только 1 или 2, то почему
($model, 'status1[]',

то есть - что вы хотите?
а потом - смотрите что написано у вас в коде.

я правда ни разу не делал поля массивами
($model, 'status1[]',
как-то не надо было
но умеет ли dropDownList автоматически превращаться в список чекбоксов...
Посмотрите в его код. в код фреймворка в смысле - понимает ли он что нужно рисовать
на основе
'status1' => [
0 => '1'
]

чекбокс - используя [
'1' => 'Кредитор', '2' => 'Должник'
]
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
andrej3337
Сообщения: 46
Зарегистрирован: 2019.11.03, 16:02

Re: Оставить выбранным параметр из выпадающего списка

Сообщение andrej3337 »

Я хочу чтобы при отправке формы с параметром '1' => 'Кредитор' в html присваивалось <option value="1" selected>Кредитор</option> как и работает на голом php что в примере в начале
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Оставить выбранным параметр из выпадающего списка

Сообщение ElisDN »

Просто вписывайте ($model, 'status1', ...) вместо ($model, 'status1[]', ...)
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Оставить выбранным параметр из выпадающего списка

Сообщение unknownby »

Ну раз тайна исчезновения значений в dropDownList раскрыта, то посоветую вынести массив "Кредитор/Должник" вверх и использовать везде этот массив, вместо объявления его четыре раза. :D
andrej3337
Сообщения: 46
Зарегистрирован: 2019.11.03, 16:02

Re: Оставить выбранным параметр из выпадающего списка

Сообщение andrej3337 »

ElisDN писал(а): 2020.09.01, 00:12 Просто вписывайте ($model, 'status1', ...) вместо ($model, 'status1[]', ...)
Спасибо, попробую как будет доступ к коду
andrej3337
Сообщения: 46
Зарегистрирован: 2019.11.03, 16:02

Re: Оставить выбранным параметр из выпадающего списка

Сообщение andrej3337 »

unknownby писал(а): 2020.09.01, 11:01 Ну раз тайна исчезновения значений в dropDownList раскрыта, то посоветую вынести массив "Кредитор/Должник" вверх и использовать везде этот массив, вместо объявления его четыре раза. :D
Но мне необходимо прописать логику выдачи результата исходя из того что пользователь выберет во всех возможных вариациях этих 4 выпадающих списков, потому думается лучше привязать каждый список к своей переменной. Но попробую воспользоваться вашим советом и распечатаю результат, если с этими данными можно будет работать, то вариант неплохой.
Закрыто