PageRenderTime 62ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/phpmyfaq/admin/category.main.php

https://github.com/cyrke/phpMyFAQ
PHP | 429 lines | 345 code | 49 blank | 35 comment | 84 complexity | b58638564e1e2d11cfe5be62e5eadbc5 MD5 | raw file
Possible License(s): LGPL-2.1, LGPL-3.0, MPL-2.0-no-copyleft-exception
  1. <?php
  2. /**
  3. * List all categories in the admin section
  4. *
  5. * PHP Version 5.3
  6. *
  7. * This Source Code Form is subject to the terms of the Mozilla Public License,
  8. * v. 2.0. If a copy of the MPL was not distributed with this file, You can
  9. * obtain one at http://mozilla.org/MPL/2.0/.
  10. *
  11. * @category phpMyFAQ
  12. * @package Administration
  13. * @author Thorsten Rinne <thorsten@phpmyfaq.de>
  14. * @copyright 2003-2012 phpMyFAQ Team
  15. * @license http://www.mozilla.org/MPL/2.0/ Mozilla Public License Version 2.0
  16. * @link http://www.phpmyfaq.de
  17. * @since 2003-12-20
  18. */
  19. if (!defined('IS_VALID_PHPMYFAQ')) {
  20. header('Location: http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['SCRIPT_NAME']));
  21. exit();
  22. }
  23. ?>
  24. <header>
  25. <h2><?php print $PMF_LANG['ad_menu_categ_edit']; ?>
  26. </header>
  27. <?php
  28. $csrfToken = PMF_Filter::filterInput(INPUT_POST, 'csrf', FILTER_SANITIZE_STRING);
  29. if ('category' != $action && 'content' != $action &&
  30. (!isset($_SESSION['phpmyfaq_csrf_token']) || $_SESSION['phpmyfaq_csrf_token'] !== $csrfToken)) {
  31. $permission['editcateg'] = false;
  32. }
  33. if ($permission['editcateg']) {
  34. // Save a new category
  35. if ($action == 'savecategory') {
  36. $category = new PMF_Category($faqConfig, false);
  37. $category->setUser($currentAdminUser);
  38. $category->setGroups($currentAdminGroups);
  39. $parentId = PMF_Filter::filterInput(INPUT_POST, 'parent_id', FILTER_VALIDATE_INT);
  40. $categoryData = array(
  41. 'lang' => PMF_Filter::filterInput(INPUT_POST, 'lang', FILTER_SANITIZE_STRING),
  42. 'name' => PMF_Filter::filterInput(INPUT_POST, 'name', FILTER_SANITIZE_STRING),
  43. 'description' => PMF_Filter::filterInput(INPUT_POST, 'description', FILTER_SANITIZE_STRING),
  44. 'user_id' => PMF_Filter::filterInput(INPUT_POST, 'user_id', FILTER_VALIDATE_INT)
  45. );
  46. $permissions = array();
  47. if ('all' === PMF_Filter::filterInput(INPUT_POST, 'userpermission', FILTER_SANITIZE_STRING)) {
  48. $permissions += array(
  49. 'restricted_user' => array(
  50. -1
  51. )
  52. );
  53. } else {
  54. $permissions += array(
  55. 'restricted_user' => array(
  56. PMF_Filter::filterInput(INPUT_POST, 'restricted_users', FILTER_VALIDATE_INT)
  57. )
  58. );
  59. }
  60. if ('all' === PMF_Filter::filterInput(INPUT_POST, 'grouppermission', FILTER_SANITIZE_STRING)) {
  61. $permissions += array(
  62. 'restricted_groups' => array(
  63. -1
  64. )
  65. );
  66. } else {
  67. $permissions += PMF_Filter::filterInputArray(
  68. INPUT_POST,
  69. array(
  70. 'restricted_groups' => array(
  71. 'filter' => FILTER_VALIDATE_INT,
  72. 'flags' => FILTER_REQUIRE_ARRAY
  73. )
  74. )
  75. );
  76. }
  77. $categoryId = $category->addCategory($categoryData, $parentId);
  78. if ($categoryId) {
  79. $category->addPermission('user', array($categoryId), $permissions['restricted_user']);
  80. $category->addPermission('group', array($categoryId), $permissions['restricted_groups']);
  81. // All the other translations
  82. $languages = PMF_Filter::filterInput(INPUT_POST, 'used_translated_languages', FILTER_SANITIZE_STRING);
  83. if ($faqConfig->get('main.enableGoogleTranslation') === true && !empty($languages)) {
  84. $languages = explode(",", $languages);
  85. $category_lang = $categoryData['lang'];
  86. $user_id = $categoryData['user_id'];
  87. foreach ($languages as $translated_lang) {
  88. if ($translated_lang == $category_lang) {
  89. continue;
  90. }
  91. $translated_name = PMF_Filter::filterInput(INPUT_POST, 'name_translated_' . $translated_lang, FILTER_SANITIZE_STRING);
  92. $translated_description = PMF_Filter::filterInput(INPUT_POST, 'description_translated_' . $translated_lang, FILTER_SANITIZE_STRING);
  93. $categoryData = array_merge($categoryData, array(
  94. 'id' => $categoryId,
  95. 'lang' => $translated_lang,
  96. 'parent_id' => $parentId,
  97. 'name' => $translated_name,
  98. 'description' => $translated_description,
  99. 'user_id' => $user_id));
  100. if (!$category->checkLanguage($categoryId, $translated_lang)) {
  101. $category->addCategory($categoryData, $parentId, $categoryId);
  102. } else {
  103. $category->updateCategory($categoryData);
  104. }
  105. }
  106. }
  107. printf('<p class="alert alert-success">%s</p>', $PMF_LANG['ad_categ_added']);
  108. } else {
  109. printf('<p class="alert alert-error">%s</p>', $faqConfig->getDb()->error());
  110. }
  111. }
  112. // Updates an existing category
  113. if ($action == 'updatecategory') {
  114. $category = new PMF_Category($faqConfig, false);
  115. $category->setUser($currentAdminUser);
  116. $category->setGroups($currentAdminGroups);
  117. $parentId = PMF_Filter::filterInput(INPUT_POST, 'parent_id', FILTER_VALIDATE_INT);
  118. $categoryData = array(
  119. 'id' => PMF_Filter::filterInput(INPUT_POST, 'id', FILTER_VALIDATE_INT),
  120. 'lang' => PMF_Filter::filterInput(INPUT_POST, 'catlang', FILTER_SANITIZE_STRING),
  121. 'parent_id' => $parentId,
  122. 'name' => PMF_Filter::filterInput(INPUT_POST, 'name', FILTER_SANITIZE_STRING),
  123. 'description' => PMF_Filter::filterInput(INPUT_POST, 'description', FILTER_SANITIZE_STRING),
  124. 'user_id' => PMF_Filter::filterInput(INPUT_POST, 'user_id', FILTER_VALIDATE_INT));
  125. $permissions = array();
  126. if ('all' === PMF_Filter::filterInput(INPUT_POST, 'userpermission', FILTER_SANITIZE_STRING)) {
  127. $permissions += array(
  128. 'restricted_user' => array(
  129. -1
  130. )
  131. );
  132. } else {
  133. $permissions += array(
  134. 'restricted_user' => array(
  135. PMF_Filter::filterInput(INPUT_POST, 'restricted_users', FILTER_VALIDATE_INT)
  136. )
  137. );
  138. }
  139. if ('all' === PMF_Filter::filterInput(INPUT_POST, 'grouppermission', FILTER_SANITIZE_STRING)) {
  140. $permissions += array(
  141. 'restricted_groups' => array(
  142. -1
  143. )
  144. );
  145. } else {
  146. $permissions += PMF_Filter::filterInputArray(
  147. INPUT_POST,
  148. array(
  149. 'restricted_groups' => array(
  150. 'filter' => FILTER_VALIDATE_INT,
  151. 'flags' => FILTER_REQUIRE_ARRAY
  152. )
  153. )
  154. );
  155. }
  156. if (!$category->checkLanguage($categoryData['id'], $categoryData['lang'])) {
  157. if ($category->addCategory($categoryData, $parentId, $categoryData['id']) &&
  158. $category->addPermission('user', array($categoryData['id']), $permissions['restricted_user']) &&
  159. $category->addPermission('group', array($categoryData['id']), $permissions['restricted_groups'])) {
  160. printf('<p class="alert alert-success">%s</p>', $PMF_LANG['ad_categ_translated']);
  161. } else {
  162. printf('<p class="alert alert-error">%s</p>', $faqConfig->getDb()->error());
  163. }
  164. } else {
  165. if ($category->updateCategory($categoryData)) {
  166. $category->deletePermission('user', array($categoryData['id']));
  167. $category->deletePermission('group', array($categoryData['id']));
  168. $category->addPermission('user', array($categoryData['id']), $permissions['restricted_user']);
  169. $category->addPermission('group', array($categoryData['id']), $permissions['restricted_groups']);
  170. printf('<p class="alert alert-success">%s</p>', $PMF_LANG['ad_categ_updated']);
  171. } else {
  172. printf('<p class="alert alert-error">%s</p>', $faqConfig->getDb()->error());
  173. }
  174. }
  175. // All the other translations
  176. $languages = PMF_Filter::filterInput(INPUT_POST, 'used_translated_languages', FILTER_SANITIZE_STRING);
  177. if ($faqConfig->get('main.enableGoogleTranslation') === true && !empty($languages)) {
  178. $languages = explode(",", $languages);
  179. $category_lang = $categoryData['lang'];
  180. $categoryId = $categoryData['id'];
  181. $user_id = $categoryData['user_id'];
  182. foreach ($languages as $translated_lang) {
  183. if ($translated_lang == $category_lang) {
  184. continue;
  185. }
  186. $translated_name = PMF_Filter::filterInput(INPUT_POST, 'name_translated_' . $translated_lang, FILTER_SANITIZE_STRING);
  187. $translated_description = PMF_Filter::filterInput(INPUT_POST, 'description_translated_' . $translated_lang, FILTER_SANITIZE_STRING);
  188. $categoryData = array_merge($categoryData, array(
  189. 'id' => $categoryId,
  190. 'lang' => $translated_lang,
  191. 'parent_id' => $parentId,
  192. 'name' => $translated_name,
  193. 'description' => $translated_description,
  194. 'user_id' => $user_id));
  195. if (!$category->checkLanguage($categoryId, $translated_lang)) {
  196. $category->addCategory($categoryData, $parentId, $categoryId);
  197. } else {
  198. $category->updateCategory($categoryData);
  199. }
  200. }
  201. }
  202. }
  203. // Deletes an existing category
  204. if ($permission['delcateg'] && $action == 'removecategory') {
  205. $category = new PMF_Category($faqConfig, false);
  206. $category->setUser($currentAdminUser);
  207. $category->setGroups($currentAdminGroups);
  208. $id = PMF_Filter::filterInput(INPUT_POST, 'cat', FILTER_VALIDATE_INT);
  209. $lang = PMF_Filter::filterInput(INPUT_POST, 'lang', FILTER_SANITIZE_STRING);
  210. $deleteall = PMF_Filter::filterInput(INPUT_POST, 'deleteall', FILTER_SANITIZE_STRING);
  211. $delete_all = strtolower($deleteall) == 'yes' ? true : false;
  212. if ($category->deleteCategory($id, $lang, $delete_all) &&
  213. $category->deleteCategoryRelation($id, $lang, $delete_all) &&
  214. $category->deletePermission('user', array($id)) && $category->deletePermission('group', array($id))) {
  215. printf('<p class="alert alert-success">%s</p>', $PMF_LANG['ad_categ_deleted']);
  216. } else {
  217. printf('<p class="alert alert-error">%s</p>', $faqConfig->getDb()->error());
  218. }
  219. }
  220. // Moves a category
  221. if ($action == 'changecategory') {
  222. $category = new PMF_Category($faqConfig, false);
  223. $category->setUser($currentAdminUser);
  224. $category->setGroups($currentAdminGroups);
  225. $categoryId_1 = PMF_Filter::filterInput(INPUT_POST, 'cat', FILTER_VALIDATE_INT);
  226. $categoryId_2 = PMF_Filter::filterInput(INPUT_POST, 'change', FILTER_VALIDATE_INT);
  227. if ($category->swapCategories($categoryId_1, $categoryId_2)) {
  228. printf('<p class="alert alert-success">%s</p>', $PMF_LANG['ad_categ_updated']);
  229. } else {
  230. printf(
  231. '<p class="alert alert-error">%s<br />%s</p>',
  232. $PMF_LANG['ad_categ_paste_error'],
  233. $faqConfig->getDb()->error()
  234. );
  235. }
  236. }
  237. // Pastes a category
  238. if ($action == 'pastecategory') {
  239. $category = new PMF_Category($faqConfig, false);
  240. $category->setUser($currentAdminUser);
  241. $category->setGroups($currentAdminGroups);
  242. $categoryId = PMF_Filter::filterInput(INPUT_POST, 'cat', FILTER_VALIDATE_INT);
  243. $parentId = PMF_Filter::filterInput(INPUT_POST, 'after', FILTER_VALIDATE_INT);
  244. if ($category->updateParentCategory($categoryId, $parentId)) {
  245. printf('<p class="alert alert-success">%s</p>', $PMF_LANG['ad_categ_updated']);
  246. } else {
  247. printf(
  248. '<p class="alert alert-error">%s<br />%s</p>',
  249. $PMF_LANG['ad_categ_paste_error'],
  250. $faqConfig->getDb()->error()
  251. );
  252. }
  253. }
  254. ?>
  255. <p>
  256. <a class="btn btn-success" href="?action=addcategory">
  257. <i class="icon-plus icon-white"></i> <?php print $PMF_LANG['ad_kateg_add']; ?>
  258. </a>
  259. <a class="btn btn-info" href="?action=showcategory">
  260. <i class="icon-th icon-white"></i> <?php print $PMF_LANG['ad_categ_show'];?>
  261. </a>
  262. </p>
  263. <?php
  264. // Lists all categories
  265. $lang = PMF_Filter::filterInput(INPUT_POST, 'lang', FILTER_SANITIZE_STRING, $LANGCODE);
  266. // If we changed the category tree, unset the object
  267. if (isset($category)) {
  268. unset($category);
  269. }
  270. $category = new PMF_Category($faqConfig, false);
  271. $category->setUser($currentAdminUser);
  272. $category->setGroups($currentAdminGroups);
  273. $category->getMissingCategories();
  274. $category->buildTree();
  275. $open = $lastCatId = $openDiv = 0;
  276. print '<ul>';
  277. foreach ($category->catTree as $id => $cat) {
  278. $indent = '';
  279. for ($i = 0; $i < $cat['indent']; $i++) {
  280. $indent .= '&nbsp;&nbsp;&nbsp;';
  281. }
  282. // Category translated in this language?
  283. if ($cat['lang'] == $lang) {
  284. $categoryName = $cat['name'];
  285. } else {
  286. $categoryName = $cat['name'] . ' (' . $languageCodes[strtoupper($cat['lang'])] . ')';
  287. }
  288. $level = $cat['indent'];
  289. $leveldiff = $open - $level;
  290. if ($leveldiff > 1) {
  291. print '</li>';
  292. for ($i = $leveldiff; $i > 1; $i--) {
  293. print '</ul></div></li>';
  294. }
  295. }
  296. if ($level < $open) {
  297. if (($level - $open) == -1) {
  298. print '</li>';
  299. }
  300. print '</ul></li>';
  301. } elseif ($level == $open) {
  302. print '</li>';
  303. }
  304. if ($level > $open) {
  305. printf('<div id="div_%d" style="display: none;">', $lastCatId);
  306. print '<ul><li>';
  307. } else {
  308. print '<li>';
  309. }
  310. if (count($category->getChildren($cat['id'])) != 0) {
  311. // Show name and icon for expand the sub-categories
  312. printf(
  313. '<h4><a href="javascript:;" onclick="toggleFieldset(%d);">%s</a> </h4> ',
  314. $cat['id'],
  315. $categoryName
  316. );
  317. } else {
  318. // Show just the name
  319. printf("<h4>%s</h4> ", $categoryName);
  320. }
  321. if ($cat["lang"] == $lang) {
  322. // add sub category (if current language)
  323. printf('
  324. <a class="btn btn-info btn-mini" href="?action=addcategory&amp;cat=%s&amp;lang=%s"><span title="%s" class="icon-plus-sign icon-white"></span></a> ',
  325. $cat['id'],
  326. $cat['lang'],
  327. $PMF_LANG['ad_quick_category']
  328. );
  329. // rename (sub) category (if current language)
  330. printf('
  331. <a class="btn btn-info btn-mini" href="?action=editcategory&amp;cat=%s"><span title="%s" class="icon-edit icon-white"></a> ',
  332. $cat['id'],
  333. $PMF_LANG['ad_kateg_rename']
  334. );
  335. }
  336. // translate category (always)
  337. printf(
  338. '<a class="btn btn-info btn-mini" href="?action=translatecategory&amp;cat=%s"><span title="%s" class="icon-share icon-white"></a> ',
  339. $cat['id'],
  340. $PMF_LANG['ad_categ_translate']
  341. );
  342. // delete (sub) category (if current language)
  343. if (count($category->getChildren($cat['id'])) == 0 && $cat["lang"] == $lang) {
  344. printf(
  345. '<a class="btn btn-danger btn-mini" href="?action=deletecategory&amp;cat=%s&amp;catlang=%s"><span title="%s" class="icon-trash icon-white"></a> ',
  346. $cat['id'],
  347. $cat['lang'],
  348. $PMF_LANG['ad_categ_delete']
  349. );
  350. } else {
  351. echo '<a class="btn btn-inverse btn-mini" style="cursor: not-allowed;"><span class="icon-trash icon-white"></a> ';
  352. }
  353. if ($cat["lang"] == $lang) {
  354. // cut category (if current language)
  355. printf(
  356. '<a class="btn btn-warning btn-mini" href="?action=cutcategory&amp;cat=%s"><span title="%s" class="icon-move icon-white"></a> ',
  357. $cat['id'],
  358. $PMF_LANG['ad_categ_cut']
  359. );
  360. if ($category->numParent($cat['parent_id']) > 1) {
  361. // move category (if current language) AND more than 1 category at the same level)
  362. printf(
  363. '<a class="btn btn-warning btn-mini" href="?action=movecategory&amp;cat=%s&amp;parent_id=%s"><span title="%s" class="icon-resize-vertical icon-white"></a> ',
  364. $cat['id'],
  365. $cat['parent_id'],
  366. $PMF_LANG['ad_categ_move']
  367. );
  368. }
  369. }
  370. $open = $level;
  371. $lastCatId = $cat['id'];
  372. }
  373. if ($open > 0) {
  374. print str_repeat("</li>\n\t</ul>\n\t", $open);
  375. }
  376. print "</li>\n</ul>";
  377. printf('<p class="alert alert-info">%s</p>', $PMF_LANG['ad_categ_remark']);
  378. } else {
  379. print $PMF_LANG['err_NotAuth'];
  380. }