cancel
Showing results for 
Search instead for 
Did you mean: 

Database Model Event and Observer

   Did you know you can see the translated content as per your choice?

Translation is in progress. Please check again after few minutes.

Database Model Event and Observer

Hey, I'm new to Magento programming and hope someone could assist with the below.

 

I'm busy making a module that will talk to a remote service and I need to save the ID of the remote service to the local database so I can link the local customer with a remote customer. So my question is, is there a easier, cleaner way to do this. 

 

I have this so far, I removed some of the naming etc just for this post.

 

# app/code/Vendor/Package/Setup/InstallSchema.php

$table = $setup->getConnection()->newTable($setup->getTable('vendor_package_customers'));

$table->addColumn( 'customer_id', Table::TYPE_INTEGER, null, ['unsigned' => true], 'Customer Id');
$table->addColumn( 'remote_id', Table::TYPE_INTEGER, null, ['unsigned' => true], 'Remote Id' );

$table->addIndex($setup->getIdxName('synergicode_sageone_customers', ['customer_id']), ['mage_id']);
$table->addIndex($setup->getIdxName('synergicode_sageone_customers', ['remote_id']), ['sage_id']);

$table->addForeignKey(
$setup->getFkName('synergicode_sageone_customers', 'customer_id', 'customer_entity', 'entity_id'),
'customer_id', $setup->getTable('customer_entity'), 'entity_id',
Table::ACTION_SET_NULL
);

 

app/code/Vendor/Package/etc/events.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">
    <event name="adminhtml_customer_save_after">
        <observer name="vendor_package_customer_save" instance="Vendor\Package\Observer\Customer\Save" />
    </event>
</config>

# app/code/Vendor/Package/Observer/Customer.php

class Save implements ObserverInterface {

    protected $_logger, $_customer_factory;

    function __construct(\Psr\Log\LoggerInterface $logger, \Vendor\Package\Model\CustomerFactory $customerFactory) 
    {
        $this->_logger = $logger;
        $this->_customer_factory = $customerFactory;
    }

    public function execute(Observer $observer) 
    {
        $customer = $observer->getCustomer();

        /*
            Check if the customer object exists
        
            TODO
        */

        $_remote_customer = $this->_customer_factory->create()->load($customer->getId());
        
        /*
            Is there a way to call getByCustomer ?
        */
        
        $remote_id = $_remote_customer->getRemoteId();
        
        /*
            Then for inserting a new recording, is there a way to link to the customer object without me having to pass it
        */
        
        $_db_customer = $this->_customer_factory->create();
        
        $_db_customer->setCustomerId($customer->getId());
        $_db_customer->setRemoteId('1234');
                
        $_db_customer->save();
    }
}

app/code/Vendor/Package/Model/Customer.php

class Customer extends \Magento\Framework\Model\AbstractModel
{
    /**
    * Initialize resource model
    * @return void
    */
    protected function _construct()
    {
        $this->_init('Vendor\Package\Model\ResourceModel\Customer');
    }

    /*
        Should I add methods here so I can access certain stuff in the object ?
    */
}

app/code/Vendor/Package/Model/ResourceModel/Customer.php

<?php
    
class Customer extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
{

    /**
    * Initialize resource model
    * Get table name from config
    *
    * @return void
    */
    protected function _construct()
    {
        $this->_init('vendor_package_customers', 'customer_id');
        
        $this->_isPkAutoIncrement = false;
    }

}

# app/local/Vendor/Package/Model/ResourceModel/Customer/Collection.php

class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
{
    /**
    * Constructor
    * Configures collection
    *
    * @return void
    */
    protected function _construct()
    {
        $this->_init('Vendor\Package\Model\Customer', 'Vendor\Package\Model\ResourceModel\Customer');
    }
}

I hope my question make sense and that someone is willing to assist.