Magento2: налаштування періодичних завдань власного модуля через адмін-панель
Для створення періодичного завдання у власному модулі треба виконати наступні кроки:
-
Сворюємо 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>
-
Створюємо поле для налаштування періодичного завдання у файлі 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> ...
-
Створюємо бекенд-модель 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(); } }
-
І нарешті створюємо app/VendorName/ModuleName/Cron/CronJob.php
<?php namespace VendorName\ModuleName\Cron; class CronJob { public function execute() { ... return $this; } }