function search_blogs($query, $look) { $inDB = cmsDatabase::getInstance(); $searchModel = cms_model_search::initModel(); global $_LANG; $sql = "SELECT con.*, cat.title cat_title, cat.id cat_id, cat.owner owner, cat.user_id user_id, cat.seolink as bloglink\n\t\t\tFROM cms_blog_posts con\n\t\t\tINNER JOIN cms_blogs cat ON cat.id = con.blog_id AND cat.allow_who = 'all' AND cat.owner = 'user'\n\t\t\tWHERE MATCH(con.title, con.content) AGAINST ('{$query}' IN BOOLEAN MODE) AND con.published = 1 LIMIT 100"; $result = $inDB->query($sql); if ($inDB->num_rows($result)) { cmsCore::loadLanguage('components/blogs'); cmsCore::loadModel('blogs'); $model = new cms_model_blogs(); while ($item = $inDB->fetch_assoc($result)) { $result_array = array(); $result_array['link'] = $model->getPostURL($item['bloglink'], $item['seolink']); $result_array['place'] = $_LANG['BLOG'] . ' «' . $item['cat_title'] . '»'; $result_array['placelink'] = $model->getBlogURL($item['bloglink']); $result_array['description'] = $searchModel->getProposalWithSearchWord($item['content_html']); $result_array['title'] = $item['title']; $result_array['pubdate'] = $item['pubdate']; $result_array['session_id'] = session_id(); $searchModel->addResult($result_array); } } return; }
private function getRelatedPosts($item) { if (!($this->inCore->do == 'post' && $this->inCore->component == 'blogs')) { return $item; } $current_post_id = $item['id']; $current_blog_id = $item['blog_id']; $current_title = $item['title']; $search_mode = (int) $this->config['search_mode']; $tags_mode = (int) $this->config['tags_mode']; $add_mode = (int) $this->config['add_mode']; $need_found = (int) $this->config['limit']; $truncate = (int) $this->config['truncate']; $blank_photo = strip_tags($this->config['blank_photo']); $cash_time = (int) $this->config['cash_time']; $found_posts = array(); $exception = ''; // защита от дурака if ($need_found < 1 || $truncate < 20) { return $item; } // Опционально может быть использовано кеширование if (cmsCore::isCached('rel_posts', $current_post_id, $cash_time, 'HOUR')) { $cache = cmsCore::getCache('rel_posts', $current_post_id); if (isset($item['plugins_output_after'])) { $item['plugins_output_after'] .= $cache; } else { $item['plugins_output_after'] = $cache; } return $item; } // Исключаем текущий, предыдущий и следующий пост $sql = "(\r\n SELECT id\r\n FROM cms_blog_posts\r\n WHERE id < {$current_post_id}\r\n AND blog_id = {$current_blog_id}\r\n ORDER BY id DESC LIMIT 1\r\n ) UNION (\r\n SELECT id\r\n FROM cms_blog_posts\r\n WHERE id > {$current_post_id}\r\n AND blog_id = {$current_blog_id}\r\n ORDER BY id ASC LIMIT 1\r\n )"; if ($res = $this->inDB->query($sql)) { while ($r = $this->inDB->fetch_row($res)) { $exception .= $r[0] . ", "; } } // Первый набор исключений готов $exception .= $current_post_id; if (in_array($search_mode, array(1, 2))) { // Если разрешен поиск по титлу или контенту $target = $search_mode == 1 ? 'p.title' : 'p.content_html'; // Сразу по обоим полям с существующими на сегодняшний день индексами сделать нельзя $sql = "SELECT p.id,\r\n p.title,\r\n p.seolink AS post_link,\r\n p.content_html AS content,\r\n b.seolink AS blog_link,\r\n img.fileurl,\r\n MATCH({$target}) AGAINST('{$current_title}') AS rel\r\n FROM cms_blog_posts p\r\n JOIN cms_blogs b ON b.id = p.blog_id\r\n LEFT JOIN cms_upload_images img ON img.target_id = p.id AND img.target = 'blog_post' AND img.component = 'blogs'\r\n WHERE MATCH({$target}) AGAINST('{$current_title}' IN BOOLEAN MODE)\r\n AND p.allow_who = 'all'\r\n AND b.allow_who = 'all'\r\n AND b.owner = 'user'\r\n AND p.id NOT IN({$exception})\r\n GROUP BY p.id\r\n ORDER BY rel DESC\r\n LIMIT {$need_found}"; if ($res = $this->inDB->query($sql)) { while ($r = $this->inDB->fetch_assoc($res)) { $found_posts[] = $r; } } } $found = count($found_posts); if ($found < $need_found && $tags_mode) { // Если недобор и разрешен поиск по тегам $left_find = $need_found - $found; $except = ''; foreach ($found_posts as $post) { // Обновляю список найденных постов $except .= $post['id'] . ", "; } // Второй набор исключений готов $exception2 = $except . $exception; // Вытягиваю идентификаторы постов имеющих такие же теги как и у текущего поста. // Остаток оставляю в чистом виде в надежде что в последующей выборке все посты с этими идентификаторами попадут в выборку. // В ином случае недобор покроется за счет соседей $sql = "SELECT item_id,\r\n COUNT(item_id) AS match_common_tags\r\n FROM cms_tags\r\n WHERE item_id NOT IN({$exception2})\r\n AND target = 'blogpost'\r\n AND tag IN(SELECT tag\r\n FROM cms_tags\r\n WHERE target = 'blogpost'\r\n AND item_id = {$current_post_id})\r\n GROUP BY item_id\r\n ORDER BY match_common_tags DESC\r\n LIMIT {$left_find}"; $res = $this->inDB->query($sql); // Определять факт успеха операции в этом месте недостаточно, тут нужно гарантировать возврат числа if ($this->inDB->num_rows($res)) { $target_id = ''; while ($r = $this->inDB->fetch_row($res)) { $target_id .= $r[0] . ", "; // Заполняю найдеными идентификаторами переменную } $target_id = rtrim($target_id, ', '); // Вытягиваю посты $sql = "SELECT p.id,\r\n p.title,\r\n p.seolink AS post_link,\r\n p.content_html AS content,\r\n b.seolink AS blog_link,\r\n img.fileurl\r\n FROM cms_blog_posts p\r\n JOIN cms_blogs b ON b.id = p.blog_id\r\n LEFT JOIN cms_upload_images img ON img.target_id = p.id AND img.target = 'blog_post' AND img.component = 'blogs'\r\n WHERE p.allow_who = 'all'\r\n AND b.allow_who = 'all'\r\n AND b.owner = 'user'\r\n AND p.id IN({$target_id})\r\n GROUP BY p.id\r\n LIMIT {$left_find}"; if ($res = $this->inDB->query($sql)) { while ($r = $this->inDB->fetch_assoc($res)) { $found_posts[] = $r; } } } } $found = count($found_posts); if ($found < $need_found && $add_mode == 1) { // Если опять недобор и разрешено дополнять сеседями $left_find = $need_found - $found; $except = ''; foreach ($found_posts as $post) { // Обновляю список найденных постов $except .= $post['id'] . ", "; } // Третий набор исключений готов $exception3 = $except . $exception; // Смотрю как там оно распределено и сколько вообще осталось контента удовлетворяющего моим требованиям $sql = "(\r\n SELECT COUNT(p.id)\r\n FROM cms_blog_posts p\r\n JOIN cms_blogs b ON b.id = p.blog_id\r\n WHERE p.allow_who = 'all'\r\n AND b.allow_who = 'all'\r\n AND b.owner = 'user'\r\n AND p.id < {$current_post_id}\r\n AND p.id NOT IN({$exception3})\r\n ) UNION (\r\n SELECT COUNT(p.id)\r\n FROM cms_blog_posts p\r\n JOIN cms_blogs b ON b.id = p.blog_id\r\n WHERE p.allow_who = 'all'\r\n AND b.allow_who = 'all'\r\n AND b.owner = 'user'\r\n AND p.id > {$current_post_id}\r\n AND p.id NOT IN({$exception3})\r\n )"; if ($res = $this->inDB->query($sql)) { $have_left = $this->inDB->fetch_row($res); $have_left = $have_left[0]; $have_right = $this->inDB->fetch_row($res); $have_right = $have_right[0]; } else { $have_left = 0; $have_right = 0; } // Все дальнейшие действия актуальны только если в базе остался подходящий под все условия контент if ($have_left + $have_right > 0) { // Разделяю на левую и правую половину $need_from_both = $left_find / 2; $need_from_left = floor($need_from_both); $need_from_right = ceil($need_from_both); // Коррекция если текущий оказался крайним if ($have_left < $need_from_left) { $need_from_right = $need_from_right + $need_from_left - $have_left; } if ($have_right < $need_from_right) { $need_from_left = $need_from_left + $need_from_right - $have_right; } if ($need_from_left == 0) { // Если слева оказался ноль $sql = "SELECT p.id,\r\n p.title,\r\n p.seolink AS post_link,\r\n p.content_html AS content,\r\n b.seolink AS blog_link, img.fileurl\r\n FROM cms_blog_posts p\r\n JOIN cms_blogs b ON b.id = p.blog_id\r\n LEFT JOIN cms_upload_images img ON img.target_id = p.id AND img.target = 'blog_post' AND img.component = 'blogs'\r\n WHERE p.allow_who = 'all'\r\n AND b.allow_who = 'all'\r\n AND b.owner = 'user'\r\n AND p.id NOT IN({$exception3})\r\n AND p.id > {$current_post_id}\r\n GROUP BY p.id\r\n ORDER BY p.id ASC\r\n LIMIT {$left_find}"; } else { $sql = "(\r\n SELECT p.id,\r\n p.title,\r\n p.seolink AS post_link,\r\n p.content_html AS content,\r\n b.seolink AS blog_link, img.fileurl\r\n FROM cms_blog_posts p\r\n JOIN cms_blogs b ON b.id = p.blog_id\r\n LEFT JOIN cms_upload_images img ON img.target_id = p.id AND img.target = 'blog_post' AND img.component = 'blogs'\r\n WHERE p.allow_who = 'all'\r\n AND b.allow_who = 'all'\r\n AND b.owner = 'user'\r\n AND p.id NOT IN({$exception3})\r\n AND p.id < {$current_post_id}\r\n GROUP BY p.id\r\n ORDER BY p.id DESC\r\n LIMIT {$need_from_left}\r\n ) UNION (\r\n SELECT p.id,\r\n p.title,\r\n p.seolink AS post_link,\r\n p.content_html AS content,\r\n b.seolink AS blog_link, img.fileurl\r\n FROM cms_blog_posts p\r\n JOIN cms_blogs b ON b.id = p.blog_id\r\n LEFT JOIN cms_upload_images img ON img.target_id = p.id AND img.target = 'blog_post' AND img.component = 'blogs'\r\n WHERE p.allow_who = 'all'\r\n AND b.allow_who = 'all'\r\n AND b.owner = 'user'\r\n AND p.id NOT IN({$exception3})\r\n AND p.id > {$current_post_id}\r\n GROUP BY p.id\r\n ORDER BY p.id ASC\r\n LIMIT {$need_from_right}\r\n )\r\n\r\n LIMIT {$left_find}"; } if ($res = $this->inDB->query($sql)) { while ($post = $this->inDB->fetch_assoc($res)) { $found_posts[] = $post; } } } } // Если ничео нет, то возврат if (count($found_posts) == 0) { return $item; } cmsCore::loadModel('blogs'); $model = new cms_model_blogs(); foreach ($found_posts as $key => $post) { if (!$found_posts[$key]['fileurl']) { $found_posts[$key]['fileurl'] = '/images/photos/small/' . $blank_photo; } $found_posts[$key]['url'] = $model->getPostURL($post['blog_link'], $post['post_link']); $found_posts[$key]['blog_url'] = $model->getBlogURL($post['bloglink']); $found_posts[$key]['content'] = mb_strimwidth(preg_replace('/\\[cut=.*\\]/ui', '', strip_tags($post['content'])), 0, $truncate, '...'); } ob_start(); cmsPage::initTemplate('plugins', 'p_related_posts.tpl')->assign('posts', $found_posts)->display('p_related_posts.tpl'); $html = ob_get_clean(); // Добавляем в спец ячейку вывод if (isset($item['plugins_output_after'])) { $item['plugins_output_after'] .= $html; } else { $item['plugins_output_after'] = $html; } // кешируем если нужно if ($cash_time > 0) { cmsCore::saveCache('rel_posts', $current_post_id, $html); } return $item; }