Создание Yii2 extensions. Тонкости.

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

Создание Yii2 extensions. Тонкости.

Сообщение sitemast »

Нужно создать extension в yii2.
Информации в доках крайне мало.
Например, не ясно как организовать работу с базой данных. Где-то встречалось мнение, что в extension не желательно использовать active records.
Как зарегистрировать extension в прилажении?
В общем, если есть подобный опыт, прошу им поделиться в данной теме.
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: Создание Yii2 extensions. Тонкости.

Сообщение S c »

>Где-то встречалось мнение, что в extension не желательно использовать active records.
Не верно.

Откройте 5-10 качественных расширений и посмотрите как они реализованы. Для начала попробуйте создать расширение - обертку, например какой-нибудь js библиотеки

Главное, ОБЯЗАТЕЛЬНО используйте стандарты оформления кода, принятые в Yii, composer и тд. Ну и если вы будете публиковать ваше решение, либо поддерживайте его в дальнейшем, либо укажите что вы создали его исключительно для себя, под вашу задачу и не рекомендуете его использовать другим как надежное решение
Аватара пользователя
mihail_dev
Сообщения: 243
Зарегистрирован: 2013.07.17, 00:51
Откуда: Молдова
Контактная информация:

Re: Создание Yii2 extensions. Тонкости.

Сообщение mihail_dev »

что именно вы подразумеваете под extension? это модуль какой то набор контроллеров или просто классы хелперы?
в принципе суть одна но в работе с каждым есть тонкости!
Изображение
sitemast
Сообщения: 16
Зарегистрирован: 2015.08.11, 08:26

Re: Создание Yii2 extensions. Тонкости.

Сообщение sitemast »

В данном случае у меня стоит задача сделать виджет для вывода комментариев в виде extension.Так как класс виджета наследует \yii\base\Widget.
Я так понимаю, что обработка формы отправки комментариев должна быть в методе run(), по типу кого, как в экшене контроллера.
Класс модели находится в папке с виджетом.
Правильно ли это или лучше передавать модель в виджет в конфиг.
Аватара пользователя
ksetrin
Сообщения: 81
Зарегистрирован: 2015.03.06, 10:00
Контактная информация:

Re: Создание Yii2 extensions. Тонкости.

Сообщение ksetrin »

sitemast писал(а):или лучше передавать модель в виджет в конфиг.
Лучше в конфиге
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: Создание Yii2 extensions. Тонкости.

Сообщение S c »

>виджет для вывода комментариев в виде extension
скорей наоборот) extension в виде виджета что ли)
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Создание Yii2 extensions. Тонкости.

Сообщение maleks »

sitemast писал(а): Правильно ли это или лучше передавать модель в виджет в конфиг.
Через конфиг должен настраиваться класс модели. Если пользователю вашего расширения понадобится расширить вашу модель то он отнаследует и изменит.
Естественно ваша мадель тоже должна быть, изначальная такая, в БД таблица для нее через миграции.
Yii2 universal module sceleton - for basic and advanced templates
sitemast
Сообщения: 16
Зарегистрирован: 2015.08.11, 08:26

Re: Создание Yii2 extensions. Тонкости.

Сообщение sitemast »

Если у виджета есть view и model, то сохранение данных формы в видах происходит так же как в экшене контроллере - $model->save(), только в методе run() ?
Аватара пользователя
ksetrin
Сообщения: 81
Зарегистрирован: 2015.03.06, 10:00
Контактная информация:

Re: Создание Yii2 extensions. Тонкости.

Сообщение ksetrin »

sitemast писал(а):Если у виджета есть view и model, то сохранение данных формы в видах происходит так же как в экшене контроллере - $model->save(), только в методе run() ?
1. Во view будь-то виджет или что-либо иное не должно происходить сохранения данных
2. Нотация вида $model->save() по сути выполняет сохранение данных в модели
3. Если у виджета и есть модель, то скорее для получения данных, а не для записи
4. Да, в виджете действительно есть методы run() и init(). Условно, можно сказать, что в init происходит подготовка данных к некоторой логике, а в run та самая логика виджета
sitemast
Сообщения: 16
Зарегистрирован: 2015.08.11, 08:26

