Як зберегти лише конкретне значення атрибута, а не зберегти весь продукт у Magento2


10

Як ви вже знаєте, ми раніше використовували цей метод у магенто, щоб зберегти конкретне значення атрибуту, як це.

// saving product attribute
$product = Mage::getModel('catalog/product')->load('id here');
$product->setName('your name here');
$product->getResource()->saveAttribute($product, 'name');

або

// saving customer attribute
$customer->setData($attrCode, $value)->getResource()->saveAttribute($customer, $attrCode);

Чи може хто-небудь повідомити мені альтернативу вищезазначеного в Magento2 .

Відповіді:


8

Це те саме, що Magento 1

$dataobject->setData('attribute_code', $value);
$dataobject->getResource()->saveAttribute($dataobject, 'attribute_code');

Це спрацює для будь-якої організації.

Згідно @ Рафаеля Відповідь Це не буде працювати для атрибутів продажів.

В основному він викликає функцію Magento \ Eav \ Model \ Entity \ AbstractEntity :: saveAttribute () .

Це прийме два параметри

saveAttribute(\Magento\Framework\DataObject $object, $attributeCode)

По-перше $object, це об'єкт, який потрібно оновити, а другий параметр $attributeCode- кодом для атрибута, який потрібно оновити.


В основному це повинно бути для будь-якого суб'єкта.
Кінгшук Деб

Так, це працюватиме для будь-якої організації. Це в основному дзвінок, Magento\Eav\Model\Entity\AbstractEntity::saveAttribute()який прийме об'єкт даних та код сутності.
Джаймін Сутарія

Оголошення, але не прийняття відповіді зараз. Буду перевіряти та оновлювати.
Кінгшук Деб

Перейдіть до рядка 1608 у файлі. (Magento 2.1.5) є ще одна функціяpublic function saveAttribute(\Magento\Framework\DataObject $object, $attributeCode)
Jaimin Sutariya

1
Здається, магенто в основному зберігав усі важливі функції недоторканими.
Кінгшук Деб

4

Просто для уточнення відповіді Джайміна:

Це спрацює для будь-якої організації.

Це не правда. Він працюватиме лише для організацій EAV, які поширюютьсяMagento\Eav\Model\Entity\AbstractEntity

Якщо ви маєте справу з суб'єктом EAV, на якому поширюється модель ресурсу, Magento\Framework\Model\ResourceModel\Db\AbstractDbвам доведеться реалізувати saveAttributeметод у вашій моделі ресурсів.

У Magento 2 вони зробили це для Magento\Sales\Model\ResourceModel\Attributeкласу:

public function saveAttribute(AbstractModel $object, $attribute)
{
    if ($attribute instanceof AbstractAttribute) {
        $attributes = $attribute->getAttributeCode();
    } elseif (is_string($attribute)) {
        $attributes = [$attribute];
    } else {
        $attributes = $attribute;
    }
    if (is_array($attributes) && !empty($attributes)) {
        $this->getConnection()->beginTransaction();
        $data = array_intersect_key($object->getData(), array_flip($attributes));
        try {
            $this->_beforeSaveAttribute($object, $attributes);
            if ($object->getId() && !empty($data)) {
                $this->getConnection()->update(
                    $object->getResource()->getMainTable(),
                    $data,
                    [$object->getResource()->getIdFieldName() . '= ?' => (int)$object->getId()]
                );
                $object->addData($data);
            }
            $this->_afterSaveAttribute($object, $attributes);
            $this->getConnection()->commit();
        } catch (\Exception $e) {
            $this->getConnection()->rollBack();
            throw $e;
        }
    }
    return $this;
}

3

Що стосується продукту, ви можете використовувати об’єкт масової дії. Наприклад:

// Edit
$productIds = [123];
$attributesData = ['name' => 'new product name'];
$storeId = 0;
$productMassAction = \Magento\Framework\App\ObjectManager::getInstance()->get('Magento\Catalog\Model\Product\Action');
$productMassAction->updateAttributes($productIds, $attributesData, $storeId);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.