!!! Горю! Тону! Спасите, помогите! ...Получить id у row GridView при формирование 'value' каждой строки столбца[~РЕШЕНО]

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
terrarium volition
Сообщения: 99
Зарегистрирован: 2021.07.15, 21:22

!!! Горю! Тону! Спасите, помогите! ...Получить id у row GridView при формирование 'value' каждой строки столбца[~РЕШЕНО]

Сообщение terrarium volition »

Всем доброго дня!

Ситуация крайне непонятная, прошу помощи, уважаемые гуру yii2! :!:

Я формирую значение поля 'value' для ячейки таблицы через функцию, сама ячейка при этом в формате 'raw' :

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

$value = (function($model, $key, $index, $widget) use ($pnotifyDelay, $pjaxDelay, $modalID) {
....
}
Я пытаюсь получить id строки в таблице(модели), когда формирую значение ячейки таблицы, так:

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

$model->id,
где $model - это текущая модель, которая подгружается из БД как DataProvider.
Если я вывожу на посмотреть эти id так:

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

print_r('$model->id : ' . $model->id . ' - столбец 1 ; ');
, то вижу:

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

$model->id : 30 - столбец 1 ; $model->id : 37 - столбец 1 ; $model->id : 39 - столбец 1 ;
Но когда передают этот id в секцию дополнительных данных:

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

 'uploadExtraData' => [
                                    'attribute' =>  $widget->attribute,
                                    'id'        =>  $model->id,
                                    'modalID'   =>  $modalID,
                                ],
, то при дальнейшем сохранении ВСЕГДА попадаю на первую строку(модель) таблицы!

Как так может быть, что при генерации 'value ' для каждой модели в отладке я вижу изменяемый id, а при передаче в виджет он не обновляется?!

Полных код формирования 'value':

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

$modalID = '#modalFileUpload1';

        $value = (function($model, $key, $index, $widget) use ($pnotifyDelay, $pjaxDelay, $modalID) {
            print_r('$model->id : ' . $model->id . ' : 1 строка ; ');

            return 

            $model[$widget->attribute]
            .
            '<p>'
            .
            Html::tag("a", "<i class='fa fa-download'></i> Загрузить ", ["class" => "btn btn-primary", "data-toggle" => "modal", "href" => $modalID])
            .
            '</p>'
            .
            '<div class="modal fade" id="modalFileUpload1" tabindex="-1" role="dialog">'
            .
                '<div class="modal-dialog" role="document">
                    <div class="modal-content">
                        <div class="modal-header">
                            <h4 class="modal-title">Добавь файл</h4>
                        </div>
                        <div class="modal-body">'
                        .
                        FileInput::widget([
                            'name'      =>  $widget->attribute . $model->id,
                            'language'  => 'ru',
                            'options'=>[
                                'multiple'  =>  false
                            ],
                            'pluginOptions' => [
                                'previewFileType'   =>  'any',
                                'uploadUrl'         =>  "index.php?r=site/uploadmodal",
                                'uploadExtraData' => [
                                    'attribute' =>  $widget->attribute,
                                    'id'        =>  $model->id,
                                    'modalID'   =>  $modalID,
                                ],
                            ],
                            'pluginEvents' => [
                                'fileuploaded'=>"function(event, data, previewId, index, fileId){
                                    var datas = data.response.files[0];
                                    new PNotify({
                                        title   :   datas.message,
                                        type    :   datas.type,
                                        text    :   datas.filename,
                                        styling :   'bootstrap3',
                                        delay   :   $pnotifyDelay,
                                    });     

                                    $(datas.modalID).modal('hide');
                                    setTimeout(() => { $.pjax.reload({container: datas.pjaxTarget, async:false, timeout: false}); }, $pjaxDelay);
                                }",
                            ]
                        ])
                        .
                        '</div>
                    </div>
                </div>
            </div>';
        });
Пожалуйста, проясните, может есть какой-то стандартный способ, как правильно получить номер модели в таблице GridView при нажатии на модальную кнопку, которая открывает окно загрузки файла?

Спасибо!
Последний раз редактировалось terrarium volition 2023.04.17, 18:52, всего редактировалось 6 раз.
terrarium volition
Сообщения: 99
Зарегистрирован: 2021.07.15, 21:22

Re: Получить id у row GridView при формирование 'value' каждой строки столбца

Сообщение terrarium volition »

Проблема решена.
Сделал вызов FileInput не через 'name', а через 'modal', 'attribute', а далее, не через

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

$form->field($model, "file")->FileInput
, т.к. так виджет в модальном окне не отрисовывается,
а через echo.
terrarium volition
Сообщения: 99
Зарегистрирован: 2021.07.15, 21:22

Re: Получить id у row GridView при формирование 'value' каждой строки столбца

Сообщение terrarium volition »

Поторопился я с ответом. Проблема осталась, только теперь выбирается не первая строка(модель), а последняя!

Что с этим делать совершенно непонятно.
terrarium volition
Сообщения: 99
Зарегистрирован: 2021.07.15, 21:22

Re: Получить id у row GridView при формирование 'value' каждой строки столбца

Сообщение terrarium volition »

Вдобавок выяснилось, что событие 'fileuploaded' срабатывает у FileInput для каждой строки, вне зависимости от того, в какой строке я открывал виджет и загружать файл! И для каждой строки $model->id был одинаковым и соответствовал последней строке!

Это какой-то кошмар.
terrarium volition
Сообщения: 99
Зарегистрирован: 2021.07.15, 21:22

Re: !!! Горю! Тону! Спасите, помогите! ...Получить id у row GridView при формирование 'value' каждой строки столбца

Сообщение terrarium volition »

Ну хорошо. Сделал через js так:
1. Назначил $model->id таблицы как id для модальной кнопки, по которой вызываю меню загрузки файла.
2. Получил id этой кнопки в js в момент её нажатия(сам файл в это время ещё не выбран для загрузки)
3. Передал на сервер id и сохранил в сессии.
4. Взял id из сессии в момент сохранения файл в БД.

Я не знаю, можно ли сделать как-то через виджет, но был бы признателен, если бы сообщество всё равно ответило бы на вышеописанный вопрос.
terrarium volition
Сообщения: 99
Зарегистрирован: 2021.07.15, 21:22

Re: !!! Горю! Тону! Спасите, помогите! ...Получить id у row GridView при формирование 'value' каждой строки столбца[~РЕШ

Сообщение terrarium volition »

Ещё пару моментов:
1. Если убрать модальность, т.е. выводить виджет сразу в ячейке GridView, то никаких проблем с $model->id нет.
2. Такое поведение не только у виджета файлов, но, например, у select2 тоже самое. И, видимо, у всех виджетов так будет, ибо дело не в них, а в модальном окне.
Ответить