Magento设置不保存客户属性选项值?

时间:2014-11-12 14:41:54

标签: magento

我想以编程方式更改客户地址属性选项值,以便我创建了一个文件并进行了搜索并找到了解决方案:

<?php
require_once 'app/Mage.php';
Mage::app();

$attribute = Mage::getSingleton('eav/config')->getAttribute('customer_address', 'geslacht');
$data['option']['value'] = array(
    8649 => array(
        0 => 'De heer',
        1 => 'heer',
        2 => 'heer'
    ),
    8648 => array(
        0 => 'Mevrouw',
        1 => 'mevrouw',
        2 => 'mevrouw'
    )
);
$data['store_labels'] = array(
    0 => 'Geslacht',
    1 => 'Aanhef',
    2 => 'Aanhef'
);
$attribute->addData($data)->save();

它完美无缺!但是......现在我想在我创建的模块的设置文件中使用它,所以我已经将它复制到安装文件中并且来到了这个:

<?php
$installer = $this;
$installer->startSetup();

$attribute = Mage::getSingleton('eav/config')->getAttribute('customer_address', 'geslacht');
$data['option']['value'] = array(
    8649 => array(
        0 => 'De heer',
        1 => 'heer',
        2 => 'heer'
    ),
    8648 => array(
        0 => 'Mevrouw',
        1 => 'mevrouw',
        2 => 'mevrouw'
    )
);
$data['store_labels'] = array(
    0 => 'Geslacht',
    1 => 'Aanhef',
    2 => 'Aanhef'
);
$attribute->addData($data)->save();

$installer->endSetup();

现在只保存商店标签,并清除所有选项值!为什么我不能在安装文件中使用此代码?

6 个答案:

答案 0 :(得分:2)

好的,我不确定这会起作用,但似乎是一种可能的解释。 问题可能是由于当安装Magento运行脚本时,环境未完全初始化。解决方案可以是将脚本移动到数据安装脚本,该脚本将在环境初始化后运行。

这些文件的命名约定主要与sql脚本相同,但它们位于一个单独的文件夹中。

这不是主题,所以我只发布一个关于如何创建数据安装脚本的链接:http://inchoo.net/magento/using-magento-1-6-data-install-scripts/

我还找到了一篇非常有用的文章:http://vinaikopp.com/2014/11/03/magento-setup-scripts/

祝你好运!

答案 1 :(得分:0)

创建后,无法将属性的选项值更新。最初调用addAttribute时,它将检测选项值数组,并自动使用必要信息填充eav_config_option和eav_config_option_value表。您可以在此处查看安装脚本是如何执行此操作的(主要是addAttribute和addAttributeOption函数):http://freegento.com/doc/d0/d7b/_eav_2_model_2_entity_2_setup_8php-source.html

我最近不得不做类似的事情(在自定义产品属性中添加一堆选项值),所以这可能是有用的指南,它基于我上面链接的核心文件中的过程。

https://github.com/aligent/Aligent_Feeds/blob/47ee0ad0f15a3461d3d228ed663a9e9816d25913/app/code/community/Aligent/Feeds/sql/aligent_feeds_setup/upgrade-0.1.1-0.1.2.php

祝你好运!

答案 2 :(得分:0)

有一个设置功能可以更新名为 addAttributeOption 的属性选项数据。它的名字以“add”开头,但它也会更新。没有用于更新属性的商店标签的设置功能,但幸运的是,您的代码可以用于此目的。因此,此代码可能适用于您的示例;

<?php
$installer = $this;
$installer->startSetup();

$attribute = Mage::getSingleton('eav/config')->getAttribute('customer_address', 'geslacht');
$attributeData['store_labels'] = array(
    0 => 'Geslacht',
    1 => 'Aanhef',
    2 => 'Aanhef'
);
$attribute->addData($attributeData)->save();

$optionData['option']['attribute_id'] = $attribute->getId();
$optionData['option']['value'] = array(
    8649 => array(
        0 => 'De heer',
        1 => 'heer',
        2 => 'heer'
    ),
    8648 => array(
        0 => 'Mevrouw',
        1 => 'mevrouw',
        2 => 'mevrouw'
    )
);

$installer->addAttributeOption($optionData); //Function is named "addAttributeOption", but it makes update too.

$installer->endSetup();

答案 3 :(得分:-1)

您可以将属性值直接保存到相应的数据库表中:

    $installer->run("

    INSERT INTO customer_address_entity_varchar
    (entity_type_id,attribute_id,entity_id,value) 
    VALUES (2,9,1,'Francis');

    ");

脏,但非常普遍和快速。

答案 4 :(得分:-1)

我们可以使用以下脚本以编程方式更新属性选项(商店的更新标签)

我可以使用此脚本更新产品属性选项值

// This Function Get Attribute code and Attribute Value.

function getOptionId($atributeCode,$optionValue){
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 
    /*$attributeRepository = $objectManager->create('\Magento\Eav\Model\AttributeRepository');
    $attribute_id = $attributeRepository->get('catalog_product', $atributeCode)->getAttributeId();*/
    $resource = $objectManager->get('Magento\Framework\App\ResourceConnection');
    $connection = $resource->getConnection();
    $eaov = $resource->getTableName('eav_attribute_option_value');
    $eao = $resource->getTableName('eav_attribute_option');
    $ea= $resource->getTableName('eav_attribute');
    $attributeId = $connection->fetchOne("SELECT `attribute_id` FROM $ea WHERE `attribute_code` = '$atributeCode' AND `entity_type_id` = '4'");
    $sql = "select * from $eao join $eaov on $eaov.option_id = $eao.option_id where $eaov.value='$optionValue' AND $eao.attribute_id='$attributeId'";
    $result = $connection->fetchRow($sql);
    return $optionId = isset($result['option_id']) ? $result['option_id']: null;
}

// This Function Get attribute OptionId with help of Attribute code and Attribute Value.

function creatOrGetId($atributeCode,$optionValue)
{
    $optionId = getOptionId($atributeCode,$optionValue);
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 
    if(!$optionId ){
        $attributeRepository = $objectManager->create('\Magento\Eav\Model\AttributeRepository');
        $attributeId = $attributeRepository->get('catalog_product', $atributeCode)->getAttributeId();
        $option = $objectManager->create('\Magento\Eav\Model\Entity\Attribute\Option');
        $attributeOptionLabel = $objectManager->create('\Magento\Eav\Api\Data\AttributeOptionLabelInterface');
        $attributeOptionManagement = $objectManager->create('\Magento\Eav\Api\AttributeOptionManagementInterface');
        $option->setValue($optionValue);
        $attributeOptionLabel->setStoreId(0);
        $attributeOptionLabel->setLabel($optionValue);
        $option->setLabel($attributeOptionLabel);
        $option->setStoreLabels([$attributeOptionLabel]);
        $option->setSortOrder(0);
        $option->setIsDefault(false);
        $attributeOptionManagement->add('catalog_product', $attributeId, $option);
        return $optionId = getOptionId($atributeCode,$optionValue);
    }else{
      return $optionId;
    }
}

//echo "\n================== Created Attribute Option Values =============\n";

$manufacturer = array['aa', 'bb', 'cc', 'dd']
$manufacturerId = creatOrGetId('manufacturer',$manufacturer);

//echo "\n================== Update Attribute Option Values =============\n";

$product->setManufacturer($manufacturerId); // manufacturer of product

答案 5 :(得分:-2)

尝试这样的事情

$installer->addAttribute('customer_address', 'geslacht', array(
'label' => 'De heer',
'type' => 'varchar'
));

$installer->addAttribute('customer_address', 'geslacht', array(
'label' => 'heer',
'type' => 'varchar'
));

// and so on

$installer->endSetup();

HTH

祝你好运