Drupal钩子更改日期CCK字段值
我需要在日历活动的前一天和后一天发送提醒电子邮件。不幸的是,我不能使用Rules Scheduler,因为不能用PHP操作令牌。如果我有,那就不行了Drupal钩子更改日期CCK字段值,drupal,drupal-6,scheduling,cck,drupal-rules,Drupal,Drupal 6,Scheduling,Cck,Drupal Rules,我需要在日历活动的前一天和后一天发送提醒电子邮件。不幸的是,我不能使用Rules Scheduler,因为不能用PHP操作令牌。如果我有,那就不行了 [node:field_event_date-datetime] -1 day 按预定时间 我最后做的是为前一天和后一天创建两个“虚拟”日期字段,并尝试连接到表单中,获取事件日期,使用一些PHP(如strotime())添加/减去一天,并将这些值放入数据库 我已经尝试链接到表单的#submit部分,但在phpMyAdmin中,所有值都为NULL。
[node:field_event_date-datetime] -1 day
按预定时间
我最后做的是为前一天和后一天创建两个“虚拟”日期字段,并尝试连接到表单中,获取事件日期,使用一些PHP(如strotime())添加/减去一天,并将这些值放入数据库
我已经尝试链接到表单的#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;
}
我已经阅读了有关使用和的教程
我也在关注
我用的钩子对吗?如何正确截取输入的日期值?我认为您处理问题的方式不正确。如果你想沿着你所提议的道路走下去,那么你应该看看。您可以为“插入”和/或“保存”(甚至可能是“预保存”)操作添加一些代码,这样您就可以根据事件日期值更新“][0][''.#value']之前的
$node->field_event_day'][0]['.#value']
字段
但是,您确实不想为datebefore和dateafter添加额外的字段,因为您可以根据事件日期计算这些字段
我认为更好的解决方案是实现并让该函数处理查询数据库中的所有事件(其事件日期为今天)(+1)。对于所有这些结果,请发送电子邮件。执行另一个查询,查找事件_日期为TODAY()-1的任何事件,并发送电子邮件以获取这些结果。您需要确保每24小时只运行一次此过程。我认为您处理问题的方式不正确。如果你想沿着你所提议的道路走下去,那么你应该看看。您可以为“插入”和/或“保存”(甚至可能是“预保存”)操作添加一些代码,这样您就可以根据事件日期值更新“][0][''.#value']之前的
$node->field_event_day'][0]['.#value']
字段
但是,您确实不想为datebefore和dateafter添加额外的字段,因为您可以根据事件日期计算这些字段
我认为更好的解决方案是实现并让该函数处理查询数据库中的所有事件(其事件日期为今天)(+1)。对于所有这些结果,请发送电子邮件。执行另一个查询,查找事件_日期为TODAY()-1的任何事件,并发送电子邮件以获取这些结果。您需要确保每24小时只运行一次此过程。感谢社区的帮助,我想与大家分享答案。如果遇到相同的问题,请尝试以下方法:
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字段中获取令牌,您可以使用它们的界面进行调度。感谢社区的帮助,我想分享答案。如果遇到相同的问题,请尝试以下方法:
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字段中获取令牌,您可以使用它们的界面进行调度。您可以通过使用规则模块来实现这一点,我在我的一个项目中做到了这一点,基本上您必须创建两个规则,一个用于前一天,另一个用于后一天。如果您需要任何澄清,请告诉我 谢谢
K您可以通过使用规则模块来实现这一点,我在我的一个项目中做到了这一点,基本上您必须创建两个规则,一个用于前一天,另一个用于后一天。如果您需要任何澄清,请告诉我 谢谢 K