0

カレンダー イベントの前日と翌日にリマインダー メールを送信する必要があります。残念ながら、PHP ではトークンを操作できないため、Rules Scheduler を使用できません。私が持っている場合、それは動作しません

[node:field_event_date-datetime] -1 day

予定時間通り。

私がやったことは、DAY BEFOREとDAY AFTERの2つの「ダミー」日付フィールドを作成することです.フォームにフックして、イベントの日付を取得し、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 と CCKの使用に関するチュートリアルを読み、

また、CCK の日付フィールドに基づいてメールの送信をスケジュールするもフォローしています - うまくいきません

正しいフックを使用していますか? 入力された日付値を適切に傍受するにはどうすればよいですか?

4

3 に答える 3

1

rules モジュールを使用してこれを行うことができます。私は 1 つのプロジェクトでこれを行いました。基本的には、2 つのルールを作成する必要があります。説明が必要な場合はお知らせください。

ありがとうK

于 2011-06-29T06:26:35.577 に答える
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

あなたが正しい方法で問題に取り組んでいるとは思いません。提案しているパスをたどりたい場合は、 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 回だけ実行するようにしてください。

于 2011-05-14T03:21:36.527 に答える