Класс Products.php

Класс Products

Предназначен для работы с товарами сайта

Функция get_products()

Код функции (спойлер)
 
  public function get_products($filter = array()) {
        // По умолчанию
        $limit = 100;
        $page = 1;
        $category_id_filter = '';
        $brand_id_filter = '';
        $product_id_filter = '';
        $features_filter = '';
        $keyword_filter = '';
        $visible_filter = '';
        $is_featured_filter = '';
        $discounted_filter = '';
        $in_stock_filter = '';
        $has_images_filter = '';
        $feed_filter = '';
        $group_by = '';
        $order = 'p.position DESC';

        $lang_id  = $this->languages->lang_id();
        $px = ($lang_id ? 'l' : 'p');

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

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

        $sql_limit = $this->db->placehold(' LIMIT ?, ? ', ($page-1)*$limit, $limit);

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

        if(!empty($filter['category_id'])) {
            $category_id_filter = $this->db->placehold('INNER JOIN __products_categories pc ON pc.product_id = p.id AND pc.category_id in(?@)', (array)$filter['category_id']);
            $group_by = "GROUP BY p.id";
        }

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

        if(isset($filter['featured'])) {
            $is_featured_filter = $this->db->placehold('AND p.featured=?', intval($filter['featured']));
        }

        if(isset($filter['discounted'])) {
            $discounted_filter = $this->db->placehold('AND (SELECT 1 FROM __variants pv WHERE pv.product_id=p.id AND pv.compare_price>0 LIMIT 1) = ?', intval($filter['discounted']));
        }

        if(isset($filter['in_stock'])) {
            $in_stock_filter = $this->db->placehold('AND (SELECT count(*)>0 FROM __variants pv WHERE pv.product_id=p.id AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = ?', intval($filter['in_stock']));
        }

        if(isset($filter['has_images'])) {
            $has_images_filter = $this->db->placehold('AND (SELECT count(*)>0 FROM __images pi WHERE pi.product_id=p.id LIMIT 1) = ?', intval($filter['has_images']));
        }

        if(isset($filter['feed'])) {
            $feed_filter = $this->db->placehold('inner join __variants v on v.product_id=p.id and v.feed=?', intval($filter['feed']));
        }
        $price_filter = '';
        $variant_join = '';
        $currency_join = '';

        $first_currency = $this->money->get_currencies(array('enabled'=>1));
        $first_currency = reset($first_currency);
        $coef = 1;
        if(isset($_SESSION['currency_id']) && $first_currency->id != $_SESSION['currency_id']) {
            $currency = $this->money->get_currency(intval($_SESSION['currency_id']));
            $coef = $currency->rate_from / $currency->rate_to;
        }
        if(isset($filter['price'])) {
            if(isset($filter['price']['min'])) {
                $price_filter .= $this->db->placehold(" AND floor(IF(pv.currency_id=0 OR c.id is null,pv.price, pv.price*c.rate_to/c.rate_from)*$coef)>= ? ", $this->db->escape(trim($filter['price']['min'])));
            }
            if(isset($filter['price']['max'])) {
                $price_filter .= $this->db->placehold(" AND floor(IF(pv.currency_id=0 OR c.id is null,pv.price, pv.price*c.rate_to/c.rate_from)*$coef)<= ? ", $this->db->escape(trim($filter['price']['max'])));
            }
            $variant_join = 'LEFT JOIN __variants pv ON pv.product_id = p.id';
            $currency_join = 'LEFT JOIN __currencies c ON c.id=pv.currency_id';
        }

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

        if(!empty($filter['sort'])) {
            switch ($filter['sort']) {
                case 'position':
                    $order = 'p.position DESC';
                    break;
                case 'name':
                    $order = 'p.name ASC';
                    break;
                case 'name_desc':
                    $order = 'p.name DESC';
                    break;
                case 'rating':
                    $order = 'p.rating ASC';
                    break;
                case 'rating_desc':
                    $order = 'p.rating DESC';
                    break;
                case 'created':
                    $order = 'p.created DESC';
                    break;
                case 'price':
                    $order = "(SELECT -floor(IF(pv.currency_id=0 OR c.id is null,pv.price, pv.price*c.rate_to/c.rate_from)*$coef)
                        FROM __variants pv
                        LEFT JOIN s_currencies c on c.id=pv.currency_id
                        WHERE
                            p.id = pv.product_id
                            AND pv.position=(SELECT MIN(position)
                                FROM __variants
                                WHERE
                                    product_id=p.id LIMIT 1
                            )
                        LIMIT 1) DESC";
                    break;
                case 'price_desc':
                    $order = "(SELECT -floor(IF(pv.currency_id=0 OR c.id is null,pv.price, pv.price*c.rate_to/c.rate_from)*$coef)
                        FROM __variants pv
                        LEFT JOIN s_currencies c on c.id=pv.currency_id
                        WHERE
                            p.id = pv.product_id
                            AND pv.position=(SELECT MIN(position)
                                FROM __variants
                                WHERE
                                    product_id=p.id LIMIT 1
                            )
                        LIMIT 1) ASC";
                    break;
            }
        }

        if(!empty($filter['keyword'])) {
            $keywords = explode(' ', $filter['keyword']);
            foreach($keywords as $keyword) {
                $kw = $this->db->escape(trim($keyword));
                if($kw!=='') {
                    $keyword_filter .= $this->db->placehold("AND (
                        $px.name LIKE '%$kw%'
                        OR $px.meta_keywords LIKE '%$kw%'
                        OR p.id in (SELECT product_id FROM __variants WHERE sku LIKE '%$kw%')
                    ) ");
                }
            }
        }

        if(!empty($filter['features']) && !empty($filter['features'])) {
            foreach($filter['features'] as $feature=>$value) {
                $features_filter .= $this->db->placehold('AND p.id in (SELECT product_id FROM __options WHERE feature_id=? AND translit in(?@) ) ', $feature, (array)$value);
            }
        }

        $lang_sql = $this->languages->get_query(array('object'=>'product'));
        $query = "SELECT DISTINCT
                p.id,
                p.url,
                p.brand_id,
                p.position,
                p.created as created,
                p.visible,
                p.featured,
                p.rating,
                p.votes,
                p.last_modify,
                $lang_sql->fields
            FROM __products p
            $lang_sql->join
            $category_id_filter
            $variant_join
            $currency_join
            $feed_filter
            WHERE
                1
                $product_id_filter
                $brand_id_filter
                $features_filter
                $keyword_filter
                $is_featured_filter
                $discounted_filter
                $in_stock_filter
                $has_images_filter
                $visible_filter
                $price_filter
                $group_by
            ORDER BY $order
            $sql_limit
        ";
        $this->db->query($query);
        $products = $this->db->results();

        // field brand translation
        /*if (empty($this->all_brands)) {
            foreach ($this->brands->get_brands() as $b) {
                $this->all_brands[$b->id] = $b;
            }
        }
        if (!empty($this->all_brands)) {
            foreach ($products as $p) {
                if (isset($this->all_brands[$p->brand_id])) {
                    $p->brand = $this->all_brands[$p->brand_id]->name;
                    $p->brand_url = $this->all_brands[$p->brand_id]->url;
                }
            }
        }*/
        return $products;
    }

