P5Menu.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. Lib::loadClass('UserBookmarks');
  4. Lib::loadClass('Response');
  5. Lib::loadClass('ProcesHelper');
  6. class Route_P5Menu extends RouteBase {
  7. public function getVersion() {
  8. return 2;
  9. }
  10. public function defaultAction() {
  11. Response::sendTryCatchJson(array($this, 'getMenuData'), $args = 'JSON_FROM_REQUEST_BODY');
  12. }
  13. public function getRawLabel($zasobObj) { // { ID, DESC, DESC_PL, OPIS } // TODO: move to ProcesHelper::getZasobTableInfo ?
  14. $posLimit = 20;
  15. if (!empty($zasobObj->DESC_PL)) return $zasobObj->DESC_PL;
  16. if (empty($zasobObj->OPIS)) return $zasobObj->DESC;
  17. $opis = $zasobObj->OPIS;
  18. $label = $opis;
  19. if (mb_strlen($opis) > $posLimit) {
  20. $pos = strpos($opis, ' - ');
  21. if ($pos > $posLimit || $pos < 5) {
  22. $pos = $posLimit;
  23. $label = mb_substr($opis, 0, $posLimit, 'utf-8') . '...';
  24. } else {
  25. $label = mb_substr($opis, 0, $pos, 'utf-8');
  26. }
  27. }
  28. return (empty($label))
  29. ? $zasobObj->DESC
  30. : $label;
  31. }
  32. public function getMenuData($args = []) {
  33. if ($postTask = V::get('_postTask', '', $args)) {
  34. DBG::log($args, 'array', "exec '{$postTask}'");
  35. if (!method_exists($this, "{$postTask}PostTask")) throw new Exception("Post Task not exists!");
  36. $this->{"{$postTask}PostTask"}($args);
  37. }
  38. $userAcl = User::getAcl();
  39. $listObjects = $userAcl->getTablesAcl();
  40. $listUrls = $userAcl->getUrls();
  41. // DBG::log($listUrls, 'array', "\$listUrls");
  42. $bookmarks = UserBookmarks::getInstance()->getBookmarks();
  43. $makeShortLabel = [ $this, 'getRawLabel' ];
  44. return [
  45. 'type' => 'success',
  46. 'msg' => "OK",
  47. 'body' => [
  48. 'version' => $this->getVersion(),
  49. 'objects' => array_values( array_filter(
  50. array_map(function ($acl, $idZasob) use ($makeShortLabel) {
  51. if (!$acl) return [
  52. 'id' => $idZasob,
  53. 'TODO' => 'TODO'
  54. ];
  55. $zasobObj = ProcesHelper::getZasobTableInfo($acl->getID());
  56. return [
  57. 'id' => $acl->getID(),
  58. 'namespace' => $acl->getNamespace(),
  59. 'name' => $acl->getName(),
  60. 'desc' => $zasobObj->DESC,
  61. 'label' => ($zasobObj->DESC_PL) ? htmlspecialchars($zasobObj->DESC_PL) : $zasobObj->DESC,
  62. 'short_label' => $makeShortLabel($zasobObj),
  63. 'opis' => htmlspecialchars($zasobObj->OPIS),
  64. // 'raw_zasob_obj' => $zasobObj,
  65. ];
  66. }, array_values($listObjects), array_keys($listObjects)),
  67. function ($infoAcl) {
  68. if (!array_key_exists('namespace', $infoAcl)) {
  69. trigger_error("Warning: problem z zasobem {$infoAcl['id']} - brak ACL", E_USER_WARNING);
  70. return false;
  71. }
  72. return true;
  73. }
  74. ) ),
  75. 'urls' => array_map(function ($label, $idZasob) {
  76. return [
  77. 'id' => $idZasob,
  78. 'label' => (mb_strlen($label, 'utf-8') > 100) ? mb_substr($label, 0, 100, 'utf-8') . '...' : $label,
  79. 'raw_label' => $label,
  80. ];
  81. }, array_values($listUrls), array_keys($listUrls)),
  82. 'bookmarks' => // array_filter(
  83. array_map(function ($cls, $idZasob) use ($listObjects, $listUrls) {
  84. if (array_key_exists($idZasob, $listObjects)) {
  85. $acl = $listObjects[$idZasob];
  86. return [
  87. 'id' => $idZasob,
  88. 'namespace' => $acl->getNamespace(),
  89. 'name' => $acl->getName(),
  90. 'label' => $acl->getRawLabel(),
  91. 'opis' => $acl->getOpis(),
  92. 'type' => 'menu',
  93. 'class' => $cls
  94. ];
  95. }
  96. else if (array_key_exists($idZasob, $listUrls)) {
  97. return [
  98. 'id' => $idZasob,
  99. 'name' => $listUrls[$idZasob],
  100. 'type' => 'url',
  101. 'class' => $cls
  102. ];
  103. }
  104. return null;
  105. }, array_values($bookmarks), array_keys($bookmarks)),
  106. // , function ($bookmark) { return null !== $bookmark; }),
  107. 'idsBookmarks' => array_keys($bookmarks),
  108. ]
  109. ];
  110. }
  111. public function addBookmarkPostTask($args) {
  112. $zasobID = V::get('_zasobID', 0, $args, 'int');
  113. if ($zasobID <= 0) throw new Exception('Missing _zasobID');
  114. UserBookmarks::getInstance()->addBookmark($zasobID);
  115. User::saveProfile();
  116. }
  117. public function removeBookmarkPostTask($args) {
  118. $zasobID = V::get('_zasobID', 0, $args, 'int');
  119. if ($zasobID <= 0) throw new Exception('Missing _zasobID');
  120. UserBookmarks::getInstance()->removeBookmark($zasobID);
  121. User::saveProfile();
  122. $this->getMenuData();
  123. }
  124. public function changeBookmarkPostTask($args) {
  125. $zasobID = V::get('_zasobID', 0, $args, 'int');
  126. if ($zasobID <= 0) throw new Exception('Missing _zasobID');
  127. $btnCls = V::get('btnCls', '', $args);
  128. if (empty($btnCls)) {
  129. die('Error: no button class');
  130. }
  131. UserBookmarks::getInstance()->changeBookmark($zasobID, $btnCls);
  132. User::saveProfile();
  133. }
  134. public function sortBookmarksPostTask($args) {
  135. $idsOrdered = V::get('ids', array(), $args, 'array', array('V', 'filterPositiveInteger'));
  136. if (empty($idsOrdered)) throw new Exception('Missing ids');
  137. UserBookmarks::getInstance()->sortBookmarks($idsOrdered);
  138. User::saveProfile();
  139. }
  140. }