BxForumGrid.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661
  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. define('BX_FORUM_FILTER_STATUS_RESOLVED', 'yes');
  13. define('BX_FORUM_FILTER_STATUS_UNRESOLVED', 'no');
  14. define('BX_FORUM_FILTER_ORDER_RECENT', 'latest');
  15. define('BX_FORUM_FILTER_ORDER_NEW', 'new');
  16. define('BX_FORUM_FILTER_ORDER_TOP', 'top');
  17. define('BX_FORUM_FILTER_ORDER_UPDATED', 'updated');
  18. define('BX_FORUM_FILTER_ORDER_POPULAR', 'popular');
  19. define('BX_FORUM_FILTER_ORDER_FEATURED', 'featured');
  20. define('BX_FORUM_FILTER_ORDER_FAVORITE', 'favorite');
  21. define('BX_FORUM_FILTER_ORDER_PARTAKEN', 'partaken');
  22. class BxForumGrid extends BxBaseModGeneralGrid
  23. {
  24. protected $_sDefaultSource;
  25. protected $_sFilter1Name;
  26. protected $_sFilter1Value;
  27. protected $_aFilter1Values;
  28. protected $_sFilter2Name;
  29. protected $_sFilter2Value;
  30. protected $_aFilter2Values;
  31. protected $_sFilter3Name;
  32. protected $_sFilter3Value;
  33. protected $_aFilter3Values;
  34. public function __construct ($aOptions, $oTemplate = false)
  35. {
  36. $this->_sModule = 'bx_forum';
  37. parent::__construct ($aOptions, $oTemplate);
  38. $this->_sFilter1Name = 'filter1';
  39. $this->_aFilter1Values = [
  40. '' => _t('_bx_forum_grid_filter_resolved_all'),
  41. BX_FORUM_FILTER_STATUS_RESOLVED => _t('_bx_forum_grid_filter_resolved_resolved'),
  42. BX_FORUM_FILTER_STATUS_UNRESOLVED => _t('_bx_forum_grid_filter_resolved_unresolved'),
  43. ];
  44. if(($sFilter1 = bx_get($this->_sFilter1Name)) !== false) {
  45. $this->_sFilter1Value = bx_process_input($sFilter1);
  46. $this->_aQueryAppend['filter1'] = $this->_sFilter1Value;
  47. }
  48. $this->_sFilter2Name = 'filter2';
  49. $this->_aFilter2Values = [];
  50. $aBadges = BxDolBadges::getInstance()->getData(['type' => 'by_module', 'module' => $this->_oModule->_aModule['name']]);
  51. if(is_array($aBadges) && count($aBadges) > 0) {
  52. $this->_aFilter2Values[''] = _t('_bx_forum_grid_filter_badges_all');
  53. foreach($aBadges as $aBadge)
  54. $this->_aFilter2Values[$aBadge['id']] = $aBadge['text'];
  55. }
  56. if(($sFilter2 = bx_get($this->_sFilter2Name)) !== false) {
  57. $this->_sFilter2Value = bx_process_input($sFilter2);
  58. $this->_aQueryAppend['filter2'] = $this->_sFilter2Value;
  59. }
  60. $this->_sFilter3Name = 'filter3';
  61. $this->_aFilter3Values = [
  62. BX_FORUM_FILTER_ORDER_RECENT => _t('_bx_forum_grid_filter_order_updated'),
  63. BX_FORUM_FILTER_ORDER_NEW => _t('_bx_forum_grid_filter_order_new'),
  64. BX_FORUM_FILTER_ORDER_TOP => _t('_bx_forum_grid_filter_order_top'),
  65. BX_FORUM_FILTER_ORDER_POPULAR => _t('_bx_forum_grid_filter_order_popular'),
  66. BX_FORUM_FILTER_ORDER_FEATURED => _t('_bx_forum_grid_filter_order_featured'),
  67. BX_FORUM_FILTER_ORDER_FAVORITE => _t('_bx_forum_grid_filter_order_favorite'),
  68. BX_FORUM_FILTER_ORDER_PARTAKEN => _t('_bx_forum_grid_filter_order_partaken'),
  69. ];
  70. if(($sFilter3 = bx_get($this->_sFilter3Name)) !== false) {
  71. $this->_sFilter1Value = bx_process_input($sFilter3);
  72. $this->_aQueryAppend['filter3'] = $this->_sFilter1Value;
  73. }
  74. $this->_aFilterAreaLabels = [
  75. $this->_sFilter3Name => '_sys_grid_lbl_order', // "Order": filter3 has no placeholder option to borrow a name from
  76. ];
  77. $this->_sDefaultSortingOrder = 'DESC';
  78. $this->_sDefaultSource = $this->_aOptions['source'];
  79. }
  80. public function setBrowseParams($aParams)
  81. {
  82. if(isset($aParams['ajax_paginate'])) {
  83. if(!$aParams['ajax_paginate']) {
  84. list($sPageLink, $aPageParams) = bx_get_base_url_inline();
  85. $aPageParams[$this->_aOptions['paginate_get_start']] = '{start}';
  86. $this->_aOptions['paginate_url'] = BxDolPermalinks::getInstance()->permalink(bx_append_url_params($sPageLink, $aPageParams, true, ['{start}']));
  87. }
  88. unset($aParams['ajax_paginate']);
  89. }
  90. if ($aParams['type'])
  91. $this->_sFilter3Value = $aParams['type'];
  92. parent::setBrowseParams($aParams);
  93. $sField = 'added';
  94. if(!empty($this->_aBrowseParams['type']))
  95. switch($this->_aBrowseParams['type']) {
  96. case 'new':
  97. case 'index':
  98. case 'author':
  99. case 'favorite':
  100. case 'category':
  101. $sField = 'added';
  102. break;
  103. case 'featured':
  104. $sField = 'featured';
  105. break;
  106. case 'latest':
  107. $sField = 'lr_timestamp';
  108. break;
  109. case 'popular':
  110. $sField = 'views';
  111. break;
  112. }
  113. $this->_aOptions['field_order'] = $sField;
  114. $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');
  115. }
  116. public function getCode ($isDisplayHeader = true)
  117. {
  118. $sCode = parent::getCode($isDisplayHeader);
  119. if(empty($sCode))
  120. return '';
  121. return $this->_oModule->_oTemplate->parseHtmlByName('units.html', array(
  122. 'code' => $sCode,
  123. 'js_code' => $this->_oModule->_oTemplate->getJsCode('main')
  124. ));
  125. }
  126. protected function _getActionAdd ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
  127. {
  128. if($this->_oModule->checkAllowedAdd() !== CHECK_ACTION_RESULT_ALLOWED)
  129. return '';
  130. $sUrl = bx_absolute_url(BxDolPermalinks::getInstance()->permalink('page.php?i=' . $this->_oModule->_oConfig->CNF['URI_ADD_ENTRY']));
  131. unset($a['attr']['bx_grid_action_independent']);
  132. $a['attr'] = array_merge($a['attr'], array(
  133. "onclick" => "window.open('" . $sUrl . "','_self');"
  134. ));
  135. return parent::_getActionDefault ($sType, $sKey, $a, $isSmall, $isDisabled, $aRow);
  136. }
  137. protected function _getRowHead ()
  138. {
  139. return array();
  140. }
  141. protected function _getCellDefault ($mixedValue, $sKey, $aField, $aRow)
  142. {
  143. $aField['attr_cell']['class'] = 'bx-grid-table-cell-' . $sKey;
  144. return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
  145. }
  146. protected function _getCellAuthor($mixedValue, $sKey, $aField, $aRow)
  147. {
  148. $mixedValue = $this->_oModule->_oTemplate->getEntryAuthor($aRow);
  149. return self::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
  150. }
  151. protected function _getCellCategory($mixedValue, $sKey, $aField, $aRow)
  152. {
  153. $sIcon = $this->_oModule->_oTemplate->parseHtmlByName('default_category.html', []);
  154. $o = BxDolCategory::getObjectInstance('bx_forum_cats');
  155. $aCategoryData = $this->_oModule->_oDb->getCategories(array('type' => 'by_category', 'category' => $aRow['cat']));
  156. if(isset($aCategoryData['icon']))
  157. $sIcon = $this->_oTemplate->getImage($aCategoryData['icon'], array('class' => 'sys-icon'));
  158. $mixedValue = $this->_oModule->_oTemplate->parseHtmlByName('thumb.html', ['icon' => $sIcon, 'title' => $o->getCategoryTitle($aRow['cat'])]);
  159. return self::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
  160. }
  161. protected function _getCellRating($mixedValue, $sKey, $aField, $aRow)
  162. {
  163. $CNF = &$this->_oModule->_oConfig->CNF;
  164. $oObject = isset($CNF['OBJECT_SCORES']) ? BxDolScore::getObjectInstance($CNF['OBJECT_SCORES'], $aRow[$CNF['FIELD_ID']], true, $this->_oModule->_oTemplate) : null;
  165. $mixedValue = $oObject ? $oObject->getElementInline() : '';
  166. return self::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
  167. }
  168. protected function _getCellParticipants($mixedValue, $sKey, $aField, $aRow)
  169. {
  170. $CNF = &$this->_oModule->_oConfig->CNF;
  171. $oObject = isset($CNF['OBJECT_COMMENTS']) ? BxDolCmts::getObjectInstance($CNF['OBJECT_COMMENTS'], $aRow[$CNF['FIELD_ID']]) : null;
  172. $mixedValue = $oObject ? $oObject->getCounter(['show_counter_empty' => true, 'show_counter' => false, 'show_counter_style' => 'simple', 'dynamic_mode' => true, 'show_icon' => false, 'caption_empty' => '']) : '';
  173. return self::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
  174. }
  175. protected function _getCellText($mixedValue, $sKey, $aField, $aRow)
  176. {
  177. $mixedValue = $this->_oModule->_oTemplate->getEntryPreview($aRow, ['show_meta_counters' => false, 'show_meta_reply' => false]);
  178. return self::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
  179. }
  180. protected function _addJsCss()
  181. {
  182. parent::_addJsCss();
  183. $this->_oModule->_oTemplate->addJs(array('main.js'));
  184. $this->_oModule->_oTemplate->addCss(array('main.css', 'main-media-phone.css', 'main-media-tablet.css', 'main-media-desktop.css'));
  185. }
  186. protected function _getDataSql($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage)
  187. {
  188. $CNF = &$this->_oModule->_oConfig->CNF;
  189. if(strpos($sFilter, $this->_sParamsDivider) !== false)
  190. list($this->_sFilter1Value, $this->_sFilter2Value, $this->_sFilter3Value, $sFilter) = explode($this->_sParamsDivider, $sFilter);
  191. $bAuthor = false;
  192. $iAuthorId = bx_get_logged_profile_id();
  193. if(!empty($this->_aBrowseParams['author']) && ($oProfileAuthor = BxDolProfile::getInstance((int)$this->_aBrowseParams['author'])) !== false) {
  194. $bAuthor = true;
  195. $iAuthorId = $oProfileAuthor->id();
  196. }
  197. // featured
  198. if ($this->_sFilter3Value == BX_FORUM_FILTER_ORDER_FEATURED) {
  199. $this->_aBrowseParams['where'] = ['fld' => 'featured', 'val' => 0, 'opr' => '<>'];
  200. }
  201. // partaken
  202. if ($this->_sFilter3Value == BX_FORUM_FILTER_ORDER_PARTAKEN) {
  203. $this->_aBrowseParams['select'] = [
  204. 'tbla' => 'tco',
  205. 'fld' => 'cmt_author_id',
  206. ];
  207. $this->_aBrowseParams['join'] = [
  208. 'tp' => 'LEFT',
  209. 'tbl1' => 'bx_forum_cmts',
  210. 'tbl1a' => 'tco',
  211. 'fld1' => 'cmt_object_id',
  212. 'tbl2' => 'bx_forum_discussions',
  213. 'fld2' => 'id'
  214. ];
  215. $this->_aBrowseParams['where'] = ['grp' => true, 'opr' => 'OR', 'cnds' => [[
  216. 'tbl' => 'bx_forum_discussions',
  217. 'fld' => 'author',
  218. 'val' => $iAuthorId,
  219. 'opr' => '='
  220. ], [
  221. 'tbl' => 'tco',
  222. 'fld' => 'cmt_author_id',
  223. 'val' => $iAuthorId,
  224. 'opr' => '='
  225. ]
  226. ]];
  227. $this->_aBrowseParams['group_by'] = [
  228. 'tbl' => 'bx_forum_discussions',
  229. 'fld' => 'id',
  230. ];
  231. }
  232. //FAVORITE
  233. if ($this->_sFilter3Value == BX_FORUM_FILTER_ORDER_FAVORITE){
  234. $oProfile = BxDolProfile:: getInstance(bx_process_input(bx_get('profile_id'), BX_DATA_INT));
  235. if(!$oProfile)
  236. $oProfile = BxDolProfile::getInstance();
  237. if(!$oProfile)
  238. return '';
  239. $iProfileAuthor = $oProfile->id();
  240. $oFavorite = $this->_oModule->getObjectFavorite();
  241. if(!$oFavorite->isPublic() && $iProfileAuthor != bx_get_logged_profile_id())
  242. return '';
  243. $aConditions = $oFavorite->getConditionsTrack($CNF['TABLE_ENTRIES'], 'id', $iProfileAuthor);
  244. if(empty($aConditions) || !is_array($aConditions))
  245. return '';
  246. $aJoinGroup = array('grp' => true, 'cnds' => array());
  247. if(!empty($aConditions['join']))
  248. foreach($aConditions['join'] as $aCondition)
  249. $aJoinGroup['cnds'][] = array(
  250. 'tp' => $aCondition['type'],
  251. 'tbl1' => $aCondition['table'],
  252. 'fld1' => $aCondition['onField'],
  253. 'tbl2' => $aCondition['mainTable'],
  254. 'fld2' => $aCondition['mainField']
  255. );
  256. $aWhereGroup = array('grp' => true, 'opr' => 'AND', 'cnds' => array());
  257. if(!empty($aConditions['restriction']))
  258. foreach($aConditions['restriction'] as $aCondition)
  259. $aWhereGroup['cnds'][] = array(
  260. 'tbl' => (!empty($aCondition['table']) ? $aCondition['table'] : ''),
  261. 'fld' => $aCondition['field'],
  262. 'val' => $aCondition['value'],
  263. 'opr' => $aCondition['operator']
  264. );
  265. $this->_aBrowseParams['author'] = $iProfileAuthor;
  266. $this->_aBrowseParams['join'] = $aJoinGroup;
  267. $this->_aBrowseParams['where'] = $aWhereGroup;
  268. }
  269. $sSelectClause = $sJoinClause = $sWhereClause = $sGroupByClause = '';
  270. //--- Check status
  271. $sWhereClause .= " AND `{$CNF['TABLE_ENTRIES']}`.`" . $CNF['FIELD_STATUS'] . "`='active'";
  272. $sWhereClause .= " AND `{$CNF['TABLE_ENTRIES']}`.`" . $CNF['FIELD_STATUS_ADMIN'] . "`='active'";
  273. //--- Check privacy
  274. $bIncludeContexts = isset($this->_aBrowseParams['include_contexts']) && $this->_aBrowseParams['include_contexts'];
  275. $sPrivacy = $CNF['OBJECT_PRIVACY_VIEW'];
  276. $oPrivacy = BxDolPrivacy::getObjectInstance($sPrivacy);
  277. $aCondition = $oPrivacy ? $oPrivacy->{'getContentPublic' . ($bIncludeContexts ? 'AndInContext' : '') . 'AsSQLPart'}($bAuthor ? $iAuthorId : 0) : [];
  278. if(isset($aCondition['join']))
  279. $sJoinClause .= $aCondition['join'];
  280. if(isset($aCondition['where']))
  281. $sWhereClause .= $aCondition['where'];
  282. //--- Check browse params
  283. if(!empty($this->_aBrowseParams['select']) && is_array($this->_aBrowseParams['select'])) {
  284. $sSelectClauseBrowse = $this->_getSqlSelectFromGroup($this->_aBrowseParams['select']);
  285. if(!empty($sSelectClauseBrowse))
  286. $sSelectClause .= ", " . $sSelectClauseBrowse;
  287. }
  288. if(!empty($this->_aBrowseParams['join']) && is_array($this->_aBrowseParams['join'])) {
  289. $sJoinClauseBrowse = $this->_getSqlJoinFromGroup($this->_aBrowseParams['join']);
  290. if(!empty($sJoinClauseBrowse))
  291. $sJoinClause .= " " . $sJoinClauseBrowse;
  292. }
  293. if(!empty($this->_aBrowseParams['where']) && is_array($this->_aBrowseParams['where'])) {
  294. $sWhereClauseBrowse = $this->_getSqlWhereFromGroup($this->_aBrowseParams['where']);
  295. if(!empty($sWhereClauseBrowse))
  296. $sWhereClause .= " AND " . $sWhereClauseBrowse;
  297. }
  298. if(!empty($this->_aBrowseParams['group_by']) && is_array($this->_aBrowseParams['group_by'])) {
  299. $sGroupByClauseBrowse = $this->_getSqlGroupByFromGroup($this->_aBrowseParams['group_by']);
  300. if(!empty($sGroupByClauseBrowse))
  301. $sGroupByClause .= " GROUP BY " . $sGroupByClauseBrowse;
  302. }
  303. $sFilterSql = "";
  304. // filter by resolved status
  305. if(!empty($this->_sFilter1Value))
  306. $sWhereClause .= " AND `" . $CNF['TABLE_ENTRIES'] . "`.`" . $CNF['FIELD_RESOLVABLE'] . "` = 1 AND `" . $CNF['TABLE_ENTRIES'] . "`.`" . $CNF['FIELD_RESOLVE'] . "` = " . ($this->_sFilter1Value == BX_FORUM_FILTER_STATUS_RESOLVED ? 1 : 0);
  307. // filter out posts of suspended members
  308. $sJoinClause .= " INNER JOIN `sys_profiles` AS `p` ON (`p`.`id` = ABS(`{$CNF['TABLE_ENTRIES']}`.`{$CNF['FIELD_AUTHOR']}`) AND `p`.`status` = 'active') ";
  309. // filter out posts by content filter
  310. $oCf = BxDolContentFilter::getInstance();
  311. if($oCf->isEnabled())
  312. $sWhereClause .= $oCf->getSQLParts ($CNF['TABLE_ENTRIES'], $CNF['FIELD_CF']);
  313. // filter by badges
  314. if(isset($this->_sFilter2Value) && $this->_sFilter2Value != '') {
  315. $aObjects = BxDolBadges::getInstance()->getData(['type' => 'by_module&badge', 'badge_id' => $this->_sFilter2Value, 'module' => $this->_oModule->_aModule['name']]);
  316. $sWhereClause .= " AND `" . $CNF['TABLE_ENTRIES'] . "`.`" . $CNF['FIELD_ID'] . "` IN (" . implode(',', $aObjects ) . ")";
  317. }
  318. $this->_aOptions['source'] = sprintf($this->_sDefaultSource, $sSelectClause, $sJoinClause, $sWhereClause, $sGroupByClause);
  319. return parent::_getDataSql($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage);
  320. }
  321. protected function _getDataSqlOrderClause($sOrderByFilter, $sOrderField, $sOrderDir, $bFieldsOnly = false)
  322. {
  323. $CNF = &$this->_oModule->_oConfig->CNF;
  324. if(isset($this->_sFilter3Value) && $this->_sFilter3Value != ''){
  325. $sOrderField = $this->_aBrowseParams['type'] = $this->_sFilter3Value;
  326. if (!empty($this->_aBrowseParams['type']) && $this->_aBrowseParams['type'] != 'partaken'){
  327. $this->_aBrowseParams['type'] = $this->_aBrowseParams['type'] = $this->_sFilter3Value;
  328. }
  329. }
  330. $sOrder = parent::_getDataSqlOrderClause($sOrderByFilter, $sOrderField, $sOrderDir, true);
  331. if(!empty($this->_aBrowseParams['type']))
  332. switch($this->_aBrowseParams['type']) {
  333. case 'top':
  334. $aPartsUp = $aPartsDown = array(0);
  335. if(($oVote = BxDolVote::getObjectInstance($CNF['OBJECT_VOTES'], 0, false)) !== false && $oVote->isEnabled()) {
  336. $aVote = $oVote->getSystemInfo();
  337. if(!empty($aVote['trigger_table']) && !empty($aVote['trigger_field_count']))
  338. $aPartsUp[] = '`' . $aVote['trigger_table'] . '`.`' . $aVote['trigger_field_count'] . '`';
  339. }
  340. if(($oReaction = BxDolVote::getObjectInstance($CNF['OBJECT_REACTIONS'], 0, false)) !== false && $oReaction->isEnabled()) {
  341. $aReaction = $oReaction->getSystemInfo();
  342. if(!empty($aReaction['trigger_table']) && !empty($aReaction['trigger_field_count']))
  343. $aPartsUp[] = '`' . $aReaction['trigger_table'] . '`.`' . $aReaction['trigger_field_count'] . '`';
  344. }
  345. if(($oScore = BxDolScore::getObjectInstance($CNF['OBJECT_SCORES'], 0, false)) !== false && $oScore->isEnabled()) {
  346. $aScore = $oScore->getSystemInfo();
  347. if(!empty($aScore['trigger_table']) && !empty($aScore['trigger_field_cup']) && !empty($aScore['trigger_field_cdown'])) {
  348. $aPartsUp[] = '`' . $aScore['trigger_table'] . '`.`' . $aScore['trigger_field_cup'] . '`';
  349. $aPartsDown[] = '`' . $aScore['trigger_table'] . '`.`' . $aScore['trigger_field_cdown'] . '`';
  350. }
  351. }
  352. $sOrder = pow(10, 8) . ' * ((' . implode(' + ', $aPartsUp) . ') - (' . implode(' + ', $aPartsDown) . ')) / (UNIX_TIMESTAMP() - `' . $this->_aOptions['table'] . '`.`' . $CNF['FIELD_ADDED'] . '`) ' . $this->_sDefaultSortingOrder;
  353. break;
  354. case 'partaken':
  355. $sOrder = 'MAX(IF(`tco`.`cmt_time`, `tco`.`cmt_time`, `' . $CNF['TABLE_ENTRIES'] . '`.`' . $CNF['FIELD_ADDED'] . '`)) ' . $this->_sDefaultSortingOrder;
  356. break;
  357. }
  358. return " ORDER BY `" . $CNF['TABLE_ENTRIES'] . "`.`" . $CNF['FIELD_STICK'] . "` DESC, " . $sOrder;
  359. }
  360. protected function _getSqlSelectFromGroup($aGrp)
  361. {
  362. if(!isset($aGrp['grp']) || (bool)$aGrp['grp'] !== true)
  363. return $this->_getSqlSelectFromCondition($aGrp);
  364. $sResult = "";
  365. if(empty($aGrp['cnds']) || !is_array($aGrp['cnds']))
  366. return $sResult;
  367. $sOprGrp = ", ";
  368. foreach($aGrp['cnds'] as $aCnd) {
  369. $sResultCnd = $this->_getSqlSelectFromCondition($aCnd);
  370. if(!empty($sResultCnd))
  371. $sResult .= $sOprGrp . $sResultCnd;
  372. }
  373. return trim($sResult, $sOprGrp);
  374. }
  375. protected function _getSqlSelectFromCondition($aCnd)
  376. {
  377. $sResult = "";
  378. if(!isset($aCnd['fld']))
  379. return $sResult;
  380. $sResult = "`" . $aCnd['fld'] . "`";
  381. if(!empty($aCnd['tbla']))
  382. $sResult = "`" . $aCnd['tbla'] . "`." . $sResult;
  383. else if(!empty($aCnd['tbl']))
  384. $sResult = "`" . $aCnd['tbl'] . "`." . $sResult;
  385. return $sResult;
  386. }
  387. protected function _getSqlJoinFromGroup($aGrp)
  388. {
  389. if(!isset($aGrp['grp']) || (bool)$aGrp['grp'] !== true)
  390. return $this->_getSqlJoinFromCondition($aGrp);
  391. $sResult = "";
  392. if(empty($aGrp['cnds']) || !is_array($aGrp['cnds']))
  393. return $sResult;
  394. $sOprGrp = " ";
  395. foreach($aGrp['cnds'] as $aCnd) {
  396. $sResultCnd = $this->_getSqlJoinFromCondition($aCnd);
  397. if(!empty($sResultCnd))
  398. $sResult .= $sOprGrp . $sResultCnd;
  399. }
  400. return trim($sResult, $sOprGrp);
  401. }
  402. protected function _getSqlJoinFromCondition($aCnd)
  403. {
  404. $sResult = "";
  405. if(!isset($aCnd['tp'], $aCnd['tbl1'], $aCnd['fld1'], $aCnd['fld2']))
  406. return $sResult;
  407. $sTbl1A = $aCnd['tbl1'];
  408. if(!empty($aCnd['tbl1a']))
  409. $sTbl1A = $aCnd['tbl1a'];
  410. $sField1 = "`" . $sTbl1A . "`.`" . $aCnd['fld1'] . "`";
  411. $sField2 = "`" . $aCnd['fld2'] . "`";
  412. if(!empty($aCnd['tbl2a']))
  413. $sField2 = "`" . $aCnd['tbl2a'] . "`." . $sField2;
  414. else if(!empty($aCnd['tbl2']))
  415. $sField2 = "`" . $aCnd['tbl2'] . "`." . $sField2;
  416. return $aCnd['tp'] . " JOIN `" . $aCnd['tbl1'] . "` AS `" . $sTbl1A . "` ON (" . $sField1 . " = " . $sField2 . ")";
  417. }
  418. protected function _getSqlWhereFromGroup($aGrp)
  419. {
  420. if(!isset($aGrp['grp']) || (bool)$aGrp['grp'] !== true)
  421. return $this->_getSqlWhereFromCondition($aGrp);
  422. $sResult = "";
  423. if(!isset($aGrp['opr'], $aGrp['cnds']) || empty($aGrp['cnds']) || !is_array($aGrp['cnds']))
  424. return $sResult;
  425. $sOprGrp = " " . $aGrp['opr'] . " ";
  426. foreach($aGrp['cnds'] as $aCnd) {
  427. $sMethod = '_getSqlWhereFrom' . (isset($aGrp['grp']) && (bool)$aGrp['grp'] === true ? 'Group' : 'Condition');
  428. $sResultCnd = $this->$sMethod($aCnd);
  429. if(!empty($sResultCnd))
  430. $sResult .= $sOprGrp . $sResultCnd;
  431. }
  432. $sResult = trim($sResult, $sOprGrp);
  433. if(!empty($sResult))
  434. $sResult = "(" . $sResult . ")";
  435. return $sResult;
  436. }
  437. protected function _getSqlWhereFromCondition($aCnd)
  438. {
  439. $sResult = "";
  440. if(!isset($aCnd['fld'], $aCnd['val'], $aCnd['opr']))
  441. return $sResult;
  442. $sMethod = '_getSqlWhereFromCondition' . bx_gen_method_name($aCnd['fld']);
  443. if(method_exists($this, $sMethod)) {
  444. $mixedResult = $this->$sMethod($aCnd);
  445. if(is_array($mixedResult) && isset($mixedResult['fld'], $mixedResult['val'], $mixedResult['opr']))
  446. $aCnd = $mixedResult;
  447. else
  448. return $mixedResult;
  449. }
  450. $sField = "`" . $aCnd['fld'] . "`";
  451. if(!empty($aCnd['tbl']))
  452. $sField = "`" . $aCnd['tbl'] . "`." . $sField;
  453. switch($aCnd['opr']) {
  454. case 'IN':
  455. if(empty($aCnd['val']) || !is_array($aCnd['val']))
  456. break;
  457. $sResult .= $sField . " IN (" . $this->_oModule->_oDb->implode_escape($aCnd['val']) . ")";
  458. break;
  459. case 'LIKE':
  460. $sResult .= $sField . " LIKE " . $this->_oModule->_oDb->escape('%' . $aCnd['val'] . '%');
  461. break;
  462. default:
  463. $sResult .= $sField . " " . $aCnd['opr'] . " " . $this->_oModule->_oDb->escape($aCnd['val']);
  464. }
  465. return $sResult;
  466. }
  467. protected function _getSqlGroupByFromGroup($aGrp)
  468. {
  469. if(!isset($aGrp['grp']) || (bool)$aGrp['grp'] !== true)
  470. return $this->_getSqlGroupByFromCondition($aGrp);
  471. $sResult = "";
  472. if(empty($aGrp['cnds']) || !is_array($aGrp['cnds']))
  473. return $sResult;
  474. $sOprGrp = ", ";
  475. foreach($aGrp['cnds'] as $aCnd) {
  476. $sResultCnd = $this->_getSqlGroupByFromCondition($aCnd);
  477. if(!empty($sResultCnd))
  478. $sResult .= $sOprGrp . $sResultCnd;
  479. }
  480. return trim($sResult, $sOprGrp);
  481. }
  482. protected function _getSqlGroupByFromCondition($aCnd)
  483. {
  484. $sResult = "";
  485. if(!isset($aCnd['fld']))
  486. return $sResult;
  487. $sResult = "`" . $aCnd['fld'] . "`";
  488. if(!empty($aCnd['tbla']))
  489. $sResult = "`" . $aCnd['tbla'] . "`." . $sResult;
  490. else if(!empty($aCnd['tbl']))
  491. $sResult = "`" . $aCnd['tbl'] . "`." . $sResult;
  492. return $sResult;
  493. }
  494. protected function _getSqlWhereFromConditionAuthorComment($aCnd)
  495. {
  496. $CNF = &$this->_oModule->_oConfig->CNF;
  497. $aEntriesIds = $this->_oModule->_oDb->getComments(array('type' => 'entries_author_search', 'author' => $aCnd['val']));
  498. if(!empty($aEntriesIds) && is_array($aEntriesIds))
  499. return array('tbl' => $CNF['TABLE_ENTRIES'], 'fld' => 'id', 'val' => $aEntriesIds, 'opr' => 'IN');
  500. return '';
  501. }
  502. protected function _getSqlWhereFromConditionKeywordComment($aCnd)
  503. {
  504. $CNF = &$this->_oModule->_oConfig->CNF;
  505. $aEntriesIds = $this->_oModule->_oDb->getComments(array('type' => 'entries_keyword_search', 'keyword' => $aCnd['val']));
  506. if(!empty($aEntriesIds) && is_array($aEntriesIds))
  507. return array('tbl' => $CNF['TABLE_ENTRIES'], 'fld' => 'id', 'val' => $aEntriesIds, 'opr' => 'IN');
  508. return '';
  509. }
  510. protected function _getFilterControls ()
  511. {
  512. parent::_getFilterControls();
  513. return $this->_getFilterSelectOne($this->_sFilter3Name, $this->_sFilter3Value, $this->_aFilter3Values) . $this->_getFilterSelectOne($this->_sFilter1Name, $this->_sFilter1Value, $this->_aFilter1Values) . (count($this->_aFilter2Values) > 0 ? $this->_getFilterSelectOne($this->_sFilter2Name, $this->_sFilter2Value, $this->_aFilter2Values) : '') . $this->_getSearchInput();
  514. }
  515. protected function _getFilterOnChange()
  516. {
  517. return $this->_oModule->_oConfig->getJsObject('main') . '.onChangeFilter(this)';
  518. }
  519. protected function _getFilterSelectOne($sFilterName, $sFilterValue, $aFilterValues, $bAddSelectOne = false, $bAsArray = false)
  520. {
  521. return parent::_getFilterSelectOne($sFilterName, $sFilterValue, $aFilterValues, $bAddSelectOne, $bAsArray);
  522. }
  523. }
  524. /** @} */