mercredi 5 août 2009

Framework Turbulences : TUTO 4 - Validation de formulaire

VALIDATION DE FORMULAIRE :
Le but de ce tutoriel est de protéger l'envoi d'un formulaire. Les champs qui doivent être protégés sont écrits dans le modèle. Ainsi, par exemple, un utilisateur ne peut rentrer un prénom vide.

Ce tutoriel vient à la suite du tutoriel 3. Le module administrator doit être joint avec les modules address et user. De plus le formulaire edit sert à modifier les champs prénom, nom, email, niveau d'administration, rue, ville et code postal.

1.Formulaire
2.Fonction edit
3.Remplir le modèle avec les champs obligatoires

1. Remplissons tout d'abord le formulaire edit.tpl

Il faut faire un formulaire qui récupert les données enregistrées dans la base de donnée (données bleues). On affiche les erreurs SI elles existent (données rouges).
Voici le code complet et final.
<form name="" method="post" action="" enctype="multipart/form-data">
<!-- keep the object id in form -->
<input type="hidden" name="id" value="{$administrator->id}" />
<!-- hardcode the user type -->
<input type="hidden" name="user[user_type]" value="administrator" />

<fieldset>
<legend>
<div class="title">
<div class="title_right"></div>
Administrateur
</div>
</legend>
<p><label for="lastname">Nom :</label>
<input type="text" name="user[lastname]" value="{$administrator->user->lastname}"/>{if isset($error.user.lastname)}{$error.user.lastname}{/if}</p>
<p><label for="firstname">Prénom :</label>
<input type="text" name="user[firstname]" value="{$administrator->user->firstname}"/>{if isset($error.user.firstname)}{$error.user.firstname}{/if}</p>
<p><label for="email">Email :</label>
<input type="text" name="user[email]" value="{$administrator->user->email}" />{if isset($error.user.email)}{$error.user.email}{/if}</p>
<p><label for="level">Level :</label>
<textarea name="administrator[level]" style="overflow: hidden;" >{$administrator->level}</textarea>{if isset($error.administrator.level)}{$error.administrator.level}{/if}</p>
</fieldset>
<fieldset>
<legend>
<div class="title">
<div class="title_right"></div>
Adresse
</div>
</legend>
<p><label for="address">Rue :</label>
<input type="text" name="address[address]" value="{$administrator->address->address}"/>{if isset($error.address.address)}{$error.address.address}{/if}</p>
<p><label for="city">Ville :</label>
<input type="text" name="address[city]" value="{$administrator->address->city}"/>{if isset($error.address.city)}{$error.address.city}{/if}</p>
<p><label for="zip_code">Code postal :</label>
<input type="text" name="address[zip_code]" value="{$administrator->address->zip_code}" />{if isset($error.address.zip_code)}{$error.address.zip_code}{/if}</p>


</fieldset>
<hr />

<ul>
<li class="reset"><input type="reset" value="Annuler" /></li>
<li class="submit"><input type="submit" value="Enregistrer les modifications" /></li>
</ul>
</form>


2. Controlleur


// function to save the object for all action
private function _edit($view)
{
$v = new AdministratorView();

// get the object from request
$obj = $this->getAdministratorFromRequest();
//$obj->setAccessLevel($this->_access_level); // transmission of the access level to the object

// if request type is post
if($this->isPost())
{

// on récupert les informations concernant l'administrateur dont l'ID est passé en paramètre.
$administrator = Administrator::getByPKey('Administrator',$_POST['id']);

if(!is_null($administrator))
{
$field_errors = array(); // on créé un tableau qui contiendra les erreurs sur les champs.
$answer_array =array(); // on créé un tableau de réponse qui va être envoyé à la vue.
// on récupert les informations concernant l'utilisateur dont l'id est égal au user_id de l'admin
$user=User::getByPKey('User',$administrator->user_id);
$user->setFromArray($_POST['user']); // on enregistre les données

$address=Address::getByPKey('Address',$administrator->address_id); // idem que pour les users
$address->setFromArray($_POST['address']); // idem

$administrator->setFromArray($_POST['administrator']); // idem

$user->validate(); // on effectue validate() ici pour les 3 modules. Cette fonction
$address->validate(); // vérifie que tous les champs qui doivent etre remplis le sont.
$administrator->validate(); // si ce n'est pas le cas, il renvoit faux, sinon vrai.
// de plus, la fonction validate(), si elle renvoit faux permet de passer dans la fonction getError().
// C'est pour cette raison que l'on utilise 2 fois pour chaque module la fonction validate()

if($user->validate() && $address->validate() && $administrator->validate())
{

$user->save(); // si la fonction validate() a renvoyé TRUE pour les 3 modules,
$address->save(); // on peut alors enregistrer dans la base de données
$administrator->save();
}
else
{
$field_errors['user'] = $user->getError(); // on remplit ensuite le tableau d'erreur
$field_errors['address'] = $address->getError();
$field_errors['administrator'] = $administrator->getError();
$answer_array['administrator'] = $administrator; // puis on remplit le tableau réponse avec l'objet $adminsitrator
$answer_array['error'] = $field_errors; // ainsi qu'avec le tableau d'érreur.
return $v->html_edit($answer_array);//récupère et affiche les erreurs s'il y en a
}



// s'il n'y a pas d'erreurs , on redirige vers action_list
if(isset($obj->id) && !$obj->hasError())
return $this->action_list();
}

}

$view = 'html_'.$view;
return $v->$view($obj);
}


3- Ecrire la fonction validate() ainsi que les champs obligatoires :


public function validate()
{
$this->error = array();

foreach( $this->getAttributeNames() as $key => $attr )
{
if ( $this->$attr == '' AND $this->isMandatoryValue($attr) === TRUE ){
$this->error[$attr] = sprintf("Merci de renseigner le %s.", $attr);
}
else
{
$val = parent::validateThisValue($attr, $this->$attr);
if ( $val['message'] !== TRUE AND !is_null($attr) AND $this->$attr!=$this->_original[$key] )
$this->error[$attr] = $val['error'];
else
$this->$attr = $val['value'];
}
}
if(count($this->error)>0)
return false;
else
return true;
}

/**
* retourne les erreurs
*/
function getError()
{
return $this->error;
}

var $_mandatory = array(
'default' => array('firstname','lastname','email')
);

Aucun commentaire:

Enregistrer un commentaire

Bonjour,