Почему не работает ajax

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Kazzi
Сообщения: 63
Зарегистрирован: 2020.05.05, 19:23

Почему не работает ajax

Сообщение Kazzi »

Всем добра.

Вот такой код по сути должен вывести мне алертом id из переменной. Однако в итоге выводится весь html страницы.

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

$('.to-cart').on('click', function(e){
        e.preventDefault();
        var id = $(this).data('id');
        $.ajax({
           url: '/cart/add',
           data: {id: id},
           type: 'GET',
           success: function(res){
               alert(res);
           },
           error: function(){
               alert('Error');
           }
        });
    });
А вот ссылка:

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

<a href="<?= Url::to(['cart/add', 'id' => $product['id']]) ?>" data-id="<?= $product['id']; ?>" class="to-cart"><i class="fas fa-cart-plus"></i></a>
Что я не так делаю?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Почему не работает ajax

Сообщение Dominus »

А в экшене контроллера что?
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Почему не работает ajax

Сообщение leonenco »

А как вы рендерите элемент на который вы подвесили Jquery action? Через Ajax? Для начала я бы хотя бы сделал так:

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

$(document).on('click', '.to-cart', function(e){  //<-----
        e.preventDefault();
        var id = $(this).data('id');
        $.ajax({
           url: '/cart/add',
           data: {id: id},
           type: 'GET',
           success: function(res){
               alert(res);
           },
           error: function(){
               alert('Error');
           }
        });
    });
Аватара пользователя
Kazzi
Сообщения: 63
Зарегистрирован: 2020.05.05, 19:23

Re: Почему не работает ajax

Сообщение Kazzi »

Dominus писал(а): 2020.06.25, 03:22 А в экшене контроллера что?
Вот экшон. Там пока почти ни чего. Я только начал.

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

public function actionAdd() 
    {
        $id = Yii::$app->request->get('id');
        $product = Products::findOne($id);
        if(empty($product)) return false;
        var_dump($product);
    }
Аватара пользователя
Kazzi
Сообщения: 63
Зарегистрирован: 2020.05.05, 19:23

Re: Почему не работает ajax

Сообщение Kazzi »

leonenco писал(а): 2020.06.25, 05:09 А как вы рендерите элемент на который вы подвесили Jquery action? Через Ajax? Для начала я бы хотя бы сделал так:

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

$(document).on('click', '.to-cart', function(e){  //<-----
        e.preventDefault();
        var id = $(this).data('id');
        $.ajax({
           url: '/cart/add',
           data: {id: id},
           type: 'GET',
           success: function(res){
               alert(res);
           },
           error: function(){
               alert('Error');
           }
        });
    });
Не помогло( Все так же возвращает весь html страницы. Что вы имеет в виду, на счет того, как я рендерю элемент? Это просто ссылка на главной странице в блоке карточки товара. Страница рендерится обычно, через акшон в контроллере. :shock:
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Почему не работает ajax

Сообщение Dominus »

Kazzi писал(а): 2020.06.25, 10:34
Dominus писал(а): 2020.06.25, 03:22 А в экшене контроллера что?
Вот экшон. Там пока почти ни чего. Я только начал.

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

public function actionAdd() 
    {
        $id = Yii::$app->request->get('id');
        $product = Products::findOne($id);
        if(empty($product)) return false;
        var_dump($product);
    }

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

public function actionAdd()
    {
        if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
            $id = Yii::$app->request->get('id');
            if(($product = Products::findOne($id)) && $product !== null) {        
            	return  $product;
            }
        }
    }
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
Kazzi
Сообщения: 63
Зарегистрирован: 2020.05.05, 19:23

Re: Почему не работает ajax

Сообщение Kazzi »

Dominus писал(а): 2020.06.25, 10:44

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

public function actionAdd()
    {
        if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
            $id = Yii::$app->request->get('id');
            if(($product = Products::findOne($id)) && $product !== null) {        
            	return  $product;
            }
        }
    }
