There is possible to have different product name and description values because these attributes have store_view scope.
Please take a look at screenshot
product store_view
To update product programmatically it should be something like (please ignore wrong object injection style):
$sku = 'sku1';
$storeId = 0;
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$_product = $obj->create('\Magento\Catalog\Api\ProductRepositoryInterface')->get($sku,true, $storeId, true);
$_product->setPrice(100);
$_product->setShortDescription('short description');
// $_product->setCustomAttribute("abc", 'abc');
$_product->save($_product);But in that case product short_description attribute will be updated in all scopes.
How to update product in selected store_view scope?
Hello @dmitrij_rebrov
Check the below solution:
<?php
namespace [Vendor]\[Module]\Helper;
use Magento\Framework\App\Helper\AbstractHelper;
use Magento\Framework\App\Helper\Context;
use Magento\Catalog\Model\ProductFactory;
use Magento\Catalog\Model\ResourceModel\Product;
class Data extends AbstractHelper
{
protected $productFactory;
protected $productResourceModel;
public function __construct(
Context $context,
ProductFactory $productFactory,
Product $productResourceModel
)
{
$this->productFactory = $productFactory;
$this->productResourceModel = $productResourceModel;
parent::__construct($context);
}
public function setStoreViewValueProduct($productId, $storeId, $name, $desc)
{
$product = $this->productFactory->create();
$this->productResourceModel->load($product, $productId);
$product->setStoreId($storeId);
$product->setName($name);
$product->setDescription($desc);
$this->productResourceModel->saveAttribute($product, $name);
$this->productResourceModel->saveAttribute($product, $desc);
}
}
/** @var $helper [Vendor]\[Module]\Helper */
now simply call helper function like : $helper->setStoreViewValueProduct(11, 2, 'Storeview Product 2', 'description storeview 2');I hope it helps.
Your code gives and error:
PHP Fatal error: Uncaught Error: Call to a member function getBackend() on bool in /mnt/c/Development/fruits.loc/vendor/magento/module-eav/Model/Entity /AbstractEntity.php:1666 Stack trace: #0 /mnt/c/Development/fruits.loc/generated/code/Magento/Catalog/Model/ResourceModel/Product/Interceptor.php(661): Magento\Eav\Model\Entity\AbstractEntit y->saveAttribute() #1 /mnt/c/Development/fruits.loc/app/code/Funami/MadImport/Helper/updateProductHelper.php(38): Magento\Catalog\Model\ResourceModel\Product\Interceptor-> saveAttribute() #2 /mnt/c/Development/fruits.loc/app/code/Funami/MadImport/Console/Command/XmlCheck.php(102): Funami\MadImport\Helper\updateProductHelper->setStoreViewV alueProduct() #3 /mnt/c/Development/fruits.loc/vendor/symfony/console/Command/Command.php(255): Funami\MadImport\Console\Command\XmlCheck->execute() #4 /mnt/c/Development/fruits.loc/vendor/magento/framework/Interception/Interceptor.php(58): Symfony\Component\Console\Command\Command->run() #5 /mnt/c/Development/fruits.loc/vendor/magento/framework/Interception/ in /mnt/c/Development/fruits.loc/vendor/magento/module-eav/Model/Entity/Abstract Entity.php on line 1666
I've cleared cache and deleted generated/code directory before execution.
Also method:
setSDescriptiondoes not exist in \Magento\Catalog\Model\Product class.
$storeId = $this->storeRepository->get($storeCode)->getId();
$product = $this->productRepository->get(
'your_sku',
false,
$storeId,
true
);
$product->addAttributeUpdate(
ProductAttributeInterface::CODE_NAME,
'your product name',
$storeId
);
$product->addAttributeUpdate(
ProductAttributeInterface::CODE_SHORT_DESCRIPTION,
'your product short description',
$storeId
);
$product->addAttributeUpdate(
ProductAttributeInterface::CODE_PRICE,
9.99,
$storeId
);
see method \Magento\Catalog\Model\Product::addAttributeUpdate
/**
* Save current attribute with code $code and assign new value.
*
* @param string $code Attribute code
* @param mixed $value New attribute value
* @param int $store Store ID
* @return void
*/
public function addAttributeUpdate($code, $value, $store)
{
$oldValue = $this->getData($code);
$oldStore = $this->getStoreId();
$this->setData($code, $value);
$this->setStoreId($store);
$this->getResource()->saveAttribute($this, $code);
$this->setData($code, $oldValue);
$this->setStoreId($oldStore);
}