AJAX в Yii2

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

AJAX в Yii2

Сообщение sav97 »

Коротко о задаче: на странице выводятся все товары из БД(с этим всё в порядке). Далее требуется отфильтровать товары по категории, выбираешь в select категорию и через AJAX обновляешь товары.
Проблема: товары не обновляются, рендерится та же самая страница.
В Yii начала работать недавно, какими способами не пробовала, ничего не получается.
Буду очень благодарна, если кто то тыкнет носом или накидает полезные ссылки по данной проблеме.

view/collections.php

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

<select id="groupdec" onchange="getid()">
	<option>Вид украшения</option>
        <option value="1">Подвески</option>
	<option value="2">Кольцо</option>
	<option value="3">Браслет</option>
	<option value="4">Серьги</option>
</select>

...

<div class="container" id="blok_with_product">
//здесь через foreach выводятся все продукты из бд
</div>

...

<script>
	    function getid(){
	         var group = $("#groupdec option:selected").val();
	        
	        $.ajax({
	            type: "POST",
	            url: "/index.php?r=site/group",
	            data: {id:group},
	            success: function(data){
	                console.log(data);
                   $("#blok_with_product").append(data);
                    alert('Сработало!');
                },
                error: function(xhr, status, error) {
                console.log(xhr);
                console.log(status);
                console.log(error);
                alert('Ошибка');
                  }
	        }); 
	    }
	    
</script>
controllers/SiteController.php

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

public function actionGroup()
    {
        $model = new AjaxDataGet();
         if(Yii::$app->request->isAjax){
        Yii::$app->response->format = Response::FORMAT_JSON;
            if($model->load(Yii::$app->request->post()) && $model->validate()){
                $id = Yii::$app->request->post('id');
                $ourproducts = new Products();
                $pro = $ourproducts->getGroup($id);
                return $data = ['success' => true,
                                'pro' => $pro,];
        
            }
         }
         return $this->render('collections', ['prods'=>$pro], ['id'=>$id]);
    }
models/Products.php

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

class Products extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'products';
    }
    ...
    public function attributeLabels()
    {
        return [
            'product_id' => 'Product ID',
            'product_name' => 'Product Name',
            'product_group' => 'Product Group',
            'product_type' => 'Product Type',
            'product_price' => 'Product Price',
            'product_view_small' => 'Product View Small',
            'product_view_large' => 'Product View Large',
        ];
    }
    ...
public function getGroup($id)
    {
        $groupP = Products::find()->where(['product_group'=>$id])->asArray()->all();
        return $groupP;
    }
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: AJAX в Yii2

Сообщение slo_nik »

Доброй ночи.
Вот как-то так.

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

public function actionGroup()
    {
         if(Yii::$app->request->isAjax){
             $id = Yii::$app->request->post('id');
             $pro = Products::getGroup($id); // сделайте этот метод статичным в модели Products
             return $this->renderAjax('collections', ['pro'=>$pro]);
         }
    }
sav97
Сообщения: 2
Зарегистрирован: 2020.11.11, 22:09

Re: AJAX в Yii2

Сообщение sav97 »

slo_nik писал(а): 2020.11.15, 03:43 Доброй ночи.
Вот как-то так.

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

public function actionGroup()
    {
         if(Yii::$app->request->isAjax){
             $id = Yii::$app->request->post('id');
             $pro = Products::getGroup($id); // сделайте этот метод статичным в модели Products
             return $this->renderAjax('collections', ['pro'=>$pro]);
         }
    }
Спасибо вам!
+ к этому в контроллере прорендерила другую страницу (во view создала новую страницу с фрагментом кода, который нужно обновить) и в функции js, вместо навешивания события на select, использовала отлов нажатия на ссылку. Всё заработало.
Закрыто