Re: Создание Yii2 extensions. Тонкости.

Сообщение sitemast »

ksetrin писал(а):
sitemast писал(а):Если у виджета есть view и model, то сохранение данных формы в видах происходит так же как в экшене контроллере - $model->save(), только в методе run() ?
1. Во view будь-то виджет или что-либо иное не должно происходить сохранения данных
2. Нотация вида $model->save() по сути выполняет сохранение данных в модели
3. Если у виджета и есть модель, то скорее для получения данных, а не для записи
4. Да, в виджете действительно есть методы run() и init(). Условно, можно сказать, что в init происходит подготовка данных к некоторой логике, а в run та самая логика виджета
Я имею ввиду, что ,допустим у виджета вывода комментариев есть форма для комментирования. И $model->save() присутствует в методе run() виджета для того, чтобы сохранеть комментарий введенный в форму.
Такая логика будет правильной?
Аватара пользователя
ksetrin
Сообщения: 81
Зарегистрирован: 2015.03.06, 10:00
Контактная информация:

Re: Создание Yii2 extensions. Тонкости.

Сообщение ksetrin »

sitemast писал(а):
ksetrin писал(а):
sitemast писал(а):Если у виджета есть view и model, то сохранение данных формы в видах происходит так же как в экшене контроллере - $model->save(), только в методе run() ?
1. Во view будь-то виджет или что-либо иное не должно происходить сохранения данных
2. Нотация вида $model->save() по сути выполняет сохранение данных в модели
3. Если у виджета и есть модель, то скорее для получения данных, а не для записи
4. Да, в виджете действительно есть методы run() и init(). Условно, можно сказать, что в init происходит подготовка данных к некоторой логике, а в run та самая логика виджета
Я имею ввиду, что ,допустим у виджета вывода комментариев есть форма для комментирования. И $model->save() присутствует в методе run() виджета для того, чтобы сохранеть комментарий введенный в форму.
Такая логика будет правильной?
Технически - да.
Но, как вы собираетесь отправлять данные в виджет? Именно те данные, которые надо сохранить
sitemast
Сообщения: 16
Зарегистрирован: 2015.08.11, 08:26

Re: Создание Yii2 extensions. Тонкости.

Сообщение sitemast »

