Extend and override default functionality

The Pacemaker import functionality is designed to work standalone. But, up from version 3.8.0, it is possible to use the Magento code directory <magento-install-dir>/app/code/ as well to extend the Pacemaker import functionality without the need to deploy it as a composer library.

Override existing classes

In some cases, it will be necessary to override a default class of the Pacemaker import library.

For example, if additional attributes have been added to a non-EAV entity or the import should keep going if a website that has been referenced in the CSV file is not available in the Magento instance.

A minimum Magento module has to be created.

In every project that uses Pacemaker the module will be named Import, e.g. MyProject\Import.

At this point, the directory structure should look like

<magento-install-dir>/
└--app/
   └--code/
      └--MyProject/
         └--Import/
            |--registration.php
            └--etc/
               └--di.xml
               └--config.xml
               └--module.xml
               └--adminhtml/
                  └--system.xml

As the Pacemaker import functionality is completely based on Symfony, at least a DI configuration enables us to override the default class.

The configuration file must be located in the directory <magento-install-dir>/app/code/MyProject/Import/symfony/Resources/config/services.xml.

<magento-install-dir>/
└--app/
   └--code/
      └--MyProject/
         └--Import/
            |--registration.php
            |--etc/
            |  └--di.xml
            |  └--config.xml
            |  └--module.xml
            |  └--adminhtml/
            |     └--system.xml
            |--Observers/
            |  └--ProductWebsiteObserver.php
            └--symfony/
               └--Resources/
                  └--config/
                     └--services.xml

The simple DI configuration that we used to override the original observer will have the following content.

<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
    <services>
        <service
            id="import_product.observer.product.website"
            class="MyProject\Import\Product\Observers\ProductWebsiteObserver"/>
    </services>
</container>

The corresponding observer can extend the class that has to be overwritten or completely implement the custom business logic. Assuming that the original class will be extended, this can look like

namespace MyProject\Import\Product\Observers;

/**
 * Observer that creates/updates the product's website relations.
 */
class ProductWebsiteObserver extends \TechDivision\Import\Product\Observers\ProductWebsiteObserver
{

    /**
     * Process the observer's business logic.
     *
     * @return array The processed row
     */
    protected function process()
    {
        // custom code here
    }
}

Add custom functionality

Custom functionality can be added the same way. If functionality has to be extended, it’ll also be necessary to add the workflow engine’s configuration. The workflow engine configuration can either be done be snippets located in the global configuration directory under <magento-install-dir>/app/etc/configuration or in the configuration directory of the module, which will be app/code/MyProject/Import/etc then.

Everything else will NOT be different than writing an extension that will be deployed in the Magento vendor directory.

Register the module

Finally, to make the module available for usage in the Pacemaker import functionality, it must be registered in the workflow engine’s configuration. To do so, add a snippet <magento-install-dir>/app/code/configuration/additional-vendor-dirs.json which has the following content

{
    "additional-vendor-dirs": [
        {
            "vendor-dir": "app/code",
            "libraries": [
                "MyProject/Import"
            ]
        }
    ]
}