2011-06-22 11 views
11

así que sé cómo configurar un cron utilizando el material config.xml crontab:cron magento en la configuración de la dorsal

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

Pero lo que estoy confundido en cuanto es cómo hacer que cron_expr un entorno en el back-end que puede cambiarse (cada 5 minutos, cada 10 minutos, etc.). Estoy pensando que puedo usar un backend_model y luego en un método after_save puedo hacer setStoreConfig ('path/to/schedule/cron_expr', '*/5 * * * *') o algo por el estilo y guardará en el cache. Es mi pensamiento correcto? ¿Hay una mejor manera de hacer esto?

Respuesta

24

una mejor solución que no implique un modelo de back-end personalizado.

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

Y, para cualquier persona que piense que esto debe ser una sintaxis nueva, ha sido así desde 1.1.1 (circa 2009) –

+4

¿Por qué diablos no está documentado en ninguna parte oficial? – ScottSB

+0

Excelente hallazgo, gracias Lee! – Jongosi

1

Si me estuviera acercando a este problema, podría ejecutar el cronjob en cualquier intervalo máximo que fuera útil para mí, y luego usar la ejecución cronjob para dar cuenta de la configuración del sistema. No estoy seguro de si la solución que publicó funcionará, pero si llega, cuéntenos, porque es otro enfoque muy inteligente :)

+0

funciona como se esperaba .. Me llevó un poco para encontrar la manera de cargar y guardar los valores, pero es bueno para ir –

1

Una prueba de concepto. Modificar a sus necesidades:

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

    } 
} 

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

y 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

hace esto ¿trabajo? No hubiera creído posible establecer valores XML arbitrarios a través de la tabla de la base de datos, 'core_config_data' – clockworkgeek

+0

funciona sin problemas –

+1

Mientras esto funciona (por lo que parece) he publicado una solución mucho mejor que es compatible con el código central desde 1.1 .1 –

Cuestiones relacionadas