在Magento中怎样使用计划任务(Cron Job),在这些例子中,我们是直接把时间周期设置在config.xml文件中,我们可以根据自己的需要设置每个计划任务的执行周期,这对熟悉Magento的程序员来说很方便,但对于那些不熟悉程序的用户,他们更希望能在Magento的后台中根据需要决定是否开启这个计划任务以及设置计划任务的执行周期,一个典型的例子是我们可以在后台设置货币汇率更新的频率以及清除数据库中Log的频率,下面我们将添加一个计划任务,计划任务的内容和上篇文章相似,在system.log文件中添加一行文字,计划任务的周期在后台配置。
在/app/code/local/MagentoBoy/MyCron/etc/config.xml文件中添加:
<config>
<crontab>
<jobs>
<log_hellomagento>
<run>
<model>mycron/observer::helloMagento</model>
</run>
</log_hellomagento>
</jobs>
</crontab>
</config>
和上个例子不同,在配置文件中我们只需要指定计划任务log_hellomagento的执行的代码,而不需要指定时间周期,同样,我们在/app/code/local/MagentoBoy/MyCron/Model/Observer.php中添加helloMagento()函数:
<?php
class MagentoBoy_Mycron_Model_Observer
{
//...
public function helloMagento()
{
Mage::log('Hello, Magento!');
return $this;
}
}
执行的代码很简单,在/var/log/system.log文件中添加一行'Hello, Magento!',以上的代码和上个例子没有什么差别,下面我们要为这个计划任务建立后台配置表单,首先创建/app/code/local/MagentoBoy/MyCron/etc/system.xml文件:
<?xml version="1.0"?>
<config>
<sections>
<system>
<groups>
<log_hellomagento translate="label" module="mycron">
<label>Log HelloMagento</label>
<frontend_type>text</frontend_type>
<sort_order>250</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>0</show_in_website>
<show_in_store>0</show_in_store>
<fields>
<enabled translate="label">
<label>Enable Log HelloMagento</label>
<frontend_type>select</frontend_type>
<source_model>adminhtml/system_config_source_yesno</source_model>
<sort_order>1</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>0</show_in_website>
<show_in_store>0</show_in_store>
</enabled>
<time translate="label">
<label>Start Time</label>
<frontend_type>time</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>
</time>
<frequency translate="label">
<label>Frequency</label>
<frontend_type>select</frontend_type>
<source_model>adminhtml/system_config_source_cron_frequency</source_model>
<backend_model>mycron/system_config_backend_loghellomagento_cron</backend_model>
<sort_order>3</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>0</show_in_website>
<show_in_store>0</show_in_store>
</frequency>
</fields>
</log_hellomagento>
</groups>
</system>
</sections>
</config>
通过上面的代码,我们将在后台System>ADVANCED>System页面的Log Cleaning表单下面添加一个表单Log HelloMagento,表单中包括三个元素:是否开启Log HelloMagento计划任务、计划任务执行的时间以及计划任务执行的频率,其中频率选择框的元素包括Daily/Weekly/Monthly,分别代表每天/每周/每月,这三个表单元素的值将保存在core_config_data表中,path路径分别为system/log_hellomagento/enabled, system/log_hellomagento/time以及system/log_hellomagento/frequency,我们可以为这三个元素设置初始值,在/app/code/local/MagentoBoy/MyCron/etc/config.xml中添加:
<config>
<default>
<system>
<log_hellomagento>
<enabled>0</enabled>
<time></time>
<frequency>D</frequency>
</log_hellomagento>
</system>
</default>
</config>
enabled的值为0说明该计划任务默认不执行,frequency的值为D说明计划任务在开启的情况下默认的执行周期为每天一次,我们可以根据需要设置相应的默认值。
在system.xml中我们指定frequency的backend_model为mycron/system_config_backend_loghellomagento_cron,需要添加/app/code/local/MagentoBoy/MyCron/Model/System/Config/Backend/Loghellomagento/Cron.php文件:
<?php
class MagentoBoy_MyCron_Model_System_Config_Backend_Loghellomagento_Cron extends Mage_Core_Model_Config_Data
{
const CRON_STRING_PATH = 'crontab/jobs/log_hellomagento/schedule/cron_expr';
protected function _afterSave()
{
$enabled = $this->getData('groups/log_hellomagento/fields/enabled/value');
$time = $this->getData('groups/log_hellomagento/fields/time/value');
$frequency = $this->getData('groups/log_hellomagento/fields/frequency/value');
$frequencyDaily = Mage_Adminhtml_Model_System_Config_Source_Cron_Frequency::CRON_DAILY;
$frequencyWeekly = Mage_Adminhtml_Model_System_Config_Source_Cron_Frequency::CRON_WEEKLY;
$frequencyMonthly = Mage_Adminhtml_Model_System_Config_Source_Cron_Frequency::CRON_MONTHLY;
$cronDayOfWeek = date('N');
$cronExprArray = array(
intval($time[1]), # Minute
intval($time[0]), # Hour
($frequency == $frequencyMonthly) ? '1' : '*', # Day of the Month
'*', # Month of the Year
($frequency == $frequencyWeekly) ? '1' : '*', # Day of the Week
);
$cronExprString = join(' ', $cronExprArray);
try {
Mage::getModel('core/config_data')
->load(self::CRON_STRING_PATH, 'path')
->setValue($cronExprString)
->setPath(self::CRON_STRING_PATH)
->save();
} catch (Exception $e) {
throw new Exception(Mage::helper('cron')->__('Unable to save the cron expression.'));
}
}
}
以上代码的功能是在保存Log HelloMagento表单的时候,根据所设置的时间和周期为该计划任务生成周期表达式并保存在core_config_data表的'crontab/jobs/log_hellomagento/schedule/cron_expr'元素里,这样Magento就能根据这个表达式为计划任务设定执行周期了。
(责任编辑:好模板) |