Bagaimana cara menyimpan hanya nilai atribut tertentu daripada menyimpan seluruh produk di Magento2


10

Seperti kalian sudah tahu bahwa kami dulu memiliki metode di bawah ini di magento untuk menyimpan nilai atribut tertentu seperti ini.

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

atau

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

Adakah yang bisa memberi tahu saya alternatif di atas di Magento2 .

Jawaban:


8

Sama seperti Magento 1

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

Ini akan berfungsi untuk entitas apa pun.

Per @ Raphael's Answer. Ini tidak akan berfungsi untuk atribut penjualan.

Pada dasarnya ia memanggil fungsi Magento \ Eav \ Model \ Entity \ AbstractEntity :: saveAttribute () .

Ini akan menerima dua parameter

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

Yang pertama $objectadalah objek yang perlu diperbarui dan parameter kedua $attributeCodeadalah kode untuk atribut yang akan diperbarui.


Itu pada dasarnya harus untuk entitas apa pun.
Kingshuk Deb

Ya itu akan bekerja untuk entitas apa pun. Ini pada dasarnya akan memanggil Magento\Eav\Model\Entity\AbstractEntity::saveAttribute()yang akan menerima objek data dan kode entitas.
Jaimin Sutariya

Putusan itu tetapi tidak menerima sebagai jawaban sekarang. Saya akan memeriksa dan memperbarui.
Kingshuk Deb

Silakan buka baris 1608 dalam file. (Magento 2.1.5) ada fungsi lainpublic function saveAttribute(\Magento\Framework\DataObject $object, $attributeCode)
Jaimin Sutariya

1
Tampaknya magento pada dasarnya menjaga semua fungsi penting tetap utuh.
Kingshuk Deb

4

Hanya untuk memperjelas jawaban Jaimin:

Ini akan berfungsi untuk entitas apa pun.

Ini tidak benar. Ini hanya akan bekerja untuk entitas EAV yang diperluasMagento\Eav\Model\Entity\AbstractEntity

Jika Anda berurusan dengan entitas non EAV di mana model sumber daya meluas Magento\Framework\Model\ResourceModel\Db\AbstractDbAnda harus menerapkan saveAttributemetode dalam model sumber daya Anda.

Di Magento 2, mereka telah melakukannya untuk Magento\Sales\Model\ResourceModel\Attributekelas:

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

Dalam hal produk, Anda dapat menggunakan objek aksi massa. Sebagai contoh:

// 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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.