我想以编程方式更改客户地址属性选项值,以便我创建了一个文件并进行了搜索并找到了解决方案:
<?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();
现在只保存商店标签,并清除所有选项值!为什么我不能在安装文件中使用此代码?
答案 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
我最近不得不做类似的事情(在自定义产品属性中添加一堆选项值),所以这可能是有用的指南,它基于我上面链接的核心文件中的过程。
祝你好运!
答案 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
祝你好运