Фукнция выбирает товары с БД согласно условиям

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

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

  • $filter['limit']) - лимит (количество) выбираемых записей. По умолчанию 100
  • $filter['page'] - страница, с который следует выбирать записи. Используется при пагинации
  • $filter['id'] - массив с id конкретных товаров, если нужно выбрать не все товары, а лишь конкретные
  • $filter['category_id'] - массив с id категорий, товары которых нужно выбрать.
  • $filter['brand_id'] - массив с id брендов, товары которых нужно выбрать
  • $filter['featured'] - принимает 0 или 1. Флаг выбора рекомендуемых товаров (Хит продаж). Используется для товаров на главной
  • $filter['discounted'] - принимает 0 или 1. Флаг выбора акционных товаров (товары со старой ценой). Используется для товаров на главной
  • $filter['in_stock'] - принимает 0 или 1. Флаг выбора товаров либо только тех, что в наличии, либо всех сразу
  • $filter['has_images'] - Флаг выбора товаров, у которых нет изображений. Используется для фильтра в админ. панели
  • $filter['feed'] - принимает 0 или 1. Флаг для выбора товаров, варианты которых либо выгружается в файл фида, либо не выгружаются
  • $filter['price'] - содержит в себе еще вложенное поле min и max ($filter['price']['min'], $filter['price']['max']) - используется для фильтра по цене на стороне клиента
  • $filter['visible'] - принимает 0 или 1 . Позволяет выбирать лиюо включенные, либо выключенные товары
  • $filter['sort'] - параметр сортировки товаров. На данный момент доступны такие:
    1 'position' - сортировка по позиции из админки
    2 'name' - сортировка по названию (по возрастанию)
    3 'name_desc' сортировка по названию (по убыванию)
    4 'rating' - сортировка по рейтингу (по возрастанию)
    5 'rating_desc' сортировка по рейтингу (по убыванию)
    6 'created' сортировка по дате созданию (по убыванию)
    7 'price' сортировка по цене (по возрастанию)
    8 'price_desc' сортировка по цене (по убыванию)
  • $filter['keyword'] - строка поиска, разбивается по пробелу. Поиск работает в полях name, meta_keywords, и артикулу варианта
  • $filter['features'] - Массив свойств товара. используется для фильтра на клиентской части сайта

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


Функция count_products()

Код функции (спойлер)
     public function count_products($filter = array()) {
        $category_id_filter = '';
        $brand_id_filter = '';
        $product_id_filter = '';
        $keyword_filter = '';
        $visible_filter = '';
        $is_featured_filter = '';
        $in_stock_filter = '';
        $has_images_filter = '';
        $feed_filter = '';
        $discounted_filter = '';
        $features_filter = '';

        $lang_id  = $this->languages->lang_id();
        $px = ($lang_id ? 'l' : 'p');

        if(!empty($filter['category_id'])) {
            $category_id_filter = $this->db->placehold('INNER JOIN __products_categories pc ON pc.product_id = p.id AND pc.category_id in(?@)', (array)$filter['category_id']);
        }

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

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

        if(isset($filter['keyword'])) {
            $keywords = explode(' ', $filter['keyword']);
            foreach($keywords as $keyword) {
                $kw = $this->db->escape(trim($keyword));
                if($kw!=='') {
                    $keyword_filter .= $this->db->placehold("AND (
                        $px.name LIKE '%$kw%'
                        OR $px.meta_keywords LIKE '%$kw%'
                        OR p.id in (SELECT product_id FROM __variants WHERE sku LIKE '%$kw%')
                    ) ");
                }
            }
        }

        if(isset($filter['featured'])) {
            $is_featured_filter = $this->db->placehold('AND p.featured=?', intval($filter['featured']));
        }

        if(isset($filter['in_stock'])) {
            $in_stock_filter = $this->db->placehold('AND (SELECT count(*)>0 FROM __variants pv WHERE pv.product_id=p.id AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = ?', intval($filter['in_stock']));
        }

        if(isset($filter['has_images'])) {
            $has_images_filter = $this->db->placehold('AND (SELECT count(*)>0 FROM __images pi WHERE pi.product_id=p.id LIMIT 1) = ?', intval($filter['has_images']));
        }

        if(isset($filter['feed'])) {
            $feed_filter = $this->db->placehold('inner join __variants v on v.product_id=p.id and v.feed=?', intval($filter['feed']));
        }
        $price_filter = '';
        $variant_join = '';
        $select = 'count(distinct p.id) as count';
        $currency_join = '';

        $first_currency = $this->money->get_currencies(array('enabled'=>1));
        $first_currency = reset($first_currency);
        $coef = 1;
        if(isset($_SESSION['currency_id']) && $first_currency->id != $_SESSION['currency_id']) {
            $currency = $this->money->get_currency(intval($_SESSION['currency_id']));
            $coef = $currency->rate_from / $currency->rate_to;
        }
        if(isset($filter['get_price'])) {
            $variant_join = 'LEFT JOIN __variants pv ON pv.product_id = p.id';
            $currency_join = 'LEFT JOIN __currencies c ON c.id=pv.currency_id';
            $select = "
                floor(min(IF(pv.currency_id=0 OR c.id is null,pv.price, pv.price*c.rate_to/c.rate_from)*$coef)) as min,
                floor(max(IF(pv.currency_id=0 OR c.id is null,pv.price, pv.price*c.rate_to/c.rate_from)*$coef)) as max
            ";
        } elseif(isset($filter['price'])) {
            if(isset($filter['price']['min'])) {
                $price_filter .= $this->db->placehold(" AND floor(IF(pv.currency_id=0 OR c.id is null,pv.price, pv.price*c.rate_to/c.rate_from)*$coef)>= ? ", $this->db->escape(trim($filter['price']['min'])));
            }
            if(isset($filter['price']['max'])) {
                $price_filter .= $this->db->placehold(" AND floor(IF(pv.currency_id=0 OR c.id is null,pv.price, pv.price*c.rate_to/c.rate_from)*$coef)<= ? ", $this->db->escape(trim($filter['price']['max'])));
            }
            $variant_join = 'LEFT JOIN __variants pv ON pv.product_id = p.id';
            $currency_join = 'LEFT JOIN __currencies c ON c.id=pv.currency_id';
        }

        if(isset($filter['discounted'])) {
            $discounted_filter = $this->db->placehold('AND (SELECT 1 FROM __variants pv WHERE pv.product_id=p.id AND pv.compare_price>0 LIMIT 1) = ?', intval($filter['discounted']));
        }

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

        if(!empty($filter['features']) && !empty($filter['features'])) {
            foreach($filter['features'] as $feature=>$value) {
                $features_filter .= $this->db->placehold('AND p.id in (SELECT product_id FROM __options WHERE feature_id=? AND translit in(?@) ) ', $feature, (array)$value);
            }
        }

        $lang_sql = $this->languages->get_query(array('object'=>'product'));
        $query = "SELECT $select
            FROM __products AS p
            $lang_sql->join
            $category_id_filter
            $feed_filter
            $variant_join
            $currency_join
            WHERE
                1
                $brand_id_filter
                $product_id_filter
                $keyword_filter
                $is_featured_filter
                $in_stock_filter
                $has_images_filter
                $discounted_filter
                $visible_filter
                $features_filter
                $price_filter
        ";
        $this->db->query($query);
        if(isset($filter['get_price'])) {
            return $this->db->result();
        } else {
            return $this->db->result('count');
        }
    }

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

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

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

  • $filter['id'] - массив с id конкретных товаров, если нужно выбрать не все товары, а лишь конкретные
  • $filter['category_id'] - массив с id категорий, товары которых нужно выбрать.
  • $filter['brand_id'] - массив с id брендов, товары которых нужно выбрать
  • $filter['featured'] - принимает 0 или 1. Флаг выбора рекомендуемых товаров (Хит продаж). Используется для товаров на главной
  • $filter['discounted'] - принимает 0 или 1. Флаг выбора акционных товаров (товары со старой ценой). Используется для товаров на главной
  • $filter['in_stock'] - принимает 0 или 1. Флаг выбора товаров либо только тех, что в наличии, либо всех сразу
  • $filter['has_images'] - Флаг выбора товаров, у которых нет изображений. Используется для фильтра в админ. панели
  • $filter['feed'] - принимает 0 или 1. Флаг для выбора товаров, варианты которых либо выгружается в файл фида, либо не выгружаются
  • $filter['price'] - содержит в себе еще вложенное поле min и max ($filter['price']['min'], $filter['price']['max']) - используется для фильтра по цене на стороне клиента
  • $filter['visible'] - принимает 0 или 1 . Позволяет выбирать лиюо включенные, либо выключенные товары
  • $filter['keyword'] - строка поиска, разбивается по пробелу. Поиск работает в полях name, meta_keywords, и артикулу варианта
  • $filter['features'] - Массив свойств товара. используется для фильтра на клиентской части сайта

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


