Tbbutton

Всем доброе утро. Вопрос собственно по Yiibooster, виджету TbButton, а именно как сохранять данные с помощью ajax в нем. Запарился уже, как только не пробовал, через ajax не хочет сохранять и все тут

Представление _form :




<div class="form-actions">

  <?php $this->widget('bootstrap.widgets.TbButton', array(

    'type'=>'info', 

    'buttonType'=>'ajaxSubmit',

    'ajaxOptions'=>array(

        'type'=>'POST', //request type

        'url'=>CController::createUrl('update')

        ),

    'label'=>'Обновить')); ?>

    </div>



Ну и собственно actionUpdate :




public function actionUpdate($id)

    {

	$model=$this->loadModel($id);


	// Uncomment the following line if AJAX validation is needed

	// $this->performAjaxValidation($model);


	if(isset($_POST['Product']))

	{

	    $model->attributes=$_POST['Product'];

	    $model->save();

	    Yii::app()->end();

	}

	


	$this->render('update',array(

			'model'=>$model,

	));

	}



В firebage запрос проходит, т.е. получаю строку вида:




[09:35:15.435] POST http://localhost/administration/product/update/10 [HTTP/1.1 200 OK 102ms]



Но не сохраняются данные и все тут :(




if(isset($_POST['Product']))

        {

            $model->attributes=$_POST['Product'];

            $model->save();

            var_dump($_POST['Product']); //посмотрите в firebug'е что приходит

            Yii::app()->end();

        }



Вообще ничего не выводит, форма есть, строка




[10:14:12.973] POST http://localhost/administration/product/update/10 [HTTP/1.1 200 OK 85ms]



И тихо как в танке :(

Если вы работаете с firebug, то выберите вкладку консоль и отметьте все. Здесь будут отображаться ваши запросы к серверу.

Дык есть запрос, только не сохраняет он :(

А что внутри запроса? ???

Какие данные в $_POST?

Если не сохраняет возможно не проходит валидацию?

Проходит, неужели никто не сталкивался с подобной задачей ? :unsure:

Тоесть у Вас внутри аякс запроса при сабмите находится массив $_POST с корректными данными, вы их присваиваете атрибутам модели, валидация проходит но модель не сохраняется?

Такого не может быть. Возможно поэтому никто и несталкивался.

Cделайте CVarDumper::dump() всему, сначала массиву $_POST, затем $model->attributes(). Сделайте валидацию отдельно $model->validate() , а не вместе c save(), дабы исключить ее. $model->save(false) - сохранение без валидации. Попробуйте $model->getErrors() и тоже сделайте дамп.

Если это все непоможет то проверьте какой запрос к базе у Вас выполняется с ‘enableParamLogging’ => true

Ок, спасибо, сейчас попробую :)

Всем спасибо, решил проблему, кстати или я не так чего делаю или CKeditor тот который подключается в Yii Booster

не работает через Ajax(несохраняет данные), его код:




echo $form->ckEditorRow($model, 'ckeditor', array('options'=>array('fullpage'=>'js:true', 'width'=>'640', 'resize_maxWidth'=>'640','resize_minWidth'=>'320')))



Теперь, то что получилось(особо не пинайте, если знаете вариант получше как это реализовать, с радостью выслушаю)

И так, файл представления update




$this->renderPartial('_form', array('model'=>$model, false, true));



файл представления _form




<?php /** @var BootActiveForm $form */

	$form = $this->beginWidget('bootstrap.widgets.TbActiveForm', array(

		'id'=>'product-form',

		'type'=>'vertical',

	)); ?>


    <fieldset>

        <?php echo $form->textFieldRow($model, 'title'); ?>

        <?php echo $form->html5EditorRow($model, 'description', array('class'=>'span4', 'rows'=>5, 'height'=>'200', 'options'=>array('color'=>true))); ?>

 

    </fieldset>

 

        <div class="form-actions">

  <?php $this->widget('bootstrap.widgets.TbButton', array(

    'type'=>'info', 

    'buttonType'=>'ajaxSubmit',

    'ajaxOptions'=>array(

        'type'=>'POST', //request type

        'url'=>CController::createUrl('update'),

        ),

    'label'=>'Обновить')); ?>

    </div>

<?php $this->endWidget(); ?>



Ну и actionUpdate




public function actionUpdate($id)

    {

	$model=$this->loadModel($id);

	// Uncomment the following line if AJAX validation is needed

	// $this->performAjaxValidation($model);

	$this->render('update',array(

			'model'=>$model,

	));

	

	if(isset($_POST['Product']))

	{

	    $model->attributes=$_POST['Product'];

	    if($model->save()){

		$this->render('_form',array(

		'model'=>$model

		));

		Yii::app()->end();

	    }

	}

    }



Только не знаю как сообщение вывести о том что запись сохранена, никак не въеду :unsure:

Если честно ничего непонял))

Выходит что CKeditor не передавал данные в $_POST при аякс запросе? Изза этого и были проблемы?

Но ведь вы можете и руками передать эти данные. Не особо понимаю зачем все эти извращения.

Собственно для вывода сообщения достаточно добавить:




<?php $this->widget('bootstrap.widgets.TbButton', array(

    'type'=>'info', 

    'buttonType'=>'ajaxSubmit',

    'ajaxOptions'=>array(

        'type'=>'POST', //request type

        'url'=>CController::createUrl('update'),

        'success' =>'js:function (data) {

             if(data.status=="success"){

             //выводим все что хотим

             }

    }',

        ),

    'label'=>'Обновить')); ?>

//Добавим в контроллер

if($model->save()){

                $this->render('_form',array(

                'model'=>$model

                ));

                echo CJSON::encode(array(

                    'status'=>'success',

                ));

                Yii::app()->end();

            }



Зачем вам собственно говоря 2 файла для 1 формы - я не знаю.

Передать с CKeditor в ручную возможно снова таки в кнопке:




<?php $this->widget('bootstrap.widgets.TbButton', array(

    'type'=>'info', 

    'buttonType'=>'ajaxSubmit',

    'ajaxOptions'=>array(

        'type'=>'POST', //request type

        'data'=>array('ckeditor' => 'js:$("#ckeditor").value',)//както вот так, но не уверен что заработает, возможно придется поигратся с js

        'url'=>CController::createUrl('update'),

        ),

    'label'=>'Обновить')); ?>



Спасибо, попробую :) Да,Ckeditor данные не отправляет. Дело в том что это стандартный виджет Yii Booster и он вроде как должен работать и с ajax по логике вещей, но не работает, вот в чем проблема :unsure: