Errore Form

Salve ragazzi, sono alle prese con degli errori che mi stanno bloccando completamente.

Vi spiego la situazione. Devo registrare delle inserzioni da una view che raccoglie dati da distribuire in più tabelle. Ho creato un model con una funzione (save_new_ad()) nella quale creo gli oggetti che rappresentano i vari model delle tabelle e racchiudendo tutto in una transazione, registro i dati nel database tramite le varie chiamate a save().

I problemi sono principalmente due:

  1. Dal form (solo per alcuni attributi) ritornano valori vuoti che fanno fallire le registrazioni.

  2. La transazione non fa il suo lavoro, ovvero succede che alcuni dati vengono memorizzati e altri no.

Vi scrivo alcuni passaggi… magari riuscite a trovare qualche errore.

Nella view, ho textfield, fielfield, dropdownlist… alcuni di questi input funzionano, altri no… ad esempio:

    <div class="row">


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


	<?php echo $form->fileField($model,'photo_path'); ?>


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


    </div>


    <div class="row">


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


	<?php echo $form->fileField($model,'photo_path_2'); ?>


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


    </div>


    <div class="row">


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


	<?php echo $form->fileField($model,'photo_path_3'); ?>


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


</div>

Qui riesco a far tornare il valore di photo_path… ma non gli altri due valori.

Qui:

    <div class="row">


	<?php


            echo $form->labelEx($model,'payment_1');


            $models = AllowedPayments::model()->findAll();


            $list = CHtml::listData($models,'id_payment','payment_name');


            echo $form->dropDownList($model,'payment_1',$list,array('empty' => ''));


            ?>


    </div>


    <div class="row">


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


	<?php echo $form->textField($model,'payment_1_info'); ?>





</div>

dove payment_1 e payment_1_info sono attributi del model che raccoglie i dati per la registrazione.

La textfield ritorna un valore vuoto…

Questo è il codice del controller:

public function actionNewAd()

    {


        $model = new Ad_FormManager();


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


        {


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


            if($model->validate() && $model->save_new_ad())


                $this->render('Errori', array('model'=>$model));


                //$this->render('RegistrazioneCompletata');


            else $this->render('Errori', array('model'=>$model));


        }


        else $this->render('NewAd', array('model'=>$model));


    }

Ho provato anche ad assegnare uno alla volta i valori agli attributi, ma nulla…

Questa è la funzione che salva nel DB, con la transazione che non funziona:

public function save_new_ad()

            $data_transaction = Yii::app()->db->beginTransaction();


            try {


                /*


                  Qui dichiaro vari oggetti


                  E popolo gli attributi uno alla volta!


                */





                if($result) {


                    $data_transaction->commit();


                    return $result;


                }


                else throw new Exception();


            }


            catch(Exception $e) {


                $data_transaction->rollback();


                return false;


            }





    }

La struttura è giusta?

sinceramente non so come venire a capo di tutto questo, anche perché sono agli inizi con Yii!

Potreste indirizzarmi?

Grazie :)

per gli attributi che non ti ritornano…

hai provato a leggere il $_POST direttamente?

per attributi che in Ad_FormManager non hanno nessun tipo di validazione, assicurati che nelle rules siano indicati come ‘safe’.

in questo modo:




public function rules()

{

     return array(

        //..altri attributi required o con altra validazione

	array('photo_path_2, photo_path_3', 'safe'),

     );

}



per quanto riguarda la transazione ti posto un codice testato sul quale si è dibattuto anche qui sul forum,

anche perchè se la transazione fallisce non dovresti poter salvare nessun dato.





$transaction = Yii::app()->db->beginTransaction();

	 try {

		//Salvo model

		$model_save = $model->save();

				

		//Creo e Salvo model1

		$model1 = new Model1();

		$model1->id = $model->id;

		$model1_save = $model1->save();

				

		//Creo e Salvo model2

		$model2 = new Model2();

		$model2_save = $model2->save();


				

		if(!$model_save || !$model1_save || !$model2_save)

		throw new Exception('Errore nella transazione dei model.');

				

		$transaction->commit();

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

				

	} catch (Exception $e)	{

	       $transaction->rollBack();

		Yii::app()->user->setFlash('error', "Errore nella transazione.");

	} 




Grazie per la risposta St4nny!

Adesso i campi ritornano con valori dignitosi :D