通过编程创建的可配置产品未显示在搜索中- Magento 1.9

pcww981p  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(165)

我有一个脚本,用于创建一个可配置产品和与之关联的简单产品。创建后,在后端,所有这些产品看起来都很好(股票、网站、状态、可见性以及简单产品和可配置产品之间的关联都很好)。问题是,当我尝试搜索可配置产品或将其添加到类别时,它不显示。
所有产品(可配置的和简单的)首先使用此方法创建:

private function createBaseProduct($sku)
    {
        $_product = Mage::getModel('catalog/product');
        $_product->setSku($sku);
        $_product->setAttributeSetId(4);
        $_product->setTypeId('simple');
        $_product->setWebsiteIDs(array(1));
        $_product->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH);
        $_product->setStatus(1);
        $_product->setTaxClassId(0);
        $_product->setStockData(array(
            'use_config_manage_stock' => 0,
            'manage_stock' => 1,
            'is_in_stock' => 1,
            'qty' => 100
        ));
        return $_product;
    }

如果产品是可配置的,则转到此方法:

private function setData($configurable)
    {
        $configurable->setTypeId('configurable');
        $configurable->setStockData(array(
            'use_config_manage_stock' => 0,
            'manage_stock' => 0,
            'is_in_stock' => 1,
            'qty' => 0,
        ));
    --> $configurable = $this->setAssociativeAttributes($configurable); 
        $configurableAttributesData = $configurable->getTypeInstance()->getConfigurableAttributesAsArray();
        $configurable->setCanSaveConfigurableAttributes(true);
        $configurable->setConfigurableAttributesData($configurableAttributesData);
        return $configurable;
    }

其中,方法setAssociateAttributes()设置正在创建的可配置产品的属性ID:

private function setAssociativeAttributes()
    {
        $configurable->getTypeInstance()->setUsedProductAttributeIds($this->configurableAttrsIds);
        return $configurable;
    }

然后,使用$product->save()保存setData()中返回的可配置产品。然后,使用以下方法创建(使用createBaseProduct()方法)、保存简单产品并将其分配给可配置产品:

public function associateChildProduct($configurableId, $childProduct)
    {
        $configurable = Mage::getModel('catalog/product')->load($configurableId); 
        $childProducts = $configurable->getTypeInstance()->getUsedProducts();
        array_push($childProducts, $childProduct);
        $childProductsIds = array();
        foreach($childProducts as $product) {
            array_push($childProductsIds, $product->getId());
        }
        Mage::getResourceSingleton('catalog/product_type_configurable')
            ->saveProducts($configurable, $childProductsIds);
    }

