PageRenderTime 50ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/app/models/content.php

https://github.com/dabio/php_cms
PHP | 415 lines | 238 code | 77 blank | 100 comment | 30 complexity | 7aacfbba9c7423cab84e7e79d992ecd6 MD5 | raw file
  1. <?php
  2. class Content extends Model
  3. {
  4. public function __construct(&$db)
  5. {
  6. $this->tablename = 'cms_page';
  7. // Muss aufgerufen werden, sonst wird der Kontruktor der Elternklasse
  8. // nicht ausgeführt.
  9. parent::__construct($db);
  10. }
  11. /**
  12. * add - Fügt dem Tree eine neue Seite hinzu.
  13. *
  14. * @param child - Das Array der einzufügenden Seite.
  15. * @param parend_id - Der ID des Elternelements.
  16. * @return bool
  17. * @author Danilo Braband
  18. **/
  19. public function add ($_)
  20. {
  21. if (!is_array($_))
  22. {
  23. return false;
  24. }
  25. // links des Elternelements finden:
  26. if (!$p = $this->find_lft_rgt($_['parent']))
  27. {
  28. return false;
  29. }
  30. // SQL-Statement zum Update des Baumes:
  31. $sql = 'UPDATE '.$this->tablename.' SET rgt = rgt + 2'.
  32. ' WHERE rgt > '.$p[0]['lft'];
  33. if (!$r = $this->db->query($sql))
  34. {
  35. return false;
  36. }
  37. $sql = 'UPDATE '.$this->tablename.' SET lft = lft + 2'.
  38. ' WHERE lft > '.$p[0]['lft'];
  39. if (!$r = $this->db->query($sql))
  40. {
  41. return false;
  42. }
  43. $_['lft'] = $p[0]['lft'] + 1;
  44. $_['rgt'] = $p[0]['lft'] + 2;
  45. $result = $this->insert_row($_);
  46. if (!$result)
  47. {
  48. return false;
  49. }
  50. return true;
  51. }
  52. /**
  53. * clean - Übernimmt ein Array und entfernt überflüssige Elemente und gibt
  54. * ein valides Feld zurück. Zusätzlich werden Zeichen gefiltert.
  55. *
  56. * @param array
  57. * @return void
  58. * @author Danilo Braband
  59. **/
  60. public function clean ($_ = false)
  61. {
  62. if (!is_array($_))
  63. {
  64. return false;
  65. }
  66. $fields = array('id', 'parent', 'lft', 'rgt', 'url', 'title',
  67. 'content', 'f_markup');
  68. $illegal = array('&', '<');
  69. $legal = array('&amp;', '&lt;');
  70. $my_array = array();
  71. foreach ($_ AS $i => $v)
  72. {
  73. if (in_array($i, $fields, true))
  74. {
  75. if (isset($v) and $v != '')
  76. {
  77. $my_array[$i] = str_replace($illegal, $legal, $v);
  78. }
  79. }
  80. }
  81. return $my_array;
  82. }
  83. /**
  84. * del - Löscht eine Seite in der Datenbank und passt alle restlichen
  85. * Seiten dem Baum an.
  86. *
  87. * @return bool
  88. * @author Danilo Braband
  89. **/
  90. public function del ($_ = false)
  91. {
  92. if (!is_array($_))
  93. {
  94. return false;
  95. }
  96. // Woher soll ich wissen, was ich löschen soll, wenn ich keine ID
  97. // kenne?
  98. if (!isset($_['id']))
  99. {
  100. return false;
  101. }
  102. // links und rechts des Elements finden:
  103. if (!$element = $this->find_lft_rgt($_['id']))
  104. {
  105. return false;
  106. }
  107. // Prüfung, ob es sich um das Root-Element handelt.
  108. $left = (int) $element[0]['lft'];
  109. if ($left == 1)
  110. {
  111. return false;
  112. }
  113. // Alle Unterelemente löschen, rekursiver Aufbau!
  114. $leafs = $this->find_all(array(
  115. 'select' => 'id',
  116. 'where' => 'parent = '.$_['id']
  117. ));
  118. // Rekursive Löschung der Elemente:
  119. foreach ($leafs AS $v)
  120. {
  121. $this->del($v);
  122. }
  123. // SQL-Statement zum Update des Baumes:
  124. $sql = 'UPDATE '.$this->tablename.' SET rgt = rgt - 2'.
  125. ' WHERE rgt > '.$element[0]['lft'];
  126. if (!$this->db->query($sql))
  127. {
  128. return false;
  129. }
  130. $sql = 'UPDATE '.$this->tablename.' SET lft = lft - 2'.
  131. ' WHERE lft > '.$element[0]['lft'];
  132. if (!$this->db->query($sql))
  133. {
  134. return false;
  135. }
  136. // Seite löschen
  137. return $this->delete_row(array('id' => $_['id']));
  138. }
  139. /**
  140. * find_markup - Such nach Markup-Einträgen in der Datenbank.
  141. *
  142. * @param id - Wenn ein ID angegeben wurde, dann nur dieser Datensatz.
  143. * @return void
  144. * @author Danilo Braband
  145. **/
  146. public function find_markup ($id = false)
  147. {
  148. $id = $id ? 'id = '.$id : 1;
  149. $sql = array(
  150. 'from' => 'cms_markup',
  151. 'where' => $id
  152. );
  153. return $array = parent::find_all($sql);
  154. }
  155. /**
  156. * find_lft_rgt - Sucht nacht Left der übergebenen Seiten-ID.
  157. *
  158. * @param id - Der Datensatz-ID.
  159. * @return void
  160. * @author Danilo Braband
  161. **/
  162. private function find_lft_rgt ($_ = false)
  163. {
  164. if (!isset($_))
  165. {
  166. return false;
  167. }
  168. $sql = array(
  169. 'select' => 'lft, rgt',
  170. 'where' => 'id = '.$_,
  171. 'limit' => '1'
  172. );
  173. return parent::find_all($sql);
  174. }
  175. /**
  176. * find_url - Sucht nach der URL der Übergebenen ID in der Datenbank und
  177. * gibt ihn bei Erfolg zurück.
  178. *
  179. * @return void
  180. * @author Danilo Braband
  181. **/
  182. private function find_url ($_ = false)
  183. {
  184. if (!is_string($_))
  185. {
  186. return false;
  187. }
  188. $sql = array(
  189. 'select' => 'url',
  190. 'where' => 'id = '.$_
  191. );
  192. return parent::find_all($sql);
  193. }
  194. /**
  195. * save - Speichert den Inhalt eines Array in der Datenbank
  196. *
  197. * @param array
  198. * @return bool
  199. * @author Danilo Braband
  200. **/
  201. public function save ($_ = false)
  202. {
  203. if (!is_array($_))
  204. {
  205. return false;
  206. }
  207. // Eliminieren wir erstmal falsche und leere Elemente. Die '0' bleibt
  208. // erhalten!
  209. $_ = $this->clean($_);
  210. // Ein Titel ist natürlich Pflicht.
  211. if (!isset($_['title']))
  212. {
  213. return false;
  214. }
  215. // Wo soll ich das einordnen, wenn ich kein Elternelement habe?
  216. if (!isset($_['parent']))
  217. {
  218. return false;
  219. }
  220. $clean_title = $this->urlify($_['title']);
  221. $parent_url = $this->find_url($_['parent']);
  222. // Zusammensetzen der neuen URL:
  223. if (empty($parent_url[0]['url']))
  224. {
  225. // Seite bereits vorhanden?
  226. if (isset($_['id']))
  227. {
  228. $r = $this->find_lft_rgt($_['id']);
  229. // handelt es sich hier um das Root-Element?
  230. if ((int) $r[0]['lft'] == 1)
  231. {
  232. $_['url'] = '';
  233. }
  234. }
  235. else
  236. {
  237. $_['url'] = $clean_title;
  238. }
  239. }
  240. else
  241. {
  242. $_['url'] = $parent_url[0]['url'].'/'.$clean_title;
  243. }
  244. // Wenn das Array keine ID hat, wird davon ausgegangen, dass sie noch
  245. // nicht vorhanden ist. Die Seite wird angelegt und die Funktion wird
  246. // verlassen.
  247. if (!isset($_['id']))
  248. {
  249. return $this->add($_);
  250. }
  251. // Die Seite wird aktualisiert.
  252. if (!$this->update_row($_, array('id' => (int) $_['id'])))
  253. {
  254. return false;
  255. }
  256. // Wenn die aktuelle Seite ein Elternelement ist, müssen alle Kinder
  257. // mit der neuen URL aktualisiert werden.
  258. $r = $this->find_lft_rgt($_['id']);
  259. // Wenn rechts gleich links + 1 ist, dann handelt es sich um ein
  260. // Blatt, d.h. es gibt keine nachfolgenden Elemente zum Aktualisieren.
  261. if ((int) $r[0]['rgt'] == (int) $r[0]['lft'] + 1)
  262. {
  263. return true;
  264. }
  265. $lft = (int) $r[0]['lft'] + 1;
  266. $rgt = (int) $r[0]['rgt'] - 1;
  267. // Die Kinder müssen aktualisiert werden. Alle Unterelemente auslesen:
  268. $r = parent::find_all(array(
  269. 'select' => 'parent, id, title',
  270. 'where' => 'lft BETWEEN '.$lft.' AND '.$rgt,
  271. 'orderby'=> 'lft ASC'
  272. ));
  273. // Rekursive Aktualisierung der Elemente:
  274. foreach ($r AS $v)
  275. {
  276. // Überschriften müssen merkwürdigerweise encodiert werden, da es
  277. // sonst Schwierigkeiten mit der DB gibt.
  278. $v['title'] = utf8_encode($v['title']);
  279. $this->save($v);
  280. }
  281. return true;
  282. }
  283. /**
  284. * undocumented function
  285. *
  286. * @return void
  287. * @author Danilo Braband
  288. **/
  289. public function tree ()
  290. {
  291. // Zuerst wird das Root-Element ausgelesen um den linken und rechten
  292. // Wert zu bekommen.
  293. $r = parent::find_all(array(
  294. 'select' => 'lft, rgt',
  295. 'orderby'=> 'lft ASC',
  296. 'limit' => '1'
  297. ));
  298. // Jetzt alle Child-Elemente auslesen. Inklusive Root-Element.
  299. $array = parent::find_all(array(
  300. 'select' => 'id, title, parent',
  301. 'where' => 'lft BETWEEN '.$r[0]['lft'].' AND '.$r[0]['rgt'],
  302. 'orderby'=> 'lft ASC'
  303. ));
  304. return $array;
  305. }
  306. /**
  307. * urlify - Filtert nicht erlaubte Elemente aus einem String und gibt
  308. * einen bereinigten String zur Nutzung als URL zurück.
  309. *
  310. * @param string
  311. * @return void
  312. * @author Danilo Braband
  313. **/
  314. function urlify ($_ = false)
  315. {
  316. if (!is_string($_))
  317. {
  318. return false;
  319. }
  320. // alles in Kleinbuchstaben
  321. $_ = mb_strtolower($_, mb_detect_encoding($_));
  322. $illegal= array('{', '}', '|', '\\', '^', '~', '[', ']', '`', '&lt;',
  323. '>', '#', '%', '"', '&amp;', '/', '?', ':', '@', ';',
  324. '=', '&', '<');
  325. $_ = str_replace($illegal, '', $_);
  326. $_ = str_replace(' ', '-', $_);
  327. $_ = str_replace(array('à', 'á', 'â', 'ã', 'ä', 'å', 'æ'), 'a', $_);
  328. $_ = str_replace('ç', 'c', $_);
  329. $_ = str_replace(array('è', 'é', 'ê', 'ë'), 'e', $_);
  330. $_ = str_replace(array('ì', 'í', 'î', 'ï'), 'i', $_);
  331. $_ = str_replace('ñ', 'n', $_);
  332. $_ = str_replace(array('ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'œ'), 'o', $_);
  333. $_ = str_replace(array('ù', 'ú', 'û', 'ü'), 'u', $_);
  334. $_ = str_replace('ß', 'ss', $_);
  335. return $_;
  336. }
  337. };
  338. ?>