[Solucionado] Formulario Con Múltiples Opciones

Tengo un formulario relacionado con 3 modelos diferentes, un dropdownlist me muestra los textField según la opción que seleccione, oculto el div="row" completo y lo muestro a traves de una funcion javascript, el problema es a la hora de guardar, como hago para que no me valide el div="row" que tengo oculto en ese momento?

el codigo es el siguiente




	<div class="row">

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

		<?php echo $form->dropDownList($model,'tiposolicitante', array('1' => 'Por Comunidad', '2' => 'Por Institucion'), array('empty'=>'Seleccione el tipo de solicitante', 'id'=>'tiposolicitante')); ?>

		<?php echo $form->error($model,'tiposolicitante', array('inputID'=>'tiposolicitante')); ?>

	</div>


<script>    

	$(document).ready(function(){

		var droplist = $('#tiposolicitante');

		droplist.change(function(e)

		{

		if (droplist.val() == 1)

		{

			comunidad.style.display="initial";

			circomunidad.style.display="initial";

			institucion.style.display="none";

			muninstitucion.style.display="none";

			return false;

		}

		else if (droplist.val() == 2)

		{

			comunidad.style.display="none";

			circomunidad.style.display="none";

			institucion.style.display="initial";

			muninstitucion.style.display="initial";

			return false;

		}

		else

		{

			comunidad.style.display="none";

			circomunidad.style.display="none";

			institucion.style.display="none";

			muninstitucion.style.display="none";

			return false;

		}

		})

	});

</script>


	<div class="row" id="comunidad" style = 'display: none'>

		<?php echo $form->labelEx($c,'Nombre'); ?>

		<?php echo $form->textField($c,'nombre',array('size'=>60,'maxlength'=>255, 'id'=>'nomcom')); ?>

		<?php echo $form->error($c,'nombre', array('inputID'=>'nomcom')); ?>

	</div>

    

	<div class="row" id="circomunidad" style = 'display: none'>

		<?php echo $form->labelEx($c,'Circuito'); ?>

		<?php echo $form->dropDownList($c,'circuitos_id', CHtml::listData(Circuitos::model()->findAll(), 'id', 'nombre'),array('empty'=>'Seleccione un circuito', 'id'=>'circuitos_id_com')); ?>

		<?php echo $form->error($c,'circuitos_id', array('inputID'=>'circuitos_id_com')); ?>

	</div>

    

    <div class="row" id="institucion" style = 'display: none'>

		<?php echo $form->labelEx($d,'Nombre'); ?>

		<?php echo $form->textField($d,'nombre',array('size'=>60,'maxlength'=>255, 'id'=>'nomins')); ?>

		<?php echo $form->error($d,'nombre', array('inputID'=>'nomins')); ?>

	</div>

    

    <div class="row" id="muninstitucion" style = 'display: none'>

		<?php echo $form->labelEx($d,'Municipio'); ?>

		<?php echo $form->dropDownList($d,'municipios_id', CHtml::listData(Municipios::model()->findAll(), 'id', 'nombre'),array('empty'=>'Seleccione un municipio', 'id'=>'municipios_id_ins')); ?>

		<?php echo $form->error($d,'municipios_id', array('inputID'=>'municipios_id_ins')); ?>

	</div>



Hola Miguel,

Una forma fácil y sencilla (pero no ncesariamente la mejor) es eliminar la regla "required" para los 3 campos, de esa forma se omite la validación y ud puede implementar alguna manualmente.

La otra forma, más sofisticada y un poco más compleja, es permitir que la validación se haga sólo vía Ajax, y escribe la función rules() de modo que devuelva las reglas dinámicamente considerando el valor seleccionado.

Es decir, que la regla para el campo nombre solo estará activa cuando $this->tiposolicitante_id==1 (por ejemplo), y así sucesivamente (esto en la función rules)

Saludos.

