Suddividere campi di un Form in CTabView

Salve a tutti di nuovo!

Come al solito penso di avere una domanda un po stupida…ma la butto li!

Ho la necessità di suddividere i campi creati dal CRUD in un file _form.php, in più Tab (per puro ordine visivo e non avere una pagina lunghissima), evitando (se possibile) la creazione di più pagine da richiamare con il renderPartial/Ajax, poiché, alla fine, tutti i dati presenti in tutti i tab DEVONO essere salvati all’unisono con lo stesso model…senza troppe complicazioni.

Sono più o meno riuscito nell’intento, ma con il metodo che ho implementato (ovvero racchiudere le singole ‘row’ in variabili da passare ai tab come sorgente statico) ho riscontrato una difficoltà: non riesco a passargli i campi data, per i quali uso il componente CJuiDatePicker, poichè mi dice non convertibili in stringa.




<div class="form">


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

	'id'=>'sito-form',

	'enableAjaxValidation'=>false,

)); ?>


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


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

	

	<?php


// tentativo con dati semplici (FUNZIONA)	

$tab1 = "

	<div class='row'>".

		$form->labelEx($model,'num_catalogo_generale').

		$form->textField($model,'num_catalogo_generale',array('size'=>60,'maxlength'=>250)).

		$form->error($model,'num_catalogo_generale')."

	</div>


	<div class='row'>".

		$form->labelEx($model,'suffisso_num_catalogo_generale').

		$form->textField($model,'suffisso_num_catalogo_generale',array('size'=>60,'maxlength'=>250)).

		$form->error($model,'suffisso_num_catalogo_generale')."

	</div>


	<div class='row'>".

		$form->labelEx($model,'protocollo').

		$form->textField($model,'protocollo').

		$form->error($model,'protocollo')."

	</div>";

	

// tentativo con dati complessi (MUORE DURANTE LA CONVERSIONE DEL DATEPICKER)

	$tab2 = "

	<div class='row'>".

		$form->labelEx($model,'data_scheda').


 // questo provavo ad integrarlo nella variabile $tab2..ma senza esito positivo

		$this->widget('zii.widgets.jui.CJuiDatePicker', array(

			'model'=>$model,

			'attribute'=>'data_scheda',

			'value'=>$model->data_scheda,

			'options'=>array(

				'showAnim'=>'fold', // 'show' (the default), 'slideDown', 'fadeIn', 'fold'

				'showOn'=>'button', // 'focus', 'button', 'both'

				'buttonText'=>Yii::t('ui','Select form calendar'), 

				'buttonImage'=>Yii::app()->request->baseUrl.'/images/calendar.png', 

				'buttonImageOnly'=>true,

				'dateFormat'=>Yii::app()->params['globalDateFormat'],

				'changeMonth'=>'true',

				'changeYear'=>'true',

				'firstDay'=>'1',

			),

			'htmlOptions'=>array(

				'style'=>'width:80px;vertical-align:top'

			),  

		)).

	 

		$form->error($model,'data_scheda')."

	</div>


	<div class='row'>".

		$form->labelEx($model,'definizione').

		$form->dropDownList($model,'definizione',CHtml::listData(SitoDefinizione::model()->findAll(),'id','descrizione'), array('prompt'=>'Selezionare una Definizione')).

		$form->error($model,'definizione')."

	</div>";


	

	// create tabs

	$this->widget('zii.widgets.jui.CJuiTabs', array(

		'tabs'=>array(

		   'Dati Principali' =>array('content'=>$tab1),

		   'Dati Secondari' =>array('content'=>$tab2),

		),

		// additional javascript options for the tabs plugin

		'options'=>array(

			'collapsible'=>true,

		),

	));

	?>

	



Mi suggerite un metodo più ‘sano’ per fare ciò?

Grazie in anticipo a tutti!!!

Nel frattempo di ricevere LUMI…girovagando ho trovato un tipo che risolveva usando gli output buffer.

Di conseguenza ho provato e la cosa sembra andare…anche se non è che mi piaccia tanto come soluzione, anche perché, tra le varie, il testo all’interno del datepicker perde lo stile (per lo meno la dimensione del carattere non è più la stessa di prima).




