PageRenderTime 48ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/materials.php

https://gitlab.com/kidaa/quantum
PHP | 193 lines | 175 code | 18 blank | 0 comment | 32 complexity | c3a1f706e7c738d3c23ba8460b50b5a4 MD5 | raw file
Possible License(s): GPL-2.0, MPL-2.0-no-copyleft-exception
  1. <?php
  2. class Materials extends QModule {
  3. protected $version = '1.4';
  4. private $mode = 0;
  5. public function addLanguage($lang) {
  6. $this->params['details_' . $lang] = $this->params['details_' . DEF_LANG];
  7. $this->engine->db->query("UPDATE " . DB_PREF . "modules SET `params`='" . $this->engine->db->escape(serialize($this->params)) . "' WHERE name='materials'");
  8. $this->engine->db->query("ALTER TABLE `" . DB_PREF . "materials` ADD `caption_" . $lang . "` VARCHAR( 255 ) NOT NULL, ADD `description_" . $lang . "` VARCHAR( 255 ) NOT NULL, ADD `title_" . $lang . "` TEXT NOT NULL, ADD `descr_" . $lang . "` TEXT NOT NULL, ADD `kw_" . $lang . "` TEXT NOT NULL, ADD `text_" . $lang . "` TEXT NOT NULL;");
  9. $q = $this->engine->db->query("SELECT id, caption_" . DEF_LANG . " as caption, title_" . DEF_LANG . " as title, text_" . DEF_LANG . " as text, kw_" . DEF_LANG . " as kw, descr_" . DEF_LANG . " as descr, description_" . DEF_LANG . " as description FROM " . DB_PREF . "materials");
  10. foreach($q->rows as $f) {
  11. $this->engine->db->query("UPDATE " . DB_PREF . "materials SET `caption_" . $lang . "`='" . $f['caption'] . "', `title_" . $lang . "`='" . $f['title'] . "', `text_" . $lang . "`='" . $f['text'] . "', `kw_" . $lang . "`='" . $f['kw'] . "', `descr_" . $lang . "`='" . $f['descr'] . "', `description_" . $lang . "`='" . $f['description'] . "' WHERE id=" . $f['id']);
  12. }
  13. if ($q) return true; else return false;
  14. }
  15. public function removeLanguage($lang) {
  16. unset($this->params['details_'.$lang]);
  17. $this->engine->db->query("UPDATE " . DB_PREF . "modules SET `params`='" .
  18. $this->engine->db->escape(serialize($this->params)) . "' WHERE name='materials'");
  19. $q = $this->engine->db->query("ALTER TABLE `" . DB_PREF . "materials` DROP `caption_" . $lang . "`, DROP `description_" . $lang . "`, DROP `text_" . $lang . "`, DROP `title_" . $lang . "`, DROP `descr_" . $lang . "`, DROP `kw_" . $lang . "`;");
  20. if ($q) return true; else return false;
  21. }
  22. private function fillCategory($category_id) {
  23. $limit = $this->params['count_per_page'];
  24. $start = ($this->engine->url->page_n - 1) * $limit;
  25. $q = $this->engine->db->query("SELECT id, parent_id, caption_" . $_SESSION['lang'] . " as caption, description_" . $_SESSION['lang'] . " as description, text_" . $_SESSION['lang'] . " as `text`, title_" . $_SESSION['lang'] . " as title, kw_" . $_SESSION['lang'] . " as kw, descr_" . $_SESSION['lang'] . " as descr FROM " . DB_PREF . "materials WHERE id='" . (int)$category_id . "' AND is_category=1 AND enabled=1 ORDER BY date_added DESC");
  26. if (empty($q->row)) {
  27. $this->engine->ERROR_404 = true;
  28. return false;
  29. } else {
  30. $category = $q->row;
  31. $breadcrumbs = array();
  32. $this->buildBreadcrumbs($category['id'], $breadcrumbs);
  33. $this->data['breadcrumbs'][0] = array(
  34. 'caption' => '<i class="glyphicon glyphicon-home"></i>',
  35. 'link' => $this->engine->url->link('route=home')
  36. );
  37. foreach ($breadcrumbs as $breadcrumb) {
  38. $this->data['breadcrumbs'][] = array(
  39. 'caption' => $breadcrumb['caption_' . $_SESSION['lang']],
  40. 'link' => $this->engine->url->link('route=materials&material_id='. $breadcrumb['id'])
  41. );
  42. }
  43. $this->data['category'] = array(
  44. 'caption' => $category['caption'],
  45. 'description' => $category['description'],
  46. 'text' => $category['text'],
  47. );
  48. if ($category['title'] != '') {
  49. $this->engine->document->setTitle($category['title']);
  50. }
  51. if ($category['kw'] != '') {
  52. $this->engine->document->setKeywords($category['kw']);
  53. }
  54. if ($category['descr'] != '') {
  55. $this->engine->document->setDescription($category['descr']);
  56. }
  57. $categories = $this->engine->db->query("SELECT id, caption_" . $_SESSION['lang'] . " as caption, description_" . $_SESSION['lang'] . " as description, text_" . $_SESSION['lang'] . " as text, preview FROM " . DB_PREF . "materials WHERE parent_id=" . (int)$category_id . " AND enabled=1 AND is_category = 1 ORDER BY date_added DESC")->rows;
  58. $this->data['categories'] = array();
  59. foreach ($categories as $category) {
  60. $this->data['categories'][$category['id']] = array(
  61. 'link' => $this->engine->url->link('route=materials&material_id=' . $category['id']),
  62. 'caption' => $category['caption'],
  63. 'preview' => resizeImage($category['preview'], 100, 100),
  64. 'description' => $category['description'],
  65. 'text' => $category['text']
  66. );
  67. }
  68. $materials = $this->engine->db->query("SELECT id, caption_" . $_SESSION['lang'] . " as caption, description_" . $_SESSION['lang'] . " as description, preview, date_added FROM " . DB_PREF . "materials WHERE parent_id=" . (int)$category_id . " AND enabled = 1 AND is_category = 0 ORDER BY date_added DESC LIMIT ". $start . ", " . $limit)->rows;
  69. $this->data['materials'] = array();
  70. foreach ($materials as $material) {
  71. $this->data['materials'][$material['id']] = array(
  72. 'link' => $this->engine->url->link('route=materials&material_id=' . $material['id']),
  73. 'caption' => $material['caption'],
  74. 'preview' => resizeImage($material['preview'], 150, 150),
  75. 'date_added' => $material['date_added'],
  76. 'description' => $material['description']
  77. );
  78. }
  79. $this->data['details_caption'] = $this->params['details_' . $_SESSION['lang']];
  80. $page_count = $this->getPageCount((int)$category_id, (int)$this->params['count_per_page']);
  81. $this->data['pagination'] = printPagination($page_count, $this->engine->uri);
  82. $this->mode = 1;
  83. $this->engine->ERROR_404 = false;
  84. return true;
  85. }
  86. }
  87. private function fillMaterial($material_id) {
  88. if (CLEAN_URL && ($this->engine->url->is_category)) {
  89. $this->engine->ERROR_404 = true;
  90. return false;
  91. }
  92. $material = $this->engine->db->query("SELECT parent_id, caption_" . $_SESSION['lang'] . " as caption, text_" . $_SESSION['lang'] . " as `text`, title_" . $_SESSION['lang'] . " as title, kw_" . $_SESSION['lang'] . " as kw, descr_" . $_SESSION['lang'] . " as descr, date_added FROM " . DB_PREF . "materials WHERE id=" . (int)$material_id)->row;
  93. if (empty($material)) {
  94. $this->engine->ERROR_404 = true;
  95. return false;
  96. } else {
  97. $breadcrumbs = array();
  98. $this->buildBreadcrumbs($material['parent_id'], $breadcrumbs);
  99. $this->data['breadcrumbs'][0] = array(
  100. 'caption' => '<i class="glyphicon glyphicon-home"></i>',
  101. 'link' => $this->engine->url->link('route=home')
  102. );
  103. foreach ($breadcrumbs as $breadcrumb) {
  104. $this->data['breadcrumbs'][] = array(
  105. 'caption' => $breadcrumb['caption_' . $_SESSION['lang']],
  106. 'link' => $this->engine->url->link('route=materials&material_id='. $breadcrumb['id'])
  107. );
  108. }
  109. $this->data['breadcrumbs'][] = array(
  110. 'caption' => $material['caption'],
  111. 'link' => $this->engine->url->link('route=materials&material_id='. $material_id)
  112. );
  113. $this->data['material'] = $material;
  114. if ($material['title'] != '') {
  115. $this->engine->document->setTitle($material['title']);
  116. }
  117. if ($material['kw'] != '') {
  118. $this->engine->document->setKeywords($material['kw']);
  119. }
  120. if ($material['descr'] != '') {
  121. $this->engine->document->setDescription($material['descr']);
  122. }
  123. $this->engine->ERROR_404 = false;
  124. $this->mode = 2;
  125. return true;
  126. }
  127. }
  128. private function getPageCount($category_id, $limit = 4) {
  129. $q = $this->engine->db->query("SELECT COUNT(1) as count FROM " . DB_PREF . "materials WHERE parent_id=" . (int)$category_id . " AND enabled = 1 AND is_category = 0");
  130. if (!empty($q->rows)) {
  131. $f = $q->row;
  132. $all_vals = (int)$f['count'];
  133. } else {
  134. $all_vals = 0;
  135. }
  136. return ceil($all_vals / $limit);
  137. }
  138. public function getCategories() {
  139. $l_query = '';
  140. foreach ($this->engine->languages as $lang) {
  141. $l_query .= 'caption_' . $lang['name'] . ', ';
  142. }
  143. $l_query = substr($l_query, 0 , -2);
  144. $q = $this->engine->db->query("SELECT id, parent_id, " . $l_query . " FROM " . DB_PREF . "materials WHERE enabled = 1 AND is_category = 1");
  145. return $q->rows;
  146. }
  147. private function buildBreadcrumbs($category_id, &$arr) {
  148. $breadcrumbs = $this->engine->cache->get('materials_breadcrumbs');
  149. if (!$breadcrumbs) {
  150. $breadcrumbs = $this->getCategories();
  151. $this->engine->cache->set('materials_breadcrumbs', $breadcrumbs);
  152. }
  153. foreach ($breadcrumbs as $breadcrumb) {
  154. if ((int)$breadcrumb['id'] == $category_id) {
  155. array_unshift($arr, $breadcrumb);
  156. $this->buildBreadcrumbs($breadcrumb['parent_id'], $arr);
  157. break;
  158. }
  159. }
  160. }
  161. public function index() {
  162. if (!isset($_GET['material_id'])) {
  163. $this->engine->ERROR_404 = true;
  164. return false;
  165. }
  166. if (!$this->fillCategory($_GET['material_id'])) {
  167. $this->fillMaterial($_GET['material_id']);
  168. }
  169. if ($this->mode == 1) {
  170. $this->template = TEMPLATE . 'template/materials/material_list.tpl';
  171. } elseif ($this->mode == 2) {
  172. $this->template = TEMPLATE . 'template/materials/material.tpl';
  173. }
  174. }
  175. }