Un ejemplo de reglas dinámicas es la extensión "yii-user" que hace uso de esta modalidad (no está de más echarle un vistazo.

Saludos

Bueno lo que aplique fue utilizar otro método para ocultarlo y funciono muy bien es vez de aplicarle el estilo display:none, le aplique al div el atributo hidden. y en la función js no hago un cambio de estilo sino que hago un .show(), me funciono perfectamente.

Excelente. Sería genial si publicara la solución para que otros desarrolladores con el mismo inconveniente puedan ver la solución y usarla.

Éxitos.

Aquí dejo la solución

En el form seria esto, al seleccionar una opción en tiposolicitante, si es 1 me mostrara el div comunidad y el div circomunidad, pero si es 2 me mostrara el div institución y el div muninstitucion, si regreso a la opcion empty me oculta todo de nuevo.




	<div class="row">

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

		<?php echo $form->dropDownList($model,'tiposolicitante', array('1' => 'Por Comunidad', '2' => 'Por Institucion'), array('empty'=>'Seleccione el tipo de solicitante', 'id'=>'tiposolicitante')); ?>

		<?php echo $form->error($model,'tiposolicitante', array('inputID'=>'tiposolicitante')); ?>

	</div>


<script>

$(document).ready(function()

{

	var droplist = $('#tiposolicitante');

	droplist.change(function(e)

	{

		if (droplist.val() == 1)

		{

			$('#comunidad').show();

			comunidad.disabled = false;

			$('#circomunidad').show();

			circomunidad.disabled = false;

			$('#institucion').hide();

			nomins.value = " ";

			institucion.disabled = true;

			$('#muninstitucion').hide();

			municipioS_id_ins.value = 'empty';

			muninstitucion.disabled = true;

			return false;

		}

		else if (droplist.val() == 2)

		{

			$('#comunidad').hide();

			nomcom.value = " ";

			comunidad.disabled = true;

			$('#circomunidad').hide();

			circuitos_id_com.value = 'empty';

			circomunidad.disabled = true;

			$('#institucion').show();

			institucion.disabled = false;

			$('#muninstitucion').show();

			muninstitucion.disabled = false;

			return false;

		}

		else

		{

			$('#comunidad').hide();

			nomcom.value = " ";

			comunidad.disabled = true;

			$('#circomunidad').hide();

			circuitos_id_com.value = 'empty';

			circomunidad.disabled = true;

			$('#institucion').hide();

			nomins.value = " ";

			institucion.disabled = true;

			$('#muninstitucion').hide();

			municipios_id_ins.value = 'empty';

			muninstitucion.disabled = true;

			return false;

		}

	})

});

</script>

    

    <div class="row" id="comunidad" hidden>

		<?php echo $form->labelEx($c,'Nombre'); ?>

		<?php echo $form->textField($c,'nombre',array('size'=>60,'maxlength'=>255, 'id'=>'nomcom')); ?>

		<?php echo $form->error($c,'nombre', array('inputID'=>'nomcom')); ?>

	</div>

    

	<div class="row" id="circomunidad" hidden>

		<?php echo $form->labelEx($c,'Circuito'); ?>

		<?php echo $form->dropDownList($c,'circuitos_id', CHtml::listData(Circuitos::model()->findAll(), 'id', 'nombre'),array('empty'=>'Seleccione un circuito', 'id'=>'circuitos_id_com')); ?>

		<?php echo $form->error($c,'circuitos_id', array('inputID'=>'circuitos_id_com')); ?>

	</div>

    

	<div class="row" id="institucion" hidden>

		<?php echo $form->labelEx($d,'Nombre'); ?>

		<?php echo $form->textField($d,'nombre',array('size'=>60,'maxlength'=>255, 'id'=>'nomins')); ?>

		<?php echo $form->error($d,'nombre', array('inputID'=>'nomins')); ?>

	</div>

    

	<div class="row" id="muninstitucion" hidden>

		<?php echo $form->labelEx($d,'Municipio'); ?>

		<?php echo $form->dropDownList($d,'municipios_id', CHtml::listData(Municipios::model()->findAll(), 'id', 'nombre'),array('empty'=>'Seleccione un municipio', 'id'=>'municipios_id_ins')); ?>

		<?php echo $form->error($d,'municipios_id', array('inputID'=>'municipios_id_ins')); ?>

	</div>