Form Rules

Hi i have a model searchform with one field , this is the rule method:




public function rules()

        {

                return array(

                        // nome obbligatorio

                        array('nome', 'required','message'=>'Non puoi lasciare vuoto questo campo'),

                        // nome lunghezza minima 3 caratteri

                        array('nome', 'length', 'min'=>3,'message'=>'Inserisci almeno 3 caratteri')


                );

        }



this is the view :




<?php

/* @var $this fIL,Controller */

/* @var $model  SearchForm */

/* @var $form CActiveForm */


$this->pageTitle=Yii::app()->name . ' Ricerca Film';

$this->breadcrumbs=array(

	'Ricerca Film',

);

?>


<h1>Ricerca</h1>


<?php if(Yii::app()->user->hasFlash('search')): ?>


<div class="flash-success">

	<?php echo Yii::app()->user->getFlash('search'); ?>

</div>


<?php else: ?>





<div class="form">


<?php $form=$this->beginWidget('CActiveForm', array(

	'action'=>Yii::app()->createUrl('film/risultati'),

	'method'=>'GET',

	'enableClientValidation'=>true,

	'clientOptions'=>array(

		'validateOnSubmit'=>true,

	)

	

)); ?>


	<?php //echo $form->errorSummary($model); ?>


		<div class="row">

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

		<?php echo $form->textField($model,'nome',array('size'=>60,'maxlength'=>100)); ?>

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

	</div>


	<div class="row buttons">

		<?php echo CHtml::submitButton('Ricerca'); ?>

	</div>


<?php $this->endWidget(); ?>


</div><!-- form -->


<?php endif; ?>



When i go to the form’s page i have immediately :


Non puoi lasciare vuoto questo campo 

I want the message only on submit

when i write 2 caracter i have this error :


Nome is too short (minimum is 3 characters).

I want:


Inserisci almeno 3 caratteri

Tanks.

can you post your Controller Action aswell?

This is Filmcontroller :




<?php


class FilmController extends Controller

{

	/**

	 * @var string the default layout for the views. Defaults to '//layouts/column2', meaning

	 * using two-column layout. See 'protected/views/layouts/column2.php'.

	 */

	public $layout='//layouts/column2';


	/**

	 * @return array action filters

	 */

	public function filters()

	{

		return array(

			'accessControl', // perform access control for CRUD operations

			'postOnly + delete', // we only allow deletion via POST request

		);

	}


	/**

	 * Specifies the access control rules.

	 * This method is used by the 'accessControl' filter.

	 * @return array access control rules

	 */

	public function accessRules()

	{

		return array(

			array('allow',  // allow all users to perform 'index' and 'view' actions

				'actions'=>array('index','view','search','risultati'),

				'users'=>array('*'),

			),

			array('allow', // allow authenticated user to perform 'create' and 'update' actions

				'actions'=>array('create','update'),

				'users'=>array('@'),

			),

			array('allow', // allow admin user to perform 'admin' and 'delete' actions

				'actions'=>array('admin','delete'),

				'users'=>array('admin'),

			),

			array('deny',  // deny all users

				'users'=>array('*'),

			),

		);

	}


	/**

	 * Displays a particular model.

	 * @param integer $id the ID of the model to be displayed

	 */

	public function actionView($id)

	{

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

			'model'=>$this->loadModel($id),

		));

	}


	/**

	 * Creates a new model.

	 * If creation is successful, the browser will be redirected to the 'view' page.

	 */

	public function actionCreate()

	{

		$model=new Film;


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['Film']))

		{

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

			if($model->save())

				$this->redirect(array('view','id'=>$model->Id_test));

		}


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

			'model'=>$model,

		));

	}


	/**

	 * Updates a particular model.

	 * If update is successful, the browser will be redirected to the 'view' page.

	 * @param integer $id the ID of the model to be updated

	 */

	public function actionUpdate($id)

	{

		$model=$this->loadModel($id);


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['Film']))

		{

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

			if($model->save())

				$this->redirect(array('view','id'=>$model->Id_test));

		}


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

			'model'=>$model,

		));

	}


	/**

	 * Deletes a particular model.

	 * If deletion is successful, the browser will be redirected to the 'admin' page.

	 * @param integer $id the ID of the model to be deleted

	 */

	public function actionDelete($id)

	{

		$this->loadModel($id)->delete();


		// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser

		if(!isset($_GET['ajax']))

			$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));

	}


	/**

	 * Lists all models.

	 */

	public function actionIndex()

	{

		$dataProvider=new CActiveDataProvider('Film');

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

			'dataProvider'=>$dataProvider,

		));

	}


	/**

	 * Manages all models.

	 */

	public function actionAdmin()

	{

		$model=new Film('search');

		$model->unsetAttributes();  // clear any default values

		if(isset($_GET['Film']))

			$model->attributes=$_GET['Film'];


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

			'model'=>$model,

		));

	}


	/**

	 * Returns the data model based on the primary key given in the GET variable.

	 * If the data model is not found, an HTTP exception will be raised.

	 * @param integer $id the ID of the model to be loaded

	 * @return Film the loaded model

	 * @throws CHttpException

	 */

	public function loadModel($id)

	{

		$model=Film::model()->findByPk($id);

		if($model===null)

			throw new CHttpException(404,'The requested page does not exist.');

		return $model;

	}


	/**

	 * Performs the AJAX validation.

	 * @param Film $model the model to be validated

	 */

	protected function performAjaxValidation($model)

	{

		if(isset($_POST['ajax']) && $_POST['ajax']==='film-form')

		{

			echo CActiveForm::validate($model);

			Yii::app()->end();

		}

	}

        

        public function actionSearch()

	{

		

              /**

	 * Displays the contact page

	 */

	

		$model=new SearchForm;

                if($model->validate()){

                     if(isset($_GET['SearchForm'])){

                        $searchform= Yii::app()->request->getQuery('SearchForm');

                        

                     }

                        

                }

		

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

	

	}

        

    public function actionRisultati()

	{

		

              /**

	 * Displays the contact page

	 */ 

                $searchform= Yii::app()->request->getQuery('SearchForm');


                $data['nome']=$searchform['nome'];


                $parametro=$data['nome'];




                // connessione a MySQL con yii

                $connection=Yii::app()->db;


                 // query 

                $sql = "SELECT * FROM film where nome like '%$parametro%' ";


                // esecuzione della query

                $command=$connection->createCommand($sql);


                //prendo i risultati

                $data['row']=$command->queryAll();




                //conto i risultati 

                $data['numRighe']=$command->execute();   // execute the non-query SQL


                $data['dataReader']=$command->query();

                //Stampo il numero di righe

                //echo "Numero righe: $numRighe";

		

				$this->render('risultati',$data);


		

	

	}

        

        

}




Yes. you need to check if the form is posted, not validate right away. (actionSearch).

Right now it validates a new SearchForm model, and that is ofcourse empty, therefor the error :)