I'm trying to add an attribute called orchestra_id to Order and OrderAddress. I've made a plugin who have been already activated. So I've create an Setup\UpgradeData model. This is what it look like:
<?php
namespace Maru3l\SyncOrchestra\Setup;
use Magento\Sales\Model\Order;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
class UpgradeData implements \Magento\Framework\Setup\UpgradeDataInterface
{
private $eavSetupFactory;
private $eavConfig;
private $attributeResource;
public function __construct(
\Magento\Eav\Setup\EavSetupFactory $eavSetupFactory,
\Magento\Eav\Model\Config $eavConfig,
\Magento\Customer\Model\ResourceModel\Attribute $attributeResource
) {
$this->eavSetupFactory = $eavSetupFactory;
$this->eavConfig = $eavConfig;
$this->attributeResource = $attributeResource;
}
public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
$setup->startSetup();
$eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
$this->installAddressOrchestraIdAttribute($eavSetup);
$this->installOrderOrchestraIdAttribute($eavSetup);
$setup->endSetup();
}
private function installAddressOrchestraIdAttribute($eavSetup) {
$eavSetup->addAttribute('customer_address', 'orchestra_id', [
'label' => 'Orchestra ID',
'input' => 'text',
'visible' => true,
'position' => 100,
'unique' => true,
'required' => false,
'system' => false
]);
$attribute = $this->eavConfig->getAttribute('customer_address', 'orchestra_id');
$attribute->setData('used_in_forms', ['adminhtml_customer_address', 'customer_address_edit']);
$this->attributeResource->save($attribute);
}
private function installOrderOrchestraIdAttribute($eavSetup) {
$eavSetup->addAttribute(Order::ENTITY, 'orchestra_id', [
'label' => 'Orchestra ID',
'input' => 'text',
'visible' => true,
'position' => 100,
'unique' => true,
'required' => false,
'system' => false
]);
$attribute = $this->eavConfig->getAttribute(Order::ENTITY, 'orchestra_id');
$attribute->setData('used_in_forms', ['adminhtml_order']);
$this->attributeResource->save($attribute);
}
}
I've literally copy/past the exemple in https://devdocs.magento.com/guides/v2.2/extension-dev-guide/attributes.html but it is not working.
I'm always getting this issue during the php bin/magento setup:upgrade and I don't see the collomn appared in the database :
PHP Fatal error: Uncaught Error: Call to a member function getId() on null in /var/www/vhosts/store-api.silverwax.ca/httpdocs/vendor/magento/module-eav/Model/ResourceModel/Attribute.php:117
Stack trace:
#0 /var/www/vhosts/store-api.silverwax.ca/httpdocs/vendor/magento/framework/Model/ResourceModel/Db/AbstractDb.php(832): Magento\Eav\Model\ResourceModel\Attribute->_afterSave(Object(Magento\Eav\Model\Entity\Attribute))
#1 /var/www/vhosts/store-api.silverwax.ca/httpdocs/vendor/magento/framework/Model/ResourceModel/Db/AbstractDb.php(419): Magento\Framework\Model\ResourceModel\Db\AbstractDb->processAfterSaves(Object(Magento\Eav\Model\Entity\Attribute))
#2 /var/www/vhosts/store-api.silverwax.ca/httpdocs/generated/code/Magento/Customer/Model/ResourceModel/Attribute/Interceptor.php(258): Magento\Framework\Model\ResourceModel\Db\AbstractDb->save(Object(Magento\Eav\Model\Entity\Attribute))
#3 /var/www/vhosts/store-api.silverwax.ca/httpdocs/app/code/Maru3l/SyncOrchestra/Setup/UpgradeData.php(68): Magento\Customer\Model\ResourceModel\Att in /var/www/vhosts/store-api.silverwax.ca/httpdocs/vendor/magento/module-eav/Model/ResourceModel/Attribute.php on line 117
{"messages":{"error":[{"code":500,"message":"Fatal Error: 'Uncaught Error: Call to a member function getId() on null in \/var\/www\/vhosts\/store-api.silverwax.ca\/httpdocs\/vendor\/magento\/module-eav\/Model\/ResourceModel\/Attribute.php:117\nStack trace:\n#0 \/var\/www\/vhosts\/store-api.silverwax.ca\/httpdocs\/vendor\/magento\/framework\/Model\/ResourceModel\/Db\/AbstractDb.php(832): Magento\\Eav\\Model\\ResourceModel\\Attribute->_afterSave(Object(Magento\\Eav\\Model\\Entity\\Attribute))\n#1 \/var\/www\/vhosts\/store-api.silverwax.ca\/httpdocs\/vendor\/magento\/framework\/Model\/ResourceModel\/Db\/AbstractDb.php(419): Magento\\Framework\\Model\\ResourceModel\\Db\\AbstractDb->processAfterSaves(Object(Magento\\Eav\\Model\\Entity\\Attribute))\n#2 \/var\/www\/vhosts\/store-api.silverwax.ca\/httpdocs\/generated\/code\/Magento\/Customer\/Model\/ResourceModel\/Attribute\/Interceptor.php(258): Magento\\Framework\\Model\\ResourceModel\\Db\\AbstractDb->save(Object(Magento\\Eav\\Model\\Entity\\Attribute))\n#3 \/var\/www\/vhosts\/store-api.silverwax.ca\/httpdocs\/app\/code\/Maru3l\/SyncOrchestra\/Setup\/UpgradeData.php(68): Magento\\Customer\\Model\\ResourceModel\\Att' in '\/var\/www\/vhosts\/store-api.silverwax.ca\/httpdocs\/vendor\/magento\/module-eav\/Model\/ResourceModel\/Attribute.php' on line 117","trace":"Trace is not available."}]}}
I've also create the etc\extension_attributes.xml:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Maru3l_SyncOrchestra" setup_version="0.0.18">
<sequence>
<module name="Magento_Cusomer"/>
<module name="Magento_InventoryApi"/>
<module name="Magento_Sales"/>
</sequence>
</module>
</config>
sales_order_addressand I can use the$address->setOrchestraId()and$address->getOrchestraId()like the way i need it. But I can't figure out how to reproduce it in the tablesales_order. That's the nature of the question. – maru3l May 27 '19 at 13:48