Ciao a tutti,
volevo postare la mia "soluzione" a riguardo, e magari ricevere consigli e/o critiche per farlo in modo differente etc etc…
cmq, seguendo le indicazioni di Zaccaria, ho messo mani nel "model_principale" + "controller" + "_form.php":
il model principale che si achiama "Aree":
class Aree extends LinceActiveRecord
{
//*** questo è l'attributo che inserisco per servirmene in futuro nel controller...
public $componentiApplicazioni;
...
public function rules()
{
...
//*** aggiungo nelle rules il nome del "campo" che voglio validare che in questo caso è praticamente
//*** il nome dell'attributo appena inserito, la funzione che se ne occupa è stata createa da me e sta all'interno del model.
array('componentiApplicazioni','checkComponentiApplicazioni'),
...
}
public function checkComponentiApplicazioni(){
$obj = $this->componentiApplicazioni;
if( LinceFunctions::emptyAttributes($obj) ){
//*** se è vuoto stampo un errore di avviso che l'input non può essere vuoto
$this->addError('componentiApplicazioni',"Deve essere scelto almeno uno dei seguenti campi");
}else{
//*** se è pieno procedo alla validazione dell'oggetto
//*** tramite le !!proprie rules!!
if(!$obj->validate()){
foreach ($obj->getErrors() as $campo=>$erroriDelCampo){
$msg = implode( '<br />', $erroriDelCampo );
}
$this->addError( 'componentiApplicazioni', $msg );
}
}
}
pasisamo al Controller "AreeController":
...
public function actionCreate()
{
$model=new Aree;
$valida=false;
if( isset($_POST['ComponentiApplicazioni']) ){
//*** sull'attributo creato nel model Aree gli associo un oggetto di tipo "ComponentiApplicazioni"
$model->componentiApplicazioni = new ComponentiApplicazioni();
//*** poi gli inserisco i dati del post...
$model->componentiApplicazioni->attributes = $_POST['ComponentiApplicazioni'];
//*** poi valido, ma attenzione alla forma, perchè validando $model(che è il model principale "Aree")
//*** metto in gioco l'azione delle rules di Aree, ovvero proprio dell'istruzione che ho inserito io precedentemente
//*** per validare l'attributo "componentiApplicazioni", in questo modo se la validazione appena fatta è negativa
//*** stampa l'errore presente all'interno della funzione custom "checkComponentiApplicazioni"
$valida = $model->validate();
}
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['Aree']))
{
$model->attributes=$_POST['Aree'];
if($model->validate() && $valida ){
if($model->save())
$this->redirect(array('view','id'=>$model->id_area));
}
}
$this->render('create',array(
'model'=>$model,
));
}
...
in fine nel form"aree/_form.php":
<!-- inserisco questo elemento nel form *** -->
<div class="row">
<!-- creo l'oggetto -->
<?php $compAppl = new ComponentiApplicazioni;?>
<!-- creo il label e lo associo proprio all'attributo creato precedentemente nel model principale "Aree" -->
<?php echo $form->labelEx($model, 'componentiApplicazioni'); ?>
<!-- di seguito una lista di checkBox personalizzata, poco importante ai fini di questo post(è semplicemente una lista di checkBox) -->
<?php echo $form->linceCheckBoxList($compAppl, 'fk_id_componenti',Componenti::model(), 'id_componenti', 'desc_nome'); ?>
<!-- infine imposta l'html per "ospitare" l'eventuale messaggio di errore, sempre relativo all'attributo, come si può ben vedere -->
<?php echo $form->error($model,'componentiApplicazioni'); ?>
</div>
<!-- /TEST *** -->
praticamente, con l’incrocio di questi 3 elementi riesco a fare la validazione col relativo print dei messaggi a schermo di + models associati nello stesso form.
avete consigli su come "accorciare" la cosa se possibile?
Grazie!
ciao.