Хук Drupal для изменения значения поля CCK даты - PullRequest
0 голосов
/ 13 мая 2011

Мне нужно отправить электронное письмо с напоминанием на ДЕНЬ ПЕРЕД КАЛЕНДАРЬОМ, а также ДЕНЬ ПОСЛЕ.К сожалению, я не могу использовать планировщик правил, потому что токены нельзя манипулировать с помощью 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;
}

Я прочитал учебники по использованию Rules Scheduler с CCK и

Я также слежу за Расписание электронной почты для отправки на основе поля даты CCK - у меня не работает

Использую ли я правильные хуки?Как правильно перехватить введенное значение даты?

Ответы [ 3 ]

1 голос
/ 14 мая 2011

Я хочу поделиться ответом, благодаря помощи сообщества. Если вы столкнулись с этой же проблемой, попробуйте следующее:

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 голос
/ 29 июня 2011

Вы можете сделать это с помощью модуля правил, я сделал это в одном проекте, в основном вы должны создать два правила, одно на один день раньше, а другое на один день позже. Дайте мне знать, если вы хотите каких-либо разъяснений.

Спасибо K

1 голос
/ 14 мая 2011

Я не думаю, что вы подходите к своей проблеме правильно. Если вы хотите попытаться пойти по пути, который вы предлагаете, вам стоит посмотреть hook_nodeapi () . Вы можете добавить некоторый код для операций «вставки» и / или «сохранения» (или, может быть, даже «предварительного сохранения»), чтобы вы могли обновлять поля $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 часа.

...