Drupal hook更改日期CCK字段值

时间:2011-05-13 09:29:14

标签: drupal drupal-6 scheduling cck drupal-rules

我需要在日历活动之前发送提醒电子邮件以及之后的日子。不幸的是,我无法使用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

我使用合适的挂钩吗?如何正确截取输入的日期值?

3 个答案:

答案 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)

您可以使用规则模块执行此操作,我在我的一个项目中执行此操作,基本上您必须创建两个规则,一个用于一天,另一个用于一天。如果您需要任何澄清,请告诉我。

由于 ķ