BxForumGrid.php 26 KB

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