source: trunk/web/app/data/modules/contenus/dc_utils.php @ 10

Last change on this file since 10 was 6, checked in by dj3c1t, 13 years ago

mise a jour du trunk

File size: 16.2 KB
RevLine 
[6]1<?php
2
3  class dc_utils extends data
4  {
5
6    # ----------------------------------------------------------------------------------------
7    #                                                                               categories
8    #
9
10    # $path un tableau qui contient une suite de categories, qui peut commencer ou non a la
11    # racine des categories et finir ou non par une categorie feuille.
12    # dans le tableau, chaque categorie est indiquee soit par son nom (champ "nom" dans la
13    # table "categories") soit par son identifiant (champ id). par convention, la fonction
14    # fait la distinction entre un nom et un id en fonction du type de variable. si la
15    # variable est un entier (verifie avec la fonction php is_int), la fonction considere
16    # que c'est un id, sinon, que c'est un nom.
17    #
18    # retourne l'identifiant de la derniere categorie du tableau $path
19
20    function id_categorie($path)
21    { try
22      { $ids = null;
23        $id = null;
24        $path_ok = true;
25        foreach($path as $nom)
26        { if(is_int($nom)) $id = $nom;
27          else
28          { $query =
29             "SELECT id"
30            ." FROM #--categories".(isset($id) ? ", #--categories_tree" : "")
31            ." WHERE #--categories.nom=".$this->eq($nom)
32            .( isset($id) ?
33                " AND #--categories_tree.parent=".$this->eq($id)
34               ." AND #--categories_tree.child=#--categories.id"
35               :""
36             );
37             $rst = $this->sql->query($query);
38             if($v_rst = $this->sql->fetch_assoc($rst)) $id = (int)$v_rst["id"];
39             else $path_ok = false;
40             $this->sql->free_result($rst);
41             if(!$path_ok) return null;
42          }
43        }
44        return $id;
45      }
46      catch(Exception $_e) { return false; }
47    }
48
49    # retourne les sous-categories de la categorie dont l'id est passe en parametre
50    # depth indique la profondeur. si depth vaut 1, seules les sous-categories directes
51    # seront retournées. si depth vaut 0, la fonction retournera toute la sous-arborescence
52    #
53    # le parametre list precise le format de retour. si $list vaut true, la fonction
54    # retournera une chaine de caractÚres comprenant les id des sous-categories, separes
55    # par des virgules (pour sql). si $list vaut false, la fonction retournera un array.
56    #
57    # la fonction peut prendre un chemin (path, voir plus haut, fonction id_categorie)
58    # a la place de l'id.
59
60    function sub_categories($id, $depth = 0, $list = false)
61    { if($list) $subs = "";
62      else
63      { $subs = array();
64        $subs["subs"] = array();
65      }
66      if(!is_int($id)) $id = $this->id_categorie($id);
67      if($id !== false)
68      { if($list || ($subs = $this->categorie($id)) !== false)
69        { if(!$list) $subs["subs"] = array();
70          try
71          { $query =
72             "SELECT child"
73            ." FROM #--categories_tree, #--categories"
74            ." WHERE #--categories_tree.child=#--categories.id"
75            ." AND #--categories_tree.parent=".$this->eq($id)
76            ." ORDER BY #--categories.ordre ASC";
77            $rst = $this->sql->query($query);
78            while($v_rst = $this->sql->fetch_assoc($rst))
79            { $_subs = null;
80              if(!isset($depth) || $depth > 0) $_subs = $this->sub_categories((int)$v_rst["child"], isset($depth) ? ($depth - 1) : null, $list);
81              if(isset($_subs) && $_subs === false) return false;
82              if($list)
83              { $subs .=
84                 ($subs ? "," : "")
85                .$v_rst["child"]
86                .(isset($_subs) ? $_subs : "");
87              }
88              else $subs["subs"][$v_rst["child"]] = $_subs;
89            }
90          }
91          catch(Exception $_e) { $subs = false; }
92        }
93      }
94      else $subs = false;
95      return $subs;
96    }
97
98    function categories($path, $start = 0, $max = null, $WHERE = "", $all = false)
99    { $categories = array();
100      try
101      { if(($parent = $this->id_categorie($path)) !== false)
102        { $categories["list"] = array();
103          $categories["total"] = 0;
104          $query =
105           "SELECT count(*) as n"
106          ." FROM #--categories, #--categories_tree"
107          ." WHERE #--categories.id=#--categories_tree.child"
108          ." AND #--categories_tree.parent=".$this->eq($parent)
109          .$WHERE;
110          $rst = $this->sql->query($query);
111          if($v_rst = $this->sql->fetch_assoc($rst)) $categories["total"] = $v_rst["n"];
112          $this->sql->free_result($rst);
113          if($categories["total"] > 0)
114          { $query =
115             "SELECT #--categories.*"
116            ." FROM #--categories, #--categories_tree"
117            ." WHERE #--categories.id=#--categories_tree.child"
118            ." AND #--categories_tree.parent=".$this->eq($parent)
119            .$WHERE
120            ." ORDER BY ordre ASC"
121            .( $all ?
122                 ""
123               : ( isset($max) ?
124                     " LIMIT ".$start.",".$max
125                   : ($this->env->config("max_list") ? " LIMIT ".$start.",".$this->env->config("max_list") : "")
126                 )
127             );
128            $rst = $this->sql->query($query);
129            while($v_rst = $this->sql->fetch_assoc($rst)) $categories["list"][$v_rst["id"]] = $v_rst;
130            $this->sql->free_result($rst);
131          }
132        }
133        else $categories = false;
134      }
135      catch(Exception $_e) { $categories = false; }
136      return $categories;
137    }
138
139    function categorie($id)
140    { $categorie = array();
141      try
142      { $query =
143         "SELECT *"
144        ." FROM #--categories"
145        ." WHERE #--categories.id=".$this->eq($id);
146        $rst = $this->sql->query($query);
147        if($v_rst = $this->sql->fetch_assoc($rst)) $categorie = $v_rst;
148        $this->sql->free_result($rst);
149      }
150      catch(Exception $_e) { $categorie = false; }
151      return $categorie;
152    }
153
154    function add_categorie($nom = null, $titre = null, $icone = null, $description = null, $contenu = null, $parent = null)
155    { try
156      { $query =
157         "INSERT #--categories(nom, titre, icone, description, contenu) VALUES"
158        ."( ".$this->eq($nom)
159        .", ".$this->eq($titre)
160        .", ".$this->eq($icone)
161        .", ".$this->eq($description)
162        .", ".$this->eq($contenu)
163        .")";
164        $this->sql->query($query);
165        $id = $this->sql->insert_id();
166        if(isset($parent) && $this->set_in_categorie($parent, $id)) return $id;
167      }
168      catch(Exception $_e) {}
169      return false;
170    }
171
172    function set_categorie($id, $nom = null, $titre = null, $icone = null, $description = null, $contenu = null, $ordre = null)
173    { try
174      { $query =
175         "UPDATE #--categories SET"
176        ."  nom=".$this->eq($nom)
177        .", titre=".$this->eq($titre)
178        .", icone=".$this->eq($icone)
179        .", description=".$this->eq($description)
180        .", contenu=".$this->eq($contenu)
181        .(isset($ordre) ? ", ordre=".$this->eq($ordre) : "")
182        ." WHERE ".$this->env->bdd["prefix"]."categories.id=".$this->eq($id);
183        $this->sql->query($query);
184        return true;
185      }
186      catch(Exception $_e) {}
187      return false;
188    }
189
190    function del_categorie($id, $recursif = false)
191    { if(($categorie = $this->categorie($id)) !== false)
192      { if($recursif) return $this->r_del_categorie($categorie);
193        return $this->_del_categorie($categorie);
194      }
195      return false;
196    }
197
198    function _del_categorie($categorie)
199    { try
200      { $sql =
201         "DELETE FROM #--categories"
202        ." WHERE #--categories.id=".$this->eq($categorie["id"]);
203        $this->sql->query($sql);
204        $sql =
205         "DELETE FROM #--categories_tree"
206        ." WHERE #--categories_tree.child=".$this->eq($categorie["id"]);
207        $this->sql->query($sql);
208        $this->del_categorie_icone($categorie["icone"]);
209        return true;
210      }
211      catch(Exception $_e) {}
212      return false;
213    }
214
215    function r_del_categorie($categorie)
216    { $OK = true;
217      try
218      { $sql =
219         "SELECT #--categories.*"
220        ." FROM #--categories"
221        .", #--categories_tree"
222        ." WHERE #--categories.id=#--categories_tree.child"
223        ." AND #--categories_tree.parent=".$this->eq($categorie["id"]);
224        $rst = $this->sql->query($sql);
225        while($OK && $v_rst = $this->sql->fetch_assoc($rst)) $OK = $this->r_del_categorie($v_rst);
226        $this->sql->free_result($rst);
227        if($OK)
228        { $sql =
229           "SELECT id"
230          ." FROM #--contenus"
231          ." WHERE #--contenus.categorie=".$this->eq($categorie["id"]);
232          $rst = $this->sql->query($sql);
233          while($OK && $v_rst = $this->sql->fetch_assoc($rst)) $OK = $this->del_contenu($v_rst["id"]);
234          $this->sql->free_result($rst);
235          if($OK) $OK = $this->_del_categorie($categorie);
236        }
237      }
238      catch(Exception $_e) { $OK = false;  }
239      return $OK;
240    }
241
242    function del_categorie_icone($icone)
243    { try
244      { $delete_icone = false;
245        if($icone && file_exists($icone))
246        { try
247          { $query =
248             "SELECT count(*) as n"
249            ." FROM #--categories"
250            ." WHERE icone=".$this->eq($icone);
251            $rst = $this->sql->query($query);
252            if($v_rst = $this->sql->fetch_assoc($rst)) $delete_icone = $v_rst["n"] == 1;
253            $this->sql->free_result($rst);
254          }
255          catch(Exception $_e) { return false; }
256        }
257        if($delete_icone) @unlink($icone);
258        return true;
259      }
260      catch(Exception $_e) {}
261      return false;
262    }
263
264    function in_categorie($parent, $child)
265    { $n = false;
266      try
267      { $query =
268         "SELECT count(*) as n FROM #--categories_tree"
269        ." WHERE parent=".$parent
270        ." AND child=".$child;
271        $rst = $this->sql->query($query);
272        if($v_rst = $this->sql->fetch_assoc($rst)) $n = $v_rst["n"]; 
273        $this->sql->free_result($rst);
274      }
275      catch(Exception $_e) {}
276      return $n;
277    }
278
279    function set_in_categorie($parent, $child)
280    { try
281      { if(($n = $this->in_categorie($parent, $child)) !== false)
282        { if($n == 0)
283          { $query =
284             "INSERT INTO #--categories_tree VALUES"
285            ."( ".$parent
286            .", ".$child
287            .")";
288            $this->sql->query($query);
289          }
290          return true;
291        }
292      }
293      catch(Exception $_e) {}
294      return false;
295    }
296
297    function remove_from_categorie($parent, $child)
298    { try
299      { $query =
300         "DELETE FROM #--categories_tree"
301        ." WHERE parent=".$parent
302        ." AND child=".$child;
303        $this->sql->query($query);
304        return true;
305      }
306      catch(Exception $_e) {}
307      return false;
308    }
309
310    # ----------------------------------------------------------------------------------------
311    #                                                                                 contenus
312    #
313
314    function contenus($path, $start = 0, $max = null, $WHERE = "", $depth = null, $ALL = false, $ORDRE = false)
315    { $contenus = false;
316      if(($id_categorie = $this->id_categorie($path)) !== false)
317      { if(isset($id_categorie))
318        { if(!isset($depth) || $depth > 0)
319          { if(($subs = $this->sub_categories($id_categorie, $depth, true)) !== false)
320            { $id_categorie .= $subs ? ",".$subs : "";
321            }
322            else $id_categorie = false;
323          }
324          if($id_categorie !== false)
325          { try
326            { $all = $id_categorie == $id_news_root;
327              $contenus = array("list" => array(), "total" => 0);
328              $query =
329               "SELECT count(*) as n"
330              ." FROM #--contenus"
331              ." WHERE #--contenus.categorie IN (".$id_categorie.")"
332              .$WHERE;
333              $rst = $this->sql->query($query);
334              if($v_rst = $this->sql->fetch_assoc($rst)) $contenus["total"] = $v_rst["n"];
335              $this->sql->free_result($rst);
336              if($contenus["total"] > 0)
337              { $query =
338                 "SELECT #--contenus.*"
339                .", #--pun_users.username as auteur"
340                .", #--categories.nom as categorie_nom"
341                .", #--categories.titre as categorie_titre"
342                .", #--categories.icone as categorie_icone"
343                ." FROM #--pun_users, #--contenus"
344                ." LEFT JOIN #--categories"
345                ." ON #--categories.id=#--contenus.categorie"
346                ." WHERE #--contenus.auteur_creation=#--pun_users.id"
347                ." AND #--contenus.categorie IN (".$id_categorie.")"
348                .$WHERE
349                .($ORDRE ? " ORDER BY #--contenus.ordre ASC" : " ORDER BY date_publication DESC")
350                .( $ALL ?
351                     ""
352                   : ( isset($max) ?
353                         " LIMIT ".$start.",".$max
354                       : ($this->env->config("max_list") ? " LIMIT ".$start.",".$this->env->config("max_list") : "")
355                     )
356                 );
357                $rst = $this->sql->query($query);
358                while($v_rst = $this->sql->fetch_assoc($rst)) $contenus["list"][$v_rst["id"]] = $v_rst;
359                $this->sql->free_result($rst);
360              }
361            }
362            catch(Exception $_e) { $contenus = false; }
363          }
364        }
365        else $contenus = array("list" => array(), "total" => 0);
366      }
367      return $contenus;
368    }
369
370    function contenu($id)
371    { $contenu = array();
372      try
373      { $query =
374         "SELECT #--contenus.*"
375        .", #--pun_users.username as auteur"
376        .", #--categories.id as categorie_id"
377        .", #--categories.titre as categorie_titre"
378        .", #--categories.icone as categorie_icone"
379        ." FROM #--pun_users, #--contenus"
380        ." LEFT JOIN #--categories"
381        ." ON #--categories.id=#--contenus.categorie"
382        ." WHERE #--contenus.auteur_creation=#--pun_users.id"
383        ." AND #--contenus.id=".$this->eq($id);
384        $rst = $this->sql->query($query);
385        if($v_rst = $this->sql->fetch_assoc($rst)) $contenu = $v_rst;
386        $this->sql->free_result($rst);
387      }
388      catch(Exception $_e) { $contenu = false; }
389      return $contenu;
390    }
391
392    function add_contenu($nom, $categorie, $titre, $description, $contenu, $auteur, $date_publication, $public)
393    { try
394      { $query =
395         "INSERT INTO #--contenus(nom, categorie, titre, description, contenu, auteur_creation, date_creation, date_publication, public) VALUES"
396        ."( ".$this->eq($nom)
397        .", ".$this->eq($categorie)
398        .", ".$this->eq($titre)
399        .", ".$this->eq($description)
400        .", ".$this->eq($contenu)
401        .", '".$auteur."'"
402        .", NOW()"
403        .", ".(strlen($date_publication) > 0 ? "'".$date_publication."'" : "NOW()")
404        .", '".$public."'"
405        .")";
406        $rst = $this->sql->query($query);
407        return true;
408      }
409      catch(Exception $_e) { return false; }
410      return true;
411    }
412
413    function set_contenu($id, $nom, $categorie, $titre, $description, $contenu, $auteur, $date_publication, $public)
414    { try
415      { $query =
416         "UPDATE #--contenus SET"
417        ."  nom=".$this->eq($nom)
418        .", categorie=".$this->eq($categorie)
419        .", titre=".$this->eq($titre)
420        .", description=".$this->eq($description)
421        .", contenu=".$this->eq($contenu)
422        .", auteur_modification='".$auteur."'"
423        .", date_modification=NOW()"
424        .", date_publication=".($date_publication ? "'".$date_publication."'" : "NOW()")
425        .", public='".$public."'"
426        ." WHERE id=".$id;
427        $rst = $this->sql->query($query);
428      }
429      catch(Exception $_e) { return false; }
430      return true;
431    }
432
433    function set_contenu_ordre($id, $ordre)
434    { try
435      { $query = "UPDATE #--contenus SET ordre=".(strlen($ordre) > 0 ? $ordre : "NULL")." WHERE id=".$id;
436        $this->sql->query($query);
437      }
438      catch(Exception $_e) { return false; }
439      return true;
440    }
441
442    # deplace tous les contenus (sans recursion) de la categorie $from
443    # dans la categorie $to
444
445    function move_contenus($from, $to = null)
446    { try
447      { $sql =
448         "UPDATE #--contenus SET"
449        ." categorie=".$this->eq($to)
450        ." WHERE categorie=".$from;
451        $this->sql->query($sql);
452      }
453      catch(Exception $_e) { return false; }
454      return true;
455    }
456
457    function del_contenu($id)
458    { try
459      { $query = "DELETE FROM #--contenus WHERE id=".$id;
460        $rst = $this->sql->query($query);
461      }
462      catch(Exception $_e) { return false; }
463      return true;
464    }
465
466  }
467
468?>
Note: See TracBrowser for help on using the repository browser.