在Prestashop 1.7中以编程方式复制ID问题创建产品组合

问题描述

我正在尝试添加具有PHP代码组合的产品。在运行脚本时,ps_product_attribute_combination表中发生重复的主ID错误。我正在使用颜色和尺寸组中的多个属性。这段代码放在$ product-> save()调用之后。

        $combinationAttributes[] = array(1,2);
        $combinationAttributes[] = array(5,6,7);
        

        if(!$product->productAttributeExists($combinationAttributes,false,null,true,true)){
            $price = $price;
            $weight = '';
            $ecotax = '';
            $unit_price_impact="";
            $quantity = 100;
            $reference = $reference;
            $supplier_reference = "";
            $ean13 = "";

            
            $default = '0';


            $idProductAttribute = $product->addProductAttribute((float)$price,(float)$weight,$unit_price_impact,(float)$ecotax,(int)$quantity,"",strval($reference),strval($supplier_reference),strval($ean13),$default,NULL,'','');
    
            
            $product->addAttributeCombinaison($idProductAttribute,$combinationAttributes);

解决方法

以编程方式插入产品可能会很痛苦。我使用一部分Prestashop默认值和一部分使用sql插入值编写了自己的代码。

希望此代码有助于您的进步。您可以将此文件添加到您的管理文件夹中并运行它。

独立的PHP文件

const mempty
,

在代码部分部分产品功能插入中存在一些错误 Crezzur 建议,例如检查 getfeaturename 变量是否存在必须是 featurenameid 并且查询 Check if 'feature value name' already exists in database is little incorect 。这是我的修复 // 插入“功能名称”和“功能值”

if (is_array($features)) {
    foreach ($features as $feature) {
        $attributeName = $feature['name'];
        $attributeValue = $feature['value'];

        // 1. Check if 'feature name' exist already in database
        $FeatureNameId = Db::getInstance()->getValue('SELECT id_feature FROM ' . _DB_PREFIX_ . 'feature_lang WHERE name = "' . pSQL($attributeName) . '"');

        // If 'feature name' does not exist,insert new.
        if (empty($FeatureNameId)) {
            Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'feature` (`id_feature`,`position`) VALUES (0,0)');
            $FeatureNameId = Db::getInstance()->Insert_ID(); // Get id of "feature name" for insert in product
            Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'feature_shop` (`id_feature`,`id_shop`) VALUES (' . $FeatureNameId . ',1)');
            Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'feature_lang` (`id_feature`,`id_lang`,`name`) VALUES (' . $FeatureNameId . ',' . Context::getContext()->language->id . ',"' . pSQL($attributeName) . '")');
        }

        // 1. Check if 'feature value name' exist already in database
        $FeatureValueId = Db::getInstance()->getValue('SELECT id_feature_value FROM ' . _DB_PREFIX_ . 'feature_value WHERE id_feature_value IN (SELECT id_feature_value FROM ' . _DB_PREFIX_ . 'feature_value_lang WHERE value = "' . pSQL($attributeValue) . '") AND id_feature = ' . $FeatureNameId);
        //var_dump($FeatureValueId);
        // If 'feature value name' does not exist,insert new.
        if (empty($FeatureValueId)) {
            Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'feature_value` (`id_feature_value`,`id_feature`,`custom`) VALUES (0,' . $FeatureNameId . ',0)');
            $FeatureValueId = Db::getInstance()->Insert_ID();
            Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'feature_value_lang` (`id_feature_value`,`value`) VALUES (' . $FeatureValueId . ',"' . pSQL($attributeValue) . '")');

        }
        Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'feature_product` (`id_feature`,`id_product`,`id_feature_value`) VALUES (' . $FeatureNameId . ',' . $product->id . ',' . $FeatureValueId . ')');
    }
}  The other part of the code provided by Crezzur is working and tested 10x Crezzur