maxxdev
(Maxx)
1
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), чтобы он заново посчитал, что содержится в корзине?
creocoder
(Creocoder)
2
to maxxdev
Не уверен, но попробуйте в конце реализации actionAjaxUpdate()
public function actionAjaxUpdate()
{
...
return $this->widget('ShoppingCartBox');
}
maxxdev
(Maxx)
3
Работает отлично! Спасибо.
А можно ли вывод $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’ового рендера!