Общее действие для некоторых контролерров

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
louisvuitton
Сообщения: 203
Зарегистрирован: 2014.02.16, 03:09

Общее действие для некоторых контролерров

Сообщение louisvuitton »

Дабы не плодить быдлокод спрошу сразу...

Задача такая
У некоторых моделей, например у элементов каталога, записей в блоге, нужно сделать поле (bool), означающее активна запись или нет.
И чтобы в gridview аяксовым запросом можно было кликом по значку менять значение активности.

Т.е нужно чтобы в некотроых контроллерах, было действие, обновляющее поле своей модели, и (в чем у меня возникла основная проблема) чтобы это действие возвращало html нужного gridview (для обновления gridview после ajax запроса)

Напишите плз основные шаги, как это сделать правильно
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Общее действие для некоторых контролерров

Сообщение slavcodev »

Внешнее действие это класс Action, подключаешь к контролеру, настраиваешь:
- модель
- поле которое нужно менять
- роут куда нужно редиректить, по умолчанию `index`

Действие сохраняет модель и редиректит на тоже действие что выдает грид.
Жду Yii 3!
louisvuitton
Сообщения: 203
Зарегистрирован: 2014.02.16, 03:09

Re: Общее действие для некоторых контролерров

Сообщение louisvuitton »

Спасибо за подсказку, сделал вот такое действие:

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

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 модели');
        }
    }
}
Ссылки для переключения активации в гриде генерируются такие page/activate/2?action=activate (или ?action=deactivate)

Впринципе без ajax работает, но если включить pjax, запрос отправляется норм, но страница все равно перезагружается полностью(видимо из-за редиректа) :( Как тут быть?

Еще меня смущает, что для того, чтобы работала вот эта строка
$model = $this->controller->findModel($id);
Пришлось менять на public видимость метода findModel, который генерируется gii как protected
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: Общее действие для некоторых контролерров

Сообщение Insolita »

louisvuitton писал(а):Спасибо за подсказку, сделал вот такое действие:

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

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 модели');
        }
    }
}
 
Ссылки для переключения активации в гриде генерируются такие page/activate/2?action=activate (или ?action=deactivate)

Впринципе без ajax работает, но если включить pjax, запрос отправляется норм, но страница все равно перезагружается полностью(видимо из-за редиректа) :( Как тут быть?

перезагружается как раз потому что редирект делаете   $this->controller->redirect([$this->controller->id . '/' . $this->redirectAction]);  
... отлавливать если идет pjax -запрос и возвращать $this->controller->runAction($this->redirectAction) при необходимости с параметрами, либо для вызова метода использовать ajax, в экшне возвращать true например, а на клиенте по успешной отправке запроса делать $.pjax.reload вообще посмотрите поищите реализации  ToggleColumn/ToggleAction
louisvuitton писал(а): Еще меня смущает, что для того, чтобы работала вот эта строка
$model = $this->controller->findModel($id);
Пришлось менять на public видимость метода findModel, который генерируется gii как protected
передавайте в action класс модели и реализуйте метод findModel прямо в action
louisvuitton
Сообщения: 203
Зарегистрирован: 2014.02.16, 03:09

Re: Общее действие для некоторых контролерров

Сообщение louisvuitton »

Спасибо, много полезного почерпнул)
Но решил не делать велосипед и в итоге нашел такую реализацию https://github.com/phemellc/yii2-toggle-column

Вроде все круто, но почему-то не обновляется аяксом.
Когда доходит дело до pjax запроса на обновление grid'a

$.pjax.reload({container:"#" + pjaxId});

запрос Aborted и страница перезагружается.
Я даже не успеваю посмотреть чем там сервер отвечает.
В чем может быть причина? все сделал как написано у автора, и, на мой взгляд, код там хороший и рабочий.
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: Общее действие для некоторых контролерров

Сообщение Insolita »

таймаут в виджете пиджака увеличить
louisvuitton
Сообщения: 203
Зарегистрирован: 2014.02.16, 03:09

Re: Общее действие для некоторых контролерров

Сообщение louisvuitton »

Увеличивал, стоит 3000 мсек, а абортится на ~500 мсек =\
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: Общее действие для некоторых контролерров

Сообщение Insolita »

а ну так там в action тоже редирект https://github.com/phemellc/yii2-toggle ... Action.php

вот этот поставь https://github.com/2amigos/yii2-grid-view-library там под аякс заточено
louisvuitton
Сообщения: 203
Зарегистрирован: 2014.02.16, 03:09

Re: Общее действие для некоторых контролерров

Сообщение louisvuitton »

Суперштука) Запилил
Ответить