Come salvare solo il valore dell'attributo specifico anziché salvare l'intero prodotto in Magento2


10

Come sapete già, avevamo questo metodo sotto in magento per salvare un valore di attributo specifico come questo.

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

o

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

Qualcuno può farmi sapere l' alternativa di quanto sopra in Magento2 .

Risposte:


8

È lo stesso di Magento 1

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

Questo funzionerà per qualsiasi entità.

Secondo la risposta di @ Raphael, non funzionerà per gli attributi di vendita.

Fondamentalmente chiama Magento \ Eav \ Model \ Entity \ AbstractEntity :: saveAttribute () .

Questo accetterà due parametri

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

Il primo ad essere $objectè un oggetto che deve essere aggiornato e il secondo parametro sarà $attributeCodeil codice dell'attributo da aggiornare.


Dovrebbe essere sostanzialmente per qualsiasi entità.
Kingshuk Deb,

Sì, funzionerà per qualsiasi entità. Fondamentalmente chiamerà Magento\Eav\Model\Entity\AbstractEntity::saveAttribute()che accetterà un oggetto dati e un codice entità.
Jaimin Sutariya,

Eseguendo l'upgrade ma non accettando come risposta in questo momento. Controllerò e aggiornerò.
Kingshuk Deb,

Vai alla riga 1608 nel file. (Magento 2.1.5) c'è un'altra funzionepublic function saveAttribute(\Magento\Framework\DataObject $object, $attributeCode)
Jaimin Sutariya,

1
Sembra che Magento abbia sostanzialmente mantenuto intatte tutte le funzioni importanti.
Kingshuk Deb,

4

Giusto per chiarire la risposta di Jaimin:

Questo funzionerà per qualsiasi entità.

Questo non è vero. Funzionerà solo per entità EAV che si estendonoMagento\Eav\Model\Entity\AbstractEntity

Se hai a che fare con un'entità non EAV in cui Magento\Framework\Model\ResourceModel\Db\AbstractDbsi estende il modello di risorsa, dovrai implementare il saveAttributemetodo nel tuo modello di risorsa.

In Magento 2, l'hanno fatto per la Magento\Sales\Model\ResourceModel\Attributeclasse:

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

Nel caso del prodotto, è possibile utilizzare l'oggetto azione di massa. Per esempio:

// 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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.