@DarkByte2015

Как сделать обработать результат action-а?

Я использую вот такие вкладки. Там есть такая штука что при переходе на другую вкладку можно указать ссылку для подгрузки контента. Так вот я хотел для группы своих action-ов чтобы не прописывать в каждом сделать такой обработчик что если запрос аяксовый - то как там сказано результат запроса (рендер вкладки) за жсонэнкодить. Подскажите пожалуйста как это сделать?

P.S. PHP 5.6, Yii2.

upd. Не текущий момент нашел такое решение:

public function render($view, $params = []) { // перегрузил
	$result = parent::render($view, $params);

	if (StringHelper::startsWith($this->action->id, 'step') && Yii::$app->request->isAjax)
		return Json::encode($result);

	return $result;
}


Но оно корявое. Почему видно на скриншоте. Рендерится не только контент вкладки, но и вся страница. Пока не знаю как это решить.

59e4a962f2fe2699653872.png
  • Вопрос задан
  • 200 просмотров
Решения вопроса 1
@DarkByte2015 Автор вопроса
Неактуально. Сделал без аяксов. Оказывается у вкладок был параметр url. Просто задал его и теперь при клике на вкладку перехожу на другую с полным рендером (может так и хуже, зато проще).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Может быть вам это надо?

public function beforeAction($action)
        {
            
            if(\Yii::$app->request->isAjax){
                \Yii::$app->response->format = Response::FORMAT_JSON;
            }
            
            return parent::beforeAction($action);
        }
Ответ написан
Переопределять в данному случае метод render не самое лучшее решение, в целом можно сделать так:

$is_stap_ajax=StringHelper::startsWith($this->action->id, 'step') && Yii::$app->request->isAjax;
return $is_stap_ajax ? $this->renderPartial($view, $params) : $this->render($view, $params);
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
а зачем render() и потом еще Json::encode если надо просто renderAjax. Ибо рендер тянет layout, а renderAjax нет.

public function actionRender($view, $params = []) { // перегрузил
  if(!Yii::$app->request->isAjax)
     throw new MethodNotAllowedHttpException('только ajax, черти');

  if (StringHelper::startsWith($this->action->id, 'step') ) //и другие проверки
    return $this->renderAjax($view, $params);

  throw new ErrorException('чет не пашет');
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы