* @copyright 2007-2011 PrestaShop SA * @version Release: $Revision: 6844 $ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * International Registered Trademark & Property of PrestaShop SA */ class AttributeGroupCore extends ObjectModel { /** @var string Name */ public $name; public $is_color_group; public $position; public $group_type; /** @var string Public Name */ public $public_name; protected $fieldsRequired = array(); protected $fieldsValidate = array('is_color_group' => 'isBool'); protected $fieldsRequiredLang = array('name', 'public_name'); protected $fieldsSizeLang = array('name' => 64, 'public_name' => 64); protected $fieldsValidateLang = array('name' => 'isGenericName', 'public_name' => 'isGenericName', 'position' => 'isInt'); protected $table = 'attribute_group'; protected $identifier = 'id_attribute_group'; protected $webserviceParameters = array( 'objectsNodeName' => 'product_options', 'objectNodeName' => 'product_option', 'fields' => array(), 'associations' => array( 'product_option_values' => array('resource' => 'product_option_value', 'fields' => array( 'id' => array(), ), ), ), ); public function getFields() { $this->validateFields(); $fields['is_color_group'] = (int)($this->is_color_group); $fields['group_type'] = pSQL($this->group_type); $fields['position'] = (int)($this->position); return $fields; } public function add($autodate = true, $nullValues = false) { $return = parent::add($autodate, true); Module::hookExec('afterSaveAttributeGroup', array('id_attribute_group' => $this->id)); return $return; } public function update($nullValues = false) { $return = parent::update($nullValues); Module::hookExec('afterSaveAttributeGroup', array('id_attribute_group' => $this->id)); return $return; } /** * Check then return multilingual fields for database interaction * * @return array Multilingual fields */ public function getTranslationsFieldsChild() { $this->validateFieldsLang(); return $this->getTranslationsFields(array('name', 'public_name')); } public static function cleanDeadCombinations() { $attributeCombinations = Db::getInstance()->executeS('SELECT pac.`id_attribute`, pa.`id_product_attribute` FROM `'._DB_PREFIX_.'product_attribute` pa LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON (pa.`id_product_attribute` = pac.`id_product_attribute`)'); $toRemove = array(); foreach ($attributeCombinations AS $attributeCombination) if ((int)($attributeCombination['id_attribute']) == 0) $toRemove[] = (int)($attributeCombination['id_product_attribute']); if (!empty($toRemove) AND Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'product_attribute` WHERE `id_product_attribute` IN ('.implode(', ', $toRemove).')') === false) return false; return true; } public function delete() { /* Select children in order to find linked combinations */ $attributeIds = Db::getInstance()->executeS('SELECT `id_attribute` FROM `'._DB_PREFIX_.'attribute` WHERE `id_attribute_group` = '.(int)($this->id)); if ($attributeIds === false) return false; /* Removing attributes to the found combinations */ $toRemove = array(); foreach ($attributeIds AS $attribute) $toRemove[] = (int)($attribute['id_attribute']); if (!empty($toRemove) AND Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'product_attribute_combination` WHERE `id_attribute` IN ('.implode(', ', $toRemove).')') === false) return false; /* Remove combinations if they do not possess attributes anymore */ if (!self::cleanDeadCombinations()) return false; /* Also delete related attributes */ if (Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'attribute_lang` WHERE `id_attribute` IN (SELECT id_attribute FROM `'._DB_PREFIX_.'attribute` WHERE `id_attribute_group` = '.(int)($this->id).')') === false OR Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'attribute` WHERE `id_attribute_group` = '.(int)($this->id)) === false) return false; $return = parent::delete(); if($return) Module::hookExec('afterDeleteAttributeGroup', array('id_attribute_group' => $this->id)); return $return; } /** * Get all attributes for a given language / group * * @param integer $id_lang Language id * @param boolean $id_attribute_group Attribute group id * @return array Attributes */ public static function getAttributes($id_lang, $id_attribute_group) { if (!Combination::isFeatureActive()) return array(); return Db::getInstance()->executeS(' SELECT * FROM `'._DB_PREFIX_.'attribute` a LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.(int)($id_lang).') WHERE a.`id_attribute_group` = '.(int)($id_attribute_group).' ORDER BY `position` ASC'); } /** * Get all attributes groups for a given language * * @param integer $id_lang Language id * @return array Attributes groups */ public static function getAttributesGroups($id_lang) { if (!Combination::isFeatureActive()) return array(); return Db::getInstance()->executeS(' SELECT * FROM `'._DB_PREFIX_.'attribute_group` ag LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND `id_lang` = '.(int)($id_lang).') ORDER BY `name` ASC'); } /** * Delete several objects from database * * return boolean Deletion result */ public function deleteSelection($selection) { /* Also delete Attributes */ foreach ($selection AS $value) { $obj = new AttributeGroup($value); if (!$obj->delete()) return false; } return true; } public function setWsProductOptionValues($values) { $ids = array(); foreach ($values as $value) $ids[] = intval($value['id']); Db::getInstance()->execute(' DELETE FROM `'._DB_PREFIX_.'attribute` WHERE `id_attribute_group` = '.(int)$this->id.' AND `id_attribute` NOT IN ('.implode(',', $ids).')' ); $ok = true; foreach ($values as $value) { $result = Db::getInstance()->execute(' UPDATE `'._DB_PREFIX_.'attribute` SET `id_attribute_group` = '.(int)$this->id.' WHERE `id_attribute` = '.(int)$value['id'] ); if ($result === false) $ok = false; } return $ok; } public function getWsProductOptionValues() { $result = Db::getInstance()->executeS('SELECT id_attribute AS id from `'._DB_PREFIX_.'attribute` WHERE id_attribute_group = '.(int)$this->id); return $result; } /** * Move a group attribute * @param boolean $way Up (1) or Down (0) * @param integer $position * @return boolean Update result */ public function updatePosition($way, $position) { if (!$res = Db::getInstance()->executeS(' SELECT ag.`position`, ag.`id_attribute_group` FROM `'._DB_PREFIX_.'attribute_group` ag WHERE ag.`id_attribute_group` = '.(int)Tools::getValue('id_attribute_group', 1).' ORDER BY ag.`position` ASC' )) return false; foreach ($res AS $group_attribute) if ((int)$group_attribute['id_attribute_group'] == (int)$this->id) $movedGroupAttribute = $group_attribute; if (!isset($movedGroupAttribute) || !isset($position)) return false; // < and > statements rather than BETWEEN operator // since BETWEEN is treated differently according to databases return (Db::getInstance()->execute(' UPDATE `'._DB_PREFIX_.'attribute_group` SET `position`= `position` '.($way ? '- 1' : '+ 1').' WHERE `position` '.($way ? '> '.(int)$movedGroupAttribute['position'].' AND `position` <= '.(int)$position : '< '.(int)$movedGroupAttribute['position'].' AND `position` >= '.(int)$position)) AND Db::getInstance()->execute(' UPDATE `'._DB_PREFIX_.'attribute_group` SET `position` = '.(int)$position.' WHERE `id_attribute_group`='.(int)$movedGroupAttribute['id_attribute_group'])); } /** * Reorder group attribute position * Call it after deleting a group attribute. * * @return bool $return */ public static function cleanPositions() { $return = true; $sql = ' SELECT `id_attribute_group` FROM `'._DB_PREFIX_.'attribute_group` ORDER BY `position`'; $result = Db::getInstance()->executeS($sql); $i = 0; foreach ($result as $value) $return = Db::getInstance()->execute(' UPDATE `'._DB_PREFIX_.'attribute_group` SET `position` = '.(int)$i++.' WHERE `id_attribute_group` = '.(int)$value['id_attribute_group']); return $return; } /** * getHigherPosition * * Get the higher group attribute position * * @return integer $position */ public static function getHigherPosition() { $sql = 'SELECT MAX(`position`) FROM `'._DB_PREFIX_.'attribute_group`'; $position = DB::getInstance()->getValue($sql); return ($position !== false) ? $position : -1; } }