Передача id записи в виджет.

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
slo_nik
Сообщения: 300
Зарегистрирован: 2013.10.07, 19:08

Передача id записи в виджет.

Сообщение slo_nik » 2019.03.26, 21:18

Добрый вечер.
Подскажите, пожалуйста, как правильно сделать.
Есть форма подачи объявления. Выводится в модальном окне. Кнопка вызова модального окна с формой для нового объявления расположена в layouts/main.php. Кнопка для вызова окна с формой для редактирования находится в другом модальном окне.
Необходимо сделать возможность выводить форму не только для подачи нового объявления, но и редактирования.
Вообще-то это переделка существующего кода. Но старый код, я думаю, не очень, мягко говоря.
Сейчас, чтобы получить модель для редактирования, отсылается ajax запрос к контролеру, в ответе приходят данные, которые при помощи jquery парсятся и подставляются в форму. Но форма очень объёмная, очень много лишнего кода получается.
Задумал перенести всё это в виджет, чтобы прямо в виджете выводить или пустой экземпляр модели или заполненный, для редактирования, тем самым сократив объём кода и убрать лишние запросы к контролерам.
С первой частью я справился без проблем)))
Создал виджет подключил вид с формой.

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

class SaleForm extends Widget
{
    public $model;
    public $files;
    public function init()
    {
        $this->model = new Cars;
        $this->files = new Images;
    }

    public function run()
    {
        return $this->render('index', ['model' => $this->model, 'files' => $this->files]);
    }
}
Но вот как теперь сделать передачу id объявления в виджет не знаю.
Хотелось бы получить что-то похожее.

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

    public function init()
    {
        if($this->id == null){
            $this->model = new Cars;
            $this->files = new Images;           
        }
        else{
            // тут получать экземпляр необходимой модели 
        }
    }
Я знаю, что передать параметр в виджет большой проблемы не представляет

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

 <?= SaleForm::widget(['id' => $id])
Проблем не представляет получить сам id при клике на кнопке "редактировать".
Но вот как теперь этот параметр передать в виджет не понимаю, не знаю.
Подскажите, как правильно сделать?

Аватара пользователя
futbolim
Сообщения: 2050
Зарегистрирован: 2012.07.08, 19:28

Re: Передача id записи в виджет.

Сообщение futbolim » 2019.03.27, 08:55

Добавьте в виджет
public $id;

slo_nik
Сообщения: 300
Зарегистрирован: 2013.10.07, 19:08

Re: Передача id записи в виджет.

Сообщение slo_nik » 2019.03.27, 10:29

futbolim писал(а):
2019.03.27, 08:55
Добавьте в виджет
public $id;
Это понятно, но как заполнить его при вызове виджета на редактирование?
Кликаю по кнопке "редактировать", получаю id записи через jquery, а вот как потом это передать в параметры виджета?

Аватара пользователя
futbolim
Сообщения: 2050
Зарегистрирован: 2012.07.08, 19:28

Re: Передача id записи в виджет.

Сообщение futbolim » 2019.03.27, 11:32

slo_nik писал(а):
2019.03.27, 10:29
futbolim писал(а):
2019.03.27, 08:55
Добавьте в виджет
public $id;
Это понятно, но как заполнить его при вызове виджета на редактирование?
Кликаю по кнопке "редактировать", получаю id записи через jquery, а вот как потом это передать в параметры виджета?
О Боги. Это изначально неправильно. Может лучше поправить сей костыль?
Если нет возможности, Вам придётся плодить новые.
Ложите в сессию при аякс-запросе.

slo_nik
Сообщения: 300
Зарегистрирован: 2013.10.07, 19:08

Re: Передача id записи в виджет.

Сообщение slo_nik » 2019.03.27, 14:13

futbolim писал(а):
2019.03.27, 11:32
О Боги. Это изначально неправильно. Может лучше поправить сей костыль?
Если нет возможности, Вам придётся плодить новые.
Ложите в сессию при аякс-запросе.
Вот про это я и спрашивал, в сессию можно положить, а в cookies?
Но при клике никуда не переводит, форма открывается без перезагрузки страницы.
Сессию читать в public init(), правильно я понимаю?

