Класс Blog.php

 

Класс Blog

Предназначен для работы функционала "блог" на сайте

Функция get_post()

Код функции (спойлер)
 
    /*Выбираем определенную запись*/
    public function get_post($id,$type_post = null) {
        if (empty($id) && empty($type_post)) {
            return false;
        }
        $type = '';
        if($type_post) {
            $type = $this->db->placehold('AND b.type_post=? ', $type_post);
        }
        if(is_int($id)) {
            $where = $this->db->placehold('AND b.id=? ', intval($id));
        } else {
            $where = $this->db->placehold('AND b.url=? ', $id);
        }

        $lang_sql = $this->languages->get_query(array('object'=>'blog'));
        $query = $this->db->placehold("SELECT
                b.id,
                b.url,
                b.visible,
                b.date,
                b.image,
                b.type_post,
                b.last_modify,
                $lang_sql->fields
            FROM __blog b
            $lang_sql->join
            WHERE
                1
                $where
                $type
            LIMIT 1
        ");
        if($this->db->query($query)) {
            return $this->db->result();
        } else {
            return false;
        }
    }

Функция выборки конкретной записи блога

Функция принимает аргументы $id,$type_post = null

Параметры которые содержит функция:

  • $id - $id записи, котороую нужно выбрать
  • $type_post - тип записи (статья/новость) (blog/news)

Функция возвращает объект с данными о записи в случае успеха


Функция get_posts()

Код функции (спойлер)
  /*Выбираем все записи*/
    public function get_posts($filter = array()) {
        $limit = 1000; // По умолчанию
        $page = 1;
        $post_id_filter = '';
        $visible_filter = '';
        $keyword_filter = '';
        $type_filter = '';
        $posts = array();
        $lang_id  = $this->languages->lang_id();
        $px = ($lang_id ? 'l' : 'b');

        if(isset($filter['limit'])) {
            $limit = max(1, intval($filter['limit']));
        }
        if(isset($filter['page'])) {
            $page = max(1, intval($filter['page']));
        }

        if(!empty($filter['id'])) {
            $post_id_filter = $this->db->placehold('AND b.id in(?@)', (array)$filter['id']);
        }

        if(!empty($filter['type_post'])) {
            $type_filter = $this->db->placehold('AND b.type_post = ?', $filter['type_post']);
        }

        if(isset($filter['visible'])) {
            $visible_filter = $this->db->placehold('AND b.visible = ?', intval($filter['visible']));
        }
        if(isset($filter['keyword'])) {
            $keywords = explode(' ', $filter['keyword']);
            foreach($keywords as $keyword) {
                $keyword_filter .= $this->db->placehold('AND ('.$px.'.name LIKE "%'.$this->db->escape(trim($keyword)).'%" OR '.$px.'.meta_keywords LIKE "%'.$this->db->escape(trim($keyword)).'%") ');
            }
        }

        $sql_limit = $this->db->placehold(' LIMIT ?, ? ', ($page-1)*$limit, $limit);
        $lang_sql = $this->languages->get_query(array('object'=>'blog'));
        $query = $this->db->placehold("SELECT
                b.id,
                b.url,
                b.visible,
                b.date,
                b.image,
                b.type_post,
                b.last_modify,
                $lang_sql->fields
            FROM __blog b
            $lang_sql->join
            WHERE
                1
                $post_id_filter
                $visible_filter
                $keyword_filter
                $type_filter
            ORDER BY date DESC, id DESC
            $sql_limit
        ");
        $this->db->query($query);
        return $this->db->results();
    }

Функция выборки записей из раздела "блог"

Функция принимает один аргумент $filter

Параметры которые содержит функция:

  • $filter['limit'] - количество выбираемых записей
  • $filter['page'] - страница (позиция) с которой нужно начать выбирать записи. Используется для пагинации
  • $filter['id'] - массив id записей, которые нужно выбрать
  • $filter['type_post'] - тип записи, которые нужно выбрать (blog/news)
  • $filter['visible'] - фильтр включенных/выключенных записей
  • $filter['keyword'] - ключевое слово поиска. (поиск происходит по названию статьи или по полю meta_keywords)

Возвращает массив объектов с данными о записях раздела "блог"


Функция count_posts()

Код функции (спойлер)
    /*Подсчитываем количество найденных записей*/
    public function count_posts($filter = array()) {
        $post_id_filter = '';
        $visible_filter = '';
        $keyword_filter = '';
        $type_filter = '';
        $lang_id  = $this->languages->lang_id();
        $px = ($lang_id ? 'l' : 'b');

        if(!empty($filter['id'])) {
            $post_id_filter = $this->db->placehold('AND b.id in(?@)', (array)$filter['id']);
        }

        if(!empty($filter['type_post'])) {
            $type_filter = $this->db->placehold('AND b.type_post = ?', $filter['type_post']);
        }

        if(isset($filter['visible'])) {
            $visible_filter = $this->db->placehold('AND b.visible = ?', intval($filter['visible']));
        }

        if(isset($filter['keyword'])) {
            $keywords = explode(' ', $filter['keyword']);
            foreach($keywords as $keyword) {
                $keyword_filter .= $this->db->placehold('AND ('.$px.'.name LIKE "%'.$this->db->escape(trim($keyword)).'%" OR '.$px.'.meta_keywords LIKE "%'.$this->db->escape(trim($keyword)).'%") ');
            }
        }
        $lang_sql = $this->languages->get_query(array('object'=>'blog'));
        $query = "SELECT COUNT(distinct b.id) as count
            FROM __blog b
            $lang_sql->join
            WHERE 1
                $post_id_filter
                $visible_filter
                $keyword_filter
                $type_filter
        ";

        if($this->db->query($query)) {
            return $this->db->result('count');
        } else {
            return false;
        }
    }

Функция подсчета количества записей

Функция принимает один аргумент $filter

Параметры которые содержит функция:

  • $filter['id'] - массив id записей, которые нужно выбрать
  • $filter['type_post'] - тип записи, которые нужно выбрать (blog/news)
  • $filter['visible'] - фильтр включенных/выключенных записей
  • $filter['keyword'] - ключевое слово поиска. (поиск происходит по названию статьи или по полю meta_keywords)

Возвращает количество (число) записей блога согласно заданными критериям


Функция add_post()

Код функции (спойлер)
    /*Добавляем запись*/
    public function add_post($post) {
        $date_query = (!isset($post->date) ? ', date=NOW()' : '');

        $post = (object)$post;
        // Проверяем есть ли мультиязычность и забираем описания для перевода
        $result = $this->languages->get_description($post, 'blog');

        $post->last_modify = date("Y-m-d H:i:s");
        $query = $this->db->placehold("INSERT INTO __blog SET ?% $date_query", $post);
        if(!$this->db->query($query)) {
            return false;
        }

        $id = $this->db->insert_id();

        // Если есть описание для перевода. Указываем язык для обновления
        if(!empty($result->description)) {
            $this->languages->action_description($id, $result->description, 'blog');
        }

        return $id;
    }

Функция добавления записи в раздел "блог"

Функция принимает аргументы $post

Параметры которые содержит функция:

  • $post - объект с данными о записи (название, ссылка, описание и т.д)

Функция возвращает id добавленной записи


Функция update_post()

Код функции (спойлер)
   /*Обновляем запись*/
    public function update_post($id, $post) {
        $post = (object)$post;
        // Проверяем есть ли мультиязычность и забираем описания для перевода
        $result = $this->languages->get_description($post, 'blog');

        $post->last_modify = date("Y-m-d H:i:s");
        $query = $this->db->placehold("UPDATE __blog SET ?% WHERE id in(?@) LIMIT ?", $post, (array)$id, count((array)$id));
        $this->db->query($query);

        // Если есть описание для перевода. Указываем язык для обновления
        if(!empty($result->description)) {
            $this->languages->action_description($id, $result->description, 'blog', $this->languages->lang_id());
        }
        return $id;
    }

Функция обновления записи

Функция принимает аргумент $id, $post

Параметры которые содержит функция:

  • $id - $id записи, которую нужно обновить
  • $post - объект с данными о записи (имя, описание и т.д)

Функция возвращает id обновленной записи


Функция delete_post()

Код функции (спойлер)
   /*Удаляем запись*/
    public function delete_post($id) {
        if(!empty($id)) {
            $this->image->delete_image($id, 'image', 'blog', $this->config->original_blog_dir, $this->config->resized_blog_dir);
            $query = $this->db->placehold("DELETE FROM __blog WHERE id=? LIMIT 1", intval($id));
            if($this->db->query($query)) {
                $this->settings->lastModifyPosts = date("Y-m-d H:i:s");
                $this->db->query("DELETE FROM __lang_blog WHERE blog_id=?", intval($id));
                $query = $this->db->placehold("DELETE FROM __comments WHERE type='blog' AND object_id=?", intval($id));
                if($this->db->query($query)) {
                    return true;
                }
            }
        }
        return false;
    }

Функция удаления записи

Функция принимает аргумент $id

Параметры которые содежит функция:

  • $id - $id записи, которую нужно удалить

Функция возвращает true в случае успешного удаления


Функция get_next_post() и функция get_prev_post()

Код функции (спойлер)
  /*Выбираем следующию запись от текущей*/
    public function get_next_post($id) {
        $this->db->query("SELECT date,type_post FROM __blog WHERE id=? LIMIT 1", $id);
        $res = $this->db->results();
        $this->db->query("(SELECT id, type_post FROM __blog WHERE date=? AND id>? AND visible AND type_post = ?  ORDER BY id limit 1)
                           UNION
                          (SELECT id, type_post FROM __blog WHERE date>? AND visible AND type_post = ? ORDER BY date, id limit 1)",
            reset($res)->date, $id, reset($res)->type_post,reset($res)->date, reset($res)->type_post);
        $next = $this->db->results();
        if($next) {
            return $this->get_post(intval(reset($next)->id), reset($next)->type_post);
        } else {
            return false;
        }
    }

    /*Выбираем предыдущую запись от текущей*/
    public function get_prev_post($id) {
        $this->db->query("SELECT date,type_post FROM __blog WHERE id=? LIMIT 1", $id);
        $res = $this->db->results();

        $this->db->query("(SELECT id,type_post FROM __blog WHERE date=? AND id<? AND visible AND type_post = ? ORDER BY id DESC limit 1)
                           UNION
                          (SELECT id,type_post FROM __blog WHERE date<? AND visible AND type_post = ? ORDER BY date DESC, id DESC limit 1)",
            reset($res)->date, $id, reset($res)->type_post,reset($res)->date, reset($res)->type_post );
        $prev = $this->db->results();
        if($prev) {
            return $this->get_post(intval(reset($prev)->id), reset($prev)->type_post);
        } else {
            return false;
        }
    }

Функции выбирает следующую и предыдующую запись от заданной

Функции возвращают объект с данными о записи в случае успеха


Функция get_related_products()

Код функции (спойлер)
    /*Выбираем связанные товары к записи*/
    public function get_related_products($filter = array()) {
        $product_id_filter = '';
        $post_id_filter = '';
        if(!empty($filter['post_id'])) {
            $post_id_filter = $this->db->placehold('AND post_id in(?@)', (array)$filter['post_id']);
        }
        if(!empty($filter['product_id'])) {
            $product_id_filter = $this->db->placehold('AND related_id in(?@)', (array)$filter['product_id']);
        }
        $query = $this->db->placehold("SELECT
                post_id,
                related_id,
                position
            FROM __related_blogs
            WHERE
                1
                $post_id_filter
                $product_id_filter
            ORDER BY position
        ");
        $this->db->query($query);
        return $this->db->results();
    }

Функция выборки связанных товаров к статье

Функция принимает аргумент $filter

Параметры которые содержит функция:

  • $filter['post_id'] - массив $id записей
  • $filter['product_id'] - массив id товаров

Функция возвращает массив объектов с данными о связанных товарах


Функция add_related_product()

Код функции (спойлер)
    /*Добавление связанного товара к записи*/
    public function add_related_product($post_id, $related_id, $position=0) {
        $query = $this->db->placehold("INSERT IGNORE INTO __related_blogs SET post_id=?, related_id=?, position=?", $post_id, $related_id, $position);
        $this->db->query($query);
        return $related_id;
    }

Функция добавления связанных товаров к статье

Функция принимает аргументы $post_id, $related_id, $position

Параметры которые содержит функция:

  • $post_id - id записи, к которой нужно прикрепить товар
  • $related_id - id товара, который прикрепляется к записи
  • $position - позиция товара в списке

Функция возвращает id приккрепленного товара