salut Ramzz1994 et merci pour ton intervention. encore une fois je ne vois pas comment en empilant toutes les regles dans un super tableau coe tu l'as fais et sans modification aucune de la methode "validates()" tu pourras valider tes formulaires.
prenons par exemple la structure de ton tableau, et la vue "edit",j'imagine que tu voudrais que la validation de ton formulaire sur cette vue porte sur les regles definies dans
$this->validate'edit']
, or la methode
validates()
telle qu'elle est ecrite essayera de valider aussi les regles de
$this->validate'add']
. bien-sur les champs renseignés dans le 2e sous tableau ne faisant pas parti de notre formulaire, la validation de ceux-ci nous retournera systématiquement des erreurs.
aussi tu as ecrit : "Il faut faire attention avec ce qui semblerait être de la réflexion (property_exists). Enfin, ça risque de fonctionner... heureusement, c'est toi qui a écrit le code de la classe Model". pour moi il s'agit là d'une remarque inutile et pas du tout pertinente car un developpeur ne va jamais se lancer tête baissée dans la création d'une application avec un framework dont il ne maîtrise pas. lorsque vous créez une application avec cake, codeigniter, zend, joomla ou tout autre systeme, c'est que vous savez comment ils sont structurés, et si tel n'etait pas les cas et que vous vous trouviez dans l'obligation de les utiliser, vous deviez d'abords prendre du temps pour les étudier via la doc ou les forums.
tu comprends donc que lorsque je fais une modif dans une methode de ma classe, je sais comment dorénavant je lui passerai les variables.
surtout que je prend la peine de m'assurer que les autres applications ne me retourneront pas d'erreur en cas de validation.
if($property and property_exists($this,$property)) $this->validate = $this->$property;
si tu est réfractaire à la déclaration de plusieurs tableaux(ce qui pour le coup est une bonne chose car permet de centraliser,la validation dans une application: je l'adopte), en gardant la structure de ton super tableau , et en restant dans l'esprit de ma proposition , la methode validates() pourrait ressembler à ceci:
class Model
{
public $validate = ];
public function validates($data,$key=null)
{
if($key)
$this->validate = (isset($this->validate$key]) and count($this->validate$key]))? $this->validate$key] : null;
if(!$this->validate)
{
$this->errors] = 'Aucune règle de validation n\'a été definie';
return false;
}
..........................
suite du code
}
/*
*
*/
}
dans le model de notre application
class Bonjour extends Model
{
var $validate = array(
'add' => array(
'champs1'=>array('regle1','message1'),
'champs2'=>array('regle2','message2'),
'champs3'=>array('regle3','message3')
),
'edit' => array(
'champsA'=>array('regleA','messageA'),
'champsB'=>array('regleB','messageB'),
'champsC'=>array('regleC','messageC')
)
);
}
et dans le controller on aura:
class BonjoursController extends Controller
{
public function index()
{
$this->loadModel('Bonjour');
// noter la presence du 2e parametre, indiquant quel sous tableau de la
// proprieté validate sera utilisé pour la validation
if(!$this->Bonjour->validates($this->request->data, $key='edit'))
{
$this->Session->setFlash($this->Bonjour->errors,'error');
return false;
}
}
/*
*
*/
}
je constate egalement(même si tu le déconseille finalement) que tu parles des pattern de validation qu pourraient provenir d'une bdd. moi je le deconseille fortement, non seulement pour des raisons de perfomance, mais aussi d'usage. on ne va pas consommer les ressources de notre serveur mysql juste pour recuperer les patterns necessaires à la validation d'un formulaire. ce qui faudrai c'est créer une classe de validation, validant les differents types de données qu'il est possible de poster depuis un formulaire,et l'appeller dans notre methode "validates()", ce qui boostera d'avantage notre rythme de travail, car les regles etant deja definies dans la classe, nous n'auront pour chaque champs qu'à renseigner le type de données auxquelles s'attendre.
exemple:
var $validate = array(
'login'=>array('notempty','email'),
'password'=>array('notempty','passwd'=>array('min'=>'8','max'=>'32'))
);
et dans le fichier model.php, notre methode de validation ressemblerai à ceci.
public function validates($data,$key=null)
{
if($key)
$this->validate = (isset($this->validate$key]) and count($this->validate$key]))? $this->validate$key] : null;
if(!$this->validate)
{
$this->errors] = 'Aucune règle de validation n\'a été definie';
return false;
}
$validation = new Validation($data);//j'ai intégré un autoloader au mvc
foreach($this->validate as $field=>$rules)
{
if(!is_array($rules))
{
if(strpos($rules,',')!==false) $rules = explode(',',trim($rules,','));
else $rules = array($rules);
}
foreach($rules as $each=>$rule)
if(!$validation->matchRules($each,$field,$rule)) $this->errors$field] = $validation->message;
}//endforeach
//irivenmvc::debug($this->errors);
if(isset($this->Form)) $this->Form->errors = $this->errors;
if(!count($this->errors)) return true;
return false;
}
NB: mes propositions sont testées et 100% fonctionnelles.