Функция get_product()

Код функции (спойлер)
    public function get_product($id) {
        if (empty($id)) {
            return false;
        }
        if(is_int($id)) {
            $filter = $this->db->placehold('AND p.id = ?', $id);
        } else {
            $filter = $this->db->placehold('AND p.url = ?', $id);
        }

        $lang_sql = $this->languages->get_query(array('object'=>'product'));
        $query = "SELECT DISTINCT
                p.id,
                p.url,
                p.brand_id,
                p.position,
                p.created as created,
                p.visible,
                p.featured,
                p.rating,
                p.votes,
                p.last_modify,
                $lang_sql->fields
            FROM __products AS p
            $lang_sql->join
            WHERE
                1
                $filter
            GROUP BY p.id
            LIMIT 1
        ";
        $this->db->query($query);
        $product = $this->db->result();
        return $product;
    }

Функция выборки одного конкретного товара

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

Если $id передан как число, поиск будет происходит по id товара. Во всех других случаях поиск происходит по полю url(ссылка товара)

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


Функция update_product()

Код функции (спойлер)
    public function update_product($id, $product) {
        $product = (object)$product;
        $result = $this->languages->get_description($product, 'product');

        $product->last_modify = date("Y-m-d H:i:s");
        $query = $this->db->placehold("UPDATE __products SET ?% WHERE id in (?@) LIMIT ?", $product, (array)$id, count((array)$id));
        if($this->db->query($query)) {
            if(!empty($result->description)) {
                $this->languages->action_description($id, $result->description, 'product', $this->languages->lang_id());
            }
            return $id;
        } else {
            return false;
        }
    }

