[RISOLTO] Salvare più model in una volta

Ho un gestionale e ora sto caricando le procedure per fare l’update degli utenti.

Ogni utente è collegato ad una anagrafica, quindi mi salvo

       sia le modifiche del mio model 'Utente' 


       sia del mio model 'Anagrafica'.



public function actionUpdate($id) {

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

        $anagrafica = new Anagrafica();


        if (isset($_POST['Utente'])) {

            $model->_attributes = $_POST['Utente'];

            $model->validate();

            $anagrafica->_attributes = $_POST['Anagrafica'];

            if ($anagrafica->id!='') $anagrafica->setIsNewRecord (0);

            $anagrafica->validate();

            $model->anagrafica = $anagrafica;

            $anagrafica->save();

            if ($model->pass!='' && $model->val_checkpass()) {

                if ($model->save() )

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

            }else if (!$model->pass) {

                if ($model->save() )

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

            } 

        }

        $model->pass = '';

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

            'model' => $model,

        ));

    }

Allora:

come vedete ho inserito una linea per spiegare a yii se anagrafica è o meno un nuovo record, perchè da solo non faceva l’update, ma tentava di salvare l’anagrafica generando l’errore di duplice primary-key [il problema in create non si crea, salvando tutto come nuovo)

C’è un modo di non mettere questa linea?

Non tanto in questo caso, dove i model sono 2, ma quando gestisco una filiale di una banca d’appoggio modifico il model anagrafica (per il nome della banca, che è una azienda e quindi la salvo tra le anagrafiche), il model filiale, il model banca…

suggerimenti?

Se non ricordo male $model->isNewRecord ti permette di capire se si tratta di un nuovo record o di un record già esistente.

esatto, il mio problema è che quando gestisco il model come nel caso sopra, con il post[ANAGRAFICA] “ospitato” nel form Utente non mi setta isnewRecord corretamente, e quindi lo setto io in maniera abrupta controllando la presenza dell’id e usando quindi setIsNewRecord();

Mmmm è una soluzione, ma non risolve il tuo problema. Il tuo problema è che usi sempre la variabile $model: sia per anagrafica che per Utente. Usi una cosa per farne due (bad smell).

Prova a rivedere il codice della tua actionUpdate seguendo questo snippet.




    public function actionUpdate($id) {

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

        $modelAnagrafica = new Anagrafica();


        if (isset($_POST['Utente'])) {


            $model->_attributes = $_POST['Utente'];

            $model->validate();


            $modelAnagrafica->_attributes = $_POST['Anagrafica'];


            ...

        }

        

        ...

         

    }



mmm mi sa che ho capito il problema:

non tanto il duplice nome, visto che uno si chiama $anagrafica e uno model, ma (dimmi se ti suona possibile) il fatto che associo inizialmente a $anagrafica una New Anagrafica, che per definizione ha isNewRecord a 0 (è new!).

mentre invece se carico $anagrafica= Anagrafica::model()->FindByPk($model->anagra_id) me lo carica e quindi è necessariamente settato isnewRecord a 1.

Che ne pensi?

Confermo:

in actionUpdate, quando va creato il model per $anagrafica, non si deve utilizzare new Anagrafica(), bensì proprio


$anagrafica= Anagrafica::model()->findByPk($utente->anagraid);

In questo modo Yii setta già la variabile isNewRecord da solo, senza bisogno di ricordarselo.

Ecco tutta la trafila:


public function actionUpdate($id) {

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

        $anagrafica = Anagrafica::model()->findByPk($utente->anagra_id);

        if (isset($_POST['Utente'])) {

            $utente->_attributes = $_POST['Utente'];

            $utente->validate();

            $anagrafica->_attributes = $_POST['Anagrafica'];

            $anagrafica->validate();

            $utente->anagrafica = $anagrafica;

            $anagrafica->save();

            if ($utente->pass!='' && $utente->val_checkpass()) {

                if ($utente->save() )

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

            }else if (!$utente->pass) {

                if ($utente->save() )

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

            }

        }

        $utente->pass = '';

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

            'model' => $utente,

        ));

    }

la mia update view, che richiama 2 form, uno nella stessa cartella, l’altro nel modulo “anagra”, cartella “views/anagrafiche”:


$this->widget('CTabView', array(

    'tabs' => array(

        'tab1' => array(

            'title' => 'Anagrafica',

            'view' => '../../../anagra/views/anagrafiche/_forminclude',

            'data' => array('model' => $model->anagrafica),

        )

        ,'tab3' => array(

            'title' => 'Profilo',

            'view' => '_form',

            'data' => array('model' => $model,)

        )

    ),

));

Ovviamente in actionCreate uso


$anagrafica=new Anagrafica();

visto che lì l’anagrafica devo crearla

Ciao ho un caso molto simile, nel quale però non capisco il perchè non mi esegua il validate() del modello !!! :blink:

file: ProgettoController.php




public function actionCreate($paziente_id)

	{

		 $model=new Progetto;

		 $modelcc = new Cclinica;

		 $modelcc->pz_fk_id=$paziente_id;

		

		

		// Uncomment the following line if AJAX validation is needed

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

	

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

		{

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

                        $valid = $model->validate();

                        

                        if ($valid) 

                        {

                            $modelcc->cc_codice = $conta->conta_cartelle;

                            $modelcc->save(false); // <----- Creo la nuova Cartella Clinica 

                            $model->cc_id_fk=$modelcc->cc_id; // <--- ID della cartella creata nel Progetto

                            $model->save(); // <---- Creo il Nuovo Progetto

				

			    $insert_id = $model->pr_id; // ID del progetto appena inserito...

                            

                            

				if(isset($_POST['Progetto']['aree_di_intervento']))

				{

                                        $arr = $_POST['Progetto']['aree_di_intervento'];

                                        

                                                foreach($arr as $catID)

						{

                                                        $modelADI=new InterventoAreeProgetti;

                                                        $modelADI->pr_fk_id = $insert_id;

                                                        $modelADI->ai_fk_id = $catID;

                                                        $modelADI->save();

                                                }

                                }

				

				if(isset($_POST['Progetto']['icdih2_strutt']))

				{

                                        $arr = $_POST['Progetto']['icdih2_strutt'];

                                        

                                                foreach($arr as $dsID)

						{

                                                        $modelADI=new icdih2_Struttura;

                                                        $modelADI->pr_fk_id = $insert_id;

                                                        $modelADI->ds_fk_id = $dsID;

                                                        $modelADI->save();

                                                }

                                }

				

				if(isset($_POST['Progetto']['icdih2_funzn']))

				{

                                        $arr = $_POST['Progetto']['icdih2_funzn'];

                                        

                                                foreach($arr as $dfID)

						{

                                                        $modelADI=new icdih2_Funzione;

                                                        $modelADI->pr_fk_id = $insert_id;

                                                        $modelADI->df_fk_id = $dfID;

                                                        $modelADI->save();

                                                }

                                }

				

				if(isset($_POST['Progetto']['icdih2_attivt']))

				{

                                        $arr = $_POST['Progetto']['icdih2_attivt'];

                                        

                                                foreach($arr as $daID)

						{

                                                        $modelADI=new icdih2_Attivita;

                                                        $modelADI->pr_fk_id = $insert_id;

                                                        $modelADI->da_fk_id = $daID;

                                                        $modelADI->save();

                                                }

                                }

                            

                            

                            

                        }else{   

                            

                        }

              $this->redirect(array('Paziente/view','id'=>$modelcc->pz_fk_id));

		}

		

		


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

	}

Grazie

hai utilizzato validate() solo per il model progetto…





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

 $valid = $model->validate();