Magento cron в конфигурации бэкэнд

Итак, я знаю, как настроить cron с помощью файла config.xml crontab:

<crontab>
    <jobs>
        <millena_export_send_all>
            <schedule><cron_expr>* * * * *</cron_expr></schedule>
            <run><model>millena_export/observer::exportOrderData</model></run>
        </millena_export_send_all>
    </jobs>
</crontab>

Но то, что я смущен, - это сделать, что cron_expr параметр в бэкэнде, который можно изменить (каждые 5 минут, каждые 10 минут и т.д.). Я думаю, что могу использовать backend_model, а затем в методе after_save я могу сделать setStoreConfig ('путь/to/schedule/cron_expr', '*/5 * * * *') или что-то в этом роде, и он сохранит в кэш. Правильно ли я считаю? Есть ли лучший способ сделать это?

Ответ 1

Лучшее решение, которое не включает пользовательскую бэкэнд-модель.

config.xml

<?xml version="1.0"?>   
<config>
    <modules>
        <Company_Export>
            <version>0.1.0</version>
        </Company_Export>
    </modules>
    <global>
        <models>
            <company_export>
                <class>Company_Export_Model</class>
            </company_export>
        </models>
    </global>
    <default>
        <export>                
            <order>
                <cron_settings>*/5 * * * *</cron_settings>
            </order>
        </export>
    </default>
    <crontab>
        <jobs>                
            <company_export_send_order>
                <schedule>
                    <config_path>export/order/cron_settings</config_path>
                </schedule>
                <run>
                    <model>company_export/observer::exportOrderData</model>
                </run>
            </company_export_send_order>
        </jobs>
    </crontab>
</config>

System.Xml

<?xml version="1.0"?>
<config>
    <tabs>
        <feedsconfig translate="label" module="export">
            <label>Feeds Configuration</label>
            <sort_order>99999</sort_order>
        </feedsconfig>
    </tabs>
    <sections>
        <export translate="label" module="export">
            <label>Export</label>
            <tab>feedsconfig</tab>
            <frontend_type>text</frontend_type>
            <sort_order>10000</sort_order>
            <show_in_default>1</show_in_default>
            <groups>
                <order translate="label">
                    <label>Order</label>
                    <frontend_type>text</frontend_type>
                    <sort_order>2</sort_order>
                    <show_in_default>1</show_in_default>
                    <fields>
                         <cron_settings>
                            <label>How often do you want the cron to run?</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>40</sort_order>
                            <comment>Use Crontab Format (Eg. "*/5 * * * *" for every 5 minutes)</comment>
                            <show_in_default>1</show_in_default>
                        </cron_settings>
                    </fields>
                </order>
            </groups>
        </export>
    </sections>
</config>

Ответ 2

Если бы я подходил к этой проблеме, я мог бы запустить cronjob в любом максимальном интервале, полезном для меня, а затем использовать само выполнение cronjob для учета системных настроек. Я не уверен, что решение, которое вы разместили, будет работать, но если это произойдет, скажите нам, потому что это еще один довольно умный подход:)

Ответ 3

Доказательство концепции. Измените ваши потребности:

<?php

/**
 * Model for Working with the backend cron configuration for export
 *
 * @author bryan
 */
class Company_Export_Model_Config_Cron extends Mage_Core_Model_Config_Data
{

    protected function _afterSave(){

        $groupId = $this->getGroupId();

        $cronStringPath = 'crontab/jobs/company_export_send_' . $groupId . '/schedule/cron_expr';
        $cronModelPath = 'crontab/jobs/company_export_send_' . $groupId . '/run/model';

        $value = $this->getData('groups/' . $groupId . '/fields/cron_setting/value');

        Mage::getModel('core/config_data')
        ->load($cronStringPath, 'path')
            ->setValue($value)
            ->setPath($cronStringPath)
            ->save();
        Mage::getModel('core/config_data')
            ->load($cronModelPath, 'path')
            ->setValue((string) Mage::getConfig()->getNode($cronModelPath))
            ->setPath($cronModelPath)
            ->save();           

    }
}

и config.xml:

<?xml version="1.0"?>

<config>
    <modules>
        <Company_Export>
            <version>0.1.0</version>
        </Company_Export>
    </modules>
    <global>
        <models>
            <company_export>
                <class>Company_Export_Model</class>
            </company_export>
        </models>
        <helpers>
            <export>
                <class>Company_Export_Helper</class>
            </export>
        </helpers>
        <resources>
            <export_setup>
                <setup>
                    <module>Company_Export</module>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </export_setup>
            <export_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </export_write>
            <export_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </export_read>
        </resources>
    </global>
    <adminhtml> 
        <acl> 
            <resources> 
                <admin> 
                    <children> 
                        <system> 
                            <children> 
                                <config> 
                                    <children> 
                                        <export> 
                                            <title>Order Export Configuration</title> 
                                        </export> 
                                    </children> 
                                </config> 
                            </children> 
                        </system> 
                    </children> 
                </admin> 
            </resources> 
        </acl> 
    </adminhtml>
    <crontab>
        <jobs>                
            <company_export_send_order>
                <run><model>company_export/observer::exportOrderData</model></run>
            </company_export_send_order>
        </jobs>
    </crontab>
</config>

и system.xml:

<?xml version="1.0"?>

<config>
    <tabs>
        <feedsconfig translate="label" module="export">
            <label>Feeds Configuration</label>
            <sort_order>99999</sort_order>
        </feedsconfig>
    </tabs>
    <sections>
        <export translate="label" module="export">
            <label>Export</label>
            <tab>feedsconfig</tab>
            <frontend_type>text</frontend_type>
            <sort_order>10000</sort_order>
            <show_in_default>1</show_in_default>
            <show_in_website>0</show_in_website>
            <show_in_store>0</show_in_store>
            <groups>
                <order translate="label">
                    <label>Order</label>
                    <frontend_type>text</frontend_type>
                    <sort_order>2</sort_order>
                    <show_in_default>1</show_in_default>
                    <show_in_website>0</show_in_website>
                    <show_in_store>0</show_in_store>
                    <fields>
                         <cron_setting>
                            <label>How often do you want the cron to run?</label>
                            <frontend_type>text</frontend_type>
                            <backend_model>company_export/config_cron</backend_model>
                            <sort_order>40</sort_order>
                            <comment>Use Crontab Format (Eg. "*/5 * * * *" for every 5 minutes)</comment>
                            <show_in_default>1</show_in_default>
                            <show_in_website>0</show_in_website>
                            <show_in_store>0</show_in_store>
                        </cron_setting>
                    </fields>
                </order>
            </groups>
        </export>
    </sections>
</config>