2011-06-22 55 views
11

所以我知道如何安裝使用config.xml中的crontab東西一個cron:的Magento的cron

<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('path/to/schedule/cron_expr','*/5 * * * *')或類似的東西,它會保存在緩存。我的想法是否正確?有一個更好的方法嗎?

回答

24

一個更好的解決方案,不涉及一個自定義的後端模式。

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

而且,對於所有認爲這必須是新語法的人來說,自1.1.1(大約2009年)以來一直是這種方式 –

+4

爲什麼地球上這實際上沒有任何官方記錄? – ScottSB

+0

非常好找,謝謝李先生! – Jongosi

1

如果我遇到了這個問題,我可以在對我有用的最大間隔時間內運行cronjob,然後使用cronjob執行本身來說明系統設置。我不確定你發佈的解決方案是否可行,但是如果它確實告訴我們,因爲這是另一個相當聰明的方法:)

+0

按預期工作..我花了一點弄清楚如何加載和保存價值,但它是很好的去 –

1

概念證明。修改你的需求:

<?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> 
+0

這是否工作?我不會想到可以通過數據庫表設置任意的XML值,'core_config_data' – clockworkgeek

+0

完美地工作 –

+1

雖然這起作用(從它的外觀),但我發佈了一個更好的解決方案,自1.1 .1 –