Equivalent du viewstate en php ?

cs_alce Messages postés 2 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 14 octobre 2004 - 6 oct. 2004 à 09:57
cs_alce Messages postés 2 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 14 octobre 2004 - 14 oct. 2004 à 20:22
Bonjour !

Certains d'entre vous savent-ils s'il existe une classe (en cours de développement ou non) permettant de simuler un équivalent du "viewstate" en ASP.Net ?

C'est une fonctionnalité qui permet de collecter les données d'un formulaire d'une page et de les renvoyer automatiquement en cas de rechargement (du par exemple à une erreur de remplissage).

Ca permet de gagner du temps en programmation sans avoir à gèrer la re-saisie d'informations...

Merci !

2 réponses

phanatic Messages postés 44 Date d'inscription vendredi 18 octobre 2002 Statut Membre Dernière intervention 8 décembre 2005
14 oct. 2004 à 18:38
################## CPhanaticFormHTML.class.php ##################
<?php
/**
* class représentant un formulaire HTML
*/
abstract class CPhanaticFormHTML {
/** @var array liste des champs enregistrés*/
private $registerInputs=array();
/** @var array liste des methodes de validation */
private $inputValidationMethods=array();
/** @var array liste des messages d'erreur */
private $inputErrorMessages=array();
/** @var string nom du formulaire */
private $formName;
/** @var boolean comportement sur la validation */
private $cleanOnValidat;
/**
* @param string $formName identifiant du formulaire ( unique pour une session )
* @param boolean $cleanOnValidat deternime si l'etat du formulaire doit être sauvegardé aprés sa validation
*/
function __construct($formName="_DEFAULT", $cleanOnValidat=TRUE){
$this->formName = $formName;
$this->cleanOnValidat = $cleanOnValidat;
if(empty($_SESSION[$this->formName])){
$this->initialize();
$_SESSION[$this->formName] = "ready";
}
}
/**
* enregistrement d'un champ de formulaire
* @param string $inputName nom du champ ( nom HTML )
* @param string $validationMethodeName methode qui sera appelée pour valider le champ : public boolean methodName(string $value)
* @param string $errorMessage message renvoyé en cas d'erreur sur le champ
*/
protected function resigsterInput($inputName,$validationMethodeName, $errorMessage){
if(!in_array($inputName, $this->registerInputs)){
$this->inputValidationMethods[$inputName] = $validationMethodeName;
$this->inputErrorMessages[$inputName] = $errorMessage;
}
}
/**
* netoyage de la session
*/
public function clean(){
foreach($this->registerInputs as $input){
$validValueInputName = $this->formName . "_" . $inputName . "_VALUE";
$validMessageInputName = $this->formName . "_" . $inputName . "_MSG";
if(!empty($_SESSION[$validValueInputName])){
unset($_SESSION[$validValueInputName]);
}
if(!empty($_SESSION[$validMessageInputName])){
unset($_SESSION[$validMessageInputName]);
}
}
}
/**
* teste s'il le formulaire a été posté
* @return boolean - true si oui
* - false dans tous les autres cas
*/
public function isPosted(){
return !empty($_POST[$this->formName]);
}
/**
* obtenir la valeur d'un champ
* @param string $inputName nom du champ ( nom HTML )
* @return string
*/
public function getInputValue($inputName){
$validInputName = $this->formName . "_" . $inputName . "_VALUE";
if(array_key_exists($validInputName,$_SESSION)){
$_SESSION[$validInputName] = "";
}
return $_SESSION[$validInputName];
}
/**
* définir la valeur d'un champ
* @param string $inputName nom du champ ( nom HTML )
* @param string $inputValue valeur du champ
*/
public function setInputValue($inputName, $inputValue){
$validInputName = $this->formName . "_" . $inputName . "_VALUE";
$_SESSION[$validInputName] = $inputValue;
}
/**
* obtenir le message d'un champ
* @param string $inputName nom du champ ( nom HTML )
* @return string
*/
public function getInputMessage($inputName){
$validInputName = $this->formName . "_" . $inputName . "_MSG";
if(array_key_exists($validInputName,$_SESSION)){
$_SESSION[$validInputName] = "";
}
return $_SESSION[$validInputName];
}
/**
* définir le message d'un champ
* @param string $inputName nom du champ ( nom HTML )
* @param string $inputMessage message du champ
*/
public function setInputMessage($inputName, $inputMessage){
$validInputName = $this->formName . "_" . $inputName . "_MSG";
$_SESSION[$validInputName] = $inputValue;
}
/**
* teste s'il le formulaire est valide
* @return boolean - TRUE si oui
* - FALSE dans tous les autres cas
*/
public function isValidate(){
$result = TRUE;
// vider la pile des anciens messages
unset($this->messages);
$this->messages = array();

//interogation de la classe d'implémentation
$cls = new ReflectionClass(get_class($this));
$validatMethod = null;

// effecter le travail pour tous les champs enregistrés
foreach($this->registerInputs as $input){
if(!array_key_exists($input, $_POST)){
$this->messages[$input] = "Ce champ n'existe pas dans le formulaire !";
$result = FALSE;
break;
}
$validatMethod = $cls->getMethod($this->inputValidationMethods[$inputName]);
// teste de la valeur
if(!$validatMethod->invoke($this,$_POST[$inputName])){
$this->messages[$input] = $this->inputErrorMessages[$inputName];
$result = FALSE;
break;
}
}
//notification de l'évennement de validation
if($result){
$this->onValidate();
if($this->cleanOnValidat){
$this->clean();
}
} else {
$this->onInvalidate();
}
return $result;
}
/**
* appeler l'or de la premiere instentiation
*/
protected function initialize(){
}
/**
* appeler en cas de non validation ( ne pas faire de redirection )
*/
protected function onInvalidate(){
}
/**
* appeler en cas de validation ( ne pas faire de redirection )
*/
protected function onValidate(){
}

/* validations prédéfinies */
public static function isNotEmty($string){
return !empty($string);
}
public static function isUSZipCode($string){
return preg_match("/^[2-9][0-9]{4}([-]{1}[0-9]{4})?$/",$string));
}
public static function isUSPhoneNumber($phonenumber){
return preg_match("/^[0-9]{3,3}[-]{1,1}[0-9]{3,3}[-]{1,1}
[0-9]{4,4}$/", $phonenumber);
}
public static function isIPAddress($ip_addr){
$num="(1?\d\d|2[0-4]\d|25[0-5]|[0-9])";
return preg_match("/$num\.$num\.$num\.$num/",$ip_addr);
}
public static function isEmail($email){
// j'ai la flème ....
return !empty($email);
}
}
?>

