1
0

BxForumGrid.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  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 Forum Forum
  7. * @ingroup UnaModules
  8. *
  9. * @{
  10. */
  11. require_once(BX_DIRECTORY_PATH_INC . "design.inc.php");
  12. class BxForumGrid extends BxTemplGrid
  13. {
  14. protected $_oModule;
  15. protected $_sDefaultSource;
  16. public function __construct ($aOptions, $oTemplate = false)
  17. {
  18. $this->_oModule = BxDolModule::getInstance('bx_forum');
  19. parent::__construct ($aOptions, $oTemplate);
  20. $this->_sDefaultSortingOrder = 'DESC';
  21. $this->_sDefaultSource = $this->_aOptions['source'];
  22. }
  23. public function setBrowseParams($aParams)
  24. {
  25. if(isset($aParams['ajax_paginate'])) {
  26. if(!$aParams['ajax_paginate']) {
  27. list($sPageLink, $aPageParams) = bx_get_base_url_inline();
  28. $aPageParams[$this->_aOptions['paginate_get_start']] = '{start}';
  29. $this->_aOptions['paginate_url'] = BxDolPermalinks::getInstance()->permalink(bx_append_url_params($sPageLink, $aPageParams));
  30. }
  31. unset($aParams['ajax_paginate']);
  32. }
  33. parent::setBrowseParams($aParams);
  34. $sField = 'added';
  35. if(!empty($this->_aBrowseParams['type']))
  36. switch($this->_aBrowseParams['type']) {
  37. case 'new':
  38. case 'index':
  39. case 'author':
  40. case 'favorite':
  41. case 'category':
  42. $sField = 'added';
  43. break;
  44. case 'featured':
  45. $sField = 'featured';
  46. break;
  47. case 'updated':
  48. $sField = 'changed';
  49. break;
  50. case 'latest':
  51. $sField = 'lr_timestamp';
  52. break;
  53. case 'popular':
  54. $sField = 'views';
  55. break;
  56. }
  57. $this->_aOptions['field_order'] = $sField;
  58. $this->_aOptions['paginate_per_page'] = !empty($this->_aBrowseParams['per_page']) ? (int)$this->_aBrowseParams['per_page'] : (int)$this->_oModule->_oDb->getParam('bx_forum_per_page_browse');
  59. }
  60. public function getCode ($isDisplayHeader = true)
  61. {
  62. $sCode = parent::getCode($isDisplayHeader);
  63. if(empty($sCode))
  64. return '';
  65. return $this->_oModule->_oTemplate->parseHtmlByName('units.html', array(
  66. 'code' => $sCode,
  67. 'js_code' => $this->_oModule->_oTemplate->getJsCode('main')
  68. ));
  69. }
  70. protected function _getActionAdd ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
  71. {
  72. if($this->_oModule->checkAllowedAdd() !== CHECK_ACTION_RESULT_ALLOWED)
  73. return '';
  74. $sUrl = BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php?i=' . $this->_oModule->_oConfig->CNF['URI_ADD_ENTRY']);
  75. unset($a['attr']['bx_grid_action_independent']);
  76. $a['attr'] = array_merge($a['attr'], array(
  77. "onclick" => "window.open('" . $sUrl . "','_self');"
  78. ));
  79. return parent::_getActionDefault ($sType, $sKey, $a, $isSmall, $isDisabled, $aRow);
  80. }
  81. protected function _getRowHead ()
  82. {
  83. return array();
  84. }
  85. protected function _getCellDefault ($mixedValue, $sKey, $aField, $aRow)
  86. {
  87. $aField['attr_cell']['class'] = 'bx-grid-table-cell-' . $sKey;
  88. return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
  89. }
  90. protected function _getCellAuthor($mixedValue, $sKey, $aField, $aRow)
  91. {
  92. $mixedValue = $this->_oModule->_oTemplate->getEntryAuthor($aRow);
  93. return self::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
  94. }
  95. protected function _getCellText($mixedValue, $sKey, $aField, $aRow)
  96. {
  97. $mixedValue = $this->_oModule->_oTemplate->getEntryPreview($aRow);
  98. return self::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
  99. }
  100. protected function _addJsCss()
  101. {
  102. parent::_addJsCss();
  103. $this->_oModule->_oTemplate->addJs(array('main.js'));
  104. $this->_oModule->_oTemplate->addCss(array('main.css', 'main-media-phone.css', 'main-media-tablet.css', 'main-media-desktop.css'));
  105. }
  106. protected function _getDataSql($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage)
  107. {
  108. $sSelectClause = $sJoinClause = $sWhereClause = $sGroupByClause = '';
  109. //--- Check status
  110. $sWhereClause .= " AND `" . $this->_oModule->_oConfig->CNF['FIELD_STATUS'] . "`='active'";
  111. $sWhereClause .= " AND `" . $this->_oModule->_oConfig->CNF['FIELD_STATUS_ADMIN'] . "`='active'";
  112. //--- Check privacy
  113. $iAuthorId = 0;
  114. if(!empty($this->_aBrowseParams['author'])) {
  115. $oProfileAuthor = BxDolProfile::getInstance((int)$this->_aBrowseParams['author']);
  116. if($oProfileAuthor)
  117. $iAuthorId = $oProfileAuthor->id();
  118. }
  119. $sPrivacy = $this->_oModule->_oConfig->CNF['OBJECT_PRIVACY_VIEW'];
  120. $oPrivacy = BxDolPrivacy::getObjectInstance($sPrivacy);
  121. $aCondition = $oPrivacy ? $oPrivacy->getContentPublicAsSQLPart($iAuthorId) : array();
  122. if(isset($aCondition['join']))
  123. $sJoinClause .= $aCondition['join'];
  124. if(isset($aCondition['where']))
  125. $sWhereClause .= $aCondition['where'];
  126. //--- Check browse params
  127. if(!empty($this->_aBrowseParams['select']) && is_array($this->_aBrowseParams['select'])) {
  128. $sSelectClauseBrowse = $this->_getSqlSelectFromGroup($this->_aBrowseParams['select']);
  129. if(!empty($sSelectClauseBrowse))
  130. $sSelectClause .= ", " . $sSelectClauseBrowse;
  131. }
  132. if(!empty($this->_aBrowseParams['join']) && is_array($this->_aBrowseParams['join'])) {
  133. $sJoinClauseBrowse = $this->_getSqlJoinFromGroup($this->_aBrowseParams['join']);
  134. if(!empty($sJoinClauseBrowse))
  135. $sJoinClause .= " " . $sJoinClauseBrowse;
  136. }
  137. if(!empty($this->_aBrowseParams['where']) && is_array($this->_aBrowseParams['where'])) {
  138. $sWhereClauseBrowse = $this->_getSqlWhereFromGroup($this->_aBrowseParams['where']);
  139. if(!empty($sWhereClauseBrowse))
  140. $sWhereClause .= " AND " . $sWhereClauseBrowse;
  141. }
  142. if(!empty($this->_aBrowseParams['group_by']) && is_array($this->_aBrowseParams['group_by'])) {
  143. $sGroupByClauseBrowse = $this->_getSqlGroupByFromGroup($this->_aBrowseParams['group_by']);
  144. if(!empty($sGroupByClauseBrowse))
  145. $sGroupByClause .= " GROUP BY " . $sGroupByClauseBrowse;
  146. }
  147. $this->_aOptions['source'] = sprintf($this->_sDefaultSource, $sSelectClause, $sJoinClause, $sWhereClause, $sGroupByClause);
  148. return parent::_getDataSql($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage);
  149. }
  150. protected function _getDataSqlOrderClause($sOrderByFilter, $sOrderField, $sOrderDir, $bFieldsOnly = false)
  151. {
  152. $CNF = &$this->_oModule->_oConfig->CNF;
  153. $sOrder = parent::_getDataSqlOrderClause($sOrderByFilter, $sOrderField, $sOrderDir, true);
  154. if(!empty($this->_aBrowseParams['type']))
  155. switch($this->_aBrowseParams['type']) {
  156. case 'top':
  157. $aPartsUp = $aPartsDown = array(0);
  158. if(($oVote = BxDolVote::getObjectInstance($CNF['OBJECT_VOTES'], 0, false)) !== false && $oVote->isEnabled()) {
  159. $aVote = $oVote->getSystemInfo();
  160. if(!empty($aVote['trigger_table']) && !empty($aVote['trigger_field_count']))
  161. $aPartsUp[] = '`' . $aVote['trigger_table'] . '`.`' . $aVote['trigger_field_count'] . '`';
  162. }
  163. if(($oReaction = BxDolVote::getObjectInstance($CNF['OBJECT_REACTIONS'], 0, false)) !== false && $oReaction->isEnabled()) {
  164. $aReaction = $oReaction->getSystemInfo();
  165. if(!empty($aReaction['trigger_table']) && !empty($aReaction['trigger_field_count']))
  166. $aPartsUp[] = '`' . $aReaction['trigger_table'] . '`.`' . $aReaction['trigger_field_count'] . '`';
  167. }
  168. if(($oScore = BxDolScore::getObjectInstance($CNF['OBJECT_SCORES'], 0, false)) !== false && $oScore->isEnabled()) {
  169. $aScore = $oScore->getSystemInfo();
  170. if(!empty($aScore['trigger_table']) && !empty($aScore['trigger_field_cup']) && !empty($aScore['trigger_field_cdown'])) {
  171. $aPartsUp[] = '`' . $aScore['trigger_table'] . '`.`' . $aScore['trigger_field_cup'] . '`';
  172. $aPartsDown[] = '`' . $aScore['trigger_table'] . '`.`' . $aScore['trigger_field_cdown'] . '`';
  173. }
  174. }
  175. $sOrder = pow(10, 8) . ' * ((' . implode(' + ', $aPartsUp) . ') - (' . implode(' + ', $aPartsDown) . ')) / (UNIX_TIMESTAMP() - `' . $this->_aOptions['table'] . '`.`' . $CNF['FIELD_ADDED'] . '`) ' . $this->_sDefaultSortingOrder;
  176. break;
  177. case 'partaken':
  178. $sOrder = 'MAX(`tco`.`cmt_time`) ' . $this->_sDefaultSortingOrder;
  179. break;
  180. }
  181. return " ORDER BY `" . $CNF['FIELD_STICK'] . "` DESC, " . $sOrder;
  182. }
  183. protected function _getSqlSelectFromGroup($aGrp)
  184. {
  185. if(!isset($aGrp['grp']) || (bool)$aGrp['grp'] !== true)
  186. return $this->_getSqlSelectFromCondition($aGrp);
  187. $sResult = "";
  188. if(empty($aGrp['cnds']) || !is_array($aGrp['cnds']))
  189. return $sResult;
  190. $sOprGrp = ", ";
  191. foreach($aGrp['cnds'] as $aCnd) {
  192. $sResultCnd = $this->_getSqlSelectFromCondition($aCnd);
  193. if(!empty($sResultCnd))
  194. $sResult .= $sOprGrp . $sResultCnd;
  195. }
  196. return trim($sResult, $sOprGrp);
  197. }
  198. protected function _getSqlSelectFromCondition($aCnd)
  199. {
  200. $sResult = "";
  201. if(!isset($aCnd['fld']))
  202. return $sResult;
  203. $sResult = "`" . $aCnd['fld'] . "`";
  204. if(!empty($aCnd['tbla']))
  205. $sResult = "`" . $aCnd['tbla'] . "`." . $sResult;
  206. else if(!empty($aCnd['tbl']))
  207. $sResult = "`" . $aCnd['tbl'] . "`." . $sResult;
  208. return $sResult;
  209. }
  210. protected function _getSqlJoinFromGroup($aGrp)
  211. {
  212. if(!isset($aGrp['grp']) || (bool)$aGrp['grp'] !== true)
  213. return $this->_getSqlJoinFromCondition($aGrp);
  214. $sResult = "";
  215. if(empty($aGrp['cnds']) || !is_array($aGrp['cnds']))
  216. return $sResult;
  217. $sOprGrp = " ";
  218. foreach($aGrp['cnds'] as $aCnd) {
  219. $sResultCnd = $this->_getSqlJoinFromCondition($aCnd);
  220. if(!empty($sResultCnd))
  221. $sResult .= $sOprGrp . $sResultCnd;
  222. }
  223. return trim($sResult, $sOprGrp);
  224. }
  225. protected function _getSqlJoinFromCondition($aCnd)
  226. {
  227. $sResult = "";
  228. if(!isset($aCnd['tp'], $aCnd['tbl1'], $aCnd['fld1'], $aCnd['fld2']))
  229. return $sResult;
  230. $sTbl1A = $aCnd['tbl1'];
  231. if(!empty($aCnd['tbl1a']))
  232. $sTbl1A = $aCnd['tbl1a'];
  233. $sField1 = "`" . $sTbl1A . "`.`" . $aCnd['fld1'] . "`";
  234. $sField2 = "`" . $aCnd['fld2'] . "`";
  235. if(!empty($aCnd['tbl2a']))
  236. $sField2 = "`" . $aCnd['tbl2a'] . "`." . $sField2;
  237. else if(!empty($aCnd['tbl2']))
  238. $sField2 = "`" . $aCnd['tbl2'] . "`." . $sField2;
  239. return $aCnd['tp'] . " JOIN `" . $aCnd['tbl1'] . "` AS `" . $sTbl1A . "` ON (" . $sField1 . " = " . $sField2 . ")";
  240. }
  241. protected function _getSqlWhereFromGroup($aGrp)
  242. {
  243. if(!isset($aGrp['grp']) || (bool)$aGrp['grp'] !== true)
  244. return $this->_getSqlWhereFromCondition($aGrp);
  245. $sResult = "";
  246. if(!isset($aGrp['opr'], $aGrp['cnds']) || empty($aGrp['cnds']) || !is_array($aGrp['cnds']))
  247. return $sResult;
  248. $sOprGrp = " " . $aGrp['opr'] . " ";
  249. foreach($aGrp['cnds'] as $aCnd) {
  250. $sMethod = '_getSqlWhereFrom' . (isset($aGrp['grp']) && (bool)$aGrp['grp'] === true ? 'Group' : 'Condition');
  251. $sResultCnd = $this->$sMethod($aCnd);
  252. if(!empty($sResultCnd))
  253. $sResult .= $sOprGrp . $sResultCnd;
  254. }
  255. $sResult = trim($sResult, $sOprGrp);
  256. if(!empty($sResult))
  257. $sResult = "(" . $sResult . ")";
  258. return $sResult;
  259. }
  260. protected function _getSqlWhereFromCondition($aCnd)
  261. {
  262. $sResult = "";
  263. if(!isset($aCnd['fld'], $aCnd['val'], $aCnd['opr']))
  264. return $sResult;
  265. $sMethod = '_getSqlWhereFromCondition' . bx_gen_method_name($aCnd['fld']);
  266. if(method_exists($this, $sMethod)) {
  267. $mixedResult = $this->$sMethod($aCnd);
  268. if(is_array($mixedResult) && isset($mixedResult['fld'], $mixedResult['val'], $mixedResult['opr']))
  269. $aCnd = $mixedResult;
  270. else
  271. return $mixedResult;
  272. }
  273. $sField = "`" . $aCnd['fld'] . "`";
  274. if(!empty($aCnd['tbl']))
  275. $sField = "`" . $aCnd['tbl'] . "`." . $sField;
  276. switch($aCnd['opr']) {
  277. case 'IN':
  278. if(empty($aCnd['val']) || !is_array($aCnd['val']))
  279. break;
  280. $sResult .= $sField . " IN (" . $this->_oModule->_oDb->implode_escape($aCnd['val']) . ")";
  281. break;
  282. case 'LIKE':
  283. $sResult .= $sField . " LIKE " . $this->_oModule->_oDb->escape('%' . $aCnd['val'] . '%');
  284. break;
  285. default:
  286. $sResult .= $sField . " " . $aCnd['opr'] . " " . $this->_oModule->_oDb->escape($aCnd['val']);
  287. }
  288. return $sResult;
  289. }
  290. protected function _getSqlGroupByFromGroup($aGrp)
  291. {
  292. if(!isset($aGrp['grp']) || (bool)$aGrp['grp'] !== true)
  293. return $this->_getSqlGroupByFromCondition($aGrp);
  294. $sResult = "";
  295. if(empty($aGrp['cnds']) || !is_array($aGrp['cnds']))
  296. return $sResult;
  297. $sOprGrp = ", ";
  298. foreach($aGrp['cnds'] as $aCnd) {
  299. $sResultCnd = $this->_getSqlGroupByFromCondition($aCnd);
  300. if(!empty($sResultCnd))
  301. $sResult .= $sOprGrp . $sResultCnd;
  302. }
  303. return trim($sResult, $sOprGrp);
  304. }
  305. protected function _getSqlGroupByFromCondition($aCnd)
  306. {
  307. $sResult = "";
  308. if(!isset($aCnd['fld']))
  309. return $sResult;
  310. $sResult = "`" . $aCnd['fld'] . "`";
  311. if(!empty($aCnd['tbla']))
  312. $sResult = "`" . $aCnd['tbla'] . "`." . $sResult;
  313. else if(!empty($aCnd['tbl']))
  314. $sResult = "`" . $aCnd['tbl'] . "`." . $sResult;
  315. return $sResult;
  316. }
  317. protected function _getSqlWhereFromConditionAuthorComment($aCnd)
  318. {
  319. $aEntriesIds = $this->_oModule->_oDb->getComments(array('type' => 'entries_author_search', 'author' => $aCnd['val']));
  320. if(!empty($aEntriesIds) && is_array($aEntriesIds))
  321. return array('fld' => 'id', 'val' => $aEntriesIds, 'opr' => 'IN');
  322. return '';
  323. }
  324. protected function _getSqlWhereFromConditionKeywordComment($aCnd)
  325. {
  326. $aEntriesIds = $this->_oModule->_oDb->getComments(array('type' => 'entries_keyword_search', 'keyword' => $aCnd['val']));
  327. if(!empty($aEntriesIds) && is_array($aEntriesIds))
  328. return array('fld' => 'id', 'val' => $aEntriesIds, 'opr' => 'IN');
  329. return '';
  330. }
  331. }
  332. /** @} */