'advpicto', 'primary' => 'id_advpicto', 'multilang' => true, 'fields' => array( 'title' => array( 'type' => ObjectModel :: TYPE_STRING, 'lang' => true, 'validate' => 'isString', 'required' => TRUE ), 'alt' => array( 'type' => ObjectModel :: TYPE_STRING, 'lang' => true, 'validate' => 'isString' ), 'content' => array( 'type' => ObjectModel :: TYPE_HTML, 'lang' => true, 'validate' => 'isString' ), 'link' => array( 'type' => ObjectModel :: TYPE_STRING, 'lang' => true, 'validate' => 'isString' ), 'external' => array( 'type' => ObjectModel :: TYPE_INT, 'validate' => 'isBool' ), 'selfcategory_display' => array( 'type' => ObjectModel :: TYPE_INT, 'validate' => 'isBool' ), 'active' => array( 'type' => ObjectModel :: TYPE_INT, 'validate' => 'isBool' ), 'position' => array( 'type' => ObjectModel :: TYPE_INT ) ) ); public function __construct($id = NULL, $id_lang = NULL, $id_shop = NULL) { parent::__construct($id, $id_lang, $id_shop); $this->image_dir = _PS_IMG_DIR_ . 'picto/'; } public static function getAllPictos() { $query = ' SELECT adv.`id_advpicto` as id, advpl.`title` FROM `' . _DB_PREFIX_ . 'advpicto` adv LEFT JOIN `' . _DB_PREFIX_ . 'advpicto_lang` advpl ON adv.`id_advpicto` = advpl.`id_advpicto` AND advpl.`id_lang` = ' . Context::getContext()->language->id . ' '; if(Shop::isFeatureActive()) { $query .= ' INNER JOIN `'._DB_PREFIX_.'advpicto_shop` advs ON adv.`id_advpicto` = advs.`id_advpicto` AND id_shop = '. Context::getContext()->shop->id; } return Db::getInstance()->executeS($query); } public function getCategories() { if(!$this->id) { return array(); } if (!isset($this->categories)) { $this->categories = array(); foreach (Db::getInstance()->executeS(' SELECT `id_category` FROM `' . _DB_PREFIX_ . 'advpicto_category` WHERE `id_advpicto` = ' . $this->id . ' ') as $category) { $this->categories[] = $category['id_category']; } } return $this->categories; } public function addCategoryAssociation( $categories ) { if(!empty($categories)) { Db::getInstance()->execute(' DELETE FROM `'._DB_PREFIX_.'advpicto_category` WHERE `id_advpicto` = '.(int) $this->id.' '); if ($categories) { foreach ( $categories as $category ) { Db::getInstance()->execute(' INSERT INTO `'._DB_PREFIX_.'advpicto_category` (`id_advpicto`,`id_category`) VALUES ('.(int) $this->id.','.$category.') '); } } } } public static function getPictoName($id_picto, $id_lang) { return Db::getInstance()->getValue(' SELECT `title` FROM `' . _DB_PREFIX_ . 'advpicto_lang` WHERE `id_advpicto` = ' . $id_picto . ' AND id_lang = ' . $id_lang . ' '); } public static function getPictosForProductList($id_product, $id_category) { $context = Context::getContext(); $categories = Product::getProductCategories($id_product); if(!empty($categories)) { $query = ' SELECT * FROM `'._DB_PREFIX_.'advpicto` adv INNER JOIN `'._DB_PREFIX_.'advpicto_lang` advl ON adv.`id_advpicto` = advl.`id_advpicto` AND id_lang = '. $context->language->id ; if(Shop::isFeatureActive()) { $query .= ' INNER JOIN `'._DB_PREFIX_.'advpicto_shop` advs ON adv.`id_advpicto` = advs.`id_advpicto` AND id_shop = '. $context->shop->id; } $query .= ' INNER JOIN `'._DB_PREFIX_.'advpicto_category` advc ON adv.`id_advpicto` = advc.`id_advpicto` AND advc.`id_category` IN ('. implode(',', $categories) . ') WHERE adv.`active` = 1 GROUP BY adv.`id_advpicto` ORDER BY adv.`position` ASC '; $pictos = Db::getInstance()->executeS($query); if (empty($pictos)) { return false; } foreach($pictos as $key => $picto) { if(!$picto['selfcategory_display']) { $pictoCategories = Db::getInstance()->executeS(' SELECT `id_category` FROM `' . _DB_PREFIX_ . 'advpicto_category` WHERE `id_advpicto` = ' . $picto['id_advpicto'] ); $pictoCategories = array_map(function($elem) { return $elem['id_category']; }, $pictoCategories); if(in_array($id_category, $pictoCategories)) { unset($pictos[$key]); } } } return $pictos; } } public static function getPictosForProductDetails($id_product = null) { $context = Context::getContext(); if(!empty($id_product) && is_int($id_product)) { $query = ' SELECT DISTINCT(advp.`id_advpicto`), `title`, `alt`, `link` FROM `'._DB_PREFIX_.'advpicto_product` advp INNER JOIN `'._DB_PREFIX_.'advpicto_lang` advl ON advp.`id_advpicto` = advl.`id_advpicto` AND id_lang = '. $context->language->id.' INNER JOIN `'._DB_PREFIX_.'advpicto` ap ON ap.`id_advpicto` = advp.`id_advpicto`'; if(Shop::isFeatureActive()) { $query .= ' INNER JOIN `'._DB_PREFIX_.'advpicto_shop` advs ON advp.`id_advpicto` = advs.`id_advpicto` AND id_shop = '. $context->shop->id; } $query .= ' AND advp.id_product = '. (int) $id_product; $query .= ' ORDER BY ap.position '; $pictos = Db::getInstance()->executeS($query); if (empty($pictos)) { return false; } foreach($pictos as $key => $picto) { $pictos[$key]['hasImg'] = file_exists(_PS_IMG_DIR_ .'picto/'. $picto['id_advpicto'] . '.jpg'); } return $pictos; } } public function updatePosition($way, $position) { $sql = 'SELECT `position`, `id_advpicto` FROM `'._DB_PREFIX_.'advpicto` ORDER BY `position` ASC'; $res = Db::getInstance()->executeS($sql); if (!$res) return false; foreach ($res as $row) if ((int)$row['id_advpicto'] == (int)$this->id) $moved_row = $row; if (!isset($moved_row) || !isset($position)) return false; // < and > statements rather than BETWEEN operator // since BETWEEN is treated differently according to databases $res = Db::getInstance()->execute(' UPDATE `'._DB_PREFIX_.'advpicto` SET `position`= `position` '.($way ? '- 1' : '+ 1').' WHERE `position` '.($way ? '> '.(int)$moved_row['position'].' AND `position` <= '.(int)$position : '< '.(int)$moved_row['position'].' AND `position` >= '.(int)$position) ) && Db::getInstance()->execute(' UPDATE `'._DB_PREFIX_.'advpicto` SET `position` = '.(int)$position.' WHERE `id_advpicto`='.(int)$moved_row['id_advpicto'] ); $this->refreshPositions(); return $res; } public function refreshPositions(){ $sql = 'SELECT `id_advpicto` FROM `'._DB_PREFIX_.'advpicto` ORDER BY `position` ASC'; if (!$blocks = Db::getInstance()->executeS($sql)) return false; $pos=0; foreach ($blocks as $block) { Db::getInstance()->execute(' UPDATE `'._DB_PREFIX_.'advpicto` SET `position` = '.(int)$pos.' WHERE `id_advpicto`='.(int)$block['id_advpicto']); $pos++; } } }