cthml

Salve a tutti

come faccio a salvare la mia select





<?php echo CHtml::dropDownList('Responsabili_id_ufficio','', array()); ?>




nel mio form ?




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

	'id'=>'responsabili-form',

	'enableAjaxValidation'=>true,

)); ?>




buon lavoro a tutti



salvare la select nel form non ha molto senso come frase

se ti interessa metterla semplicemente all’interno usa


$form->dropDownList($model, 'attributo_del_model', array());



tieni a mente che l’array deve contenere i dati del dropdown.

ps: per evitare equivoci usa il termine “dropdownlist” o menu a tendina, ma non select, che poi la gente pensa a sql :P

forse mi sono espresso male.

il mio obiettivo è quello di salvare la CHtml::dropDownList nella tabella del DB.

definisci il "salvare la lista"

vuoi salvare l’intero html che la compone?

o vuoi salvare tutti i suoi valori?

o vuoi salvare la coppia valore/testo?

o vuoi salvare il solo valore selezionato dall’utente nel form?

ok certo.

ho bisogno di salvare solo il valore selezionato dall’utente.

il mio view è questo :




<div class="form">


<?php if(isset($_POST['Responsabili'])) 

{

	$cp=$_POST['Responsabili']['id_compagnia'];

	echo "la compagnia selezionata è la = ".$cp." ";

}

		

?>

<?php # var_dump($model->attributes); ?>

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

	'id'=>'responsabili-form',

	'enableAjaxValidation'=>true,

)); ?>




<?php 

	$criteria = new CDbCriteria();

	$criteria->select='id_compagnia, compagnia';

	$criteria->order='compagnia';

#	$criteria->condition='id_compagnie = '.$cp;

	# $criteria->condition='id_compagnie = 1 ';

	$tipodati=Compagnie::model()->findAll($criteria);

	$listacompagnie = CHtml::listData($tipodati, 'id_compagnia', 'compagnia');

	

	

?>	


<?php 

	$criteria = new CDbCriteria();

	$criteria->select='id_incarichi, incarico, filtro';

	$criteria->order='filtro';

	$criteria->condition="filtro ='R'";

	$tipodati=Incarichi::model()->findAll($criteria);

	$listaincarichi = CHtml::listData($tipodati, 'id_incarichi', 'incarico');

?>

<?php 

	$criteria = new CDbCriteria();

	$criteria->select='id_ufficio, ufficio, id_compagnie';

	$criteria->order='ufficio';

#	if exit(($_POST['id_responsabili']));

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

	{

		$cp=$_POST['Responsabili']['id_compagnia'];

	

 	echo "id è null e la cp e ".$_POST['Responsabili']['id_compagnia'];


		$criteria->condition='id_compagnie = '.$cp;

	}

	

#	$criteria->condition='id_compagnie = '.$cp;

	# $criteria->condition='id_compagnie = 1 ';

	$tipodati=Uffici::model()->findAll($criteria);

	$listauffici = CHtml::listData($tipodati, 'id_ufficio', 'ufficio');

#	var_dump ($listauffici);

	

?>	

	<p class="note">I campi con <span class="required">*</span> sono richiesti.</p>


	<?php echo $form->errorSummary($model); ?>


	<div class="row">

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

		<?php echo $form->textField($model,'grado',array('size'=>20,'maxlength'=>20)); ?>

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

	</div>


	<div class="row">

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

		<?php echo $form->textField($model,'nome',array('size'=>20,'maxlength'=>20)); ?>

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

	</div>


	<div class="row">

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

		<?php echo $form->textField($model,'cognome',array('size'=>20,'maxlength'=>20)); ?>

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

	</div>


	<div class="row">

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

			echo $form->dropDownList($model, 'id_compagnia', $listacompagnie, 

array(

'ajax' => array(

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

'url'=>CController::createUrl('responsabili/aggiornauffici'),

#'url'=>'http://127.0.0.1/gestionePrivacy/index.php?r=responsabili/aggiornauffici',

//Style: CController::createUrl('currentController/methodToCall')

'update'=>'#id_ufficio', //selector to update

//'data'=>'js:javascript statement' 

//leave out the data key to pass all form values through

'data'=>array('id_compagnia'=>'js:this.selectedIndex'),

))); 




# echo CHtml::dropDownList('id_ufficio','', array('empty' => 'Lista Uffici'));


		 ?>

	</div>

	<div class="row">

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

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

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

	</div>


	<div class="row">

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

		<?php #	echo $form->dropDownList($model, 'id_ufficio', $listauffici,  array('empty' => 'Lista Uffici')); ?>

