我需要在日历活动之前发送提醒电子邮件以及之后的日子。不幸的是,我无法使用Rules Scheduler,因为无法使用PHP操纵令牌。如果我有
,它就不起作用[node:field_event_date-datetime] -1 day
作为预定时间。
我最终做的是为DAY BEFORE和DAY AFTER创建两个“虚拟”日期字段,我正试图抓住表单,抓住事件日期,使用一些像strtotime()这样的PHP来添加/减去一天,并将这些值输入数据库。
我已尝试链接到表单的#submit部分,但在phpMyAdmin中,所有值都为NULL。 对于这段代码,我甚至没有更改日期,我只是想让值出现在数据库中。
function mymodule_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == "event_node_form") {
$form['#submit'][] = '_mymodule_after_build';
// Makes the fields invisible
$form["field_event_day_before"]["#access"] = FALSE;
$form["field_event_day_after"]["#access"] = FALSE;
}
}
function _mymodule_after_build($form, &$form_state) {
$eventcopy = array();
// copy the value part from the Event
$eventcopy = $form['field_event_date'][0]['#value'];
// without doing any PHP yet, simply copy the values. Doesn't show up in db.
$form['field_event_day_before'][0]['#value'] = $eventcopy;
dsm($form);
return $form;
}
我已阅读有关使用Rules Scheduler with CCK和
的教程我也关注Schedule email to go out based on CCK date field - not working for me
我使用合适的挂钩吗?如何正确截取输入的日期值?
答案 0 :(得分:1)
我认为你没有以正确的方式接近你的问题。如果你想尝试沿着你提出的道路前进,那么你会想看看hook_nodeapi()。您可以为“插入”和/或“保存”(或者甚至是“推文”)操作添加一些代码,以便您可以根据event_date值更新$node->field_event_day_before'][0]['#value']
和$node->field_event_day_after'][0]['#value']
字段。
但是,您真的不想在日期之前和日期之后添加额外的字段,只能从event_date中计算出来。
我认为更好的解决方案只是实现hook_cron()并让该函数处理数据库中事件日为TODAY()+1的所有事件的查询。对于所有这些结果,请发送电子邮件。执行另一个查询,查找event_date为TODAY() - 1的任何事件,并发送电子邮件以获取这些结果。您需要确保每24小时只运行一次此过程。
答案 1 :(得分:1)
感谢社区的帮助,我想分享答案。如果您遇到同样的问题,请尝试以下方法:
function mymodule_form_event_node_form_alter(&$form, &$form_state) {
// hide these dummy fields, will fill in programatically
$form["field_event_day_before"]["#access"] = FALSE;
$form["field_event_day_after"]["#access"] = FALSE;
}
function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL){
switch ($op) {
//if the node is inserted in the database
case 'insert':
if($node->type == 'event') {
// Day before (+10 hours because I'm in Hawai`i, far from GMT)
$daybefore = strtotime('-1 day +10 hours', strtotime($node->field_event_date[0]['value']));
$daybefore = date('Y-m-j\TH:i:s', $daybefore);
$node->field_event_day_before[0]['value'] = $daybefore;
// Day after (+10 hours because I'm in Hawai`i)
$dayafter = strtotime('+1 day +10 hours', strtotime($node->field_event_date[0]['value']));
$dayafter = date('Y-m-j\TH:i:s', $dayafter);
$node->field_event_day_after[0]['value'] = $dayafter;
}
}
}
规则调度程序然后可以从day_before / day_after字段中获取标记,您可以使用它们的接口进行调度。
答案 2 :(得分:1)
您可以使用规则模块执行此操作,我在我的一个项目中执行此操作,基本上您必须创建两个规则,一个用于一天,另一个用于一天。如果您需要任何澄清,请告诉我。
由于 ķ