[Risolto] Wizard behavior e applicazione di una view personalizzata ad uno step

Salve a tutti,

sono ancora nuovo dell’ambiente Yii, ma sto cercando di utilizzare più cose possibili per capire

come funziona il framework.

Sto utilizzando l’estensione wizard behavior,

per creare una procedura step by step, per l’immissione di numerosi campi.

Ad uno dei miei step avrei bisogno di visualizzare la form non nel metodo standard di CForm,

ma una tabella su cui devo fare dei calcoli, magari seguendo l’esempio di ejqcalculator

http://www.yiiframework.com/extension/ejqcalculator

ogni step della procedura è un model che estende CFormModel,

ed ha un metodo getForm che ritorna un oggetto CForm con i vari elementi della form; il Controller legge la form da getForm.

quindi, come faccio a customizzare la view della mia form?

Grazie.

scrivo qui come ho risolto e cambio il titolo della discussione,

visto che ho letto nel forum, non solo quello italiano, che è un problema che in molti hanno cercato di superare, senza ricevere molte risposte in merito.

Ho lasciato la configurazione di wizard-behavior come nella demo scaricabile, in quasi tutti i file.

  • Il controller come da demo

  • I vari model come da demo

  • ho cambiato la view in questa maniera:




	<?php

	

	echo $event->sender->menu->run();


	echo '<div>Step '.$event->sender->currentStep.' di '.$event->sender->stepCount.'<br /><br />';


	echo '<h3>'.$event->sender->getStepLabel($event->step).'</h3>';

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

	

	if($event->step==='conti'){

		$this->renderPartial('form_conti', array('form'=>$form));

	} else 

		echo CHtml::tag('div',array('class'=>'form'),$form);


	?>



in questa maniera controllo da quale step sta arrivando la chiamata e includo un’altra view, nel mio caso se lo step è uguale a conti allora visualizzo la view form_conti.

nella view form_conti.php invece:




<div class="form">

	<?php	

	echo $form->renderBegin();

	?>


i miei vari div e i campi posizionati a piacimento con:

<?php echo $form['nomoelemento']; ?>




        <?php 

	echo $form->renderButtons();

	echo $form->renderEnd();

	?>

</div>



Ciao @st4nny grazie per la preziosissima guida, stò impazzendo da 4 ore per comprendere il funzionamento di queto behavior, ma continua a rimanere sullo step1 non capisco il perchè, posso chiederti se hai i files php della demo, perchè il link ufficiale sembra corrotto o vada su una url non valida, grazie

Trovati !! Sono qui

Ciao pasquale, mi fa piacere che hai reperito i file che cercavi.

Ti posso dire che appena ho preso dimestichezza con yii, ho abbandonato l’approccio di questo componente, che per molte cose è comodo e stringato ma fattivamente non mi aiutava molto nello sviluppo per due motivi principali.

Il primo è che nella maggior parte delle occasioni hai bisogno di viste personalizzate per ogni step. (almeno nel mio lavoro capita sempre così), spesso hai bisogno anche di fare diverse operazioni nel controller prima di passare a rendere la form… questo approccio non aiuta.

Il secondo, la procedura è completamente in sessione, con la possibilità di salvarsi il tutto con un serialize dei vari oggetti nel db. (questo è comodo).

Lavorare in sessione può comportare diversi svantaggi, i dati nel db vengono inseriti solo a fine procedura, spesso hai bisogno di salvare diversa roba di riferimento al record principale, tipo upload di file o altri elementi relazionati con l’entità principale, comunque salvare una quantità cospicua di dati raccolti in un unico momento è un’operazione critica, il rischio è di aver compilato tutti gli step, aver fatto perdere del tempo all’utente e alla fine non ritrovarsi nulla.

Tutto questo mi viene più naturale gestirlo con un form multi step che lavora direttamente sul db e ad ogni passo aggiorna lo stato di avanzamento. In questa maniera si può sempre riprendere il lavoro da dove si è lasciato e non avere limiti dal punto di vista della personalizzazione senza abbandonare mai l’approccio mvc.

ciao @st4nny dopo aver perso una mattinata … e aver visto l’esempio completo, ho abbandonato anch’io l’idea ma oltre ai motivi da te citati, c’è da aggiungere l’odioso utilizzo dell’oggetto cForm !! E’ talmente comodo l’ActiveRecord che ridisegnare tutto (ogni step) coi cForm è da scartare !!! Tornerò al metodo tradizionale, tutto dentro un unico form e qualche trucco jQuery :) e un pizzico di afterSave() del model (per salvare i record relazionati) unico neo di questo metodo è gestire la validazione dei record relazionati con js per non far ripetere l’intero modulo all’utente.

Grazie per tutto, è stata cmq una bella esperienza leggere i meccanismi di questo behavior ! :)

Ciao