Аватара пользователя
Seagull
Сообщения: 31
Зарегистрирован: 2019.01.24, 20:00

Re: Передача id записи в виджет.

Сообщение Seagull » 2019.03.27, 14:35

Кликаю по кнопке "редактировать", получаю id записи через jquery, а вот как потом это передать в параметры виджета?
Вы получаете id записи JS'ом, после того, как виджет уже был отрендерин?! Если так, то средствами JS'а форму и менять.

Если на момент рендеринга страницы в сессии\куки уже есть id, то да, в init виджета обрабатывать. И тогда jquery не нужен.

slo_nik
Сообщения: 300
Зарегистрирован: 2013.10.07, 19:08

Re: Передача id записи в виджет.

Сообщение slo_nik » 2019.03.27, 14:57

Seagull писал(а):
2019.03.27, 14:35
Кликаю по кнопке "редактировать", получаю id записи через jquery, а вот как потом это передать в параметры виджета?
Вы получаете id записи JS'ом, после того, как виджет уже был отрендерин?! Если так, то средствами JS'а форму и менять.

Если на момент рендеринга страницы в сессии\куки уже есть id, то да, в init виджета обрабатывать. И тогда jquery не нужен.
Нет, id я получаю до отрисовки виджета, до открытия модального окна, в котором виджет.
Id на момент рендеринга страницы нет ни в сессии ни в куках.
Вообще, оправдано ли создание виджета в этом случае?

Аватара пользователя
Seagull
Сообщения: 31
Зарегистрирован: 2019.01.24, 20:00

Re: Передача id записи в виджет.

Сообщение Seagull » 2019.03.27, 15:04

slo_nik писал(а):
2019.03.27, 14:57
Нет, id я получаю до отрисовки виджета, до открытия модального окна, в котором виджет.
slo_nik писал(а):
2019.03.27, 14:57
Id на момент рендеринга страницы нет ни в сессии ни в куках.
Виджет рендерится JS'ом или просто в layout'е через echo?

slo_nik
Сообщения: 300
Зарегистрирован: 2013.10.07, 19:08

Re: Передача id записи в виджет.

Сообщение slo_nik » 2019.03.27, 15:13

Seagull писал(а):
2019.03.27, 15:04
Виджет рендерится JS'ом или просто в layout'е через echo?
В layout-e через echo.

Аватара пользователя
Seagull
Сообщения: 31
Зарегистрирован: 2019.01.24, 20:00

Re: Передача id записи в виджет.

Сообщение Seagull » 2019.03.27, 15:21

slo_nik писал(а):
2019.03.27, 15:13
В layout-e через echo.
Так значит в сам виджет Вы уже не передадите ID, который получаете JS'ом.

Альтернатива предыдущей реализации:
1. Вынести форму в отдельный action, в которым уже будет проверяться наличие Id существующей записи и в зависимости от этого рендерить (без лэйаута) нужную форму (создание/редактирование). А при открытии модального окна, обращаться JS'ом к этому экшену и рендерить его ответ в тело модального окна.

slo_nik
Сообщения: 300
Зарегистрирован: 2013.10.07, 19:08

Re: Передача id записи в виджет.

Сообщение slo_nik » 2019.03.27, 15:38

Seagull писал(а):
2019.03.27, 15:21
slo_nik писал(а):
2019.03.27, 15:13
В layout-e через echo.
Так значит в сам виджет Вы уже не передадите ID, который получаете JS'ом.

Альтернатива предыдущей реализации:
1. Вынести форму в отдельный action, в которым уже будет проверяться наличие Id существующей записи и в зависимости от этого рендерить (без лэйаута) нужную форму (создание/редактирование). А при открытии модального окна, обращаться JS'ом к этому экшену и рендерить его ответ в тело модального окна.
Что-то похожее видел в инете...
Значит, надо на кнопки "подать объявление" и "редактировать" повесить js, который будет отсылать ajax на отдельное действие, которое будет заниматься только отрисовкой формы с данными или без?
В данном варианте не стоит городить отдельный виджет?

Аватара пользователя
Seagull
Сообщения: 31
Зарегистрирован: 2019.01.24, 20:00

Re: Передача id записи в виджет.