<div class="form">


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

	'id'=>'sito-form',

	'enableAjaxValidation'=>false,

)); ?>


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


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

	

	<?php

	$tab1 = "

	<div class='row'>".

		$form->labelEx($model,'num_catalogo_generale').

		$form->textField($model,'num_catalogo_generale',array('size'=>60,'maxlength'=>250)).

		$form->error($model,'num_catalogo_generale')."

	</div>


	<div class='row'>".

		$form->labelEx($model,'suffisso_num_catalogo_generale').

		$form->textField($model,'suffisso_num_catalogo_generale',array('size'=>60,'maxlength'=>250)).

		$form->error($model,'suffisso_num_catalogo_generale')."

	</div>


	<div class='row'>".

		$form->labelEx($model,'protocollo').

		$form->textField($model,'protocollo').

		$form->error($model,'protocollo')."

	</div>";


// qui ho usato gli output buffers..

	ob_start();

	$this->widget('zii.widgets.jui.CJuiDatePicker', array(

			'model'=>$model,

			'attribute'=>'data_scheda',

			'value'=>$model->data_scheda,

			'options'=>array(

				'showAnim'=>'fold', // 'show' (the default), 'slideDown', 'fadeIn', 'fold'

				'showOn'=>'button', // 'focus', 'button', 'both'

				'buttonText'=>Yii::t('ui','Seleziona dal Calendario'), 

				'buttonImage'=>Yii::app()->baseUrl.'/images/calendar.png', 

				'buttonImageOnly'=>true,

				'dateFormat'=>Yii::app()->params['globalDateFormat'],

				'changeMonth'=>'true',

				'changeYear'=>'true',

				'firstDay'=>'1',

			),

			'htmlOptions'=>array(

				'style'=>'width:80px;vertical-align:top'

			),  

		));

// prendo il buffer e lo inserisco in una variabile

	$datePicker = ob_get_contents();

// svuoto il buffer

	ob_end_clean();

	

	$tab2 = "

	<div class='row'>".

		$form->labelEx($model,'data_scheda').

// inserisco la variabile nell'output della riga

		$datePicker.

		$form->error($model,'data_scheda')."

	</div>


	<div class='row'>".

		$form->labelEx($model,'definizione').

		$form->dropDownList($model,'definizione',CHtml::listData(SitoDefinizione::model()->findAll(),'id','descrizione'), array('prompt'=>'Selezionare una Definizione')).

		$form->error($model,'definizione')."

	</div>";


	

	// create tabs

	$this->widget('zii.widgets.jui.CJuiTabs', array(

		'tabs'=>array(

		   'Dati Principali' =>array('content'=>$tab1),

		   'Dati Secondari' =>array('content'=>$tab2),

		),

		// additional javascript options for the tabs plugin

		'options'=>array(

			'collapsible'=>true,

		),

	));

	?>

	



Resto sempre in attesa di qualche idea magari migliore!!

GRAZIE IN ANTICIPO!

Invece degli output buffer puoi usare la render partial: crei una view con il contenuto da mettere nell’output buffer e poi fai:


$html=$this->renderPartial('view', array(), true);



Il terzo parametro true fa si’ che la vista ti viene restituta come stringa

Lo stesso per i widget:


$this->widget('zii.widgets.jui.CJuiDatePicker', array(...), true);



Se ti organizzi con le renderPartial il codice viene molto leggibile, ed e’ facile passare da una vista a tab a una vista a pagina singola, scambiare tab eccetera.

Grazie Zaccaria!

Non sapevo del parametro…ora provo a vedere se mi funziona come mi aspetto!! :P

Scusa ma ho un problema…

ho creato due file (_tab1.php e _tab2.php) in una sottocartella delle views (tabs), i quali contengono ora le row da includere nei tab rispettivi:

TAB1:




<div class="row">

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

	<?php echo $form->textField($model,'num_catalogo_generale',array('size'=>60,'maxlength'=>250)); ?>

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

</div>


<div class="row">

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

	<?php echo $form->textField($model,'suffisso_num_catalogo_generale',array('size'=>60,'maxlength'=>250)); ?>

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

</div>


<div class="row">

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

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

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

</div>


<div class="row">

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

	<?php

	$this->widget('zii.widgets.jui.CJuiDatePicker', array(

		'model'=>$model,

		'attribute'=>'data_scheda',

		'value'=>$model->data_scheda,

		'options'=>array(

			'showAnim'=>'fold', // 'show' (the default), 'slideDown', 'fadeIn', 'fold'

			'showOn'=>'button', // 'focus', 'button', 'both'

			'buttonText'=>Yii::t('ui','Seleziona dal Calendario'), 

			'buttonImage'=>Yii::app()->baseUrl.'/images/calendar.png', 

			'buttonImageOnly'=>true,

			'dateFormat'=>Yii::app()->params['globalDateFormat'],

			'changeMonth'=>'true',

			'changeYear'=>'true',

			'firstDay'=>'1',

		),

		'htmlOptions'=>array(

			'style'=>'width:150px;vertical-align:top'

		),  

	));

	?>

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

