P5Menu.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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. $sqlIds = implode(", ", array_keys($listObjects));
  45. $cacheZasobInfo = DB::getPDO()->fetchAllByKey("
  46. select `ID`, `DESC`, `DESC_PL`, `OPIS`
  47. from CRM_LISTA_ZASOBOW
  48. where ID in ({$sqlIds})
  49. ", $key = 'ID');
  50. return [
  51. 'type' => 'success',
  52. 'msg' => "OK",
  53. 'body' => [
  54. 'version' => $this->getVersion(),
  55. 'objects' => array_values( array_filter(
  56. array_map(function ($acl, $idZasob) use ($makeShortLabel, $cacheZasobInfo) {
  57. if (!$acl) return [
  58. 'id' => $idZasob,
  59. 'TODO' => 'TODO'
  60. ];
  61. // $zasobObj = ProcesHelper::getZasobTableInfo($acl->getID());
  62. // $zasobObj = (object)DB::getPDO()->fetchFirst("
  63. // select `ID`, `DESC`, `DESC_PL`, `OPIS`
  64. // from CRM_LISTA_ZASOBOW
  65. // where ID = :id
  66. // ", [ ':id' => $acl->getID() ]);
  67. // if ((int)$idZasob !== (int)$acl->getID()) throw new Exception("BUG idZasob !== Acl->getID() : ({$idZasob}) !== (".$acl->getID().")");
  68. if (!array_key_exists($acl->getID(), $cacheZasobInfo)) return [
  69. 'id' => $idZasob,
  70. 'TODO' => "Zasób '{$idZasob}' nie istnieje w bazie"
  71. ];
  72. $zasobObj = (object)$cacheZasobInfo[$acl->getID()];
  73. return [
  74. 'id' => $acl->getID(),
  75. 'namespace' => $acl->getNamespace(),
  76. 'name' => $acl->getName(),
  77. 'desc' => $zasobObj->DESC,
  78. 'label' => ($zasobObj->DESC_PL) ? htmlspecialchars($zasobObj->DESC_PL) : $zasobObj->DESC,
  79. 'short_label' => $makeShortLabel($zasobObj),
  80. 'opis' => htmlspecialchars($zasobObj->OPIS),
  81. // 'raw_zasob_obj' => $zasobObj,
  82. ];
  83. }, array_values($listObjects), array_keys($listObjects)),
  84. function ($infoAcl) {
  85. if (!array_key_exists('namespace', $infoAcl)) {
  86. trigger_error("Warning: problem z zasobem {$infoAcl['id']} - brak ACL", E_USER_WARNING);
  87. return false;
  88. }
  89. return true;
  90. }
  91. ) ),
  92. 'urls' => array_map(function ($label, $idZasob) {
  93. return [
  94. 'id' => $idZasob,
  95. 'label' => (mb_strlen($label, 'utf-8') > 100) ? mb_substr($label, 0, 100, 'utf-8') . '...' : $label,
  96. 'raw_label' => $label,
  97. ];
  98. }, array_values($listUrls), array_keys($listUrls)),
  99. 'bookmarks' => // array_filter(
  100. array_map(function ($cls, $idZasob) use ($listObjects, $listUrls) {
  101. if (array_key_exists($idZasob, $listObjects)) {
  102. $acl = $listObjects[$idZasob];
  103. return [
  104. 'id' => $idZasob,
  105. 'namespace' => $acl->getNamespace(),
  106. 'name' => $acl->getName(),
  107. 'label' => $acl->getRawLabel(),
  108. 'opis' => $acl->getOpis(),
  109. 'type' => 'menu',
  110. 'class' => $cls
  111. ];
  112. }
  113. else if (array_key_exists($idZasob, $listUrls)) {
  114. return [
  115. 'id' => $idZasob,
  116. 'name' => $listUrls[$idZasob],
  117. 'type' => 'url',
  118. 'class' => $cls
  119. ];
  120. }
  121. return null;
  122. }, array_values($bookmarks), array_keys($bookmarks)),
  123. // , function ($bookmark) { return null !== $bookmark; }),
  124. 'idsBookmarks' => array_keys($bookmarks),
  125. ]
  126. ];
  127. }
  128. public function addBookmarkPostTask($args) {
  129. $zasobID = V::get('_zasobID', 0, $args, 'int');
  130. if ($zasobID <= 0) throw new Exception('Missing _zasobID');
  131. UserBookmarks::getInstance()->addBookmark($zasobID);
  132. User::saveProfile();
  133. }
  134. public function removeBookmarkPostTask($args) {
  135. $zasobID = V::get('_zasobID', 0, $args, 'int');
  136. if ($zasobID <= 0) throw new Exception('Missing _zasobID');
  137. UserBookmarks::getInstance()->removeBookmark($zasobID);
  138. User::saveProfile();
  139. $this->getMenuData();
  140. }
  141. public function changeBookmarkPostTask($args) {
  142. $zasobID = V::get('_zasobID', 0, $args, 'int');
  143. if ($zasobID <= 0) throw new Exception('Missing _zasobID');
  144. $btnCls = V::get('btnCls', '', $args);
  145. if (empty($btnCls)) {
  146. die('Error: no button class');
  147. }
  148. UserBookmarks::getInstance()->changeBookmark($zasobID, $btnCls);
  149. User::saveProfile();
  150. }
  151. public function sortBookmarksPostTask($args) {
  152. $idsOrdered = V::get('ids', array(), $args, 'array', array('V', 'filterPositiveInteger'));
  153. if (empty($idsOrdered)) throw new Exception('Missing ids');
  154. UserBookmarks::getInstance()->sortBookmarks($idsOrdered);
  155. User::saveProfile();
  156. }
  157. }