1
0

BxBaseModGeneralMenuSnippetMeta.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. <?php defined('BX_DOL') or die('hack attempt');
  2. /**
  3. * Copyright (c) UNA, Inc - https://una.io
  4. * MIT License - https://opensource.org/licenses/MIT
  5. *
  6. * @defgroup BaseGeneral Base classes for modules
  7. * @ingroup UnaModules
  8. *
  9. * @{
  10. */
  11. class BxBaseModGeneralMenuSnippetMeta extends BxTemplMenuUnitMeta
  12. {
  13. protected $_bShowZeros;
  14. protected $_sModule;
  15. protected $_oModule;
  16. protected $_iContentId;
  17. protected $_aContentInfo;
  18. public function __construct($aObject, $oTemplate = false)
  19. {
  20. $this->_oModule = BxDolModule::getInstance($this->_sModule);
  21. if(empty($oTemplate))
  22. $oTemplate = $this->_oModule->_oTemplate;
  23. parent::__construct($aObject, $oTemplate);
  24. $this->_sStylePrefix = 'bx-base-general-unit-meta';
  25. $this->_bShowZeros = false;
  26. }
  27. public function getCode()
  28. {
  29. if(empty($this->_aContentInfo) || !is_array($this->_aContentInfo))
  30. return '';
  31. return parent::getCode();
  32. }
  33. public function setContentId($iContentId)
  34. {
  35. $this->_iButtons = 0;
  36. $this->_iContentId = (int)$iContentId;
  37. $this->_aContentInfo = $this->_oModule->_oDb->getContentInfoById($this->_iContentId);
  38. if($this->_aContentInfo)
  39. $this->addMarkers(array('content_id' => (int)$this->_iContentId));
  40. }
  41. protected function _getMenuItemAuthor($aItem)
  42. {
  43. $CNF = &$this->_oModule->_oConfig->CNF;
  44. if($this->_bIsApi)
  45. return $this->_getMenuItemAPI($aItem, 'profile', [
  46. 'data' => BxDolProfile::getData($this->_aContentInfo[$CNF['FIELD_AUTHOR']])
  47. ]);
  48. $oProfile = BxDolProfile::getInstanceMagic($this->_aContentInfo[$CNF['FIELD_AUTHOR']]);
  49. return $this->getUnitMetaItemLink($oProfile->getDisplayName(), array(
  50. 'href' => $oProfile->getUrl(),
  51. 'class' => 'bx-base-text-unit-author'
  52. ));
  53. }
  54. protected function _getMenuItemDate($aItem)
  55. {
  56. $CNF = &$this->_oModule->_oConfig->CNF;
  57. if($this->_bIsApi)
  58. return $this->_getMenuItemAPI($aItem, 'time', [
  59. 'title' => $this->_aContentInfo[$CNF['FIELD_ADDED']]
  60. ]);
  61. if ($aItem['icon'] == '')
  62. return $this->getUnitMetaItemText(bx_time_js($this->_aContentInfo[$CNF['FIELD_ADDED']], BX_FORMAT_DATE));
  63. else
  64. return $this->getUnitMetaItemExtended(bx_time_js($this->_aContentInfo[$CNF['FIELD_ADDED']], BX_FORMAT_DATE), $aItem['icon'], '');
  65. }
  66. protected function _getMenuItemCategory($aItem)
  67. {
  68. $CNF = &$this->_oModule->_oConfig->CNF;
  69. if(empty($CNF['OBJECT_CATEGORY']) || empty($CNF['FIELD_CATEGORY']) || empty($this->_aContentInfo[$CNF['FIELD_CATEGORY']]))
  70. return false;
  71. $oCategory = BxDolCategory::getObjectInstance($CNF['OBJECT_CATEGORY']);
  72. if(!$oCategory)
  73. return false;
  74. $sTitle = $oCategory->getCategoryTitle($this->_aContentInfo[$CNF['FIELD_CATEGORY']]);
  75. $sLink = $oCategory->getCategoryUrl($this->_aContentInfo[$CNF['FIELD_CATEGORY']]);
  76. if($this->_bIsApi)
  77. return $this->_getMenuItemAPI($aItem, 'text', [
  78. 'title' => $sTitle,
  79. 'link' => $sLink
  80. ]);
  81. return $this->getUnitMetaItemLink($sTitle, [
  82. 'href' => $sLink
  83. ]);
  84. }
  85. protected function _getMenuItemTags($aItem)
  86. {
  87. if($this->_bIsApi) //--- API: Isn't supported
  88. return false;
  89. $CNF = &$this->_oModule->_oConfig->CNF;
  90. if(empty($CNF['OBJECT_METATAGS']))
  91. return false;
  92. $oMetatags = BxDolMetatags::getObjectInstance($CNF['OBJECT_METATAGS']);
  93. if(!$oMetatags || !$oMetatags->keywordsIsEnabled())
  94. return false;
  95. return $this->getUnitMetaItemCustom($oMetatags->getKeywordsList($this->_aContentInfo[$CNF['FIELD_ID']], 3));
  96. }
  97. protected function _getMenuItemViews($aItem, $aParams = [])
  98. {
  99. $bShowAsObject = isset($aParams['show_as_object']) && (bool)$aParams['show_as_object'] === true;
  100. if($bShowAsObject && !$this->_bIsApi) //--- API: Object based views aren't supported
  101. return $this->_getMenuItemViewsObject($aItem, $aParams);
  102. $CNF = &$this->_oModule->_oConfig->CNF;
  103. if(empty($CNF['FIELD_VIEWS']) || (empty($this->_aContentInfo[$CNF['FIELD_VIEWS']]) && !$this->_bShowZeros))
  104. return false;
  105. $sTitle = _t('_view_n_views', $this->_aContentInfo[$CNF['FIELD_VIEWS']]);
  106. if($this->_bIsApi)
  107. return $this->_getMenuItemAPI($aItem, 'text', [
  108. 'title' => $sTitle
  109. ]);
  110. return $this->getUnitMetaItemText($sTitle);
  111. }
  112. protected function _getMenuItemViewsObject($aItem, $aParams = [])
  113. {
  114. $CNF = &$this->_oModule->_oConfig->CNF;
  115. if(empty($CNF['OBJECT_VIEWS']))
  116. return false;
  117. $oObject = BxDolView::getObjectInstance($CNF['OBJECT_VIEWS'], $this->_aContentInfo[$CNF['FIELD_ID']]);
  118. if(!$oObject || !$oObject->isEnabled())
  119. return false;
  120. $aObjectOptions = [
  121. 'show_counter' => true
  122. ];
  123. if(!empty($aParams['object_options']) && is_array($aParams['object_options']))
  124. $aObjectOptions = array_merge($aObjectOptions, $aParams['object_options']);
  125. if($this->_bIsApi)
  126. return false;
  127. return $this->getUnitMetaItemCustom($oObject->getElementInline($aObjectOptions));
  128. }
  129. protected function _getMenuItemVotes($aItem, $aParams = [])
  130. {
  131. $bShowAsObject = isset($aParams['show_as_object']) && (bool)$aParams['show_as_object'] === true;
  132. if($bShowAsObject || $this->_bIsApi) //--- API: Object base votes are used by default
  133. return $this->_getMenuItemVotesObject($aItem, $aParams);
  134. $CNF = &$this->_oModule->_oConfig->CNF;
  135. if(empty($CNF['FIELD_VOTES']) || (empty($this->_aContentInfo[$CNF['FIELD_VOTES']]) && !$this->_bShowZeros))
  136. return false;
  137. $sTitle = _t('_vote_n_votes', $this->_aContentInfo[$CNF['FIELD_VOTES']]);
  138. if($this->_bIsApi)
  139. return $this->_getMenuItemAPI($aItem, 'text', [
  140. 'title' => $sTitle
  141. ]);
  142. return $this->getUnitMetaItemText($sTitle);
  143. }
  144. protected function _getMenuItemVotesObject($aItem, $aParams = [])
  145. {
  146. $CNF = &$this->_oModule->_oConfig->CNF;
  147. if(empty($CNF['OBJECT_VOTES']))
  148. return false;
  149. $oObject = BxDolVote::getObjectInstance($CNF['OBJECT_VOTES'], $this->_aContentInfo[$CNF['FIELD_ID']]);
  150. if(!$oObject || !$oObject->isEnabled())
  151. return false;
  152. $aObjectOptions = [
  153. 'show_counter' => true
  154. ];
  155. if(!empty($aParams['object_options']) && is_array($aParams['object_options']))
  156. $aObjectOptions = array_merge($aObjectOptions, $aParams['object_options']);
  157. if($this->_bIsApi)
  158. return $this->_getMenuItemElementAPI($aItem, $oObject->getElementApi($aObjectOptions));
  159. return $this->getUnitMetaItemCustom($oObject->getElementInline($aObjectOptions));
  160. }
  161. protected function _getMenuItemRating($aItem, $aParams = [])
  162. {
  163. $CNF = &$this->_oModule->_oConfig->CNF;
  164. if(empty($CNF['OBJECT_VOTES_STARS']))
  165. return false;
  166. $oObject = BxDolVote::getObjectInstance($CNF['OBJECT_VOTES_STARS'], $this->_aContentInfo[$CNF['FIELD_ID']]);
  167. if(!$oObject || !$oObject->isEnabled())
  168. return false;
  169. $aObjectOptions = [
  170. 'show_counter' => true
  171. ];
  172. if(!empty($aParams['object_options']) && is_array($aParams['object_options']))
  173. $aObjectOptions = array_merge($aObjectOptions, $aParams['object_options']);
  174. if($this->_bIsApi)
  175. return $this->_getMenuItemElementAPI($aItem, $oObject->getElementApi($aObjectOptions));
  176. return $this->getUnitMetaItemCustom($oObject->getElementInline($aObjectOptions));
  177. }
  178. protected function _getMenuItemReactions($aItem)
  179. {
  180. if($this->_bIsApi) //--- API: Isn't supported
  181. return false;
  182. $CNF = &$this->_oModule->_oConfig->CNF;
  183. $sKo = 'OBJECT_REACTIONS';
  184. if(empty($CNF[$sKo]))
  185. return false;
  186. $oObject = BxDolVote::getObjectInstance($CNF[$sKo], $this->_aContentInfo[$CNF['FIELD_ID']]);
  187. if(!$oObject || !$oObject->isEnabled())
  188. return false;
  189. return $this->getUnitMetaItemCustom($oObject->getCounter([
  190. 'show_counter_style' => 'compound',
  191. 'show_counter_empty' => false,
  192. 'dynamic_mode' => true
  193. ]));
  194. }
  195. /**
  196. * Note. Saved for backward compatibility.
  197. */
  198. protected function _getMenuItemScore($aItem, $aParams = [])
  199. {
  200. return $this->_getMenuItemScores($aItem, $aParams);
  201. }
  202. protected function _getMenuItemScores($aItem, $aParams = [])
  203. {
  204. $bShowAsObject = isset($aParams['show_as_object']) && (bool)$aParams['show_as_object'] === true;
  205. if($bShowAsObject || $this->_bIsApi) //--- API: Object base scores are used by default
  206. return $this->_getMenuItemScoreObject($aItem, $aParams);
  207. $CNF = &$this->_oModule->_oConfig->CNF;
  208. $sKf = 'FIELD_SCORE';
  209. if(empty($CNF[$sKf]) || (empty($this->_aContentInfo[$CNF[$sKf]]) && !$this->_bShowZeros))
  210. return false;
  211. $sTitle = _t('_sys_score_n_score', $this->_aContentInfo[$CNF[$sKf]]);
  212. if($this->_bIsApi)
  213. return $this->_getMenuItemAPI($aItem, 'text', [
  214. 'title' => $sTitle
  215. ]);
  216. return $this->getUnitMetaItemText($sTitle);
  217. }
  218. protected function _getMenuItemScoreObject($aItem, $aParams = [])
  219. {
  220. $CNF = &$this->_oModule->_oConfig->CNF;
  221. if(empty($CNF['OBJECT_SCORES']))
  222. return false;
  223. $oObject = BxDolScore::getObjectInstance($CNF['OBJECT_SCORES'], $this->_aContentInfo[$CNF['FIELD_ID']], true, $this->_oModule->_oTemplate);
  224. if(!$oObject || !$oObject->isEnabled())
  225. return false;
  226. $aObjectOptions = [
  227. 'show_counter' => true
  228. ];
  229. if(!empty($aParams['object_options']) && is_array($aParams['object_options']))
  230. $aObjectOptions = array_merge($aObjectOptions, $aParams['object_options']);
  231. if($this->_bIsApi)
  232. return $this->_getMenuItemElementAPI([
  233. 'id' => $aItem['id'],
  234. 'name' => 'scores',
  235. ], $oObject->getElementApi($aObjectOptions));
  236. return $this->getUnitMetaItemCustom($oObject->getElementInline($aObjectOptions));
  237. }
  238. protected function _getMenuItemComments($aItem, $aParams = [])
  239. {
  240. $bShowAsObject = isset($aParams['show_as_object']) && (bool)$aParams['show_as_object'] === true;
  241. if($bShowAsObject || $this->_bIsApi) //--- API: Object base comments are used by default
  242. return $this->_getMenuItemCommentsObject($aItem, $aParams);
  243. $CNF = &$this->_oModule->_oConfig->CNF;
  244. if(empty($CNF['OBJECT_COMMENTS']) || empty($CNF['FIELD_COMMENTS']) || (empty($this->_aContentInfo[$CNF['FIELD_COMMENTS']]) && !$this->_bShowZeros))
  245. return false;
  246. $oComments = BxDolCmts::getObjectInstance($CNF['OBJECT_COMMENTS'], $this->_aContentInfo[$CNF['FIELD_ID']]);
  247. if(!$oComments || !$oComments->isEnabled())
  248. return false;
  249. $sTitle = _t('_cmt_txt_n_comments', $oComments->getCommentsCountAll(0, true));
  250. $sLink = $oComments->getListUrl();
  251. if($this->_bIsApi)
  252. return $this->_getMenuItemAPI($aItem, 'text', [
  253. 'title' => $sTitle,
  254. 'link' => $sLink
  255. ]);
  256. return $this->getUnitMetaItemLink($sTitle, [
  257. 'href' => $sLink
  258. ]);
  259. }
  260. protected function _getMenuItemCommentsObject($aItem, $aParams = [])
  261. {
  262. $CNF = &$this->_oModule->_oConfig->CNF;
  263. if(empty($CNF['OBJECT_COMMENTS']))
  264. return false;
  265. $oObject = BxDolCmts::getObjectInstance($CNF['OBJECT_COMMENTS'], $this->_aContentInfo[$CNF['FIELD_ID']], true, $this->_oModule->_oTemplate);
  266. if(!$oObject || !$oObject->isEnabled())
  267. return false;
  268. $aObjectOptions = [
  269. 'show_counter' => true
  270. ];
  271. if(!empty($aParams['object_options']) && is_array($aParams['object_options']))
  272. $aObjectOptions = array_merge($aObjectOptions, $aParams['object_options']);
  273. if($this->_bIsApi)
  274. return $this->_getMenuItemElementAPI($aItem, $oObject->getElementApi($aObjectOptions));
  275. return $this->getUnitMetaItemCustom($oObject->getElementInline($aObjectOptions));
  276. }
  277. protected function _getMenuItemDefault($aItem)
  278. {
  279. $sResult = false;
  280. $a = [
  281. 'res' => &$sResult,
  282. 'menu' => $this->_sObject,
  283. 'menu_object' => $this,
  284. 'item' => $aItem,
  285. 'module' => $this->_sModule,
  286. 'content_id' => $this->_iContentId,
  287. 'content_data' => $this->_aContentInfo,
  288. ];
  289. /**
  290. * @hooks
  291. * @hookdef hook-bx_base_general-menu_custom_item '{module_name}', 'menu_custom_item' - hook to override menu item
  292. * - $unit_name - module name
  293. * - $action - equals `menu_custom_item`
  294. * - $object_id - not used
  295. * - $sender_id - not used
  296. * - $extra_params - array of additional params with the following array keys:
  297. * - `res` - [string] by ref, menu item code, can be overridden in hook processing
  298. * - `menu` - [string] menu name
  299. * - `menu_object` - [object] an instance of menu, @see BxDolMenu
  300. * - `item` - [array] menu item array as key&value pairs
  301. * - `module` - [string] module name
  302. * - `content_id` - [int] content id
  303. * - `content_data` - [array] content info array as key&value pairs
  304. * @hook @ref hook-bx_base_general-menu_custom_item
  305. */
  306. bx_alert($this->_sModule, 'menu_custom_item', 0, 0, $a);
  307. /**
  308. * @hooks
  309. * @hookdef hook-menu-menu_custom_item 'menu', 'menu_custom_item' - hook to override menu item
  310. * It's equivalent to @ref hook-bx_base_general-menu_custom_item
  311. * @hook @ref hook-menu-menu_custom_item
  312. */
  313. bx_alert('menu', 'menu_custom_item', 0, 0, $a);
  314. if (false !== $sResult)
  315. return $sResult;
  316. return parent::_getMenuItemDefault($aItem);
  317. }
  318. }
  319. /** @} */