Функция обновления конкретного товара

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

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

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

Функция возвращает id товара в случае успешного обновления, или же false в случае неудачи


Функция add_product()

Код функции (спойлер)
    public function add_product($product) {
        $product = (array) $product;
        if(empty($product['url'])) {
            $product['url'] = preg_replace("/[\s]+/ui", '-', $product['name']);
            $product['url'] = strtolower(preg_replace("/[^0-9a-zа-я\-]+/ui", '', $product['url']));
        }

        // Если есть товар с таким URL, добавляем к нему число
        while($this->get_product((string)$product['url'])) {
            if(preg_match('/(.+)_([0-9]+)$/', $product['url'], $parts)) {
                $product['url'] = $parts[1].'_'.($parts[2]+1);
            } else {
                $product['url'] = $product['url'].'_2';
            }
        }

        $product = (object)$product;
        $result = $this->languages->get_description($product, 'product');

        $product->last_modify = date("Y-m-d H:i:s");
        if($this->db->query("INSERT INTO __products SET ?%", $product)) {
            $id = $this->db->insert_id();
            $this->db->query("UPDATE __products SET position=id WHERE id=?", $id);

            if(!empty($result->description)) {
                $this->languages->action_description($id, $result->description, 'product');
            }
            return $id;
        } else {
            return false;
        }
    }

Функция добавления нового товара в БД

Функция принимает один аргумент $product в виде массива или объекта

Функция возващает id добавленного товара в случае успеха. В противном случае - FALSE


Функция delete_product()

Код функции (спойлер)
    public function delete_product($id) {
        if(!empty($id)) {
            // Удаляем варианты
            $variants = $this->variants->get_variants(array('product_id'=>$id));
            foreach($variants as $v) {
                $this->variants->delete_variant($v->id);
            }

            // Удаляем изображения
            $images = $this->get_images(array('product_id'=>$id));
            foreach($images as $i) {
                $this->delete_image($i->id);
            }

            // Удаляем категории
            $categories = $this->categories->get_categories(array('product_id'=>$id));
            foreach($categories as $c) {
                $this->categories->delete_product_category($id, $c->id);
            }

            // Удаляем свойства
            $options = $this->features->get_options(array('product_id'=>$id));
            foreach($options as $o) {
                $this->features->delete_option($id, $o->feature_id);
            }

            // Удаляем связанные товары
            $related = $this->get_related_products($id);
            foreach($related as $r) {
                $this->delete_related_product($id, $r->related_id);
            }

            // Удаляем товар из связанных с другими
            $query = $this->db->placehold("DELETE FROM __related_products WHERE related_id=?", intval($id));
            $this->db->query($query);

            // Удаляем отзывы
            $comments = $this->comments->get_comments(array('object_id'=>$id, 'type'=>'product'));
            foreach($comments as $c) {
                $this->comments->delete_comment($c->id);
            }

            // Удаляем из покупок
            $this->db->query('UPDATE __purchases SET product_id=NULL WHERE product_id=?', intval($id));

            //lastModify
            $this->db->query('select brand_id from __products where id=?', intval($id));
            $bid = (int)$this->db->result('brand_id');
            if ($bid) {
                $this->db->query('update __brands set last_modify=now() where id=?', $bid);
            }

            // Удаляем языки
            $query = $this->db->placehold("DELETE FROM __lang_products WHERE product_id=?", intval($id));
            $this->db->query($query);

            // Удаляем товар
            $query = $this->db->placehold("DELETE FROM __products WHERE id=? LIMIT 1", intval($id));
            if($this->db->query($query)) {
                return true;
            }
        }
        return false;
    }

