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';