0

我需要在日历事件前一天和后一天发送提醒电子邮件。不幸的是,我不能使用规则调度程序,因为 PHP 不能操作令牌。如果我有它不起作用

[node:field_event_date-datetime] -1 day

作为预定时间。

我最终做的是为 DAY BEFORE 和 DAY AFTER 创建两个“虚拟”日期字段,我试图连接到表单中,获取事件日期,使用一些 PHP,如 strtotime() 来添加/减去天,并将这些值作为将进入数据库的值。

我已经尝试链接到表单的#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;
}

我已经阅读了有关使用规则调度程序和 CCK的教程和

我也在关注基于 CCK 日期字段的日程安排电子邮件 - 不适合我

我使用了正确的钩子吗?如何正确截取输入的日期值?

4

3 回答 3

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 小时只运行一次此过程。

于 2011-05-14T03:21:36.527 回答
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 字段中获取令牌,您可以使用它们的接口进行调度。

于 2011-05-14T06:58:58.457 回答
1

你可以通过使用规则模块来做到这一点,我在我的一个项目中做到了这一点,基本上你必须创建两个规则,一个用于前一天,另一个用于后一天。如果您需要任何澄清,请告诉我。

谢谢K

于 2011-06-29T06:26:35.577 回答