PageRenderTime 64ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/features/cerberusweb.kb/api/sc/kb.php

https://github.com/rmiddle/cerb5
PHP | 302 lines | 225 code | 64 blank | 13 comment | 21 complexity | 4b8745b1a730f6eb6313c888afe6a576 MD5 | raw file
  1. <?php
  2. class UmScKbController extends Extension_UmScController {
  3. const PARAM_KB_ROOTS = 'kb.roots';
  4. const SESSION_ARTICLE_LIST = 'kb_article_list';
  5. function isVisible() {
  6. // Disable the KB if no categories were selected
  7. $sKbRoots = DAO_CommunityToolProperty::get(ChPortalHelper::getCode(),self::PARAM_KB_ROOTS, '');
  8. $kb_roots = !empty($sKbRoots) ? unserialize($sKbRoots) : array();
  9. return !empty($kb_roots);
  10. }
  11. function renderSidebar(DevblocksHttpResponse $response) {
  12. $tpl = DevblocksPlatform::getTemplateService();
  13. @$q = DevblocksPlatform::importGPC($_POST['q'],'string','');
  14. $tpl->assign('q', $q);
  15. $tpl->display("devblocks:cerberusweb.kb:portal_".ChPortalHelper::getCode() . ":support_center/kb/sidebar.tpl");
  16. }
  17. function writeResponse(DevblocksHttpResponse $response) {
  18. $tpl = DevblocksPlatform::getTemplateService();
  19. $umsession = ChPortalHelper::getSession();
  20. $stack = $response->path;
  21. array_shift($stack); // kb
  22. // KB Roots
  23. $sKbRoots = DAO_CommunityToolProperty::get(ChPortalHelper::getCode(),self::PARAM_KB_ROOTS, '');
  24. $kb_roots = !empty($sKbRoots) ? unserialize($sKbRoots) : array();
  25. $kb_roots_str = '0';
  26. if(!empty($kb_roots))
  27. $kb_roots_str = implode(',', array_keys($kb_roots));
  28. switch(array_shift($stack)) {
  29. case 'search':
  30. @$q = DevblocksPlatform::importGPC($_REQUEST['q'],'string','');
  31. @$scope = DevblocksPlatform::importGPC($_REQUEST['scope'],'string','all');
  32. $tpl->assign('q', $q);
  33. $tpl->assign('scope', $scope);
  34. if(null == ($view = UmScAbstractViewLoader::getView('', UmSc_KbArticleView::DEFAULT_ID))) {
  35. $view = new UmSc_KbArticleView();
  36. }
  37. $view->name = "";
  38. $params = array();
  39. switch($scope) {
  40. default:
  41. case "all":
  42. $params[SearchFields_KbArticle::FULLTEXT_ARTICLE_CONTENT] = new DevblocksSearchCriteria(SearchFields_KbArticle::FULLTEXT_ARTICLE_CONTENT,DevblocksSearchCriteria::OPER_FULLTEXT,array($q,'all'));
  43. break;
  44. case "any":
  45. $params[SearchFields_KbArticle::FULLTEXT_ARTICLE_CONTENT] = new DevblocksSearchCriteria(SearchFields_KbArticle::FULLTEXT_ARTICLE_CONTENT,DevblocksSearchCriteria::OPER_FULLTEXT,array($q,'any'));
  46. break;
  47. case "phrase":
  48. $params[SearchFields_KbArticle::FULLTEXT_ARTICLE_CONTENT] = new DevblocksSearchCriteria(SearchFields_KbArticle::FULLTEXT_ARTICLE_CONTENT,DevblocksSearchCriteria::OPER_FULLTEXT,array($q,'phrase'));
  49. break;
  50. }
  51. $params[SearchFields_KbArticle::TOP_CATEGORY_ID] = new DevblocksSearchCriteria(SearchFields_KbArticle::TOP_CATEGORY_ID,'in',array_keys($kb_roots));
  52. $view->addParams($params, true);
  53. UmScAbstractViewLoader::setView($view->id, $view);
  54. $tpl->assign('view', $view);
  55. $tpl->display("devblocks:cerberusweb.kb:portal_".ChPortalHelper::getCode() . ":support_center/kb/search_results.tpl");
  56. break;
  57. case 'article':
  58. if(empty($kb_roots))
  59. return;
  60. $id = intval(array_shift($stack));
  61. list($articles, $count) = DAO_KbArticle::search(
  62. array(),
  63. array(
  64. new DevblocksSearchCriteria(SearchFields_KbArticle::ID,'=',$id),
  65. new DevblocksSearchCriteria(SearchFields_KbArticle::TOP_CATEGORY_ID,'in',array_keys($kb_roots))
  66. ),
  67. -1,
  68. 0,
  69. null,
  70. null,
  71. false
  72. );
  73. if(!isset($articles[$id]))
  74. break;
  75. $article = DAO_KbArticle::get($id);
  76. $tpl->assign('article', $article);
  77. @$article_list = $umsession->getProperty(self::SESSION_ARTICLE_LIST, array());
  78. if(!empty($article) && !isset($article_list[$id])) {
  79. DAO_KbArticle::update($article->id, array(
  80. DAO_KbArticle::VIEWS => ++$article->views
  81. ));
  82. $article_list[$id] = $id;
  83. $umsession->setProperty(self::SESSION_ARTICLE_LIST, $article_list);
  84. }
  85. $categories = DAO_KbCategory::getAll();
  86. $tpl->assign('categories', $categories);
  87. $cats = DAO_KbArticle::getCategoriesByArticleId($id);
  88. $breadcrumbs = array();
  89. $trails = array();
  90. foreach($cats as $cat_id) {
  91. $pid = $cat_id;
  92. $trail = array();
  93. while($pid) {
  94. array_unshift($trail,$pid);
  95. $pid = $categories[$pid]->parent_id;
  96. }
  97. // Remove any breadcrumbs not in this SC profile
  98. if(isset($kb_roots[reset($trail)]))
  99. $trails[] = $trail;
  100. }
  101. // Remove redundant trails
  102. foreach($trails as $idx => $trail) {
  103. foreach($trails as $c_idx => $compare_trail) {
  104. if($idx != $c_idx && count($compare_trail) >= count($trail)) {
  105. if(array_slice($compare_trail,0,count($trail))==$trail) {
  106. unset($trails[$idx]);
  107. }
  108. }
  109. }
  110. }
  111. $tpl->assign('breadcrumbs',$trails);
  112. // Attachments
  113. $attachments_map = DAO_AttachmentLink::getLinksAndAttachments(CerberusContexts::CONTEXT_KB_ARTICLE, $id);
  114. $tpl->assign('attachments_map', $attachments_map);
  115. $tpl->display("devblocks:cerberusweb.kb:portal_".ChPortalHelper::getCode() . ":support_center/kb/article.tpl");
  116. break;
  117. default:
  118. case 'browse':
  119. @$root = intval(array_shift($stack));
  120. $tpl->assign('root_id', $root);
  121. $categories = DAO_KbCategory::getAll();
  122. $tpl->assign('categories', $categories);
  123. $tree_map = DAO_KbCategory::getTreeMap(0);
  124. // Remove other top-level categories
  125. if(is_array($tree_map[0]))
  126. foreach($tree_map[0] as $child_id => $count) {
  127. if(!isset($kb_roots[$child_id]))
  128. unset($tree_map[0][$child_id]);
  129. }
  130. // Remove empty categories
  131. if(is_array($tree_map[0]))
  132. foreach($tree_map as $node_id => $children) {
  133. foreach($children as $child_id => $count) {
  134. if(empty($count)) {
  135. @$pid = $categories[$child_id]->parent_id;
  136. unset($tree_map[$pid][$child_id]);
  137. unset($tree_map[$child_id]);
  138. }
  139. }
  140. }
  141. $tpl->assign('tree', $tree_map);
  142. // Breadcrumb // [TODO] API-ize inside Model_KbTree ?
  143. $breadcrumb = array();
  144. $pid = $root;
  145. while(0 != $pid) {
  146. $breadcrumb[] = $pid;
  147. $pid = $categories[$pid]->parent_id;
  148. }
  149. $tpl->assign('breadcrumb',array_reverse($breadcrumb));
  150. $tpl->assign('mid', @intval(ceil(count($tree_map[$root])/2)));
  151. // Articles
  152. if(null == ($view = UmScAbstractViewLoader::getView('', UmSc_KbArticleView::DEFAULT_ID))) {
  153. $view = new UmSc_KbArticleView();
  154. }
  155. if(!empty($root)) {
  156. $view->addParams(array(
  157. new DevblocksSearchCriteria(SearchFields_KbArticle::CATEGORY_ID,'=',$root),
  158. new DevblocksSearchCriteria(SearchFields_KbArticle::TOP_CATEGORY_ID,'in',array_keys($kb_roots)),
  159. ), true);
  160. } else {
  161. // Most Popular Articles
  162. $view->addParams(array(
  163. new DevblocksSearchCriteria(SearchFields_KbArticle::TOP_CATEGORY_ID,'in',array_keys($kb_roots)),
  164. ), true);
  165. }
  166. $view->name = "";
  167. $view->renderSortBy = SearchFields_KbArticle::UPDATED;
  168. $view->renderSortAsc = false;
  169. $view->renderPage = 0;
  170. $view->renderLimit = 10;
  171. UmScAbstractViewLoader::setView($view->id, $view);
  172. $tpl->assign('view', $view);
  173. $tpl->display("devblocks:cerberusweb.kb:portal_".ChPortalHelper::getCode() . ":support_center/kb/index.tpl");
  174. break;
  175. }
  176. }
  177. function configure(Model_CommunityTool $instance) {
  178. $tpl = DevblocksPlatform::getTemplateService();
  179. // Knowledgebase
  180. $tree_map = DAO_KbCategory::getTreeMap();
  181. $tpl->assign('tree_map', $tree_map);
  182. $levels = DAO_KbCategory::getTree(0);
  183. $tpl->assign('levels', $levels);
  184. $categories = DAO_KbCategory::getAll();
  185. $tpl->assign('categories', $categories);
  186. $sKbRoots = DAO_CommunityToolProperty::get($instance->code,self::PARAM_KB_ROOTS, '');
  187. $kb_roots = !empty($sKbRoots) ? unserialize($sKbRoots) : array();
  188. $tpl->assign('kb_roots', $kb_roots);
  189. $tpl->display("devblocks:cerberusweb.kb::portal/sc/config/kb.tpl");
  190. }
  191. function saveConfiguration(Model_CommunityTool $instance) {
  192. // KB
  193. @$aKbRoots = DevblocksPlatform::importGPC($_POST['category_ids'],'array',array());
  194. $aKbRoots = array_flip($aKbRoots);
  195. DAO_CommunityToolProperty::set($instance->code, self::PARAM_KB_ROOTS, serialize($aKbRoots));
  196. }
  197. };
  198. class UmSc_KbArticleView extends C4_AbstractView {
  199. const DEFAULT_ID = 'sc_kb';
  200. function __construct() {
  201. $this->id = self::DEFAULT_ID;
  202. $this->name = 'Articles';
  203. $this->renderSortBy = 'kb_updated';
  204. $this->renderSortAsc = false;
  205. $this->view_columns = array(
  206. SearchFields_KbArticle::TITLE,
  207. SearchFields_KbArticle::UPDATED,
  208. SearchFields_KbArticle::VIEWS,
  209. );
  210. $this->addParamsHidden(array(
  211. SearchFields_KbArticle::ID,
  212. SearchFields_KbArticle::FORMAT,
  213. ));
  214. $this->doResetCriteria();
  215. }
  216. function getData() {
  217. $objects = DAO_KbArticle::search(
  218. $this->view_columns,
  219. $this->getParams(),
  220. $this->renderLimit,
  221. $this->renderPage,
  222. $this->renderSortBy,
  223. $this->renderSortAsc,
  224. $this->renderTotal
  225. );
  226. return $objects;
  227. }
  228. function render() {
  229. //$this->_sanitize();
  230. $tpl = DevblocksPlatform::getTemplateService();
  231. $tpl->assign('id', $this->id);
  232. $tpl->assign('view', $this);
  233. $tpl->display("devblocks:cerberusweb.kb:portal_".ChPortalHelper::getCode() . ":support_center/kb/view.tpl");
  234. }
  235. function getFields() {
  236. return SearchFields_KbArticle::getFields();
  237. }
  238. };