Общее действие для некоторых контролерров
-
- Сообщения: 203
- Зарегистрирован: 2014.02.16, 03:09
Общее действие для некоторых контролерров
Дабы не плодить быдлокод спрошу сразу...
Задача такая
У некоторых моделей, например у элементов каталога, записей в блоге, нужно сделать поле (bool), означающее активна запись или нет.
И чтобы в gridview аяксовым запросом можно было кликом по значку менять значение активности.
Т.е нужно чтобы в некотроых контроллерах, было действие, обновляющее поле своей модели, и (в чем у меня возникла основная проблема) чтобы это действие возвращало html нужного gridview (для обновления gridview после ajax запроса)
Напишите плз основные шаги, как это сделать правильно
Задача такая
У некоторых моделей, например у элементов каталога, записей в блоге, нужно сделать поле (bool), означающее активна запись или нет.
И чтобы в gridview аяксовым запросом можно было кликом по значку менять значение активности.
Т.е нужно чтобы в некотроых контроллерах, было действие, обновляющее поле своей модели, и (в чем у меня возникла основная проблема) чтобы это действие возвращало html нужного gridview (для обновления gridview после ajax запроса)
Напишите плз основные шаги, как это сделать правильно
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Общее действие для некоторых контролерров
Внешнее действие это класс Action, подключаешь к контролеру, настраиваешь:
- модель
- поле которое нужно менять
- роут куда нужно редиректить, по умолчанию `index`
Действие сохраняет модель и редиректит на тоже действие что выдает грид.
- модель
- поле которое нужно менять
- роут куда нужно редиректить, по умолчанию `index`
Действие сохраняет модель и редиректит на тоже действие что выдает грид.
Жду Yii 3!
-
- Сообщения: 203
- Зарегистрирован: 2014.02.16, 03:09
Re: Общее действие для некоторых контролерров
Спасибо за подсказку, сделал вот такое действие:
Ссылки для переключения активации в гриде генерируются такие page/activate/2?action=activate (или ?action=deactivate)
Впринципе без ajax работает, но если включить pjax, запрос отправляется норм, но страница все равно перезагружается полностью(видимо из-за редиректа) Как тут быть?
Еще меня смущает, что для того, чтобы работала вот эта строка
$model = $this->controller->findModel($id);
Пришлось менять на public видимость метода findModel, который генерируется gii как protected
Код: Выделить всё
namespace app\components\actions;
use Yii;
use yii\base;
use yii\base\Action;
class ActivateAction extends Action
{
public $attribute = 'active';
public $redirectAction = 'index';
public function run()
{
$request = Yii::$app->request;
$attribute = $request->get('attribute', $this->attribute);
$action = $request->get('action', 'activate');
$id = $request->get('id');
if($id) {
$model = $this->controller->findModel($id);
if ($model) {
$model->$attribute = ($action == 'activate' ? 1 : 0);
$model->update([$attribute]);
}
$this->controller->redirect([$this->controller->id . '/' . $this->redirectAction]);
}
else {
throw new base\ErrorException('Не указан id модели');
}
}
}
Впринципе без ajax работает, но если включить pjax, запрос отправляется норм, но страница все равно перезагружается полностью(видимо из-за редиректа) Как тут быть?
Еще меня смущает, что для того, чтобы работала вот эта строка
$model = $this->controller->findModel($id);
Пришлось менять на public видимость метода findModel, который генерируется gii как protected
Re: Общее действие для некоторых контролерров
louisvuitton писал(а):Спасибо за подсказку, сделал вот такое действие:
Ссылки для переключения активации в гриде генерируются такие page/activate/2?action=activate (или ?action=deactivate)Код: Выделить всё
namespace app\components\actions; use Yii; use yii\base; use yii\base\Action; class ActivateAction extends Action { public $attribute = 'active'; public $redirectAction = 'index'; public function run() { $request = Yii::$app->request; $attribute = $request->get('attribute', $this->attribute); $action = $request->get('action', 'activate'); $id = $request->get('id'); if($id) { $model = $this->controller->findModel($id); if ($model) { $model->$attribute = ($action == 'activate' ? 1 : 0); $model->update([$attribute]); } $this->controller->redirect([$this->controller->id . '/' . $this->redirectAction]); } else { throw new base\ErrorException('Не указан id модели'); } } }
Впринципе без ajax работает, но если включить pjax, запрос отправляется норм, но страница все равно перезагружается полностью(видимо из-за редиректа) Как тут быть?
перезагружается как раз потому что редирект делаете $this->controller->redirect([$this->controller->id . '/' . $this->redirectAction]);
... отлавливать если идет pjax -запрос и возвращать $this->controller->runAction($this->redirectAction) при необходимости с параметрами, либо для вызова метода использовать ajax, в экшне возвращать true например, а на клиенте по успешной отправке запроса делать $.pjax.reload вообще посмотрите поищите реализации ToggleColumn/ToggleAction
передавайте в action класс модели и реализуйте метод findModel прямо в actionlouisvuitton писал(а): Еще меня смущает, что для того, чтобы работала вот эта строка
$model = $this->controller->findModel($id);
Пришлось менять на public видимость метода findModel, который генерируется gii как protected
-
- Сообщения: 203
- Зарегистрирован: 2014.02.16, 03:09
Re: Общее действие для некоторых контролерров
Спасибо, много полезного почерпнул)
Но решил не делать велосипед и в итоге нашел такую реализацию https://github.com/phemellc/yii2-toggle-column
Вроде все круто, но почему-то не обновляется аяксом.
Когда доходит дело до pjax запроса на обновление grid'a
$.pjax.reload({container:"#" + pjaxId});
запрос Aborted и страница перезагружается.
Я даже не успеваю посмотреть чем там сервер отвечает.
В чем может быть причина? все сделал как написано у автора, и, на мой взгляд, код там хороший и рабочий.
Но решил не делать велосипед и в итоге нашел такую реализацию https://github.com/phemellc/yii2-toggle-column
Вроде все круто, но почему-то не обновляется аяксом.
Когда доходит дело до pjax запроса на обновление grid'a
$.pjax.reload({container:"#" + pjaxId});
запрос Aborted и страница перезагружается.
Я даже не успеваю посмотреть чем там сервер отвечает.
В чем может быть причина? все сделал как написано у автора, и, на мой взгляд, код там хороший и рабочий.
Re: Общее действие для некоторых контролерров
таймаут в виджете пиджака увеличить
-
- Сообщения: 203
- Зарегистрирован: 2014.02.16, 03:09
Re: Общее действие для некоторых контролерров
Увеличивал, стоит 3000 мсек, а абортится на ~500 мсек =\
Re: Общее действие для некоторых контролерров
а ну так там в action тоже редирект https://github.com/phemellc/yii2-toggle ... Action.php
вот этот поставь https://github.com/2amigos/yii2-grid-view-library там под аякс заточено
вот этот поставь https://github.com/2amigos/yii2-grid-view-library там под аякс заточено
-
- Сообщения: 203
- Зарегистрирован: 2014.02.16, 03:09
Re: Общее действие для некоторых контролерров
Суперштука) Запилил