ksetrin писал(а):
Технически - да.
Но, как вы собираетесь отправлять данные в виджет? Именно те данные, которые надо сохранить
В виджете в методе function run() передаю в вид return $this->render('comments', [ ''model' => $this->model, ]);
И в том же методе делаю проверку

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

if ($this->model->load(Yii::$app->request->post()))
{

           $this->model->writeData = date('Y-m-d H:i:s');//date('Y-m-d, H:i:s')
           $this->model->ip = Yii::$app->getRequest()->getUserIP();

            if ($this->model->validate() && $this->model->save()){
                return Yii::$app->response->redirect(Yii::$app->request->referrer);
               
            }
}
Хотя, надо сказать, что данные приходят нормально в $this->model, однако почему - то $this->model->save() не сохраняет ни чего.Пока не могу найти причину.
Аватара пользователя
mihail_dev
Сообщения: 243
Зарегистрирован: 2013.07.17, 00:51
Откуда: Молдова
Контактная информация:

Re: Создание Yii2 extensions. Тонкости.

Сообщение mihail_dev »

создание экшинов в виджете это не правильно!

виджеты используются для вывода тех или иных блоков а не для обработки данных(частично обработка конечно может производится но очень специализированна допустим как работает yii\widgets\LinkPager в основном виджеты должны работать только с GET данными)!

делай связку виджет контроллер обработчик

в виджет передаются все необходимые данные
он отображает форму и данные
с формы данные передаются в контроллер там обрабатываются и возвращают юзер куда необходимо (дело техники)
если нужна передача данных без перезагрузки делайте на основе аякса

по поводу комментариев
скорее всего вам придётся сделать целый модуль если собираетесь что-то серьёзное делать так как надо отслеживать спам жалобы и тд всё это лучше сгруппировать в один модуль
в конфиге настраивайте модуль как вам нужно а в виджет допустим можно передавать название модуля (также можно зарезервировать название по умолчанию) и подтягивать все настройки из настроек модуля
Изображение
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Создание Yii2 extensions. Тонкости.

Сообщение maleks »

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

if ($this->model->validate() && $this->model->save()){
В save есть валидация, отдельный ->validate() не нужен. Не сохранять может потому что валидачия не пропускает, т.е. есть ошибки.
Посмотри var_dump($this->model->validate()), model->errors, что там
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Создание Yii2 extensions. Тонкости.

Сообщение maleks »

mihail_dev писал(а):создание экшинов в виджете это не правильно!
Можно и сделать, почему нет.
В первом yii виджет даже наследовался от базового контроллера, что как бы намекает.
И так проще и логичнее чем с action на некий контроллер.
По сути то виджет предлагает ввести данные , вот он их и обрабатывает.
А не так что action формы поставить на некий контроллер, получится:
- этот контроллер надо будет закрыть извне, не только по Посту но и мало ли для пользователей с какими правами тот виджет показался.
- при ошибках модели, он в виджете их и покажет, а так получится с контроллера надо редиректить назад на ту страницу где виджет с передачей ошибок через сессию.
Yii2 universal module sceleton - for basic and advanced templates
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Создание Yii2 extensions. Тонкости.

Сообщение zelenin »

maleks писал(а):В первом yii виджет даже наследовался от базового контроллера, что как бы намекает.
что намекает на то, что весь слой view наследовался от контроллера (ошибка архитектуры) - только на это.
maleks писал(а):И так проще и логичнее чем с action на некий контроллер.
По сути то виджет предлагает ввести данные , вот он их и обрабатывает.
но все таки это view слой, а, значит, введенные данные должны быть отловлены в контроллере и переданы дальше во вьюшку для показа и в виджет для обработки.
maleks писал(а): А не так что action формы поставить на некий контроллер, получится:
- этот контроллер надо будет закрыть извне, не только по Посту но и мало ли для пользователей с какими правами тот виджет показался.
разве это проблема?
maleks писал(а):при ошибках модели, он в виджете их и покажет, а так получится с контроллера надо редиректить назад на ту страницу где виджет с передачей ошибок через сессию.
насколько я вижу, здесь не указан функционал разрабатываемого виджета.
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: Создание Yii2 extensions. Тонкости.

Сообщение S c »

Вы говорили о виджете вывода комментариев, сейчас уже ставите другую задачу. Ваше расширение может содержать в себе и виджет и action и что угодно, хоть модуль. Виджет пусть отвечает исключительно за вывод комментариев + отображение формы
sitemast
Сообщения: 16
Зарегистрирован: 2015.08.11, 08:26

Re: Создание Yii2 extensions. Тонкости.

Сообщение sitemast »

S c писал(а):Вы говорили о виджете вывода комментариев, сейчас уже ставите другую задачу. Ваше расширение может содержать в себе и виджет и action и что угодно, хоть модуль. Виджет пусть отвечает исключительно за вывод комментариев + отображение формы
По моему замыслу виджет будет выводить комментарии и форму для добавления комментариев.Но, вероятнее всего, данные из формы будут отлавливаться в методе run() виджета. Там будет проверка на post и валидацию данных и вызов метода модели save().Поэтому я пока не вижу причин создавать контроллер для этого.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Создание Yii2 extensions. Тонкости.

Сообщение zelenin »

sitemast писал(а):Поэтому я пока не вижу причин создавать контроллер для этого.
причина может быть одна - понимание mvc. Отсутствие понимания позволяет вам не видеть причин для создания контроллеров вообще.
sitemast
Сообщения: 16
Зарегистрирован: 2015.08.11, 08:26

Re: Создание Yii2 extensions. Тонкости.

Сообщение sitemast »

zelenin писал(а):
sitemast писал(а):Поэтому я пока не вижу причин создавать контроллер для этого.
причина может быть одна - понимание mvc. Отсутствие понимания позволяет вам не видеть причин для создания контроллеров вообще.
С пониманием mvs все в порядке.Мне нужен совет как организовать систему комментариев через виджет по типу https://github.com/rmrevin/yii2-comments
Ответить