Можно ли динамическипередать переменную в виджет, использую Pjax?

Здравствуйте, суть вопроса такая: во вьюхе есть виджет, который принимает параметр $type и на его основании рендерит определенную вьюху. Этот параметр передается из контроллера, который рендерит основной вью файл, есть значение по умолчанию. Основной вью имеет Pjax и JS событие onchange, которое передает в контроллер тот самый $type. Но при обновлении Pjax-ом, виджет почему-то не подхватывает параметр, или не успевает отрендерить нужный вью, прошу помочь.

Основной вью
<?php Pjax::begin(); ?>
        <?php if($productsInCart):?>

            <table id="cart_products"cellspacing="0">
                <tr>
                    <th>Удалить</th>
                    <th>Наименование</th>
                    <th>Цена</th>
                    <th>Количество</th>
                    <th>Всего</th>
                </tr>

                <?php foreach($prods as $product):?>
                    <tr>
                        <td><a href="" class="del" data-id="<?= $product->id;?>">
                                <img src="/img/del_prod_pic.png">
                            </a></td>
                        <td><?= $product->name;?></td>
                        <td><?= $product['prices'][0]->price;?></td>
                        <td>
                            <?= $productsInCart[$product['id']];?> шт.
                            <a href="" class="to_cart" data-id="<?= $product->id;?>">
                                <img src="/img/plus.png">
                            </a>
                            <a href="" class="cart_del" data-id="<?= $product->id;?>">
                                <img src="/img/minus.png">
                            </a>
                        </td>
                        <td><?= Order::getProdTotalPrice($product->id);?></td>
                    </tr>
                <?php endforeach;?>
                <tr id="total_sum">
                    <td></td>
                    <td></td>
                    <td></td>
                    <td>Итого в корзине: </td>
                    <td><?= $totalPrice;?></td>
                </tr>
            </table>

            <?php
                $form = ActiveForm::begin(['id' => 'delivery_form']);

                echo $form->field($model_order, 'FIO')->textInput(['value' => $user->username]);

                echo $form->field($model_order, 'email')->textInput(['value' => $user->email]);

                echo $form->field($model_order, 'phone')->textInput(['value' => $user->phone]);

                echo $form->field($model_address, 'address')->textarea();

                echo $form->field($model_order, 'comment')->textarea();

                echo $form->field($model_delivery_type, 'name')->dropDownList(
                    ArrayHelper::map(DeliveryType::find()
                        ->orderBy('prior ASC')
                        ->all(), 'alias', 'name'
                    ),['id' => 'delivery_type']);

                echo DeliveryWidget::widget(['type' => $type, 'form' => $form]);

                ActiveForm::end();
            ?>

            <a href="/cart/checkout" class="checkout">
                Оформить заказ
            </a>

        <?php else:?>
            <h2 id="empty_cart">Ваша корзина пуста</h2>
            <a href="/" id="empty_cart_to_main">Продолжить покупки</a>
        <?php endif;?>
        <?= Html::a("Обновить", ['/cart'], ['class' => 'refresh btn btn-lg btn-primary']);?>
        <?php Pjax::end(); ?>


Контроллер
public function actionIndex () {
//echo Yii::$app->request->post('alias');exit;
        $type = 'empty';

        //Получаем данные из корзины
        $productsInCart = Order::getProducts();
        if ($productsInCart) {
            //Получаем полную информацию о товаре
            $productsId = array_keys($productsInCart);
            $productsId;
            $prods = ShopProducts::find()->joinWith('prices')->where([
                    'shop_products.id' => $productsId,
                ])->all();
            //Получаем общую стоимость товаров
            $totalPrice = Order::getTotalPrice($prods);
        }

        if(Yii::$app->request->isPost && !empty(Yii::$app->request->post('alias'))){
            $type = Yii::$app->request->post('alias');
        }

        $model_order = new Order;
        $model_delivery_type = new DeliveryType;

        switch($type){

            case 'courier' : $model_address = new DeliveryCourier;
                break;

            case 'pickup' : $model_address = new DeliveryPickup;
                break;

            case 'novaposhta' : $model_address = new DeliveryNovaposhta;
                break;

            default: $model_address = new DeliveryCourier;
        }

        if(!Yii::$app->user->isGuest){
            $user = User::findOne(Yii::$app->user->identity->id);
        }

        return $this->render('index', [
            'prods' => $prods,
            'productsInCart' => $productsInCart,
            'totalPrice' => $totalPrice,
            'type' => $type,
            'model_order' => $model_order,
            'model_delivery_type' => $model_delivery_type,
            'user' => $user,
            'model_address' => $model_address
        ]);
    }


Виджет
class DeliveryWidget extends Widget
{

    public $type = 'empty';
    public $form;

    public function run()
    {
        return $this->render("delivery_$this->type", [
            'form' => $this->form
        ]);
    }
}


JS
$('body').on('change', '#delivery_type', function(){
        var alias = $(this).val();

        $.post("/cart", {'alias': alias}, function(data){

        });

        $('.refresh').click();
        return false;
    });
  • Вопрос задан
  • 218 просмотров
Решения вопроса 1
@SharuPoNemnogu
не язык плохой, программисты такие...
Работает, значит ок, пригодится может кому:
<?php Pjax::begin(['id' => 'cart-wrapper']); ?>
и в js
$('body').on('change', '#delivery_type', function(){
    var alias = $(this).val();
    $.pjax({
        type : 'POST',
        url : '/cart',
        container : '#cart-wrapper',
        data : {alias: alias}
    });
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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