Comment enregistrer uniquement la valeur d'attribut spécifique plutôt que d'enregistrer le produit entier dans Magento2


10

Comme vous le savez déjà, nous avions cette méthode ci-dessous dans magento pour enregistrer une valeur d'attribut spécifique comme celle-ci.

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

ou

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

Quelqu'un peut-il me faire connaître l' alternative de ce qui précède dans Magento2 .

Réponses:


8

C'est la même chose que Magento 1

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

Cela fonctionnera pour n'importe quelle entité.

Selon la réponse de @ Raphael, cela ne fonctionnera pas pour les attributs de vente.

Fondamentalement, il appelle la fonction Magento \ Eav \ Model \ Entity \ AbstractEntity :: saveAttribute () .

Cela acceptera deux paramètres

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

Le premier à être $objectest un objet qui doit être mis à jour et le deuxième paramètre sera $attributeCodele code de l'attribut à mettre à jour.


Cela devrait être fondamentalement pour n'importe quelle entité.
Kingshuk Deb

Oui, cela fonctionnera pour n'importe quelle entité. Il appellera essentiellement Magento\Eav\Model\Entity\AbstractEntity::saveAttribute()qui acceptera un objet de données et un code d'entité.
Jaimin Sutariya

Le voter mais ne pas l'accepter comme réponse pour le moment. Je vais vérifier et mettre à jour.
Kingshuk Deb

Veuillez passer à la ligne 1608 dans le fichier. (Magento 2.1.5) il y a une autre fonctionpublic function saveAttribute(\Magento\Framework\DataObject $object, $attributeCode)
Jaimin Sutariya

1
Il semble que magento ait fondamentalement conservé toutes les fonctions importantes.
Kingshuk Deb

4

Juste pour clarifier la réponse de Jaimin:

Cela fonctionnera pour n'importe quelle entité.

Ce n'est pas vrai. Cela ne fonctionnera que pour les entités EAV qui s'étendentMagento\Eav\Model\Entity\AbstractEntity

Si vous traitez avec une entité non EAV où le modèle de ressource s'étend, Magento\Framework\Model\ResourceModel\Db\AbstractDbvous devrez implémenter la saveAttributeméthode dans votre modèle de ressource.

Dans Magento 2, ils l'ont fait pour 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

Dans le cas d'un produit, vous pouvez utiliser l'objet d'action de masse. Par exemple:

// 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);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.