一切看起来都很好,产品被创建并正确分配到可配置。但在前端,可配置的产品没有显示(只有当我通过URL访问它时,它才能正确打开,包括变化和所有内容)。观察结果:简单产品在搜索中正确显示,仅缺少可配置产品。
我认为可配置的数据有问题,但我无法解决:(
-----编辑-----
因此,我又调试了一些,似乎问题实际上出在用于创建可配置产品的属性上(我也是以编程方式创建此属性的)。如果我再次在管理面板中保存以编程方式创建的属性,简单产品与其可配置显示之间的联系(它们在管理面板中不再显示链接)。属性在可配置产品之前使用类“CustomAttribute”创建:

public function __construct($attrCode)
{   
    $attrData = array(
            'group'             => '',
            'type'              => 'varchar',
            'backend'           => '',
            'frontend'          => '',
            'label'             => ucfirst($attrCode),
            'input'             => 'select',
            'class'             => '',
            'source'            => '',
            'global'            => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
            'visible'           => true,
            'required'          => false,
            'user_defined'      => true,
            'default'           => '0',
            'searchable'        => false,
            'filterable'        => false,
            'comparable'        => false,
            'visible_on_front'  => false,
            'is_configurable'   => true,
            'unique'            => false,
        );
        $installer = new Mage_Eav_Model_Entity_Setup('core_setup');
        $installer->startSetup();
        $installer->addAttribute(Mage_Catalog_Model_Product::ENTITY, $attrCode, $attributeData);
        $this->addAttributeToDefaultSet();
        $installer->endSetup();
}

并使用以下方法将此属性设置为子产品(在创建子产品期间):

private function setCustomAttribute($chidlProduct, $attrCode, $optionLabel)
{
    $customAttribute = new CustomAttribute($attrCode);
    $customAttribute->addOptionIfNotExists($optionLabel, $attrCode);
    $optionId = $customAttribute->getOptionId($optionLabel);
    $product->setData($attrCode, $optionId);
}

其中,方法$customAttribute->addOptionIfNotExists()会建立属性的选项(如果尚未建立):

public function addOptionIfNotExists($optionLabel, $attrCode)
    {
        $value['option'] = array($optionLabel);
        $order['option'] = 0;
        $optionData = array(
            'value' => $value,
            'order' => $order
        );
        $attribute = Mage::getSingleton('eav/config')
            ->getAttribute(Mage_Catalog_Model_Product::ENTITY, $attrCode);
        $attribute->setData('option', $optionData);
        $attribute->save();
    }

添加后,调用方法associateChildProduct()将简单产品与其可配置项关联。
观察结果:可配置产品通过URL正确显示,甚至显示属性变体。观察结果2:如果我通过管理面板保存属性,删除简单产品并使用“快速创建”(具有相同值)创建新产品,则可配置产品将显示在搜索和类别中。

k7fdbhmy

k7fdbhmy1#

  • 只是把我的意见以答案的形式,并组织它 *

最近创建的产品或以编程方式创建的产品不显示在某个集合中的原因有很多。
索引
第一个也是最常见的一个与指数化有关。
这可能与cronjob中的问题有关(未配置或未正常工作)。
您可以通过执行以下操作手动触发重新建立索引过程:

磁性1php shell/indexer.php reindexall
Magento 2bin/magento indexer:reindex

产品未添加到网站或不可见

检查产品是否已启用且在目录中可见。如果它们是来自可配置产品的简单产品,请确保它们都已启用。还要检查项目是否有足够的库存,以及它们是否未标记为“库存不足”(无论库存数量如何)。
在多网站商店中,检查产品编辑页面中的“网站”组,看看它是否被选中显示在该网站中。还要检查产品范围。有时您会在内部级别(即商店视图或网站)禁用产品。

某些条件未满足

如果您认为已经检查了所有内容,那么现在是时候调试集合了。
Magento 1和Magento 2在集合对象中有getSelect()方法。
找到产品被 * 循环 * 的phtml或块,并找到集合变量(通常用于foreach)。
然后,添加类似echo (string)$collection->getSelect()的内容。
这将显示用于搜索产品的查询。查看您缺少的产品不符合哪个joinwhere条件。
下面是Magento 1中类别集合查询的一个示例:

SELECT `e`.*,
       `cat_index`.`position`    AS `cat_index_position`,
       `price_index`.`price`,
       `price_index`.`tax_class_id`,
       `price_index`.`final_price`,
       IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price),
          price_index.min_price) AS `minimal_price`,
       `price_index`.`min_price`,
       `price_index`.`max_price`,
       `price_index`.`tier_price`
FROM `catalog_product_entity` AS `e`
INNER JOIN `catalog_category_product_index` AS `cat_index`
        ON cat_index.product_id = e.entity_id AND cat_index.store_id = 4 AND
           cat_index.visibility IN (2, 4) AND cat_index.category_id = '10'
INNER JOIN `catalog_product_index_price` AS `price_index`
        ON price_index.entity_id = e.entity_id AND price_index.website_id = '4' AND
           price_index.customer_group_id = 0
ORDER BY `cat_index`.`position` ASC
LIMIT 12

1来自Magento 1样本数据的“新品"类别。

0s0u357o

0s0u357o2#

Ricardo Martins的帮助下,我调试了这个问题,发现可配置产品没有被显示,因为它的entity_id没有被添加到表catalog_product_index_price中。这个问题似乎是由于在可配置产品的创建中使用的属性将backend_type设置为varchar,而不是intReference)而引起的。
因此,我将创建属性的代码更改为:

public function __construct($attrCode)
{   
    $attrData = array(
            'group'             => '',
        --> 'type'              => 'int',
            'backend'           => '',
            'frontend'          => '',
            'label'             => ucfirst($attrCode),
            'input'             => 'select',
            'class'             => '',
            'source'            => '',
            'global'            => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
            'visible'           => true,
            'required'          => false,
            'user_defined'      => true,
            'default'           => '0',
            'searchable'        => false,
            'filterable'        => false,
            'comparable'        => false,
            'visible_on_front'  => false,
            'is_configurable'   => true,
            'unique'            => false,
        );
        $installer = new Mage_Eav_Model_Entity_Setup('core_setup');
        $installer->startSetup();
        $installer->addAttribute(Mage_Catalog_Model_Product::ENTITY, $attrCode, $attributeData); 
        $this->addAttributeToDefaultSet();
        $installer->endSetup();
}

其中,在所示行中,属性的backend_type设置为int。此后,可配置产品将正确显示在类别和搜索中:)

相关问题