2011-06-22 8 views
11

Więc wiem jak skonfigurować crona używając rzeczy config.xml crontab:Magento cron w konfiguracji backend

<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> 

ale co jestem mylić o to, jak sprawić, że cron_expr ustawienie w backend, który może być zmieniane (co 5 minut, co 10 minut itd.). Myślę, że mogę użyć backend_model, a następnie w metodzie after_save mogę zrobić setStoreConfig ('path/to/schedule/cron_expr', '*/5 * * * *') lub coś w tym rodzaju i to zapisze w Pamięć podręczna. Czy moje myślenie jest poprawne? Czy jest lepszy sposób to zrobić?

Odpowiedz

24

Lepszym rozwiązaniem, które nie wymaga niestandardowy model backend.

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

I dla każdego, kto myśli, że to musi być nowa składnia, to tak było od 1.1.1 (około 2009) –

+4

Dlaczego, na litość boską, nie jest to faktycznie udokumentowane nigdzie oficjalne !? – ScottSB

+0

Doskonałe znalezisko, dziękuję Lee! – Jongosi

1

Gdybym zbliżył się do tego problemu, mógłbym uruchomić cronjob w dowolnym przydatnym dla mnie interwale, a następnie użyć samego wykonania cronjob do ustawienia systemu. Nie jestem pewien, czy rozwiązanie, które wysłałeś, będzie działać, ale jeśli tak się stanie, powiedz nam, ponieważ jest to kolejne całkiem sprytne podejście.

+0

działa zgodnie z oczekiwaniami .. Zajęło mi trochę, aby dowiedzieć się, jak załadować i zapisać wartości, ale to dobrze iść –

1

Dowód koncepcji. Modyfikować do własnych potrzeb:

<?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();   

    } 
} 

i 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> 

i 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

Czy ten praca? Nie sądziłem, że możliwe jest ustawienie dowolnych wartości XML za pomocą tabeli bazy danych, 'core_config_data' – clockworkgeek

+0

działa bezbłędnie –

+1

Podczas gdy to działa (z wyglądu) napisałem o wiele lepsze rozwiązanie, które jest obsługiwane w kodzie źródłowym od 1.1 .1 –