Функция удаления товара

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

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

  • $id- id удаляемого товара

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


Функция duplicate_product()

Код функции (спойлер)
    public function duplicate_product($id) {
        $product = $this->get_product($id);
        $product->id = null;
        $product->external_id = '';
        unset($product->created);

        // Сдвигаем товары вперед и вставляем копию на соседнюю позицию
        $this->db->query('UPDATE __products SET position=position+1 WHERE position>?', $product->position);
        $new_id = $this->products->add_product($product);
        $this->db->query('UPDATE __products SET position=? WHERE id=?', $product->position+1, $new_id);

        //lastModify
        if ($product->brand_id > 0) {
            $this->db->query('update __brands set last_modify=now() where id=?', intval($product->brand_id));
        }

        // Очищаем url
        $this->db->query('UPDATE __products SET url="" WHERE id=?', $new_id);

        // Дублируем категории
        $categories = $this->categories->get_product_categories($id);
        foreach($categories as $i=>$c) {
            $this->categories->add_product_category($new_id, $c->category_id, $i);
        }

        // Дублируем изображения
        $images = $this->get_images(array('product_id'=>$id));
        foreach($images as $image) {
            $this->add_image($new_id, $image->filename);
        }

        // Дублируем варианты
        $variants = $this->variants->get_variants(array('product_id'=>$id));
        foreach($variants as $variant) {
            $variant->product_id = $new_id;
            unset($variant->id);
            if($variant->infinity) {
                $variant->stock = null;
            }
            unset($variant->infinity);
            unset($variant->rate_from);unset($variant->rate_to);
            $variant->external_id = '';
            $this->variants->add_variant($variant);
        }

        // Дублируем свойства
        $options = $this->features->get_options(array('product_id'=>$id));
        foreach($options as $o) {
            $this->features->update_option($new_id, $o->feature_id, $o->value);
        }

        // Дублируем связанные товары
        $related = $this->get_related_products($id);
        foreach($related as $r) {
            $this->add_related_product($new_id, $r->related_id);
        }

        $this->multi_duplicate_product($id, $new_id);
        return $new_id;
    }

Функция копирования(дублирования) товара

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

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

  • $id- id копируемого товара товара

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


Функция get_related_products()