<?php  echo CHtml::dropDownList('id_ufficio','', array('empty' => 'Lista Uffici')); ?>

<?php  # $form->dropDownList($model, 'id_ufficio', $data,'id','city')?>

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

		<?php # $model->id_ufficio=1; ?>

	</div>

	<div class="row">

	

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

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

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

	</div>




	<div class="row">

	    

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

		<?php echo $form->dropDownList($model, 'id_incarichi', $listaincarichi,  array('empty' => 'Lista degli incarichi')); ?>

		

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

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

	</div>

	<div class="row">

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

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

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

	</div>


	<div class="row buttons">


		<?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>

	</div>

  		

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









l’unica CHtml::dropDownList è questa




 echo CHtml::dropDownList('id_ufficio','', array('empty' => 'Lista Uffici'));



scusa se non sono preciso ma solo da un mese che lavoro con yii, e cercando di mettere i pezzi a posto.

mmm…

dunque se posso darti qualche consiglio cerca di dividere meglio i layer dell’applicazione.

nelle view non deve esserci alcuna logica, devono solo presentare dei contenuti.

genera all’interno del model i metodi contenenti quei parametri fissi di ricerca se così ti servono, in maniera tale che nella view ti limiti a richiamare il metodo statico del model senza dover mettere tutte quelle righe di codice vero e proprio.

stessa cosa vale per il codice commentato.

se devi postarlo nel form eliminalo, e sarebbe buona cosa toglierlo proprio.

aggiungi poi dei commenti significativi al codice, così che non ti ci perdi.

tornando alla tua domanda vedo che una dropdownlist è già inserita all’interno del tuo form:




<?php echo $form->dropDownList($model, 'id_incarichi', $listaincarichi,  array('empty' => 'Lista degli incarichi')); ?>



inserisci l’altra esattamente come hai fatto per la prima

pertanto quando invii il dato al controller per effettuare il salvataggio ti basta utilizzare il classico:




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



se sei insicuro di quale sia il nome del model puoi sempre controllare anche con firebug l’html generato in automatico da yii.

dopo di che ti basta chiamare il metodo save del model.

ricordati che se un attributo non passa alcun tipo di validazione (nemmeno un safe) questo non viene passato per il salvataggio sul db.

potrebbe anche essere questo il problema che affronti.

ti ringrazio per i tuoi preziosi consigli.

hai perfettamente ragione devo spostare un po’ di codice nel model.

ma non capisco una cosa:

l’altra dropDownList è il risultato di questa operazione :




			echo $form->dropDownList($model, 'id_compagnia', $listacompagnie, 

array(

'ajax' => array(

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

'url'=>CController::createUrl('responsabili/aggiornauffici'),

'update'=>'#id_ufficio', //selector to update

'data'=>array('id_compagnia'=>'js:this.selectedIndex'),

))); 




 echo CHtml::dropDownList('id_ufficio','', array('empty' => 'Lista Uffici'));






ovvero cerco di implementare la seconda dropDownList è filtrata col risulsato della prima. (select concatenate)

ti ringrazio ancora infinite, per non avere il massimo da yii devi capire i suoi oggetti.

Invece di una dropdownlist, usa activeDropDownList:


<?php echo CHtml::activeDropDownList($model, 'id_ufficio', ...)?>

Tieni presente che quando fai $form->dropDonwList, stai chiamando il metodo CHtml::activeDropDownList, quidi con quell’active in piu’ fai il lavoro solito.

tanto per cambiare cè un errore sull’istruzione:




echo CHtml::activeDropDownList($model, 'id_ufficio','', array('empty' => 'Lista Uffici'),'id_ufficio', 'ufficio'); ?>



PHP Error

Descrizione

Invalid argument supplied for foreach()

/var/www/framework/web/helpers/CHtml.php(1822)

01810: $key=isset($htmlOptions[‘key’]) ? $htmlOptions[‘key’] : ‘primaryKey’;

01811: if(is_array($selection))

01812: {

01813: foreach($selection as $i=>$item)

01814: {

01815: if(is_object($item))

01816: $selection[$i]=$item->$key;

01817: }

01818: }

01819: else if(is_object($selection))

01820: $selection=$selection->$key;

01821:

01822: foreach($listData as $key=>$value)

