Обновление виджета после Ajax сабмита

ShoppingCartBox отображает содержимое корзины:


 layouts/main.php <?php $this->widget('ShoppingCartBox'); ?>

ShoppingCartController.php содержит метод для добавления товара в корзину.

Через Ajax делаю добавление в корзину:


<?php echo CHtml::ajaxButton ("Update data",

                              CController::createUrl('shoppingcart/ajaxUpdate'), 

                              array('update' => '#shopping_cart'));

?>

Как в методе ajaxUpdate сделать обновление/вызов виджета(ShoppingCartBox), чтобы он заново посчитал, что содержится в корзине?

to maxxdev

Не уверен, но попробуйте в конце реализации actionAjaxUpdate()




public function actionAjaxUpdate()

{

    ...

    return $this->widget('ShoppingCartBox');

}



Работает отлично! Спасибо.

А можно ли вывод $this->widget(…) отослать как элемент JSON-объекта?

Такая конструкция не проходит, в ответе приходит каша из HTML и JSON:




$json['...'] = ...

...

$json['Action'] = $this->widget('application.components.TaskMenu', array('model' => $model, 'user' => Yii::app()->user));

return CJSON::encode($json);



Дело в том, что виджет показывает список ссылок в одной из ячеек строки таблицы. Сама строка формируется из элементов JSON-объекта.

Вот как удалось решить проблему:




$json['Action'] = $this->widget('application.components.TaskMenu', array('model' => $model, 'user' => Yii::app()->user, 'isajax' => true))->run();



Но для этого пришлось в TaskMenu добавить:




public $isajax = true;



И сделать рендер так:




if(!$this->isajax)

{

	$this->render('taskMenu',array('items'=>$items, 'id'=>$this->model->ID));

}

else

{

	return $this->render('taskMenu',array('items'=>$items, 'id'=>$this->model->ID), true);					

}



Обратите внимание на true в конце Ajax’ового рендера!