Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
Complex classes like GestionContenus often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use GestionContenus, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
9 | class GestionContenus extends Contenus { |
||
10 | use ParentTexte; |
||
11 | |||
12 | private $erreur; |
||
13 | |||
14 | |||
15 | //-------------------------- GETTER ----------------------------------------------------------------------------// |
||
16 | public function getErreur() { |
||
17 | return $this->erreur; |
||
18 | } |
||
19 | |||
20 | public function getBlocEditable($id_page_courante) { |
||
|
|||
21 | $dbc = App::getDb(); |
||
22 | $bloc_editable = 0; |
||
23 | |||
24 | $query = $dbc->select("bloc_editable")->from("page")->where("ID_page", "=", $id_page_courante)->get(); |
||
25 | |||
26 | if ((is_array($query)) && (count($query) > 0)) { |
||
27 | foreach ($query as $obj) { |
||
28 | $bloc_editable = $obj->bloc_editable; |
||
29 | } |
||
30 | } |
||
31 | |||
32 | return $bloc_editable; |
||
33 | } |
||
34 | |||
35 | private function getOrdrePage($parent) { |
||
36 | if (($parent != "") || ($parent != 0)) { |
||
37 | $dbc = \core\App::getDb(); |
||
38 | $ordre = 1; |
||
39 | |||
40 | $query = $dbc->select("ordre")->from("page")->orderBy("ordre", "DESC")->limit(0, 1)->get(); |
||
41 | if ((is_array($query)) && (count($query) > 0)) { |
||
42 | foreach ($query as $obj) { |
||
43 | $ordre = $obj->ordre; |
||
44 | } |
||
45 | } |
||
46 | |||
47 | return $ordre; |
||
48 | } |
||
49 | } |
||
50 | |||
51 | private function getParentId($parent) { |
||
52 | $dbc = \core\App::getDb(); |
||
53 | |||
54 | if ($parent == "") return 0; |
||
55 | |||
56 | $query = $dbc->select("ID_page")->from("page")->where("titre", " LIKE ", '"%'.$parent.'%"', "", true)->get(); |
||
57 | |||
58 | if ((is_array($query)) && (count($query) == 1)) { |
||
59 | foreach ($query as $obj) { |
||
60 | return $obj->ID_page; |
||
61 | } |
||
62 | } |
||
63 | |||
64 | return 0; |
||
65 | } |
||
66 | |||
67 | /** |
||
68 | * @param $nom_table |
||
69 | * @param $nom_id_table |
||
70 | * @param $champ |
||
71 | * @param $value |
||
72 | * @param $limit_char |
||
73 | * @param $err_char |
||
74 | * @param $err_egalite |
||
75 | * @param null $value_id_table |
||
76 | * @return string |
||
77 | * fonction qui permet de vérifier qu'il n'y ait pas d'erreur dans le champ spécifié ni de doublons |
||
78 | */ |
||
79 | private function getVerifChamp($nom_table, $nom_id_table, $champ, $value, $limit_char, $err_char, $err_egalite, $value_id_table = null) { |
||
80 | $dbc = App::getDb(); |
||
81 | |||
82 | if (strlen(utf8_decode($value)) > $limit_char) { |
||
83 | $this->erreur = true; |
||
84 | return "<li>$err_char</li>"; |
||
85 | } |
||
86 | else if ($dbc->rechercherEgalite($nom_table, $champ, $value, $nom_id_table, $value_id_table) == true) { |
||
87 | $this->erreur = true; |
||
88 | return "<li>$err_egalite</li>"; |
||
89 | } |
||
90 | } |
||
91 | //-------------------------- FIN GETTER ----------------------------------------------------------------------------// |
||
92 | |||
93 | |||
94 | |||
95 | //-------------------------- SETTER ----------------------------------------------------------------------------// |
||
96 | /** |
||
97 | * @param string $url |
||
98 | * @param string $err_balise_title |
||
99 | * @param string $err_url |
||
100 | * @param string $err_meta_description |
||
101 | * @param string $err_titre_page |
||
102 | */ |
||
103 | private function setErreurContenus($balise_title, $url, $meta_description, $titre_page, $parent, $err_balise_title, $err_url, $err_meta_description, $err_titre_page) { |
||
104 | $_SESSION['balise_title'] = $balise_title; |
||
105 | $_SESSION['url'] = $url; |
||
106 | $_SESSION['meta_description'] = $meta_description; |
||
107 | $_SESSION['titre_page'] = $titre_page; |
||
108 | $_SESSION['parent'] = $parent; |
||
109 | $_SESSION['err_modification_contenu'] = true; |
||
110 | |||
111 | $message = "<ul>".$err_balise_title.$err_url.$err_meta_description.$err_titre_page."</ul>"; |
||
112 | FlashMessage::setFlash($message); |
||
113 | } |
||
114 | |||
115 | /** |
||
116 | * fonction qui permet de créer un page |
||
117 | * @param $balise_title |
||
118 | * @param $url |
||
119 | * @param $meta_description |
||
120 | * @param $titre_page |
||
121 | * @param $parent |
||
122 | */ |
||
123 | public function setCreerPage($balise_title, $url, $meta_description, $titre_page, $parent, $affiche = 1) { |
||
124 | $dbc = \core\App::getDb(); |
||
125 | |||
126 | $url = ChaineCaractere::setUrl($url); |
||
127 | |||
128 | $nom_page = explode("/", $url); |
||
129 | $nom_page = end($nom_page); |
||
130 | |||
131 | $page_type = ROOT."config/page_type/page_type.html"; |
||
132 | $new_page = ROOT."app/views/".$nom_page.".html"; |
||
133 | |||
134 | $err_balise_title_char = "Le titre pour le navigateur ne doit pas dépasser 70 caractères"; |
||
135 | $err_balise_title_egalite = "Ce titre est déjà présent en base de données, merci d'en choisir un autre pour optimiser le référencement de votre site"; |
||
136 | $err_balise_title = $this->getVerifChamp("page", "ID_page", "balise_title", $balise_title, 70, $err_balise_title_char, $err_balise_title_egalite); |
||
137 | |||
138 | $err_url_char = "L'url ne doit pas dépasser 92 caractères"; |
||
139 | $err_url_egalite = "Cette url est déjà présent en base de données, merci d'en choisir une autre pour ne pas avoir de conflit entre vos pages"; |
||
140 | $err_url = $this->getVerifChamp("page", "ID_page", "url", $url, 92, $err_url_char, $err_url_egalite); |
||
141 | |||
142 | $err_meta_description_char = "La description de cette page ne doit pas dépasser 158 caractères"; |
||
143 | $err_meta_description_egalite = "Cette description est déjà présent en base de données, merci d'en choisir une autre pour optimiser le référencement de votre site"; |
||
144 | $err_meta_description = $this->getVerifChamp("page", "ID_page", "meta_description", $meta_description, 158, $err_meta_description_char, $err_meta_description_egalite); |
||
145 | |||
146 | $err_titre_page_char = "Le titre de cette page ne doit pas dépasser 50 caractères"; |
||
147 | $err_titre_page_egalite = "Cette titre de page est déjà présent en base de données, merci d'en choisir un autre pour ne pas avoir de conflit dans votre navigation"; |
||
148 | $err_titre_page = $this->getVerifChamp("page", "ID_page", "titre", $titre_page, 50, $err_titre_page_char, $err_titre_page_egalite); |
||
149 | |||
150 | if ($this->erreur !== true) { |
||
151 | //si le fichier n'existe pas et que la copy est ok on insert en bdd |
||
152 | if ((!file_exists($new_page)) && (copy($page_type, $new_page))) { |
||
153 | $parent = intval($this->getParentId($parent)); |
||
154 | $ordre = intval($this->getOrdrePage($parent)); |
||
155 | $dbc->insert("titre", $titre_page) |
||
156 | ->insert("url", $url) |
||
157 | ->insert("meta_description", $meta_description) |
||
158 | ->insert("balise_title", $balise_title) |
||
159 | ->insert("ordre", $ordre) |
||
160 | ->insert("parent", $parent) |
||
161 | ->insert("affiche", $affiche) |
||
162 | ->into("page") |
||
163 | ->set(); |
||
164 | |||
165 | $this->id_page = $dbc->lastInsertId(); |
||
166 | $this->url = $url; |
||
167 | if ($parent == "") { |
||
168 | $this->setAjoutLienNavigation("ID_page", $this->id_page, 1); |
||
169 | } |
||
170 | } |
||
171 | else { |
||
172 | FlashMessage::setFlash("Impossible de créer cette page, veuillez réeseyer dans un moment. Si le problème persiste contactez votre administrateur."); |
||
173 | $this->erreur = true; |
||
174 | } |
||
175 | } |
||
176 | View Code Duplication | else { |
|
1 ignored issue
–
show
|
|||
177 | $this->setErreurContenus($balise_title, $url, $meta_description, $titre_page, $parent, $err_balise_title, $err_url, $err_meta_description, $err_titre_page); |
||
178 | $this->erreur = true; |
||
179 | } |
||
180 | } |
||
181 | |||
182 | /** |
||
183 | * function that will create a redirection on an other site |
||
184 | * @param $balise_title |
||
185 | * @param $url |
||
186 | * @param $titre_page |
||
187 | * @param $parent |
||
188 | */ |
||
189 | public function setCreerPageRedirect($balise_title, $url, $titre_page, $parent, $affiche = 1) { |
||
228 | |||
229 | /** |
||
230 | * fonction qui permet de modifier une page en fonction de son id |
||
231 | * @param $id_page |
||
232 | * @param $balise_title |
||
233 | * @param $url |
||
234 | * @param $meta_description |
||
235 | * @param $titre_page |
||
236 | * @param $parent |
||
237 | * @param $contenu |
||
238 | */ |
||
239 | public function setModifierPage($id_page, $balise_title, $url, $meta_description, $titre_page, $parent, $affiche = 1) { |
||
297 | |||
298 | /** |
||
299 | * @param $id_page |
||
300 | * @param $contenu |
||
301 | */ |
||
302 | public function setModifierContenu($id_page, $contenu) { |
||
307 | |||
308 | /** |
||
309 | * fonction qui permet de supprimer une page, test si fichier exist, si oui on delete |
||
310 | * @param $id_page |
||
311 | */ |
||
312 | public function setSupprimerPage() { |
||
313 | $url = explode("/", $this->url); |
||
314 | $filename = ROOT."app/views/".end($url).".html"; |
||
331 | |||
332 | /** |
||
333 | * @param string $id |
||
334 | * @param $value_id |
||
335 | * @param integer $affiche |
||
336 | */ |
||
337 | private function setAjoutLienNavigation($id, $value_id, $affiche) { |
||
342 | |||
343 | /** |
||
344 | * @param string $id |
||
345 | * @param integer $affiche |
||
346 | */ |
||
347 | private function setModifierLienNavigation($id, $id_page, $parent, $affiche) { |
||
355 | |||
356 | /** |
||
357 | * delete link in nav and delete page in table |
||
358 | */ |
||
359 | private function setSupprimerLienNavigation() { |
||
366 | //-------------------------- FIN SETTER ----------------------------------------------------------------------------// |
||
367 | } |
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.