Champ facultatif class Objet
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:
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:
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:
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