getValue(' SELECT count(*) AS nb FROM `'._DB_PREFIX_.'product_configurator_opt_group` pcog, `'._DB_PREFIX_.'configurator_opt_group` cog WHERE pcog.`id_product` = '.(int)$id_product.' AND cog.`id_configurator_opt_group` = pcog.`id_configurator_opt_group`'); return ( $result > 0 ? true : false ); } /** * Retourne les groupes options * @param int $id_product * @return array */ public static function getConfiguratorOptGroup($id_product) { $context = Context::getContext(); $id_lang = $context->language->id; $result = Db::getInstance()->executeS(' SELECT pcog.*, col.`name`, col.`description`, col.`separator`, cog.`type`, cog.`reference` FROM `'._DB_PREFIX_.'product_configurator_opt_group` pcog, `'._DB_PREFIX_.'configurator_opt_group` cog, `'._DB_PREFIX_.'configurator_opt_group_lang` col WHERE pcog.`id_product` = '.(int)$id_product.' AND cog.`id_configurator_opt_group` = col.`id_configurator_opt_group` AND pcog.`id_configurator_opt_group` = col.`id_configurator_opt_group` AND col.`id_lang` = '.(int)$id_lang.' ORDER BY pcog.`position` ASC'); return $result; } /** * Retourne les impacts * @param int $id_product * @return array */ public static function getConfiguratorOptImpact($id_product) { $context = Context::getContext(); $id_lang = $context->language->id; $result = Db::getInstance()->executeS(' SELECT pcoi.`id_product_configurator_opt_impact`, pcoi.`id_product_configurator_opt_group`, pcoi.`id_configurator_opt`, col.`name`, pcoi.`price`, co.`position` FROM `'._DB_PREFIX_.'product_configurator_opt_impact` pcoi LEFT JOIN `'._DB_PREFIX_.'configurator_opt` co ON co.`id_configurator_opt` = pcoi.`id_configurator_opt` LEFT JOIN `'._DB_PREFIX_.'configurator_opt_lang` col ON (col.`id_configurator_opt` = pcoi.`id_configurator_opt` AND col.`id_lang` = '.(int)$id_lang.') WHERE pcoi.`id_product` = '.(int)$id_product.' ORDER BY pcoi.`id_product_configurator_opt_group`, co.`position` ASC'); return $result; } /** * Group Label : values * @param int $id_configurator * @return array */ public static function getOptProductFlatten($id_configurator) { $context = Context::getContext(); $id_lang = $context->language->id; $optFlatten = array(); $sql = 'SELECT cs.`opt_value`, cs.`id_configurator_opt_group`, cogl.`name` AS groupName, col.`name` AS optName, cog.`reference`, cog.`type` FROM `'._DB_PREFIX_.'configurator_storage` cs, `'._DB_PREFIX_.'configurator_opt_lang` col, `'._DB_PREFIX_.'configurator_opt_group_lang` cogl, `'._DB_PREFIX_.'configurator_opt_group` cog WHERE col.`id_configurator_opt` = cs.`id_configurator_opt` AND col.`id_lang` = '.(int)$id_lang.' AND cogl.`id_configurator_opt_group` = cs.`id_configurator_opt_group` AND cogl.`id_lang` = '.(int)$id_lang.' AND cog.`id_configurator_opt_group` = cs.`id_configurator_opt_group` AND cs.`id_configurator` = '.(int)$id_configurator; $optList = Db::getInstance()->executeS($sql); if (count($optList) > 0) { foreach ($optList as $o) { if (!array_key_exists($o['id_configurator_opt_group'], $optFlatten)) { $optFlatten[$o['id_configurator_opt_group']] = array( 'name' => $o['groupName'], 'reference' => $o['reference'], 'type' => $o['type'], 'value' => array(), ); } if ($o['opt_value'] == '') { $optFlatten[$o['id_configurator_opt_group']]['value'][] = $o['optName']; } else { $optFlatten[$o['id_configurator_opt_group']]['value'][] = $o['opt_value']; } } } return $optFlatten; } /** * Get form values * @param int $id_configurator * @return array */ public static function getOptProductSelected($id_configurator) { $context = Context::getContext(); $id_lang = $context->language->id; $optFlatten = array(); $sql = 'SELECT cs.`opt_value`, cs.`id_configurator_opt`, cs.`id_configurator_opt_group`, cogl.`name` AS groupName, col.`name` AS optName, cog.`reference` FROM `'._DB_PREFIX_.'configurator_storage` cs, `'._DB_PREFIX_.'configurator_opt_lang` col, `'._DB_PREFIX_.'configurator_opt_group_lang` cogl, `'._DB_PREFIX_.'configurator_opt_group` cog WHERE col.`id_configurator_opt` = cs.`id_configurator_opt` AND col.`id_lang` = '.(int)$id_lang.' AND cogl.`id_configurator_opt_group` = cs.`id_configurator_opt_group` AND cogl.`id_lang` = '.(int)$id_lang.' AND cog.`id_configurator_opt_group` = cs.`id_configurator_opt_group` AND cs.`id_configurator` = '.(int)$id_configurator; $optList = Db::getInstance()->executeS($sql); if (count($optList) > 0) { foreach ($optList as $o) { if (!array_key_exists($o['id_configurator_opt_group'], $optFlatten)) { $optFlatten[$o['id_configurator_opt_group']] = array(); } if ($o['opt_value'] == '') { $optFlatten[$o['id_configurator_opt_group']][] = $o['id_configurator_opt']; } else { $optFlatten[$o['id_configurator_opt_group']][] = $o['opt_value']; } } } return $optFlatten; } /** * Parse option send when adding to cart * @param int $id_configurator * @param int $id_product * @param int $id_address_delivery * @param int $id_product_attribute * @param int $qty * @return int */ public static function parseConfigurator($id_configurator, $id_product, $id_address_delivery, $id_product_attribute, $qty) { $detectOptGroup = 'optgroup-'; $postValues = Tools::getAllValues(); if (count($postValues) > 0) { $sqlValues = array(); foreach($postValues as $p => $v) { if (!empty($v)) { if (substr($p, 0, strlen($detectOptGroup)) === $detectOptGroup) { $ids = explode('-', substr($p, strlen($detectOptGroup))); $id_configurator_opt_group = $ids[0]; $id_configurator_opt = $v; $optValue = ''; if (isset($ids[1])) { $id_configurator_opt = $ids[1]; $optValue = $v; } if (is_array($id_configurator_opt) && count($id_configurator_opt) > 0) { foreach ($id_configurator_opt as $item) { $price = Db::getInstance()->getValue('SELECT pcoi.`price` FROM `'._DB_PREFIX_.'configurator_opt` co, `'._DB_PREFIX_.'product_configurator_opt_impact` pcoi WHERE co.`id_configurator_opt` = pcoi.`id_configurator_opt` AND co.`id_configurator_opt` = '.(int)$item); $sqlValues[] = '(@id_configurator, '.$id_product.', '.(int)$id_configurator_opt_group.', '.pSQL($item).', \''.pSQL($optValue).'\', '.$price.')'; } } else { if (is_array($optValue)) { foreach($optValue as $v) { $price = Db::getInstance()->getValue('SELECT pcoi.`price` FROM `'._DB_PREFIX_.'configurator_opt` co, `'._DB_PREFIX_.'product_configurator_opt_impact` pcoi WHERE co.`id_configurator_opt` = pcoi.`id_configurator_opt` AND co.`id_configurator_opt` = '.(int)$id_configurator_opt); $sqlValues[] = '(@id_configurator, '.$id_product.', '.(int)$id_configurator_opt_group.', '.(int)$id_configurator_opt.', \''.pSQL($v).'\', '.$price.')'; } } else { $price = Db::getInstance()->getValue('SELECT pcoi.`price` FROM `'._DB_PREFIX_.'configurator_opt` co, `'._DB_PREFIX_.'product_configurator_opt_impact` pcoi WHERE co.`id_configurator_opt` = pcoi.`id_configurator_opt` AND co.`id_configurator_opt` = '.(int)$id_configurator_opt); $sqlValues[] = '(@id_configurator, '.$id_product.', '.(int)$id_configurator_opt_group.', '.(int)$id_configurator_opt.', \''.pSQL($optValue).'\', '.$price.')'; } } } } } if (count($sqlValues) > 0) { if ($id_configurator === null) { $id_configurator = 0; } if ($id_configurator == 0) { // Get id_configurator max $cmaxSql = 'SELECT IF(MAX(cp.id_configurator) IS NULL, 0, MAX(cp.id_configurator)) AS maxCp, IF(MAX(cs.id_configurator) IS NULL, 0, MAX(cs.id_configurator)) AS maxCs FROM `'._DB_PREFIX_.'configurator_storage` cs, `'._DB_PREFIX_.'cart_product` cp'; $max = Db::getInstance()->getRow($cmaxSql); $id_configurator = ($max['maxCp'] > $max['maxCs'] ? $max['maxCp'] : $max['maxCs']) + 1; $context = Context::getContext(); // Assign id on cart_product Db::getInstance()->update('cart_product', array( 'id_configurator' => (int)$id_configurator), 'id_cart='.(int)$context->cart->id. ' AND id_product='.(int)$id_product. ' AND id_address_delivery='.(int)$id_address_delivery. ' AND id_shop='.(int)$context->cart->id_shop. ' AND id_product_attribute='.(int)$id_product_attribute. ' AND quantity='.(int)$qty .' AND id_configurator = 0'); } // Delete else { Db::getInstance()->delete('configurator_storage', 'id_configurator = '.(int)$id_configurator); } // Insert configuration $insertSql = 'SET @id_configurator = '.$id_configurator.'; INSERT INTO `'._DB_PREFIX_.'configurator_storage` (`id_configurator`, `id_product`, `id_configurator_opt_group`, `id_configurator_opt`, `opt_value`, `price`) VALUES '.implode(',', $sqlValues); if (!Db::getInstance()->execute($insertSql)){ $id_configurator = 0; } return $id_configurator; } } return 0; } /** * Check if fields are required * @param int $id_product * @return boolean|array */ public static function checkRequirement($id_product) { $context = Context::getContext(); $id_lang = $context->language->id; $errors = array(); $optIds = array(); $detectOptGroup = 'optgroup-'; $postValues = Tools::getAllValues(); if (count($postValues) > 0) { foreach($postValues as $p => $v) { if (substr($p, 0, strlen($detectOptGroup)) === $detectOptGroup) { $ids = explode('-', substr($p, strlen($detectOptGroup))); $optIds[$ids[0]] = $v; } } $result = Db::getInstance()->executeS(' SELECT pcog.*, cog.`type`, col.`name` FROM `'._DB_PREFIX_.'product_configurator_opt_group` pcog, `'._DB_PREFIX_.'configurator_opt_group` cog, `'._DB_PREFIX_.'configurator_opt_group_lang` col WHERE pcog.`id_product` = '.(int)$id_product.' AND cog.`id_configurator_opt_group` = col.`id_configurator_opt_group` AND pcog.`id_configurator_opt_group` = col.`id_configurator_opt_group` AND col.`id_lang` = '.(int)$id_lang.' ORDER BY pcog.`position` ASC'); if (count($result) > 0) { foreach($result as $item) { if ($item['required'] == 1) { if (!array_key_exists($item['id_configurator_opt_group'], $optIds)) { $errors[] = Tools::displayError('Error : field '.$item['name'].' has no value'); } else { $value = $optIds[$item['id_configurator_opt_group']]; if (empty($value)) { $errors[] = Tools::displayError('Error : field '.$item['name'].' has no value'); } } } // Check quantities field value if ($item['type'] == 'quantities') { $product = new Product($id_product); $id_product_attribute = $product->getDefaultIdProductAttribute(); if ($id_product_attribute > 0) { $attributes = $product->getAttributeCombinations($context->language->id); foreach ($attributes as $a) { if ($a['id_product_attribute'] == $id_product_attribute) { $qty = $a['minimal_quantity']; break; } } } $values = $optIds[$item['id_configurator_opt_group']]; foreach($values as $v) { if ($v <= $qty) { $errors[] = Tools::displayError('You have set a quantity under minimal quantity'); break; } } } } } } if (count($errors) > 0) { return $errors; } return true; } }