Example #1
0
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;
}
Example #2
0
 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;
 }