</div>


<div class="row">

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

	<?php

	$this->widget('zii.widgets.jui.CJuiDatePicker', array(

		'model'=>$model,

		'attribute'=>'data_creazione',

		'value'=>$model->data_creazione,

		'options'=>array(

			'showAnim'=>'fold', // 'show' (the default), 'slideDown', 'fadeIn', 'fold'

			'showOn'=>'button', // 'focus', 'button', 'both'

			'buttonText'=>Yii::t('ui','Seleziona dal Calendario'), 

			'buttonImage'=>Yii::app()->baseUrl.'/images/calendar.png', 

			'buttonImageOnly'=>true,

			'dateFormat'=>Yii::app()->params['globalDateFormat'],

			'changeMonth'=>'true',

			'changeYear'=>'true',

			'firstDay'=>'1',

		),

		'htmlOptions'=>array(

			'style'=>'width:150px;vertical-align:top'

		),  

	));

	?>

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

</div>



TAB2:




<div class="row">

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

	<?php

	$form->labelEx($model,'data_creazione').

		$this->widget('zii.widgets.jui.CJuiDatePicker', array(

		'model'=>$model,

		'attribute'=>'data_creazione',

		'value'=>$model->data_creazione,

		'options'=>array(

			'showAnim'=>'fold', // 'show' (the default), 'slideDown', 'fadeIn', 'fold'

			'showOn'=>'button', // 'focus', 'button', 'both'

			'buttonText'=>Yii::t('ui','Seleziona dal Calendario'), 

			'buttonImage'=>Yii::app()->baseUrl.'/images/calendar.png', 

			'buttonImageOnly'=>true,

			'dateFormat'=>Yii::app()->params['globalDateFormat'],

			'changeMonth'=>'true',

			'changeYear'=>'true',

			'firstDay'=>'1',

		),

		'htmlOptions'=>array(

			'style'=>'width:150px;vertical-align:top'

		),  

	));

	?>

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

</div>


<div class="row">

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

	<?php echo $form->dropDownList($model,'definizione',CHtml::listData(SitoDefinizione::model()->findAll(),'id','descrizione'), array('prompt'=>'Selezionare una Definizione')); ?>

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

</div>



_FORM.PHP




<div class="form">


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

	'id'=>'sito-form',

	'enableAjaxValidation'=>false,

)); ?>


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


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

	

	<?php

	// create tabs

	$tab1 = $this->renderPartial('tabs/_tab1.php', array('model'=>$model), true);

	$tab2 = $this->renderPartial('tabs/_tab2.php', array('model'=>$model), true);

	

	$this->widget('zii.widgets.jui.CJuiTabs', array(

		'tabs'=>array(

		   'Dati Principali' =>array('content'=>$tab1),

		   'Dati Secondari' =>array('content'=>$tab2),

		),

		// additional javascript options for the tabs plugin

		'options'=>array(

			'collapsible'=>true,

		),

	));

	?>

...



Ora mi si presenta questo errore:

SitoController cannot find the requested view "tabs/_tab1.php".

Ma il renderPartial non dovrebbe solo prendere parti della pagina da altri file? Il controller cosa c’entra in questo caso? (o molto probabilmente sono io che mi sono perso qualcosa…?)

Volevo solo far notare che il tab lo sto posizionando dentro un file ‘_form.php’ che quindi è già a sua volta chiamato da un renderPartial dai vari UPDATE e CREATE.

Può portare problemi questa cosa?

Grazie ancora!!

Risolto!!

Nel render Partial davo il nome della view parziale compreso di estensione… :P

Ho messo il terzo parametro true ai render partial…non ho dovuto inserire il terzo parametro nel widget…et voilà!

Ora mi renderizza la pagina con i tab ed i contenuti in maniera corretta

Grazie ancora Zaccaria!

Di niente, HuGoLiNo!

Ma hai scelto questo nome in antipatia con l’ArCiVeScOvO RuGgErI?

:D no a dire il vero è solo un modo più simpatico per allungarmi il mio cortissimo nome :P

Salve a tutti

A me da questo errore:

"I campi contrassegnati con * sono obbligatori.

Fatal error: Call to a member function errorSummary() on a non-object in E:\xampp\htdocs\yii\gestmap\protected\views\tblPoi\tabs\_tabPosizione.php on line 3 "

mi potete dare qualche suggerimento.

Grazie