Bonjour,
Tout d'abord j'ai vue la vidéo de grafikart qui parle de ça mais je ne veut pas faire ça avec la database ce qui rend compliquer l'application pour autre chose, en gros j'ai pas compris.
Alors voila ce je veut faire :
// je souhaite que cette class utilise les fonctions de la class Validator dans un fichier différenrent
<?php
namespace App;
class Register{
public static function registerAction(){
if(!empty($_POST)){
$validator->IsAlpha('username' , 'pseudo non valide valide (alphanumeric)');
}if($validator->IsValid()){
$validator->IsUniq('username' , 'users', 'Ce pseudo est déjà utilisée');
}if($validator->IsValid()){
App::setFlash('<strong>Super !</strong> Vous êtes bien inscrit <strong>Bien jouer reste a valider votre compte ! par Email</strong>','Success !');
header('Location:home');
die;
}else{
$errors = $validator->getErrors();
}
}
}
La class Validator :
<?php
namespace App;
class Validator{
private $data;
private $errors = [];
public function __construct($data){
$this->data = $data;
}
public function getField($field){
if(!isset($this->data[$field])){
return null;
}
return $this->data[$field];
}
public function IsAlpha($field, $errorMsg){
if(!preg_match('/^[a-zA-Z0-9_]+$/',$this->getField($field))){
$this->errors[$field] = $errorMsg;
}
}
public function IsUniq($field, $table, $errorMsg){
$record = App::getDB()->register("SELECT id FROM $table WHERE $field = ?",[$this->getField($field)]);
if($record){
$this->errors[$field] = $errorMsg;
}
}
}
Je veut faire ça pour évité de charger tous le bordel sur la page qui affiche les formulaires et profité de l'autoloader ce qui est quand même le but.
Mais voila je ne sais pas comment faire ?
de plus j'ai aussi le message App::setFlash()
et App::getDB()
a faire passer en gros dès que je fait ça Register::registerAction()
que l'autoloader sache qu'il doit utiliser la Validator App etc...
Donc voila je suis paumé dans toute ces nouveauté !
Bonsoir.
Il te faut par exemple faire :
public static function registerAction() {
if (!empty($_POST)) {
$validator = new \App\Validator($_POST);
$validator->IsAlpha('username' , 'pseudo non valide valide (alphanumeric)');
// etc ...
}
}
Par contre, dans ta fonction tu fais appel aux méthodes getErrors
et isValid
, sauf que dans la classe Validator
que tu nous montre, elles n'y existent pas.
Merci Lartak si si les deux fonction existe je voulais juste pas surcharger la page
du coup j'ai éssayer comme ceci dans Validator :
<?php
namespace App;
class Validator{
private $data;
private $errors = [];
private static $validator;
public function __construct($data){
$this->data = $data;
}
public static function getValidations(){
if(self::$validator === null){
self::$validator = new Validator($_POST);
}
return self::$validator;
}
public function getField($field){
if(!isset($this->data[$field])){
return null;
}
return $this->data[$field];
}
public function IsAlpha($field, $errorMsg){
if(!preg_match('/^[a-zA-Z0-9_]+$/',$this->getField($field))){
$this->errors[$field] = $errorMsg;
}
}
public function IsConfirm($field, $errorMsg){
$value = $this->getField($field);
if(empty($value) || $value != $this->getField($field.'_confirm') ){
$this->errors[$field] = $errorMsg;
}
}
public function IsEmail($field, $errorMsg = false){
if(!filter_var($this->getField($field), FILTER_VALIDATE_EMAIL)){
$this->errors[$field] = $errorMsg;
}
}
public function IsFieldStr($field, $errorMsg, $strMin, $strMax){
if((strlen($this->getField(utf8_decode($field))) < $strMin)){
var_dump($strMin);
$this->errors[$field] = $errorMsg;
}
if((strlen($this->getField(utf8_decode($field))) > $strMax)){
var_dump($strMax);
$this->errors[$field] = $errorMsg;
}
}
public function IsCaptcha($field, $errorMsg){
$value = $this->getField($field);
if(!empty($_SESSION['captcha'] != $value) || empty($value)){
$this->errors[$field] = $errorMsg;
}
}
public function IsUniq($field, $table, $errorMsg){
$record = App::getDB()->register("SELECT id FROM $table WHERE $field = ?",[$this->getField($field)]);
if($record){
$this->errors[$field] = $errorMsg;
}
}
public function IsValid(){
return empty($this->errors);
}
public function getErrors(){
return $this->errors;
}
}
Puis dans la class Register :
<?php
namespace App;
class Register{
public static function getErrors(){
$errors = [];
$errors = Validator::getValidations()->getErrors();
return $errors;
}
public static function registerAction(){
if(!empty($_POST)){
Validator::getValidations()->IsAlpha('username' , 'pseudo non valide valide (alphanumeric)');
if(Validator::getValidations()->IsValid()){
Validator::getValidations()->IsUniq('username' , 'users', 'Ce pseudo est déjà utilisée');
}
Validator::getValidations()->IsFieldStr('username', 'Le pseudo est trop court entre 4 et 100 caractères',4,100);
Validator::getValidations()->IsEmail('email' , "Cette email n'est pas valide");
if(Validator::getValidations()->IsValid()){
Validator::getValidations()->IsUniq('email' , 'users', 'Cette email est déjà utilisée');
}
Validator::getValidations()->IsConfirm('password', 'Vous devez entré un mots de pass valide');
Validator::getValidations()->IsFieldStr('password', 'Le mots de pass est trop court entre 5 et 100 caractères',5,100);
Validator::getValidations()->IsCaptcha('captcha', "Le captcha n'est pas valide");
if(Validator::getValidations()->IsValid()){
App::setFlash('<strong>Super !</strong> Vous êtes bien inscrit <strong>Bien jouer reste a valider votre compte ! par Email</strong>','Success !');
header('Location:home');
die;
}else{
Register::getErrors();
}
}
}
}
Après je ne sais pas si sait comme ça qu'il faut si prendre car la pour moi c'est tout nouveau !
En tout cas mes erreurs sont bien retourner le formulaire fonctionne comme il faut.
Bonjour @neecride,
Je pense qu'utiliser un champ static pour stocker une instance du même objet, c'est tordu !!!
je parle du champ $validator dans la classe Validator
le mieux serait d'instancier une fois un objet Validator dans ton controller et de passer l'objet aux autres classes par paramètre.
Ta façon de faire empêche la destruction de l'objet par le ramasse miettes car il y aura toujours une référence static dans la classe.
Petit détail qui n'a rien à voir
lorsque tu écris un verbe et que tu ne sais pas s'il faut le terminer par 'é' ou 'er', remplace par le verbe 'prendre' ou "pris"
si ça sonne mieux avec 'prendre', mets 'er' et si ça sonne mieux avec 'pris' mets 'é' (ou 'ée' pour 'prise')
exemple "Bien jouer reste a valider votre compte ! par Email"
Bien pris reste a prendre votre compte ! par Email -> Bien joué, reste a valider votre compte ! par Email
Salut Huggy merci pour l'astuce,
tu veut dir comme ce que Lartak me propose :
public static function registerAction() {
if (!empty($_POST)) {
$validator = new \App\Validator($_POST);
$validator->IsAlpha('username' , 'pseudo non valide valide (alphanumeric)');
// etc ...
}if($validator->IsValid()){
die('ok');
}else{
$errors = $validator->getErrors();
}
}
j'ai pris cette exemple sauf que mon tableau d'erreur bug je fais une boucle foreach pour les récupérer (prendre sonne mieux que pris donc 'er' si j'ai bien pigé ) .
J'essai de trouver seul mais c'est pas si simple ! quand je fais ça $errors = Register::registerAction();
la ou j'ai mon formulaire, je fait return $validator->getErrors()
dans ma class Register du coup la variable $errors
retourne mon tableau si il est définie sinon supplied for foreach
j'imagine que ce n'est pas comme cela qu'il faut si prendre.