Bonjour tout le monde,

J'ai un petit problème qui me bloque et j'espère que vous pourrez m'aider.

J'ai une page admin d'un blog. A l'ajout d'un nouvel article, certains champs sont obligatoires, d'autres sont facultatifs.

Je passe par les setters d'une classe Article pour contrôler les données du formulaire. Puis je passe par une méthode isValid() qui renvoie false si les attributs de la classe sont vides.

Le problème qui se pose est que cette méthode est cohérente lorsque les champs sont obligatoires, mais j'aimerais aussi faire la différence de la manière la plus propre possible, lorsque qu'un attribut facultatif est vide parce que l'utilisateur n'a simplement pas voulu renseigner le champs, ou lorsqu'il est vide parce que la condition du setter est fausse, et par conséquent l'attribut est resté vide.

Si je le fais en dehors de la classe, j'arrive vite avec un code immonde plein de répétitions, et j'aimerais savoir quelle est la meilleure manière de procéder, ou la plus optimum. Voici mon code:

CLASS ARTICLE

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<?php
class Article
{
 
    protected $erreur=array(), $id, $titre, $contenu, $image, $datecreation, $datemodification;
 
 
    const TITRE_TROP_COURT=1;
    const TITRE_TROP_LONG=2;
    const CONTENU_TROP_COURT=3;
 
    public function __construct(array $donnees)
    {
        $this->hydrate($donnees);
    }
 
    public function hydrate($donnees)
    {
        foreach($donnees as $key => $value)
        {
            $method='set'.ucfirst($key);
                if (method_exists($this, $method))
            {
                $this->$method($value);
            }
        }
    }
 
    // ce sont des champs obligatoire, si les attributs sont vides, c'est que la condition n'est pas remplie au niveau du setter. J'aimerais pourvoir inclure les champs facultatif dedans mais comment faire?
    public function isValid()
    {
        return !(empty($this->titre) || empty($this->contenu));
    }
 
 
    public function id()
    {
        return $this->id;
    }
 
    public function titre()
    {
        return $this->titre;
    }
 
    public function contenu()
    {
        return $this->contenu;
    }
    public function image()
    {
        return $this->image;
    }
 
    public function datecreation()
    {
        return $this->datecreation;
    }
 
    public function datemodification()
    {
        return $this->datemodification;
    }
    public function erreur()
    {
        return $this->erreur;
    }
 
    public function setId($id)
    {
        $this->id=$id;
    }
 
    public function setTitre($titre)
    {
        if(strlen($titre)<4){
            $this->erreur[] = self::TITRE_TROP_COURT;
        }elseif(strlen($titre)>20)
        {
            $this->erreur[] = self::TITRE_TROP_LONG;
        }else{
            $this->titre=$titre;
        }
    }
 
    public function setContenu($contenu)
    {
        if(strlen($contenu)<10){
            $this->erreur[] = self::CONTENU_TROP_COURT;
        }else{
            $this->contenu=$contenu;
        }
    }
 
    public function setImage($image)
    {
        // condition que je n'ai pas encore faite
        $this->image=$image;
    }
 
    public function setDatecreation($datecreation)
    {
        $this->datecreation=$datecreation;
    }
    public function setDatemodification($datemodification)
    {
        $this->datemodification=$datemodification;
    }
 
}
LE MANAGER DE LA CLASSE ARTICLE, la méthode d'ajout n'y apparaît pas encore

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
<?php
class ArticleManager
{
    protected $db;
 
    public function __construct($db)
    {
        $this->db=$db;
    }
 
    public function getList()
    {
        $articles=array();
 
        $requete=$this->db->query('
        SELECT ART_id id, ART_titre titre, ART_photo image, ART_contenu contenu, DATE_FORMAT(ART_datecreation, "%d/%m/%Y") datecreation , ART_datemodification datemodification
        FROM T_ART');
 
        while($donnees=$requete->fetch())
        {
            $articles[]= new Article($donnees);
        }
        return $articles;
    }
 
    public function delete($id)
    {
        $id= (int) $id;
        $requete=$this->db->prepare('
        DELETE FROM T_ART
        WHERE ART_id = :id');
 
        $requete->bindParam(':id', $id, PDO::PARAM_INT);
        $requete->execute;
    }
    public function exist($id)
    {
        $requete=$this->db->prepare('
        SELECT COUNT(*)
        FROM T_ART
        WHERE ART_id = :id');
        $requete->execute(array('id'=>$id));
 
        return $requete->fetchcolumn();
    }
 
}
UN PETIT BOUT DE SCRIPT


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
// si le bouton submit est cliqué
if(isset($_POST['ok']))
{
    //si les champs obligatoires sont bien remplis
    if(!empty($_POST['titre']) AND !empty($_POST['contenu'])){
        $titre=$_POST['titre'];
        $contenu=$_POST['contenu'];
 
        // création d'un nouvel objet
        $article_modif = new Article(array('titre'=>$titre, 'image'=>$image, 'contenu'=>$contenu));
 
        // vérification des données
        if($article_modif->isValid())
        {
            //méthode ADD nouvel article
        }
    }
    else
    {
        //veuillez remplir champs
    }
}
Si je veux vérifier un champs facultatif SOUS-TITRE par exemple, et faire la différence dans la classe entre si il n'est pas valable, ou si il n'est simplement pas renseigné volontairement, sans faire de répétition de la méthode ADD pour chaque champs facultatif.

Y a t-il une méthode? Merci d'avance