################## CMyFormHTML.class.php ##################
<?php
include_once ("CPhanaticFormHTML.class.php");
class CMyFormHTML extends CPhanaticFormHTML {
function __construct(){
parent::__construct("_MYFORMHTML");
$this->resigsterInput("_NAME","isValidateName", "");
$this->resigsterInput("_EMAIL","isValidateEmail", "");
$this->resigsterInput("_PHONE","isValidatePhone", "");
}
protected function initialize(){
$this->setInputValue("_NAME","Alce");
}
protected function onInvalidate(){
}
protected function onValidate(){
}
public static function isValidateName($value){
return self::isNotEmpty($value);
}
public static function isValidateEmail($value){
if(!self::isNotEmpty($value)) return FALSE;
if(!self::isEmail($value)) return FALSE;
return TRUE;
}
public static function isValidatePhone($value){
if(!self::isNotEmpty($value)) return FALSE;
if(!self::isUSPhoneNumber($value)) return FALSE;
return TRUE;
}
}
?>

################## index.php ##################
<?php
include_once ("CMyFormHTML.class.php");
$myForm = new CMyFormHTML();
if($myForm->isPosted()){
if($myForm->isValidate()){
// ...
} else {
// ...
}
}
?>
<html>
<head>
<title>Sample: CPhanaticFormHTML</title>
</head>

<form name="_MYFORMHTML" method="post">
<!-- ne pas oublier de déclarer un champ chaché du même nom que le formulaire -->

name :
getInputValue("_NAME")?>">
<?php=$myForm->getInputMessage("_NAME")?>

email :
getInputValue("_EMAIL")?>">
<?php=$myForm->getInputMessage("_EMAIL")?>

phone :
getInputValue("_PHONE")?>">
<?php=$myForm->getInputMessage("_PHONE")?>

</form>

</html>
--- ---

On peut aller beaucoup plus loing, mais la j'ai plus le temps...
Dans NOAS (framework PHP5 en dev) la validation des formulaire est un jeu d'enfant.

phanatic
0
cs_alce Messages postés 2 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 14 octobre 2004
14 oct. 2004 à 20:22
ok, merci bien !

Je vais tester ça dès que j'en aurai l'occasion.
Ca ressemble pour beaucoup à du php5, non ?

Par contre, je n'ai pas trouvé d'infos sur NOAS sur le net...

Existe t-il quelque chose d'équivalent en php4 ? On ne sait jamais...
0
Rejoignez-nous