@Izaev_D

Как в Yii2 соединить экшен с ajax так, чтобы можно было повторно использовать этот экшен?

Привет, я недавно начал разбираться в Yii и у меня возникла проблема.

Проблема: в профиле пользователя есть условно 10 блоков с его данными, их редактирование выполнено через ajax, после редактирования сразу отображается результат, также через ajax, то есть нужно загружать view 2 раза.

Вопрос: Что делать с контроллером, чтобы не писать по экшену под каждый блок? Как можно сделать так, чтобы был один экшен, который был бы универсальным для всех блоков и сам решал, что делать с конкретным блоком?
  • Вопрос задан
  • 868 просмотров
Решения вопроса 1
bitver
@bitver
Ого, что вы делаете? CRUD сгенереный из gii вполне вам подойдет, при ajax постите форму на actionUpdate(), а в нём из стандартного добавьте лишь строку проверки на ajax после сохранения модели, чтобы вернуть не полный view, а json ответ.
Вообще посмотрите как делается стандартная ajax валидация в Yii, помимо валидации вставьте строку сохранения модели.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Akdmeh
@Akdmeh
PHP, Yii2, Music
Вот здесь в документации:
www.yiiframework.com/doc-2.0/guide-structure-contr...
А вот описание класса, который нужно наследовать
www.yiiframework.com/doc-2.0/yii-base-action.html
Ответ написан
kawabanga
@kawabanga
Попробуйте вот такую конструкцию воспроизвести. Делаю через function, потому что обилие pjax блоков мешает правильно обрабатывать jquery события. функцией все проще.

action должен вернуть у вас массив, который вы должны будете обработать в ответе (respond).

Пример экшна:

public function actionTest(){
  \Yii::$app->response->format =  \yii\web\Response::FORMAT_JSON;
  $out['error'] = 0;
 $out['html'] = 'html block';
$out['per'] = 1;
return $out;

}


<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
</head>
<body>
<div class="blocks">
    <div class="block" data-attr='1'>
        <a href="" onclick="clickme(this); return false;">click me</a>
    </div>
    <div class="block" data-attr='2'>
        <a href="" onclick="clickme(this); return false;">click me</a>
    </div>
    <div class="block" data-attr='3'>
        <a href="" onclick="clickme(this); return false;">click me</a>
    </div>
</div>


</body>
</html>

<script>

    function clickme(obj) {
        alert($(obj).parents('.block').attr('data-attr'));

        var id = $(obj).parents('.block').attr('data-attr');

        $.post(
                "/url",
                {
                    id:  id
                },
                function(respond) {
                    if (respond['error'] == '0') { //если ошибки нет то продолжаем
                    } else if (respond['error'] == '1') {
                        alert(respond['text']);
                    }

                }
        );

    }
</script>
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы