IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

foreach sur un objet [PHP 5.6]


Sujet :

Langage PHP

  1. #21
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Citation Envoyé par bricoreur Voir le message

    Ensuite, j'aimais bien mon idée d'avoir un addField dans lequel je pouvais renseigner un champ et tous les contrôles à réaliser sur ce dernier en 1 seule ligne.
    En informatique, comme partout ailleurs, le mieux est souvent l'ennemi du bien. Un bon script doit être lisible et facilement compréhensible même si on le relit quelques années plus tard. Mettre trop d'informations seulement pour dire d'avoir moins de lignes est une fausse bonne idée AMHA.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  2. #22
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 261
    Points : 121
    Points
    121
    Par défaut
    Merci

    votre code marche très bien et d'appeler plusieurs fonctions (super)

    je vais maintenant travailler sur votre code et essayer de le décortiquer pour le comprendre et me l'approprier définitivement

    j'ai bien noté vos conseils sur les retours True et False et séparer les messages d'erreurs....

    Cependant j'aimerai quand même réussir à finaliser mon premier script pour comprendre les modifications à apporter

  3. #23
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    On peut même utiliser les closures dans d'autres closures. Voir $email_non_obligatoire.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    <?php
    include("validate.class.php");
    //==============================================================================
    //-------------- closures - les fonctions renvoient true ou false
    //==============================================================================
    // controle qu'un champ est rempli
    $remplissage = function($array) {
     $valeur = $array[0];
        return (!empty($valeur)) ? true : false;
    };
    // exemple de contrôle combiné => controle les valeur des 2 champs options
    $controleOption = function($array)
    {
     list($option1,$option2) = $array;
     if ($option1==$option2)
     {
      return false;
     }
     return true;
    };
    // contrôle qu'une valeur est numérique
    $numerique = function($array)
    {
     $valeur = $array[0];
     return (is_numeric($valeur)) ? true : false;
    };
    // contrôle facultatif - on ne contrôle l'email que s'il est renseigné
    // et on utilise un autre de nos contrôles !!!
    $email_non_obligatoire = function ($array) use ($remplissage)
    {
     if ($remplissage($array))
     {
      if (filter_var($array[0], FILTER_VALIDATE_EMAIL)) 
      {
       return true;
      }
      else
      {
       return false;
      }
     }
     return true;
    };
    //==============================================================================
     
    $toto = new Validate();
    $toto->addControl('Le nom n\'est pas renseigné',["nom"], $remplissage);
    $toto->addControl('Le prénom n\'est pas renseigné',["prenom"], $remplissage);
    $toto->addField(["L'âge n'est pas renseigné","L'âge n'est pas numérique => #age"],["age"], [$remplissage, $numerique]);
    $toto->addControl("Les deux options ne peuvent avoir la même valeur => option 1 = #option1 et option 2 = #option2",["option1","option2"], $controleOption);
    $toto->addControl('Email #email invalide',["email"], $email_non_obligatoire);
    //+++++++++++++++++++++++++++++++++++++++++++++
    // problème sur les options
    $valeurAController = ['nom'=>'Dupont','prenom'=>'Pierre','age'=>25,'option1'=>'oui','option2'=>'oui','email'=>''];
    $result = $toto->control($valeurAController);
    // on parcourt les résultats qui ont retourné faux pour afficher le message d'erreur.
    foreach($result as $message => $result)
    {
     if (! $result)
     {
      print "$message<br/>";
     }
    }
    //+++++++++++++++++++++++++++++++++++++++++++++
    print "<br/>";
    // problème sur les options et l'email qui est invalide
    $valeurAController = ['nom'=>'Dupont','prenom'=>'Pierre','age'=>25,'option1'=>'oui','option2'=>'oui','email'=>'totot @yoyo.fr'];
    $result = $toto->control($valeurAController);
    // on parcourt les résultats qui ont retourné faux pour afficher le message d'erreur.
    foreach($result as $message => $result)
    {
     if (! $result)
     {
      print "$message<br/>";
     }
    }
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  4. #24
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 261
    Points : 121
    Points
    121
    Par défaut
    Bonjour,

    j'ai travaillé sur vos codes...je commence à comprendre mais je bloque sur la méthode Contrôle() qui est la plus complexe.

    j'ai tenté de faire cela à partir de votre proposition :

    - un formulaire (SignUp)
    - un fichier (class Closures ?)dans lequel il y a que des closures qui pourraient être appelées lorsque j'en aurai besoin. Est-ce pertinent ?
    - une class Validate
    - un fichier Closures_SignUp dans lequel j'instancie la class Validate (+closures)
    - un fichier autoload;

    L'idée étant de créer un fichier Closures_FormA, Closures_FormB,....

    En revanche, comme je vous l'ai indiqué, je ne comprends pas tout dans la méthode Contrôle et je n'arrive pas à passer mes valeurs
    NB : dans le fichier Closures, j'ai essayé d'écrire ma propre closure que j'ai associé à la variable $tel (qu'en pensez-vous ?)

    Form_SignuUp.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <form action="Closures_SignUp.php" method="post">
     <p>Nom : <input type="text" name="nom"></p>
     <p>Prenom : <input type="text" name="prenom"></p>
     <p>Age : <input type="text" name="age"></p>
     <p>Mail : <input type="text" name="mail"></p>
     <p>Tel : <input type="text" name="tel" placeholder="00.00.00.00.00"></p>
     <input type="submit" name="inscription" value="INSCRIRE">
    </form>
    Closures_SignUp.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    <?php
     
    require "Autoload.php";
    require "Closures.php"; 
     
    $valid = new Validate();
      $valid->addControl('Le nom n\'est pas renseigné',[($_POST["nom"])], $required); 
      $valid->addControl('Le prénom n\'est pas renseigné',[($_POST["prenom"])], $required);
      $valid->addField(["L'âge n'est pas renseigné","L'âge n'est pas numérique => #age"],[($_POST["age"])], [$required, $numerique]);
      $valid->addControl("Le mail renseigné n'est pas valide",[($_POST["mail"])], $email_non_obligatoire);
      $valid->addField(["Veuillez saisir votre numéro de téléphone","Votre numero de tel n'est pas valide => #tel"],[($_POST["tel"])], [$required, $tel]); // ma propre closure
     
    $valeurAController = [$_POST]; // array [0] => array [6]  <---> $this->fieldArrayOfControls[$this->ruleNumber] = [$errorMessage,$arrayOfFieldNames,$control];
    var_dump($valeurAController); 
     
    $result = $valid->control($valeurAController);
     
    foreach($result as $message => $result)
    {
     if (! $result)
     {
      print "$message<br/>";
     }
    }
    Closures. php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    <?php
     
    // Ceci est déjà une class CLOSURE - donc pas besoin de la redeclarer ???
     
    //==============================================================================
    //-------------- ECRIRE TOUTES LES CLOSURES  - les fonctions renvoient true ou false
    //==============================================================================
     
     
    // controle qu'un champ est rempli
    $required = function($array) {
     $valeur = $array[0];
        return (!empty($valeur)) ? true : false;
    };
     
     
    // exemple de contrôle combiné => controle les valeur des 2 champs options
    $controleOption = function($array)
    {
     list($option1,$option2) = $array;
     if ($option1==$option2)
     {
      return false;
     }
     return true;
    };
     
     
    // contrôle qu'une valeur est numérique
    $numerique = function($array)
    {
     $valeur = $array[0];
     return (is_numeric($valeur)) ? true : false;
    };
     
    // contrôle facultatif - on ne contrôle l'email que s'il est renseigné
    // et on utilise un autre de nos contrôles !!!
    $email_non_obligatoire = function ($array) use ($required)
    {
     if ($required($array))
     {
      if (filter_var($array[0], FILTER_VALIDATE_EMAIL)) 
      {
       return true;
      }
      else
      {
       return false;
      }
     }
     return true;
    };
     
     
    //CONTROLE SAISIE DU TELEPHONE
    $tel = function ($array)
    {
     if (filter_var($array[0], FILTER_VALIDATE_REGEXP, array("options" => array("regexp"=>"/^[0-9]{2}.[0-9]{2}.[0-9]{2}.[0-9]{2}.[0-9]{2}$/"))) !== false) {
      return true;
     } else {
      return false;
     }
    };
    Validate.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
     
    <?php
    class Validate
    {
     private $fieldArrayOfControls  = array();
     private $arrayOfData           = array();
     private $ruleNumber            = 0;
     
     
     public function addControl($errorMessage,$arrayOfFieldNames, $control)
     {
      $this->fieldArrayOfControls[$this->ruleNumber] = [$errorMessage,$arrayOfFieldNames,$control];
      $this->ruleNumber++;
     }
     
     
     public function addField($errorMessages,$arrayOfFieldNames, $controls)
     {
      foreach($errorMessages as $key => $errorMessage)
      {
       $this->addControl($errorMessage,$arrayOfFieldNames, $controls[$key]);
      }
     }
     
     public function control($arrayOfData)
     {
      $results = array();
     
      foreach($this->fieldArrayOfControls as $ruleNumber => $data)
      {
       // init pour traitement champs manquants
       $arrMissing    = array();
       $missingFields = false;
     
       // préparation du message en sortie
       $message     = $data[0];
     
       // constitution des paramètres de la fonction de closure
       $arrayToMap   = array();
       $fieldNames   = $data[1];
       foreach($fieldNames as $key => $fieldName)
       {
        if (! isset($arrayOfData[$fieldName]))
        {
     
         // champ manquant
         $missingFields = true; 
         $arrMissing[]  = $fieldName;
        }
        else 
        {
         $fieldValue   = $arrayOfData[$fieldName];
         $arrayToMap[] = $fieldValue;
     
         // message en sortie
         $message      = str_replace("#$fieldName",$fieldValue,$message);     
        }
       }
       if (!$missingFields)
       {
     
        // Pas de champ manquant => exécution de la closure
        $function           = $data[2];
        $results[$message]  = array_map($function, [$arrayToMap])[0];     
       }
       else
       {
        foreach($arrMissing as $missingField)
        {
         $results["*** Missing field '$missingField'"] = false;
        }
       }
     
      }
      return $results;
     }
    }
    Autoload.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php
     
    spl_autoload_register('autoload');
     
    function autoload($class){
        //die($class); 
        require "$class.php";
    }

  5. #25
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    $_POST est un tabeau. Pas la peine de le mettre entre []
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  6. #26
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 261
    Points : 121
    Points
    121
    Par défaut
    Merci beaucoup,

    j'ai corrigé la syntaxe sur $_Post ainsi que dans mes AddField et AddControl.

    tout semble très bien fonctionner. Je vais continuer à faire mes tests et rajouter les closures.

    Maintenant je vous avoue ne pas avoir tout compris dans la fonction controle()...je vais chercher à me l'approprier

    je poursuis.....

  7. #27
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Le principe de control est de renvoyer un tableau contenant les messages d'erreurs comme clés de tableau et true ou false comme valeur.

    De cette manière tu peux faire un boucle sur le tableau et n'afficher que les postes du tableau dont les clés ont une valeur false.

    Par contre pour "arrêter" le script il faut contrôler l'existence d'un moins un poste de tableau à false.

    Pour pallier ce problème, on peut faire en sorte que control retourne à la fois un indicateur qui dira s'il y a eu globalement au moins une erreur et la liste des erreurs. J'ai choisi de renvoyer un tableau qui contient le résultat global des contrôles dans un poste et un tableau ne contenant plus que les messages d'erreurs => return ["controlok"=>$resultOK,"errorlist"=>$errList];

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    <?php
    class Validate
    {
     private $fieldArrayOfControls  = array();
     private $arrayOfData           = array();
     private $ruleNumber            = 0;
     
     public function addControl($errorMessage,$arrayOfFieldNames, $control)
     {
      $this->fieldArrayOfControls[$this->ruleNumber] = [$errorMessage,$arrayOfFieldNames,$control];
      $this->ruleNumber++;
     }
     
     public function addField($errorMessages,$arrayOfFieldNames, $controls)
     {
      foreach($errorMessages as $key => $errorMessage)
      {
       $this->addControl($errorMessage,$arrayOfFieldNames, $controls[$key]);
      }
     } 
     
     public function control($arrayOfData)
     {
      $errList  = array();
      // si au moins une erreur $resultOK = false
      $resultOK = true;
     
      foreach($this->fieldArrayOfControls as $ruleNumber => $data)
      {
       // init pour traitement champs manquants
       $arrMissing    = array();
       $missingFields = false;
       // préparation du message en sortie
       $message     = $data[0];
       // constitution des paramètres de la fonction de closure
       $arrayToMap   = array();
       $fieldNames   = $data[1];
       foreach($fieldNames as $key => $fieldName)
       {
        if (! isset($arrayOfData[$fieldName]))
        {
         // champ manquant
         $missingFields = true; 
         $arrMissing[]  = $fieldName;
        }
        else 
        {
         $fieldValue   = $arrayOfData[$fieldName];
         $arrayToMap[] = $fieldValue;
         // message en sortie
         $message      = str_replace("#$fieldName",$fieldValue,$message);     
        }
       }
       if (!$missingFields)
       {
        // Pas de champ manquant => exécution de la closure
        $function           = $data[2];
        $currentResult      = array_map($function, [$arrayToMap])[0];
        if (! $currentResult)
        {
         // on n'enregistre que les valeurs qui ne passent pas les tests
         $errList[$message] = $currentResult;
         $resultOK          = false;
        }
       }
       else
       {
        foreach($arrMissing as $missingField)
        {
         $errList["*** Missing field '$missingField'"] = false;
         $resultOK = false;
        }
       }
      }
     
      // on renvoie un tableau avec deux postes - j'ai mis controlok et errorlist comme clés
      // mais tu peux mettre ce que tu veux
      return ["controlok"=>$resultOK,"errorlist"=>$errList];
     }
    }



    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    <?php
    include("validate.class.php");
    //==============================================================================
    //-------------- closures - les fonctions renvoient true ou false
    //==============================================================================
    // controle qu'un champ est rempli
    $remplissage = function($array) {
     $valeur = $array[0];
        return (!empty($valeur)) ? true : false;
    };
    // exemple de contrôle combiné => controle les valeur des 2 champs options
    $controleOption = function($array)
    {
     list($option1,$option2) = $array;
     if ($option1==$option2)
     {
      return false;
     }
     return true;
    };
    // contrôle qu'une valeur est numérique
    $numerique = function($array)
    {
     $valeur = $array[0];
     return (is_numeric($valeur)) ? true : false;
    };
    // contrôle facultatif - on ne contrôle l'email que s'il est renseigné
    // et on utilise un autre de nos contrôles !!!
    $email_non_obligatoire = function ($array) use ($remplissage)
    {
     if ($remplissage($array))
     {
      if (filter_var($array[0], FILTER_VALIDATE_EMAIL)) 
      {
       return true;
      }
      else
      {
       return false;
      }
     }
     return true;
    };
    //==============================================================================
     
    $toto = new Validate();
    $toto->addControl('Le nom n\'est pas renseigné',["nom"], $remplissage);
    $toto->addControl('Le prénom n\'est pas renseigné',["prenom"], $remplissage);
    $toto->addField(["L'âge n'est pas renseigné","L'âge n'est pas numérique => #age"],["age"], [$remplissage, $numerique]);
    $toto->addControl("Les deux options ne peuvent avoir la même valeur => option 1 = #option1 et option 2 = #option2",["option1","option2"], $controleOption);
    $toto->addControl('Email #email invalide',["email"], $email_non_obligatoire);
    //+++++++++++++++++++++++++++++++++++++++++++++
    // problème sur les options et sur email
    $valeurAController = ['nom'=>'Dupont','prenom'=>'Pierre','age'=>25,'option1'=>'oui','option2'=>'oui','email'=>'opopp.@mmm.'];
    $result = $toto->control($valeurAController);
    if ($result["controlok"] == false)
    {
     // il y a au moins une erreur
     // on parcourt les résultats qui ont retourné faux pour afficher le message d'erreur.
     foreach($result["errorlist"] as $message => $result)
     {
       print "$message<br/>";
     } 
    }
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  8. #28
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Un exercice que tu pourrais faire serait que control ne renvoie qu’un booléen et que la liste des erreurs soit renvoyée par une méthode getErrorList() . Ce serait même plus propre.

    On verra ensuite qu'on peut faire plus propre.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  9. #29
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 261
    Points : 121
    Points
    121
    Par défaut
    Bonsoir

    Après un travail acharné et en m'inspirant de vos conseils j'ai enfin réussi à écrire ma fonction Validate ()

    Je vous la soumets pour échange

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
     private $post = []; 
     private $func = [];
     private $errors = []; 
     private $errorsMessages = [];  
     
     
     public function __construct ($post,$oform_tocheck) { 
      $this->post = $post;
      $this->form_tocheck = $oform_tocheck;
      $this->errorsMessages = [
       "isRequired" => "Le champ #name# est obligatoire", 
       "isAlphaM" => "Le champ '#name# doit être Alpha Majuscule" 
      ]; 
     }
     
    ......
     
     public function validate(){
     
      foreach ($this->form_tocheck->getFields() as $name  => $rules) { 
     
       if (!array_key_exists($name, $this->post)) {
        $value = NULL;
       } else {
        $value = $this->post[$name]; 
       }
       foreach($rules as $rule) {
     
        $result = call_user_func_array(array($this, $rule), array($value));
     
        if ($result === false) {
     
         if (!array_key_exists($name, $this->errors)) {
          $this->errors[$name] = []; 
         }  
         $this->errors[$name][] =  str_replace('#name#', Secur::screen($name), $this->errorsMessages[$rule]); 
        }
     
       }
      }
     }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Rules_SignUp extends Rules_Abstract {
     
     public function build() {
      $this->addField('nom', ['isRequired', 'isAlphaM']);
      $this->addField('prenom', ['isAlphaM']);
      $this->addField('taille', ['isRequired']);
      $this->addField('sexe', ['isRequired', 'isAlphaM']); 
     
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    require 'Autoload.php'; 
     
    $form_tocheck = new Rules_SignUp(); 
     
    $valid = new Valid ($_POST, $form_tocheck); 
    $valid->validate(); 
     
    if (!$valid->isValid()) {
     $valid->displayErrors(); 
    } else {
     echo 'SUITE DU TRAITEMENT - ENREGISTREMENT'; }
    Merci pour votre temps et si cela peut aider modestement.....


    Par ailleurs, je souhaiterai trouver mon erreur dans ma class Secur(). En effet, j'aimerai avoir quelques fonctions en static que je pourrai appeler en cas de besoin. Et appliquer une fonction de "nettoyage" à tous mes champs via $_POST.


    Secur.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    <?php
     
    class Secur {
     
     static function protectArray($POST) { // problème pour appliquer des méthodes sur la superglobale $_POST
     
     foreach ($POST as $name => $value) {
     
      $post[$name] = self::removeAccents($value);
      $post[$name] = strtoupper($value);
      $post[$name] = trim($value);
      $post[$name] = htmlentities($value);
      $post[$name] = strip_tags($value);
      $post[$name] = addcslashes($value, '%_');
      }
      return $post; // PROBLEME POUR RETOURNER TOUTES MES VALEURS = []
     } 
     
     
     static function protect($data) {
      $data = self::removeAccents($data);
      $data = trim($data);
      $data = htmlentities($data);
      $data = strip_tags($data);
      $data = addcslashes($data, '%_');
     
      return $data; // OK POUR CETTE FONCTION CAR IL Y A UN SEUL CHAMP
     }
     
     
     static function screen($string) {
      return htmlentities($string);
     }
     
     static function removeAccents($string) {
      $a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø');
      $b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O');
      return str_replace($a, $b, $string);
     }
     
    }
    1. Je sais que mes fonctions de contrôles me permettent déjà de vérifier la validité des données reçus
    2. En utilisant PDO et les requêtes préparées je me préserve des injections SQL
    3 Je dois protéger les données qui seront affichées...

    Mais pour mon apprentissage j'aimerai tout de même comprendre comment faire pour appeler plusieurs fonctions simplement ou faut-il encore passer par un array_map ou call user......
    si vous avez un exemple ....


    - la méthode removeAccents() ok
    - la méthode protect ok

    - la méthode protectArray sur un $_POST me pose problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <form action="traitement.php" method="post">
     <p>Nom : <input type="text" name="nom"></p>
     <p>Prenom : <input type="text" name="prenom"></p>
     <input type="submit" name="inscriptioné" value="inscécé">
    </form>
    traitement.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
     
    require 'Autoload.php'; 
    require 'Secur.php'; 
     
    var_dump($_POST); 
     
    $post = Secur::protectArray($_POST);
    var_dump($post); //  ne retourne que la dernière valeur ?? return $post !! faut-il array
    je pense que cela n'est pas grand chose

  10. #30
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Il y a beaucoup à lire et à dire.

    Déjà tu n'as pas suivi les conseils qui t'ont été donnés à savoir ne pas mettre les contrôles dans la classe. Mais bon tu t'apercevras vite qu'il en manque toujours un et qu'une alternative sont les closures qui te permettent de définir des contrôles personnalisés pour chaque problématique.

    Ta fonction validate ne renvoie rien et on ne voit pas le code pour isValid. Un des inconvénients de cette méthode est qu'on peut éventuellement utiliser isValid avant d'avoir appelé validate.
    Comme il a déjà été dit on ne contrôle pas qu'un champ soit en MAJUSCULES ou en minuscules. On le met au bon format un point c'est tout qu'il ait été tapé en majuscules ou pas.
    Tes noms de contrôles sont isRequired ou isAlphaM. Si j'écris isrequired plus rien ne fonctionne. Il faudrait que tu utilises des constantes et non pas des chaînes de caractères. Les noms des constantes sont écrits en MAJUSCULES. exemple IS_REQUIRED. Ensuite la valeur de la constante peut être "isRequired" même si pour ma part et dans un tel cas je préfèrerais donner des valeurs numériques.
    Tu as mis les messages d'erreurs dans la classe. Si je suis étranger et que je dois utiliser ta classe il faut que je la modifie pour l'utiliser. Or l'intérêt d'une classe est justement d'être utilisable telle qu'elle.
    Tu as nommé une variable $post. Un autre nom serait plus judicieux car tu peux utiliser une classe pour n'importe quel type d'array.
    Il y a d'autres choses à dire mais je m'arrête là pour le moment. Je te félicite pour ta ténacité et ta volonté d'avancer. C'est comme ça qu'on progresse... mais il faut aussi écouter les conseils des autres .


    Indépendamment du fait que ce soit à faire ou pas comme ça.
    Tu as..
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      $post[$name] = self::removeAccents($value);
      $post[$name] = strtoupper($value);
      $post[$name] = trim($value);
      $post[$name] = htmlentities($value);
      $post[$name] = strip_tags($value);
      $post[$name] = addcslashes($value, '%_');

    Il faudrait
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      $post[$name] = self::removeAccents($value);
      $post[$name] = strtoupper($post[$name]);
      $post[$name] = trim($post[$name]);
      $post[$name] = htmlentities($post[$name]);
      $post[$name] = strip_tags($post[$name]);
      $post[$name] = addcslashes($post[$name], '%_');

    Il faudrait aussi que tu "initialises" le tableau $post ($post = array(); ) avant le foreach. En informatique si on initialisait tous les variables qu'on utilise il y aurait des milliards de bugs en moins.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  11. #31
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 261
    Points : 121
    Points
    121
    Par défaut
    Merci

    j'ai apporté qq modifications

    un grand merci pour m'avoir accordé du temps à la résolution de mon problème.

  12. #32
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Depuis je me suis fait ma propre bibliothèque.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  13. #33
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    @badaze
    attention : les fonctions strtoupper(), strip_tags(), addcslashes ne sont pas compatibles unicode !
    Vu que la règle maintenant établie est de ne coder qu'en utf-8, cela va induire des problèmes chiants à déboguer.

    Pour ce qui est de ta bibliothèque de validation avec des closures, je serai curieux de voir comment tu l'as implémentée, j'ai un système semblable dans mon framework.

  14. #34
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    @rawsrc.

    Merci je ne savais pas.

    Pour ma bibliothèque, j'ai arrêté d'utiliser les closures et suis passé sur un modèle orienté objet car je voulais implémenter un système de messages d'erreur et je ne voulais pas forcément les passer en paramètre.

    Avec les closures j'avais ça (je n'ai pas mis les déclarations).

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?php
    // controle qu'un champ est rempli
    $remplissage = function($array) {
     $valeur = $array[0];
        return (!empty($valeur)) ? true : false;
    };// contrôle facultatif - on ne contrôle l'email que s'il est renseigné
    $email_non_obligatoire = function ($array) use ($remplissage)
    {
     if ($remplissage($array))
     {
      if (filter_var($array[0], FILTER_VALIDATE_EMAIL)) 
      {
       return true;
      }
      else
      {
       return false;
      }
     }
     return true;
    };
    // Paramètre 1 = le(s) nom(s) du/des champs à contrôler.
    // Paramètre 2 = la fonction de contrôle.
    // Paramètre 3 = le message d'erreur #email est remplacé par la valeur du champ. Exemple : Email toto@ invalide
    $toto->addErrorControl(["email"], $email_non_obligatoire,'Email #email invalide');

    Avec le modèle objet j'ai ça. Succinctement résumé.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    class Controls extends GenericControls {
     
     // la méthode setError est héritée de GenericControls
     // Paramètre 1 = le code de l'erreur
     // Paramètre 2 = le message d'erreur
     //               #FD = description du champ #VA = valeur du champ
     //               Le premier #FD sera remplacé par la 1ère description de champ, le second par la 2ème
     //               Le premier #VA sera remplacé par $option1 le second par $option2
     // Dans un message on peut aussi utiliser #FN qui est remplacé par le nom du champ à contrôler
     // et #FV qui est remplacé par une valeur fixe passée à la méthode
     public function option1_option2($option1, $option2) {
      $this->setError('ERR0001',"Champs #FD et #FD. #VA est différent de #VA");
      return $option1 == $option2;
     }
     
     public function obligatoire($valeur) {
      $this->setError('ERR0002','Le champ #FD est obligatoire');
      return empty($valeur) ? false : true;
     }
     
     // ici la méthode setError a un code d'erreur uniquement
     // le texte du message provient soit d'un fichier des messages d'erreurs passé en paramètre au constructor
     // de cette classe => $controls = new Controls('error_msg_fr.txt');
     // ou passé en paramètre sur la méthode 
     public function longueur_chaine_ok($chaine,$longueur) {
      $this->setError('ERR0003');
      return (strlen($chaine) >= $longueur) ? true : false;
     } 
    }
     
    $controls = new Controls();
    // on passe l'instance à la classe de validation
    $toto = new Validate($controls);
    // Paramètre 1 : tableau. Le premier élément contient le nom de la méthode de contrôle
    //               les éléments suivants correspondent aux valeurs fixes de la méthode (voir un peu plus loin)
    // Paramètre 2 : tableau. les noms des champs à contrôler
    // Paramètre 3 : tableau. Les descriptions des champs voir #FD
    $toto->addError(['obligatoire'],['nom'],['Nom']);
    // Paramètre 1 : tableau. on voit la valeur 6 qui est passée au paramètre $longueur de la méthode longueur_chaine_ok
    //               ceci permet d'avoir des contrôles plus 
    // Paramètre 2 : tableau. le nom du champ à contrôler
    // Paramètre 3 : le message d'erreur #FV est remplacé par 6.
    //               le message d'erreur passé en paramètre prend le pas sur celui défini dans la méthode ou le fichier de messages
    $toto->addError(['longueur_chaine_ok',6],['pseudo'],['Le pseudo n\'est pas assez long (#FV caractères min)']);
    // Ici on dit que le mot de passe doit faire au moins 8 caractères.
    $toto->addError(['longueur_chaine_ok',8],['mdp'],['Le mot de passe n\'est pas assez long (#FV caractères min)']);

    En retour des contrôles on a un nouvel objet error qui renvoie les erreurs rencontrées sous forme de tableau (pour du PHP) ou de JSON (pour du javascript).
    Grosso modo il y a 6 types d'erreurs :
    1 - les erreurs addError
    2 - les avertissements addWarning
    3 - les champs manquants (ceux déclarés via addError ou addWarning mais qui ne sont pas passés aux contrôles)
    4 - les champs en plus (ceux qui ne sont pas déclarés addError ou addWarning et qui sont passés dans le tableau des données à contrôler).
    5 - la méthode passée est inconnue
    6 - le nombre de paramètres est incorrect

    Les méthodes de retour peuvent être filtrées par types d'erreur. Par exemple ne voir que les erreurs. Voir les erreurs et les avertissements. Tout voir sauf les erreurs champs manquants ou champs en plus. etc...

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $retour = $toto->control($_POST);
     
    // renvoie s'il y a eu (au moins) une erreur parmi les 6 types possibles
    $resultat = $retour->error()->errorFound();
    // équivalent à 
    $resultat = $retour->error(VALIDATE::FIELD_ALL)->errorFound();
     
    // équivalent à erreur et avertissement. Donc si les seules erreurs étaient de type 3 à 6 mais aucune sur les types 1 et 2 cela renverra errorFound à false.
    $resultat = $retour->error(VALIDATE::FIELD_ALL & ~FIELD_SYS_ERROR)->errorFound();
     
    // Les données JSON sont accessibles - ici aussi les filtres s'appliquent
    $json = $retour->error()->getDetailsJSON();

    Le JSON est facilement utilisable.

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <script>function toto() {
        var elements = document.querySelectorAll("[id^='e_']");
     $.each(elements, function(index, element) {
      element.innerHTML ='';
     }); 
       
     $.ajax({
            url: 'test9514b.php',
            type: 'post',
            dataType: 'html',
            data: $('form#myform').serialize(),
            success: function(json) {
       alert(json);
       $.each(JSON.parse(json), function(i, obj) {
        var current = $('#e_'+obj.field).html();
        if (current == '') {
         $('#e_'+obj.field).html(obj.message);
        }
       });
            }
        }); 
    }
    </script>

    Nom : Capture20181117_001.JPG
Affichages : 108
Taille : 39,3 Ko
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  15. #35
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut badaze,

    comment fais-tu pour permettre l'ajout de validateurs à la volée en cas de nécessité ? Tu est obligé de reprendre le code source de ta classe ?
    Ton validateur ne devrait pas gérer le message d'erreur. quand tu écris ça :
    Pour ma bibliothèque, j'ai arrêté d'utiliser les closures et suis passé sur un modèle orienté objet car je voulais implémenter un système de messages d'erreur et je ne voulais pas forcément les passer en paramètre.
    je ne vois pas en quoi la souplesse des closures t'a posé des problèmes.

    Mon système de validation est assez proche (une version légèrement simplifiée):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /**
     * Validator: not empty string
     * @param  array $p
     * @return bool
     */
    $len = function(array $p): bool {
        return isset($p[0]) ? (bool)mb_strlen((string)$p[0]) : false;
    };
     
    /**
     * @param  mixed $value
     * @param  array $in
     * @return bool
     */
    $not_in_strict = function(array $p): bool {
        return (isset($p[0], $p[1]) && is_scalar($p[0]) && is_array($p[1])) ? ( ! in_array($p[0], $p[1], true)) : false;
    };
    puis le test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $value_to_check = 'xyz';
     
    Validator::check($value_to_check, ['$len', '$not_in_strict' => ['abc', 'def']])    // valeur non vide et différente de 'abc' et de 'def'

  16. #36
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    @rawsrc

    Dans mon esprit il y a une classe pour chaque "écran" à contrôler donc on peut ajouter des contrôles à la volée. On peut la voir comme un conteneur au même titre que le fichier .php est le conteneur des fonctions closures; les méthodes utilisées étant définie dans la classe parente.

    Mon but est d'avoir une gestion de messages d'erreurs intégrée mais qui n'est cependant pas obligatoire. Les méthodes qui renvoient les erreurs contiennent tous les éléments pour faire ses propres messages, à savoir : le type d'erreur, le code erreur (qui peut ne pas être renseigné), les noms des champs testés, leurs valeurs, le message d'erreur (qui lui aussi n'est pas obligatoire).

    J'aurais pu faire une classe qui constitue les messages d'erreur mais j'ai estimé qu'elle interviendrait trop tard. En effet si je contrôle le remplissage d'un champ et sa valeur (comme dans ton exemple) et que je constitue les messages d'erreurs après le contrôle, il faut que j'arrive à savoir si le message d'erreur que je dois afficher est celui qui indique que le champ n'est pas rempli ou bien que la valeur renseignée est incorrecte. Donc au mieux j'ai besoin que ma classe de contrôle renvoie un code erreur que je remplacerai par un message et au pire si je n'ai aucune information sur l'erreur je ne peux pas déterminer laquelle afficher. Donc quand je me suis aperçu qu'il me fallait au moins un code erreur pour afficher la bonne information à l'utilisateur je me suis dit que tant qu'à faire autant constituer le message au moment où on fait le contrôle. Mais bon, avec l'expérience on sait qu'on ne pense pas forcément à tout au moment où on programme et je me suis laissé une porte ouverte en renvoyant tous les éléments permettant de constituer en dehors de la classe de contrôle les messages à afficher.

    Un autre avantage que j'ai vu est la possibilité de décrire et mettre des noms aux paramètres. Ainsi :
    Bien évidemment il s'agit d'un exemple trivial.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     public function controle_option($option1, $option2) {
      return $option1 == $option2;
     }

    est plus parlant que :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     $controleOption = function($array)
     {
      return $array[0] == $array[1];
     };

    ou (si on veut rendre le code plus parlant) que :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     $controleOption = function($array)
     {
      list($option1,$option2) = $array;
      return $option1 == $option2;
     };
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  17. #37
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par badaze Voir le message
    si je contrôle le remplissage d'un champ et sa valeur (comme dans ton exemple) et que je constitue les messages d'erreurs après le contrôle, il faut que j'arrive à savoir si le message d'erreur que je dois afficher est celui qui indique que le champ n'est pas rempli ou bien que la valeur renseignée est incorrecte. Donc au mieux j'ai besoin que ma classe de contrôle renvoie un code erreur que je remplacerai par un message et au pire si je n'ai aucune information sur l'erreur je ne peux pas déterminer laquelle afficher. Donc quand je me suis aperçu qu'il me fallait au moins un code erreur pour afficher la bonne information à l'utilisateur je me suis dit que tant qu'à faire autant constituer le message au moment où on fait le contrôle. Mais bon, avec l'expérience on sait qu'on ne pense pas forcément à tout au moment où on programme et je me suis laissé une porte ouverte en renvoyant tous les éléments permettant de constituer en dehors de la classe de contrôle les messages à afficher.
    J'ai résolu ce problème avec une classe spécifique : dès qu'une valeur se présente, elle est encapsulée dans une classe qui lui fournit tous les services d'identification, de valeur saisie, de collecteur d'erreur.
    Ma valeur ne voyage à travers toute l'application qu'armée de se classe ce qui elle permet de remonter à la surface n'importe quel problème relatif à la valeur où qu'elle apparaît et ainsi au final, tu peux tout remonter au rendu à ta guise.
    Enfin, question perfs, aucun souci dans la mesure où une classe n'est manipulée que par référence alors que les scalaire et tableau sont dupliqués (certes PHP bénéficie d'un sacré mécanisme d'optimisation dans ce cas de figure)

  18. #38
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Tu peux poster un exemple ? Je suis curieux.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  19. #39
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    quelque chose dans ce genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    class MyVar
    implements IEECollectable
    {
        /**
         * Valeur saisie et récupérée par l'utilisateur
         *
         * @var mixed
         */
        private $user_value;
        /**
         * Nom littéral de la valeur utilisé dans l'interface graphique
         * utilisé pour la personnalisation automatique des messages d'erreur
         *
         * @var string
         */
        private $gui_name = null;
        /**
         * @var EECollector Exceptions and Errors Collector
         */
        private $eec;
     
        /**
         * @param mixed  $value
         * @param string $gui_name Nom littéral de la valeur utilisé dans une interface graphique
         */
        public function __construct($value = null, ?string $gui_name = null)
        {
            $this->user_value = $value;
            $this->gui_name   = $gui_name;
            $this->eec        = new EECollector();
        }
     
        /**
         * Renvoie le collecteur d'erreurs et d'exceptions
         *
         * @return EECollector
         */
        public function eec(): EECollector
        {
            return $this->eec;
        }
     
        /**
         * @return mixed
         */
        public function userValue()
        {
            return $this->user_value;
        }
     
        /**
         * Définit l'identifiant de l'interface graphique auquel est rattachée la variable
         *
         * @param  string $p
         * @return MyVar
         */
        public function setGuiName(string $p): self
        {
            $this->gui_name = $p;
     
            return $this;
        }
     
        /**
         * Renvoie l'identifiant de l'interface graphique auquel est rattachée la variable
         *
         * @return string|null
         */
        public function guiName(): ?string
        {
            return $this->gui_name;
        }
    }
    ensuite quand t'as besoin de manipuler une donnée externe sans savoir au préalable quls traitements elle va subir : $nom = new MyVar($_POST['nom'], 'nom_du_controle_sur_le_formulaire');Comme cette classe contient un collecteur d'erreurs, tu la passes partout où t'en as besoin et en cas d'erreur : $nom->eec()->addAlert(...); ou $nom->eec()->addException($e);En fin de traitement, tu gardes ta variable $nom et tu peux savoir tout ce qu'elle a collecté.
    Version simplifiée, mais la logique est là

  20. #40
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Merci.
    Je pense avoir saisi le concept mais il faut que ça mûrisse. Par contre je ne vois pas comment cela peut fonctionner dans le cas d’un contrôle qui implique plusieurs champs.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. foreach à l'envers sur un objet
    Par dedis dans le forum Langage
    Réponses: 1
    Dernier message: 02/03/2011, 22h00
  2. [JSTL] Faire un forEach sur un objet pour construire un select
    Par weed dans le forum Taglibs
    Réponses: 7
    Dernier message: 19/10/2008, 18h09
  3. pointeur multiple sur un objet
    Par Arnaud-h dans le forum C++Builder
    Réponses: 9
    Dernier message: 02/06/2004, 12h33
  4. [debutant] Contraintes d'intégrité définies sur un objet
    Par maysa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/05/2004, 15h57
  5. Requêtes : recherche de maxi sur plusieur Objet
    Par pertuis dans le forum Langage SQL
    Réponses: 6
    Dernier message: 08/03/2004, 16h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo