我想添加一个新的产品属性,该属性会呈现一个包含所有CMS页面的下拉列表作为其选项。 我创建了一个扩展,并希望通过安装脚本添加此属性。但是在运行之后,Magento破坏了eav_entity_type表......
到目前为止我尝试了什么:
mysql4安装-0.1.0.php:
$installer = $this;
$setup = new Mage_Eav_Model_Entity_Setup('core_setup');
$installer->startSetup();
$setup->addAttribute('catalog_product', 'test_report', array(
'label' => 'Test report',
'required' => false,
'input' => 'select',
'source' => 'cmspageselect/entity_source',
'default' => 'none',
'position' => 1,
'sort_order' => 3,
));
$installer->endSetup();
cmspageselect / entity_source类的来源:
class Mandarin_CMSPageSelect_Model_Source extends Mage_Eav_Model_Entity_Attribute_Source_Abstract {
/**
* Retrieve Full Option values array
*
* @param bool $withEmpty Add empty option to array
* @return array
*/
public function getAllOptions($withEmpty = true)
{
$storeId = $this->getAttribute()->getStoreId();
if (!is_array($this->_options)) {
$this->_options = array();
}
if (!isset($this->_options[$storeId])) {
$collection = Mage::getResourceModel('cms/page_collection')
->setPositionOrder('asc')
->setStoreFilter($this->getAttribute()->getStoreId())
->load();
$this->_options[$storeId] = $collection->toOptionIdArray();
}
$options = $this->_options[$storeId];
if ($withEmpty) {
array_unshift($options, array('label' => '', 'value' => ''));
}
return $options;
}
/**
* Get a text for option value
*
* @param string|integer $value
* @return string
*/
public function getOptionText($value)
{
$isMultiple = false;
if (strpos($value, ',')) {
$isMultiple = true;
$value = explode(',', $value);
}
$options = $this->getAllOptions(false);
if ($isMultiple) {
$values = array();
foreach ($options as $item) {
if (in_array($item['value'], $value)) {
$values[] = $item['label'];
}
}
return $values;
}
foreach ($options as $item) {
if ($item['value'] == $value) {
return $item['label'];
}
}
return false;
}
}
正如我所说,Magento没有创建新属性“test_report”,而是破坏了eav_entity_type表。关于发生的事情没有错误信息也没有记录条目。
如何创建这样的属性?
谢谢, aeno
答案 0 :(得分:4)
$installer
类本身应该能够添加属性,我不认为你需要加载Entity_Setup类。
$installer = $this;
$installer->startSetup();
$installer->addAttribute('catalog_product', 'test_report', array(
'label' => 'Test report',
'required' => false,
'input' => 'select',
'source' => 'cmspageselect/entity_source',
'default' => 'none',
'position' => 1,
'sort_order' => 3,
));
$installer->endSetup();
除此之外,我认为您的源值不正确,从数组中的source元素判断,您应该命名模型Mandarin_CMSPageSelect_Model_Entity_Source
。我假设您已将相应的<models>
元素添加到config.xml中,以便告诉Magento从哪里加载模型。