/ #magento 

Magento2: налаштування періодичних завдань власного модуля через адмін-панель

Для створення періодичного завдання у власному модулі треба виконати наступні кроки:

  1. Сворюємо crontab.xml в app/VendorName/ModuleName/etc

    <?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/crontab.xsd">
        <group id="default">
            <job name="vendorname_modulename_job" instance="VendorName\ModuleName\Cron\CronJob" method="execute">
                <config_path>crontab/default/jobs/vendorname_modulename_job/schedule/cron_expr</config_path>
            </job>
        </group>
    </config> 
    
  2. Створюємо поле для налаштування періодичного завдання у файлі app/VendorName/ModuleName/etc/adminhtml/system.xml

                ...
                <group id="configurable_cron" translate="label" type="text" sortOrder="150" showInDefault="1" showInWebsite="1" showInStore="0">
                    <label>Cron</label>
                    <field id="crontab" translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1">
                        <label>Crontab</label>
                        <validate>required-entry</validate>
                        <backend_model>VendorName\ModuleName\Model\Config\CronConfig</backend_model>
                    </field>
                </group> 
                ...
    
  3. Створюємо бекенд-модель app/VendorName/ModuleName/Model/Config/CronConfig.php

    <?php
    
    namespace VendorName\ModuleName\Model\Config;
    
    class CronConfig extends \Magento\Framework\App\Config\Value
    {
    
        /**
        * @var \Magento\Framework\App\Config\ValueFactory
        */
        protected $configValueFactory;
    
        /**
        * @var string
        */
        protected $runModelPath = '';
    
        /**
        * Cron string path
        */
        const CRON_STRING_PATH = 'crontab/default/jobs/vendorname_modulename_job/schedule/cron_expr';
    
        /**
        * Cron model path
        */
        const CRON_MODEL_PATH = 'crontab/default/jobs/vendorname_modulename_job/run/model';
    
        /**
        * Cron config data
        */      
        const CONFIG_DATA = 'groups/configurable_cron/fields/crontab/value';
    
        /**
        * @param \Magento\Framework\Model\Context $context
        * @param \Magento\Framework\Registry $registry
        * @param \Magento\Framework\App\Config\ScopeConfigInterface $config
        * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList
        * @param \Magento\Framework\App\Config\ValueFactory $configValueFactory
        * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
        * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
        * @param string $runModelPath
        * @param array $data
        */
        public function __construct(
            \Magento\Framework\Model\Context $context,
            \Magento\Framework\Registry $registry,
            \Magento\Framework\App\Config\ScopeConfigInterface $config,
            \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList,
            \Magento\Framework\App\Config\ValueFactory $configValueFactory,
            \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
            \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
            $runModelPath = '',
            array $data = []
        ) {
            $this->runModelPath = $runModelPath;
            $this->configValueFactory = $configValueFactory;
            parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data);
        }
    
    
        /**
        * {@inheritdoc}
        *
        * @return $this
        * @throws \Exception
        */
        public function afterSave()
        {
            $cronExprString = $this->getData(self::CONFIG_DATA);
    
            try {
                $this->configValueFactory->create()->load(
                    self::CRON_STRING_PATH,
                    'path'
                )->setValue(
                    $cronExprString
                )->setPath(
                    self::CRON_STRING_PATH
                )->save();
                $this->configValueFactory->create()->load(
                    self::CRON_MODEL_PATH,
                    'path'
                )->setValue(
                    $this->runModelPath
                )->setPath(
                    self::CRON_MODEL_PATH
                )->save();
            } catch (\Exception $e) {
                throw new \Exception(__('We can\'t save the cron expression.'));
            }
    
            return parent::afterSave();
        }
    
    }                 
    
  4. І нарешті створюємо app/VendorName/ModuleName/Cron/CronJob.php

    <?php
    
    namespace VendorName\ModuleName\Cron;
    
    class CronJob
    {
    
        public function execute()
        {
                    ...
            return $this;
        }
    }
    
Author

Олександр Бобилєв

Залишаю собі право використовувати ненормативну (але інформативну) лексику там, де звичайні слова втрачають сенс і не відображають всієї палітри почуттів, від споглядання навколишньої дійсності.