Тоже не помогло :( Все так же передается просто html страницы. А должен увидеть id, и все.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Почему не работает ajax

Сообщение Dominus »

Kazzi писал(а): 2020.06.25, 10:55
Dominus писал(а): 2020.06.25, 10:44

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

public function actionAdd()
    {
        if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
            $id = Yii::$app->request->get('id');
            if(($product = Products::findOne($id)) && $product !== null) {        
            	return  $product;
            }
        }
    }
Тоже не помогло :( Все так же передается просто html страницы. А должен увидеть id, и все.
Должна возвращаться модель, если просто id, тогда:

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

public function actionAdd()
    {
        if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
            $id = Yii::$app->request->get('id');
            return  $id;
        }
    }
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
Kazzi
Сообщения: 63
Зарегистрирован: 2020.05.05, 19:23

Re: Почему не работает ajax

Сообщение Kazzi »

Решил проблему подругому:
В запросе использовал просто путь из ссылки:

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

$('.to-cart').on('click', function(e){
        e.preventDefault();
        var id = $(this).data('id');
        var url = e.currentTarget.href;
        $.ajax({
           url: url,
           data: {id: id},
           type: 'GET',
           success: function(res){
               console.log(res);
           },
           error: function(){
               alert('Error');
           }
        });
    });
Всем огромное спасибо! :D
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Почему не работает ajax

Сообщение Dominus »

В ссылке если не указывать id или в data ajax, то можно, иначе методом get запрос будет вида

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

...cart/add?id=1&id=1
А так получается, у вас был указан в ajax не корректный url
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
Kazzi
Сообщения: 63
Зарегистрирован: 2020.05.05, 19:23

Re: Почему не работает ajax

Сообщение Kazzi »

Dominus писал(а): 2020.06.25, 11:06 А так получается, у вас был указан в ajax не корректный url
Да) Понятия не имею, почему, по сути все правильно, тупо контроллер cart, и акшон в нем add, но... пути yii неисповедимы.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Почему не работает ajax

Сообщение Dominus »

Kazzi писал(а): 2020.06.25, 13:31
Dominus писал(а): 2020.06.25, 11:06 А так получается, у вас был указан в ajax не корректный url
Да) Понятия не имею, почему, по сути все правильно, тупо контроллер cart, и акшон в нем add, но... пути yii неисповедимы.
Исповедимы)

https://www.yiiframework.com/doc/guide/2.0/ru/runtime-routing
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Почему не работает ajax

Сообщение unknownby »

Kazzi писал(а): 2020.06.24, 23:34 Всем добра.

Вот такой код по сути должен вывести мне алертом id из переменной. Однако в итоге выводится весь html страницы.

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

$('.to-cart').on('click', function(e){
        e.preventDefault();
        var id = $(this).data('id');
        $.ajax({
           url: '/cart/add',
           data: {id: id},
           type: 'GET',
           success: function(res){
               alert(res);
           },
           error: function(){
               alert('Error');
           }
        });
    });
А вот ссылка:

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

<a href="<?= Url::to(['cart/add', 'id' => $product['id']]) ?>" data-id="<?= $product['id']; ?>" class="to-cart"><i class="fas fa-cart-plus"></i></a>
Что я не так делаю?
А я бы сказал, что использование ajax в данном случае не по-назначению.

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

$('.to-cart').on('click', function(e){
 console.log($(this).data('id'));
});
    
В консольных логах должно выдать идентификатор нужный.
Ajax можно использовать по разному, но никак не узнавать информацию из ссылки, которая уже есть на представлении.
В контроллере

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

        if(\Yii::$app->request->isAjax){
            return $this->renderAjax('_ajaxview', [
                'params' => $params,
            ]);
        }
Внутрь представления передаем что хотим и переотрисовываем блок, в который возвращаем то, что было в renderAjax
Вот такая вещь примерно в представлении может быть

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

<div id="message"></div>
<?php
$js = "
$(document).ready(function(){

    $('#likes').on('click', function(e){
        $.ajax({
            type: 'POST',
            url: '".$model->news_url."',
            success: function(result) {
                $('#message').html(result);
            }
        });
    });

});
";
$this->registerJs($js);
?>
По итогу в диве с айди message будет отрисован файл _ajaxview
Подставив только свои значения URL, params и т.п.
Ответить