01823: {

01824: if(is_array($value))

01825: {

01826: $content.=’<optgroup label="’.($raw?$key : self::encode($key))."\">\n";

01827: $dummy=array(‘options’=>$options);

01828: if(isset($htmlOptions[‘encode’]))

01829: $dummy[‘encode’]=$htmlOptions[‘encode’];

01830: $content.=self::listOptions($selection,$value,$dummy);

01831: $content.=’</optgroup>’."\n";

01832: }

01833: else

01834: {

???

prima o poi spero di risolvere

il quarto argomento di CHtml::activeDropDownList deve essere un array.

ragazzi dovete abituarvi a provare almeno a dare un’occhiata alla documentazione.

perfetto ora funziona, ma sono esattamente al punto di partenza, nel senso che

prima avevo:




 echo $form->dropDownList($model, 'id_ufficio', $listauffici,  array('empty' => 'Lista Uffici'));



e che mi permetteva il salvataggio del dato selezionato.

ma la mia necessità è quella di filtrare i dati a seconda del dato scelto in un’altra dropDownList ,

ovvero :




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

			echo $form->dropDownList($model, 'id_compagnia', $listacompagnie, 

array(

'ajax' => array(

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

'url'=>CController::createUrl('responsabili/aggiornauffici'),


'update'=>'#id_ufficio', //selector to update

//'data'=>'js:javascript statement' 

//leave out the data key to pass all form values through

'data'=>array('id_compagnia'=>'js:this.selectedIndex'),

))); 



quindi diciamo che il mio problema è recuparare il valore che mi permette di fare il filtro dei dati.

il controller che mi gestisce l’azione aggiornauffici è questo:




public function actionAggiornauffici()	

	{

#		$_POST['id_compagnia']=(int) '2';


			$criteria = new CDbCriteria();

			$criteria->select='id_ufficio, ufficio, id_compagnie';

			$criteria->order='id_ufficio';

			$criteria->condition='id_compagnie = '.$_POST['id_compagnia'];

			$tipodati=Uffici::model()->findAll($criteria);			

			$data = CHtml::listData($tipodati, 'id_ufficio', 'ufficio');


    		foreach($data as $value=>$name)

		    {

			 echo CHtml::tag('option',array(

			 								'value'=>$value),

			 								CHtml::encode($name),true);

			}

    		

  	  }

  	  



il problema è risolto se salvo nel model di $data e poi lo vado a recuperare nel view.

oppure avete altre idee?

l’activedropdownlist che funziona perfettamente è :




<?php echo CHtml::ActiveDropDownList($model, 'id_ufficio', $list, array('empty' => '(Seleziona'));  ?> 



ma anche qui ho la necesita di filtrare i valori.

grazie mille a tutti e scusate per la pazienza

onestamente non ho capito il problema.

la seconda dropdownlist viene generata in base a cosa selezioni nella prima.

una volta inviati i dati al db limitati a salvare il dato all’interno della seconda, e se proprio lo vuoi riverificare hai comunque inviati al model entrambi i dati delle due dropdownlist.

io:

  • eliminerei tanto per cominciare i commenti risalenti ai tuoi tentativi passati che rendono il codice illegibile.

  • creerei un metodo all’interno del modello per rispondere a quella query, visto che è l’unica cosa che fai fare in quell’azione di quel controller.

  • all’interno di quel controller chiami quel metodo del modello invece di scrivere tutto

  • quando i dati arrivano al db (ed arrivano entrambi se le regole nel modello lo permettono e hai assegnato correttamente gli attributi al modello) fai un altro controllo incrociato per vedere se il dato inviato dalla seconda select è valido. (cosa che per altro in base a cosa stai facendo è una forma di sicurezza inutile, visto che mi pare un gestionale interno all’azienda che nessuno dovrebbe provare a raggirare).

come ti ho già detto cerca di dividere correttamente i layer dell’applicazione, allo stato attuale è solo un gran casino <.<

ragazzi è giunta l’ora delle belle notizie.

;D ;D ;D

non ci crederete ma funziona.

per la seconda dropdownlist ho usato:




<?php echo CHtml::ActiveDropDownList($model, 'id_ufficio',array(), array('empty' => '(Seleziona'));  ?> 



per la prima :





			echo $form->dropDownList($model, 'id_compagnia', $listacompagnie, 

array(

'ajax' => array(

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

'url'=>CController::createUrl('responsabili/aggiornauffici'),

'update'=>'#Responsabili_id_ufficio', //selector to update

'data'=>array('id_compagnia'=>'js:this.selectedIndex'),

)));          



facendo un bel visulizza sorgente mi sono accorto che la prima dropdownlist faceva le modifiche su

#Responsabili_id_ufficio e non su #id_ufficio.

sono contentissimo.

ora con calma seguirò il consiglio di nickcv per dare una ripulita al codice, ma … questi saranno tutti altri post :D ;)