Question

How I can add a value to new column created by my module in the table 'sales_order_item'? I have a problem, could you help me ? I explain : In the Magento table, 'eav attribute set', the 'attribute set name' column exists. And it contains a value like this: Gear [with attribute_set_id 11] ; Bag [it's id 15]; Top ; etc.

The table, 'catalog_product_entity', continent also the column 'attribute_set_id', like the value 11 for 'Bag'.

But we have not any information on the 'attribute set name' in the 'sales_order_item' table.

My module created the new column, named, 'attribute_set_name' in the 'sales_order_item'. It works, it is funny.

But I don't know how to add this information on the product purchased in the table 'sales_order_item' when the order saves it in this table.

I tried

events.xml:

<?xml version="1.0"?>
<!--
/**
 *  apprentice.magento
 *  My observer events code : sales_order_place_after
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="sales_order_place_after">
        <observer name="vendor_sales_order_place_after" instance="ApprenticeLearnerOrderMagento\AddNewColumn\Observer\OrderObserver" />
    </event>
</config>

OrderObserver.php :

    <?php
/**
 *  apprentice.magento
 *  My observer php code
 */
namespace ApprenticeLearnerOrderMagento\AddNewColumn\Observer;

use Magento\Framework\Event\ObserverInterface; 


class OrderObserver implements ObserverInterface
{
  protected $attributeSet;

  public function __construct(\Magento\Eav\Api\AttributeSetRepositoryInterface $attributeSet) {
    $this->attributeSet = $attributeSet;
  }

  public function execute(\Magento\Framework\Event\Observer $observer){       

    $order = $observer->getEvent();
    $products = $order->getProduct();

    $attributeSetRepository = $this->attributeSet->get($products->getAttributeSetId());
    $attributeSetName = $attributeSetRepository->getAttributeSetName(); 

    //see if the variable [$attributeSetName] contains a value
    file_put_contents('C:/xampp/htdocs/magentoSiteRoot/var/logMyModuleAddNewColumn/nameAttribut.log', $attributeSetName, FILE_APPEND | LOCK_EX);
    file_put_contents('C:/xampp/htdocs/magentoSiteRoot/var/logMyModuleAddNewColumn/nameAttributprint.log', var_dump($attributeSetName), FILE_APPEND | LOCK_EX);
  }
}

but this does not work:


Error: Call to a member function getAttributeSetId() on null


When I click on 'Place Order' I have a this message on the web site :

Something went wrong with your request. Please try again later.

And when I check the error.log of apache [C:\xampp\apache\logs] :

[php7:error] [pid 6476:tid 1504] [client 127.0.0.1:51141] PHP Fatal error: Uncaught Error: Call to a member function getAttributeSetId() on null in C:\xampp\htdocs\magentoSiteRoot\app\code\ApprenticeLearnerOrderMagento\AddNewColumn\Observer\OrderObserver.php:24 \nStack trace:\n#0 C:\xampp\htdocs\magentoSiteRoot\vendor\magento\framework\Event\Invoker\InvokerDefault.php(88): TestOrder\AddAttributeSet\Observer\OrderObserver->execute(Object(Magento\Framework\Event\Observer))\n#1

C:\xampp\htdocs\magentoSiteRoot\vendor\magento\framework\Event\Invoker\InvokerDefault.php(74): Magento\Framework\Event\Invoker\InvokerDefault->_callObserverMethod(Object(TestOrder\AddAttributeSet\Observer\OrderObserver), Object(Magento\Framework\Event\Observer))\n#2 C:\xampp\htdocs\magentoSiteRoot\vendor\magento\framework\Event\Manager.php(66): Magento\Framework\Event\Invoker\InvokerDefault->dispatch(Array, Object(Magento\Framework\Event\Observer))\n#3 C:\xampp\htdocs\magentoSiteRoot\generated\code\Magento\Framework\Event\Manager\Proxy.php(95): Magento\Framework\Event\Manager->dispatch('sales_order_pla...', Array)\n in C:\xampp\htdocs\magentoSiteRoot\app\code\ApprenticeLearnerOrderMagento\AddNewColumn\Observer\OrderObserver.php on line 24, referer: http://magentoSiteRoot:81/checkout/

I nedd your help and Thanks

No correct solution

Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top