Regla 'required' en varias vistas?

Hola gente, esta gran comunidad de Conocimiento en desarrollo. Muy agradecido con YII

La duda que tento es con esta regla en el modelo:


public function rules() {

        return array(

            array('uniqid', 'required'),

        );

    }

ejemplo: En el controlador en la actionIndex(), instancio el modelo y el aplica esta regla al formulario. Y lo que quiero es que al instanciar el mismo modelo en la actionUpdate(), me aplique un required a otros campos del formulario.

por ejempo que lo aplique a este otro campo y no a ‘uniqid’ sin la necesidad de crear otro modelo con esta regla diferente.




        return array(

            array('otro campo/*,uniqid*/', 'required'),

        );

    }

Agradezco a todos su ayuda

me presento: Hola a todos, soy Juan Pablo, Saludos desde Colombia! ;D

hola, espero que esto te sirva:

http://www.yiiframework.com/wiki/168/create-your-own-validation-rule/

Hola, tengo esta solucion, no se si te sirva =),

primero en el Modelo vas a definir varios escenarios: Los escenarios son las acciones en los controller donde deseas que se validen los campos por ejemplo, mi modelo es este:

public function rules() {


    return array(

array(‘campo1,campo2’, ‘required’, ‘on’ => ‘registrar’),

array(‘campo2,campo3’, ‘required’, ‘on’ => ‘actualizar’),

);

}

en el controller tengo dos funciones:

/*En esta el excenario que se va a cumplir es registrar y solo se van a validar las que en el Modelo sean ‘on’=>‘registrar’ */

public function actionCreate()


{


  $model->scenario = 'registrar';


	$model=new Products;





	$this->render('create',array(


		'model'=>$model,


	));


}

/*En esta el excenario que se va a cumplir es actualizar y solo se van a validar las que en el Modelo sean ‘on’=>‘actualizar’ */

public function actionUpdate()


{


  $model->scenario = 'actualizar';


	$model=new Products;





	$this->render('create',array(


		'model'=>$model,


	));


}

Avisame si te funciona

Gracias: stilomio.

Estado del Post: SOLUCIONADO.


Cual fue el problema?. Bueno, Lo normal es: un controlador, el modelo y las vistas. En este desarrollo tengo 2 Vistas: index y index2. en el controlador: SenoraController esta dos instancias del mismo modelo: SenoraForm, En el modelo impongo las reglas de validacion para los 3 campos: email (corresponde a index) y nombre,pass (corresponden a index2).


class SenoraController extends Controller {


    public function actionIndex() {


        $model = new SenoraForm;


        if (isset($_POST['SenoraForm'])) {

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

           

            if ($model->validate()) {

                

            }

        }

        $this->render('index', array('model' => $model));

    }


    public function actionIndex2() {

        $model = new SenoraForm;


        if (isset($_POST['SenoraForm'])) {

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

      

            if ($model->validate()) {

                

            }

        }

        $this->render('index2', array('model' => $model));

    }


}


class SenoraForm extends CFormModel {


    public $email;

    public $nombre;

    public $pass;


    public function rules() {

        return array(

            array('email,nombre,pass', 'required'),

               

        );

    }


}

index.php




div class="row" style="text-align: center;">

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

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

                    <?php //echo $form->textFieldRow($model, 'email', array('prepend' => '@')); ?>

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

                </div>



index2


div class="row" style="text-align: center;">

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

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

    </div>

    

     <div class="row" style="text-align: center;">

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

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

    </div>

En el momento es que an alguno de las 2 vistas (index,index2) el formulario envia los datos, muestra el error de validacion de campos vacidos en el index. porque en el modelo la regla dice que los 3 campos son requeridos. O en el index2 daba error de validacion porque el campo email estana sin caracteres, aun cuando este no esta definido en esa vista.

La solucion que daba era: crear otro modelo y en cada action del Controlador, definir la nueva instancia del $model. esto pues generaba mas codigo.


La Solucion del amigo: stilomio:

El Cambio: con esa solucion, me permite en 1 solo modelo definir el ‘required’ para las vistas que yo quiera sin necesidad de programas mas modelos. este es el codigo con la sulucion.


class SenoraController extends Controller {


    public function actionIndex() {


        $model = new SenoraForm;


        if (isset($_POST['SenoraForm'])) {

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

            

            $model->scenario = 'registrar';


            if ($model->validate()) {

                

            }

        }

        $this->render('index', array('model' => $model));

    }


    public function actionIndex2() {

        $model = new SenoraForm;


        if (isset($_POST['SenoraForm'])) {

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

            

            $model->scenario = 'crear';


            if ($model->validate()) {

                

            }

        }

        $this->render('index2', array('model' => $model));

    }


}


class SenoraForm extends CFormModel {


    public $email;

    public $nombre;

    public $pass;


    public function rules() {

        return array(

            array('email,nombre,pass', 'required', 'on' => 'registrar'),

            array('nombre,pass', 'required', 'on' => 'crear'),

        );

    }


}

Con esto en el Controllador la linea: $model->scenario. me permite definir el nombre para que el modelo sepa a quien le hace únicamente la validación y no generalice el resto.

NOTESE: que esta la palabra clave:


$model->scenario = 'registrar';

La defino despues de instanciar en el $model el modelo. Como el amigo: stilomio. define la solucion, no hay respuesta porque esta antes de instanciar el modelo:

Antes:


$model->scenario = 'registrar';

$model=new Products;

Despues:


$model = new SenoraForm;


        if (isset($_POST['SenoraForm'])) {

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

            

            $model->scenario = 'crear';

Excelente, que te haya funcionado estamos para ayudar cuando se pueda =). Saludos