/** * Действие поиск поста: */ public function searchAction(Application $application, Template $template) { $session = Session::getInstance(); $this['form_errors'] = array(); $this['blog_form'] = array(); $template->setParameter('title', 'Поиск постов'); $template->setParameter('board_id', 'news'); if ($_SERVER['REQUEST_METHOD'] == 'POST') { $validator = new ValidatorHelper($_POST); //$validator -> assertExists('query', 'Введите текст запроса'); $validator->assertLength('query', 80, 'Слишком длинный запрос поиска'); $validator->assertExists('order', 'Не указан порядок сортировки'); $validator->assertExists('sort', 'Не указано направление сортировки'); $this['form_errors'] = $validator->getValidationResults(); $this['blog_form'] = $_POST; if ($validator->isValid()) { $search = new SphinxClient(); $search->SetServer('localhost', 3312); switch ($_POST['order']) { default: case 'relevance': $sort = $_POST['sort'] == 'desc' ? '@relevance DESC, created_at DESC, @id DESC' : '@relevance ASC, created_at ASC, @id ASC'; $search->SetSortMode(SPH_SORT_EXTENDED, $sort); break; case 'created_at': $sort = $_POST['sort'] == 'desc' ? SPH_SORT_ATTR_DESC : SPH_SORT_ATTR_ASC; $search->SetSortMode($sort, 'created_at'); break; case 'updated_at': $sort = $_POST['sort'] == 'desc' ? SPH_SORT_ATTR_DESC : SPH_SORT_ATTR_ASC; $search->SetSortMode($sort, 'updated_at'); break; case 'rate': $sort = $_POST['sort'] == 'desc' ? SPH_SORT_ATTR_DESC : SPH_SORT_ATTR_ASC; $search->SetSortMode($sort, 'rate'); break; case 'comments': $sort = $_POST['sort'] == 'desc' ? SPH_SORT_ATTR_DESC : SPH_SORT_ATTR_ASC; $search->SetSortMode($sort, 'comments'); break; } $search->SetWeights(array('link' => 50, 'title' => 40, 'text' => 20, 'text_full' => 10)); $search->SetLimits(0, 60); if (isset($_POST['category']) && $_POST['category'] != 0) { $search->SetFilter('category', array($_POST['category'])); } $result = $search->Query($_POST['query'], 'posts'); if ($result && array_key_exists('matches', $result) && is_array($result['matches'])) { $ids = array_keys($result['matches']); $posts = Blog_BlogPostsModel::GetPostsByIds($ids); $this['posts'] = $posts; $template->setParameter('total', sizeof($result['matches'])); $template->setParameter('total_found', $result['total_found']); } else { $this['form_errors'] = array('По данному запросу ничего не найдено'); } } } EventModel::getInstance()->Broadcast('view_search_post'); return true; }
/** * Поиск постов: */ public function postSearchAction(Application $application, Template $template) { $template->setParameter('menu', 'posts'); $template->setParameter('submenu', 'post_search'); if ($_SERVER['REQUEST_METHOD'] == 'POST') { if (!empty($_POST['id'])) { $post = Blog_BlogPostsModel::GetPost($_POST['id']); if ($post) { $this['posts'] = array($post); } } else { $search = new SphinxClient(); $search->SetServer('localhost', 3312); $search->SetSortMode(SPH_SORT_EXTENDED, '@relevance DESC, created_at DESC, @id DESC'); $search->SetLimits(0, 60); $search->SetWeights(array('title' => 40, 'text' => 20, 'text_full' => 10)); if (isset($_POST['category'])) { $search->SetFilter('category', $_POST['category']); } $result = $search->Query($_POST['query'], '*'); if (is_array($result['matches'])) { $ids = array_keys($result['matches']); $this['posts'] = Blog_BlogPostsModel::GetPostsByIds($ids); } } } return true; }