Код функции (спойлер)
    public function get_related_products($product_id = array()) {
        if(empty($product_id)) {
            return array();
        }

        $product_id_filter = $this->db->placehold('AND product_id in(?@)', (array)$product_id);

        $query = $this->db->placehold("SELECT
                product_id,
                related_id,
                position
            FROM __related_products
            WHERE
                1
                $product_id_filter
            ORDER BY position
        ");
        $this->db->query($query);
        return $this->db->results();
    }

Функция выборки связанных товаров (задаются внутри самого товара, в админ. панели)

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

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

  • (array)$product_id - массив id связанных товаров

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


Функция add_related_product()

Код функции (спойлер)
    public function add_related_product($product_id, $related_id, $position=0) {
        $query = $this->db->placehold("INSERT IGNORE INTO __related_products SET product_id=?, related_id=?, position=?", $product_id, $related_id, $position);
        $this->db->query($query);
        return $related_id;
    }

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

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

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

  • $product_id - id товара к которому добавляется связанный
  • $related_id - id связанного товара
  • $position - позиция (порядок) связанного товара

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


Функция delete_related_product()

Код функции (спойлер)
    public function delete_related_product($product_id, $related_id) {
        $query = $this->db->placehold("DELETE FROM __related_products WHERE product_id=? AND related_id=? LIMIT 1", intval($product_id), intval($related_id));
        $this->db->query($query);
    }

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

Функция принимает два аргумента $product_id, $related_id

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

  • $product_id - id товара у которого нужно удалить связанный товар
  • $related_id - id связанного товара

Функция get_images()

Код функции (спойлер)
    public function get_images($filter = array()) {
        $product_id_filter = '';
        if(!empty($filter['product_id'])) {
            $product_id_filter = $this->db->placehold('AND i.product_id in(?@)', (array)$filter['product_id']);
        }

        // images
        $query = $this->db->placehold("SELECT
                i.id,
                i.product_id,
                i.name,
                i.filename,
                i.position
            FROM __images AS i
            WHERE
                1
                $product_id_filter
            ORDER BY i.product_id, i.position
        ");
        $this->db->query($query);
        return $this->db->results();
    }

Функция выборки изображений для товара(ов)

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

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

  • $filter['product_id'] - id товаров, для которых нужно выбрать изображения

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


Функция add_image()

Код функции (спойлер)
    public function add_image($product_id, $filename) {
        $query = $this->db->placehold("SELECT id FROM __images WHERE product_id=? AND filename=?", $product_id, $filename);
        $this->db->query($query);
        $id = $this->db->result('id');
        if(empty($id)) {
            $query = $this->db->placehold("INSERT INTO __images SET product_id=?, filename=?", $product_id, $filename);
            $this->db->query($query);
            $id = $this->db->insert_id();
            $query = $this->db->placehold("UPDATE __images SET position=id WHERE id=?", $id);
            $this->db->query($query);
        }
        return($id);
    }

Функция добавления изображение к товару

Функция принимает два аргумента $product_id, $filename

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

  • $product_id - товар, к которому нужно добавить фото
  • $filename - название фото, которое следует записать в БД к данному товару

Функция возвращает id существующего, или добавленного изображения


Функция update_image()

Код функции (спойлер)
    public function update_image($id, $image) {
        $query = $this->db->placehold("UPDATE __images SET ?% WHERE id=?", $image, $id);
        $this->db->query($query);
        return($id);
    }

Функция обновления изображения товара

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

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

  • $id - id товара, у которого обновляется фото
  • $image - объект с данными об изображении

Функция возвращает id изображения, которое было обновлено


Функция delete_image()

Код функции (спойлер)
    public function delete_image($id) {
        $query = $this->db->placehold("SELECT filename FROM __images WHERE id=?", $id);
        $this->db->query($query);
        $filename = $this->db->result('filename');
        $query = $this->db->placehold("DELETE FROM __images WHERE id=? LIMIT 1", $id);
        $this->db->query($query);
        $query = $this->db->placehold("SELECT count(*) as count FROM __images WHERE filename=? LIMIT 1", $filename);
        $this->db->query($query);
        $count = $this->db->result('count');
        if($count == 0) {
            $file = pathinfo($filename, PATHINFO_FILENAME);
            $ext = pathinfo($filename, PATHINFO_EXTENSION);

            // Удалить все ресайзы
            $rezised_images = glob($this->config->root_dir.$this->config->resized_images_dir.$file.".*x*.".$ext);
            if(is_array($rezised_images)) {
                foreach ($rezised_images as $f) {
                    @unlink($f);
                }
            }

            @unlink($this->config->root_dir.$this->config->original_images_dir.$filename);
        }
    }

Функция удаления изображения товара

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

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

  • $id - id изображения, которое нужно удалить

Функция get_neighbors_products()

Код функции (спойлер)
    public function get_neighbors_products($category_id, $position) {
        $pids = array();
        // следующий товар
        $query = $this->db->placehold("SELECT id FROM __products p, __products_categories pc
            WHERE
                pc.product_id=p.id AND p.position>?
                AND pc.position=(SELECT MIN(pc2.position) FROM __products_categories pc2 WHERE pc.product_id=pc2.product_id)
                AND pc.category_id=?
                AND p.visible
            ORDER BY p.position
            limit 1
        ", $position, $category_id);
        $this->db->query($query);
        $pid = $this->db->result('id');
        if ($pid) {
            $pids[$pid] = 'prev';
        }
        // предыдущий товар
        $query = $this->db->placehold("SELECT id FROM __products p, __products_categories pc
            WHERE
                pc.product_id=p.id AND p.position<?
                AND pc.position=(SELECT MIN(pc2.position) FROM __products_categories pc2 WHERE pc.product_id=pc2.product_id)
                AND pc.category_id=?
                AND p.visible
            ORDER BY p.position DESC
            limit 1
        ", $position, $category_id);
        $this->db->query($query);
        $pid = $this->db->result('id');
        if ($pid) {
            $pids[$pid] = 'next';
        }

        $result = array('next'=>'', 'prev'=>'');
        if (!empty($pids)) {
            foreach ($this->get_products(array('id'=>array_keys($pids))) as $p) {
                $result[$pids[$p->id]] = $p;
            }
        }
        return $result;
    }

Функция выбора "соседних товаров". Используется для клиентской части

Функция принимает два аргумента $category_id, $position

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

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

Функция возвращает массив с товарами


Функция multi_duplicate_product()

Код функции (спойлер)
     public function multi_duplicate_product($id, $new_id) {
        $lang_id = $this->languages->lang_id();
        if (!empty($lang_id)) {
            $languages = $this->languages->get_languages();
            $prd_fields = $this->languages->get_fields('products');
            $variant_fields = $this->languages->get_fields('variants');
            foreach ($languages as $language) {
                if ($language->id != $lang_id) {
                    $this->languages->set_lang_id($language->id);
                    //Product
                    if (!empty($prd_fields)) {
                        $old_prd = $this->get_product($id);
                        $upd_prd = new stdClass();
                        foreach($prd_fields as $field) {
                            $upd_prd->{$field} = $old_prd->{$field};
                        }
                        $this->update_product($new_id, $upd_prd);
                    }

                    // Дублируем варианты
                    if (!empty($variant_fields)) {
                        $variants = $this->variants->get_variants(array('product_id'=>$new_id));
                        $old_variants = $this->variants->get_variants(array('product_id'=>$id));
                        foreach($old_variants as $i=>$old_variant) {
                            $upd_variant = new stdClass();
                            foreach ($variant_fields as $field) {
                                $upd_variant->{$field} = $old_variant->{$field};
                            }
                            $this->variants->update_variant($variants[$i]->id, $upd_variant);
                        }
                    }

                    // Дублируем свойства
                    $options = $this->features->get_options(array('product_id'=>$id));
                    foreach($options as $o) {
                        $this->features->update_option($new_id, $o->feature_id, $o->value);
                    }

                    $this->languages->set_lang_id($lang_id);
                }
            }
        }
     }

Функция мультиязычного копирования. Используется в основной функции копирования товаров

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

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

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

  • $id - id товара с которого нужно копировать информацию
  • $new_id - id товара, в который нужно скопировать информацию

Функция get_spec_images()

Код функции (спойлер)
    public function get_spec_images() {
        $query = $this->db->placehold("SELECT id, filename, position FROM __spec_img ORDER BY position ASC");
        $this->db->query($query);
        $res = $this->db->results();
        if(!empty($res)){
            return $res;
        } else {
            return array();
        }
    }

Функция выбора всех промо-изображений

Функция возвращает массив объектов с инофрмацией об промо-изображениях


Функция delete_spec_image()

Код функции (спойлер)
    public function delete_spec_image($image_id) {
        if(empty($image_id)){
            return false;
        }
        $query = $this->db->placehold("SELECT filename FROM __spec_img WHERE id =?", intval($image_id));
        $this->db->query($query);
        $filename = $this->db->result('filename');
        unlink($this->config->root_dir.$this->config->special_images_dir.$filename);
        $this->db->query("DELETE FROM __spec_img WHERE id=? LIMIT 1", intval($image_id));
        $this->db->query("UPDATE __products SET special=NULL WHERE special=?", $filename);
        $this->db->query("UPDATE __lang_products SET special=NULL WHERE special=?", $filename);
        return true;
    }

Функция удаления промо-изображения

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

Параметры функции:

  • $image_id - id промо-изображения, которое нужно удалить

Функция возвращает TRUE в случае успеха


Функция update_spec_images()

Код функции (спойлер)
    public function update_spec_images($id, $spec_image){
        if(empty($id) || empty($spec_image)){
            return false;
        }
        $spec_image = (array)$spec_image;
        $query = $this->db->placehold("UPDATE __spec_img SET ?% WHERE id=?", $spec_image, $id);
        $this->db->query($query);
        return $id;
    }

Функция обнолвения промо-изображения

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

Параметры функции:

  • $id- id промо-изображения, которое нужно обновить
  • $spec_image - обновляемая информация

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


Функция add_spec_image()

Код функции (спойлер)
    public function add_spec_image($image) {
        if(empty($image)){
            return false;
        }
        $query = $this->db->query("INSERT INTO __spec_img SET filename = ?", $image);
        $this->db->query($query);
        $id = $this->db->insert_id();
        $this->db->query("UPDATE __spec_img SET position=id WHERE id=?", $id);
        return $id;
    }

Функция добавления промо-изображения

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

Параметры функции:

  • $image- имя добавляемого файла

Функция возвращает id добавленного промо-изображения