Cactiveform - Nie Aktualizuje Pola W Tabeli

Witam,

Do istniejącego, działającego formularza dodałem jedno pole checkbox o id ‘archived’.


$form=$this->beginWidget('CActiveForm', array(

	'id'=>'product-form',

	'enableAjaxValidation'=>true,

        'clientOptions'=>array(

            'validateOnSubmit'=>false,

            'afterValidate'=>'js:afterValidate'

        ),


...


	<div class="row">

		<?php echo $form->labelEx($model,'archived'); ?>

		<?php echo $form->checkBox($model,'archived'); ?>

		<?php echo $form->error($model,'archived'); ?>

	</div>


...

a tak wygląda kontroler:


	public function actionUpdate($id)

	{

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

	    $this->performAjaxValidation($model);


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

		{

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

			if($model->save())

                        {

				$this->redirect(array('view','id'=>$model->id));

                        }

		}


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

			'model'=>$model,

		));

	}

Oczywiście w tabeli również dodałem pole o tej samej nazwie. Model nie ma problemu z pobieraniem tej wartości. Niestety próba aktualizacji wartości nie przynosi żadnego skutku. Sprawdziłem w firebugu i w nagłówku POST, pole istnieje z poprawną wartością. Co może być przyczyną tego że aplikacja nie chce ze mną współpracować? :(

Wklej rules() z modelu

a dodaj cos takiego do modelu




array('archived','numerical' ,'integerOnly'=>true),




	public function rules() 	{ 

   return array( 			

   array('name', 'required'), 			

   array('promotion', 'numerical', 'integerOnly'=>true), 			

   array('category_id', 'length', 'max'=>10), 			

   array('sort_order', 'length', 'max'=>11), 			

   array('name', 'length', 'max'=>128), 			

   array('image', 'length', 'max'=>64), 			

   array('description_short_pl, description_short_en, description_long_pl, description_long_en','safe'), 			


   array('id, category_id, name, image, promotion, description_short_pl, description_short_en, description_long_pl, description_long_en', 'safe', 'on'=>'search'), 		

); 	

}

Jeśli problem leży tutaj, proszę Was o wyjaśnienie jak i dlaczego. Zależy mi przed wszystkim na zrozumeniu problemu.

Z własnego doświadczenia zauważyłem, że każe pole musi mieć metode walidacji. Z checkboxami juz przerabiałem to wiec powinno to załatwić sprawę.




array('archived','numerical' ,'integerOnly'=>true),



Rzeczywiście działa, dzięki. W takim razie po prostu będę stosował tę zasadę i nie będę drążył… ;)

Oczywiście masz rację, ale dla ścisłości żeby pole było widoczne w modelu musi mieć albo regułę walidacji albo być oznaczone jako bezpieczne "safe"




array('archived, description_short_pl, description_short_en, description_long_pl, description_long_en','safe'),



w ten sposób można np: obsługiwać dodatkowe pola, których nie ma w bazie danych a są potrzebne do obsługi formularza lub czegokolwiek.

Dzięki. :)

Każde pole musi mieć regułę walidacji przy masowym ($model->attributes = $_POST[‘Product’]) przypisywaniu wartości z POST do modelu (ze względów bezpieczeństwa) - jeśli zrobisz to ręcznie - czyli w kontrolerze $model->archive = $_POST[‘Product’][‘archive’] to reguła walidacji nie musi być określona.