Сообщение Seagull » 2019.03.27, 17:19

slo_nik писал(а):
2019.03.27, 15:38
Значит, надо на кнопки "подать объявление" и "редактировать" повесить js, который будет отсылать ajax на отдельное действие, которое будет заниматься только отрисовкой формы с данными или без?
Да
slo_nik писал(а):
2019.03.27, 15:38
В данном варианте не стоит городить отдельный виджет?
Это всё можно обернуть в виджет.

slo_nik
Сообщения: 300
Зарегистрирован: 2013.10.07, 19:08

Re: Передача id записи в виджет.

Сообщение slo_nik » 2019.03.27, 17:54

Seagull писал(а):
2019.03.27, 17:19
Это всё можно обернуть в виджет.
Обернуть только отрисовку пустой формы? Извините, но я не понимаю))) Объясните, пожалуйста.

Аватара пользователя
Seagull
Сообщения: 31
Зарегистрирован: 2019.01.24, 20:00

Re: Передача id записи в виджет.

Сообщение Seagull » 2019.03.27, 18:10

slo_nik писал(а):
2019.03.27, 17:54
Обернуть только отрисовку пустой формы? Извините, но я не понимаю))) Объясните, пожалуйста.
Рендер модального окна, регистрацию asset'ов со всем функционалом JS (ajax).

slo_nik
Сообщения: 300
Зарегистрирован: 2013.10.07, 19:08

Re: Передача id записи в виджет.

Сообщение slo_nik » 2019.03.27, 18:16

Seagull писал(а):
2019.03.27, 18:10
Рендер модального окна, регистрацию asset'ов со всем функционалом JS (ajax).
Ну да. Блин, туплю что-то с этим виджетом.

slo_nik
Сообщения: 300
Зарегистрирован: 2013.10.07, 19:08

Re: Передача id записи в виджет.

Сообщение slo_nik » 2019.04.20, 04:50

Seagull писал(а):
2019.03.27, 18:10
futbolim писал(а):
2019.03.27, 08:55
тут зашла в голову мысль.
Как бы то ни было, но мне надо вызывать одну и ту же форму. В первом случае пустую, в другом заполненную.
Для вызова пустой есть кнопка, которая висит в layout-e, а вторая висит в модальном окне, где показаны все объявления пользователя.
Значит всё-таки виджет.
В параметрах я передаю какой вид должен быть у кнопки и вторым параметром мне надо передать id объявления или передать null, если этот виджет вызывается в layout-e.
В виджет также засунуть саму форму. В init() проверять наличие id, если есть, выдаю заполненную форму, если нет - пустую.
И вызов виджета сводится к такому варианту:

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

// вызываем в layout-e, для вывода пустой формы
echo SaleForm::widget([
   'type' => 'create', // тип/внешний вид кнопки
   'id' => null // или вообще ничего не писать, а в самом виджете проверять на null
])

// вызываем в другом модальном, где выводятся все объявления пользователя
echo SaleForm::widget([
   'type' => 'update', // тип/внешний вид кнопки
   'id' => $model->id // объявления выводятся в цикле
])
В виде, который рендерится в run() проверять type и исходя из этого отрисовывать кнопку. Модальное окно с формой тоже в виджете.
Вот только как быть с записью и обновлением в самой базе? Контролер в виджете вроде бы как бы не допускается... Третий параметр с маршрутом к нужному действию в стороннем контролере? Или как?
Что вообще скажете о такой реализации?

Аватара пользователя
proctoleha
Сообщения: 276
Зарегистрирован: 2016.07.10, 19:00

Re: Передача id записи в виджет.

Сообщение proctoleha » 2019.04.20, 16:24

Привет Дим! Может я что-то не понимаю, но: у тебя есть некая сущность.

В ней есть виджет, который выводит форму в зависимости от параметров. Также нужны инструменты для работы с БД (контроллеры + модели), потом еще что-то потребуется ...

Объедини ты всё это в модуль. И виджет, и контроллер, и объекты AR, и сервисы, и формы ... Прописал модуль в конфиге, и дергаешь что нужно
Вот за что я не люблю линукс, так это за свои кривые, временами, руки

Ответить