首页>Magento>source

我有一个带保存按钮的表单容器.这是保存按钮调用的方法。

public function saveAction(){
    $userId = Mage::getSingleton('admin/session')->getUser()->getId();
    $user = Mage::getModel('admin/user')->load($userId);
    $idSetting=$user->getShopsetting_entity_id();
    $setting=Mage::getSingleton('Name_Module/shopSetting')->load($idSetting);
    $setting->setData($this->getRequest()->getParam('shopSetting'));
    $setting->save();
    return $this->_redirect('*/*/index');
}

此方法在shopSetting_entity中创建另一个元素,但我希望修改属性值.

我也尝试使用

$setting->setAttributeName($shopSetting['attribute_name']);
$setting->save();

但是在这种情况下,Magento在shopSetting_entity_int中添加了一行,其中包含相同的entity_type_id,attribute_id,store_id,entity_id,并且不会修改旧行。

(int是attribute_name的类型)

我也尝试用

$setting->setAttributeName($shopSetting['attribute_name']);
$setting->getResource()->saveAttribute($setting,'attribute_name');

但结果总是一样。

在Mage_Eav_Model_Entity_Abstract方法saveAttribute的特殊情况下,我注意到这个方法区分了更新和插入,这是代码:

....
 $select = $adapter->select()
                ->from($table, 'value_id')
                ->where($where);
            $origValueId = $adapter->fetchOne($select);
            if ($origValueId === false && ($newValue !== null)) {
                $this->_insertAttribute($object, $attribute, $newValue);
            } elseif ($origValueId !== false && ($newValue !== null)) {
                $this->_updateAttribute($object, $attribute, $origValueId, $newValue);
            } elseif ($origValueId !== false && ($newValue === null)) {
                $adapter->delete($table, $where);
            }
            $this->_processAttributeValues();
            $adapter->commit();
...

但_insertAttribute和_updateAttribute调用相同的方法_saveAttribute

   protected function _insertAttribute($object, $attribute, $value)
{
    return $this->_saveAttribute($object, $attribute, $value);
}

...

   protected function _updateAttribute($object, $attribute, $valueId, $value)
{
    return $this->_saveAttribute($object, $attribute, $value);
}

也许有一个错误

最新回答
  • 2019-12-5
    1 #

    如果你打电话给 setData()   使用数组,完整的数据会被替换,这包括ID。

    所以,如果是 $this->getRequest()->getParam('shopSetting')的结果   如果不包含ID,则会创建新实体。

    你可能正在寻找 addData()   它只设置传递数组中存在的属性,并保留原样。

  • 2019-12-5
    2 #

    我在我的一个自定义EAV实体类型上检测到同样的问题。

    当Magento更新EAV值时,它会使用 INSERT INTO   与 ON DUPLICATE KEY UPDATE   更新eav表中的数据。

    更新值的示例查询如下所示:

    INSERT INTO `download_entity_varchar` 
    (`entity_type_id`,`entity_id`,`attribute_id`,`value`)
    VALUES (9, 6, 446, 'this is a value')
    ON DUPLICATE KEY UPDATE `value` = VALUES(`value`)
    

    MySQL文档说:

    If you specify ON DUPLICATE KEY UPDATE ,并插入一行将导致 UNIQUE中的重复值   索引或 PRIMARY KEY ,MySQL执行 UPDATE   旧行。

    将我的自定义表格与 catalog_product_entity_varchar的表现进行比较   我意识到我的桌子上缺少一个索引: entity_id列的唯一索引 , attribute_id   和 store_id

    所以我删除了所有重复的条目后,在我的表中添加了一个唯一的索引,其中包含:

    ALTER TABLE `download_entity_varchar`
    ADD UNIQUE KEY `UNQ_DOWNLOAD_ENTITY_VARCHAR_ENTITY_ID_ATTRIBUTE_ID_STORE_ID` 
    (`entity_id`,`attribute_id`,`store_id`)
    

    如果您想使用升级脚本(通常是更智能的方式)以编程方式执行此操作,则只需添加以下行并调整表名称:

    $table = 'download_entity_varchar';
    $fields = ['entity_id', 'attribute_id', 'store_id'];
    $indexType = Varien_Db_Adapter_Interface::INDEX_TYPE_UNIQUE;
    $indexName = $installer->getIdxName($table, $fields, $indexType);
    $installer->getConnection()->addIndex($table, $indexName, $fields, $indexType);
    

    这个维兹兹   为每个值类型表执行,这是

    has to

    执行此操作后,值会正确更新。

    对我而言,似乎是Magento中的一个错误,在

      _entity_char

      _entity_datetime

      _entity_decimal

      _entity_int

      _entity_text

      _entity_varchar

    中没有创建唯一索引

    Mage_Eav_Model_Entity_Setup::createEntityTables

  • php:覆盖Magento中的核心文件
  • ee 1.14.2.2:“请等待” 在创建类别Magento 11423时卡住了页面