2011-05-13 5 views
0

캘린더 일정과 일 이후에 미리 알림 이메일을 보내야합니다. 불행히도, Token은 PHP로 조작 할 수 없기 때문에 Rules Scheduler를 사용할 수 없습니다. 가지고있는 경우 작동하지 않습니다날짜를 변경하기위한 Drupal 후크 CCK 필드 값

[node:field_event_date-datetime] -1 day 

예약 시간으로.

내가 한 일은 전에 "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; 
} 

나는 나는 또한 Schedule email to go out based on CCK date field - not working for me

내가 바로 후크를 사용하고 다음있어 Rules Scheduler with CCK

를 사용하는 방법에 대한 자습서를 읽은? 입력 한 날짜 값을 올바르게 가로채는 방법은 무엇입니까?

답변

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

지역 사회의 도움을 받아 답변을 공유하고 싶습니다.

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 필드에서 토큰을 할 수 있으며, 일정에 대한 자신의 인터페이스를 사용할 수 있습니다 :이 같은 문제가 발생하는 경우이를 시도합니다.

1

규칙 모듈을 사용하여이 작업을 수행 할 수 있습니다. 하나의 프로젝트에서이 작업을 수행했습니다. 기본적으로 하루 전에 한 규칙과 한 날 다음에 두 규칙을 작성해야합니다. 설명을 원한다면 알려주세요.

감사합니다. K

관련 문제