Извлечение значения из элемента формы даты при отправке - PullRequest
1 голос
/ 06 августа 2010

Я пишу модуль Drupal и столкнулся с тем, что должно быть тривиальной проблемой;

Рассмотрим узел типа «Персона», который включает свойство «Дата рождения». Я сконфигурировал таблицу базы данных для использования поля int для хранения даты в формате UNIX (так же, как в Drupal Core), но, конечно, мне нужно предоставить пользователю метод указания значения в более удобном формате, т.е. мм / гггг.

В моих модулях Person_form я настроил элемент даты следующим образом:

$form['dob'] = array(
    '#type' => 'date',
    '#title' => 'Date of Birth',
    '#required' => TRUE,
    '#default_value' => array(
       'day' => format_date($node->dob, 'custom', 'j'),
       'month' => format_date($node->dob, 'custom', 'n'),
       'year' => format_date($node->dob, 'custom', 'Y'),
    ),
);

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

Теперь мне нужно иметь возможность доступа к значениям этих элементов, когда пользователь нажимает кнопку «Сохранить», - но теперь у меня есть две проблемы:

  1. Подпись функции _form - Person_form ($ node), так как мне получить доступ к значениям $ form ['dob'] ['day' / 'month' / 'year']. $ form не передается в качестве аргумента функции.
  2. Как только я получу значения, каков наилучший способ создания значения даты в UNIX?

Я уже некоторое время гуглю, но термины «drupal» и «дата», похоже, указывают мне на расширение модуля Date - конечно, мне не нужно расширение для обработки простых дат, таких как: 1018 *

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 06 августа 2010

hook_form() вызывается для отображения полей формы для редактирования существующего узла или создания нового.В первом случае отображаемые значения - это те, которые уже присутствуют в $node.hook_load() перед вызовом для загрузки значений, связанных с узлом;возвращаемое значение представляет собой массив элементов, которые будут добавлены к объекту узла (например, если возвращенный массив равен array('extra_field' => 'value'), то узел будет иметь свойство $node->extra_field).hook_update() вызывается, когда узел сохраняется в базе данных (модуль, реализующий тип содержимого, должен сохранять свои собственные значения в своей таблице базы данных), тогда как hook_validate() вызывается дляпроверьте значения, введенные пользователями.

Поскольку у вас есть день, месяц и год, вы можете использовать mktime(), чтобы получить метку времени Unix;полученная вами метка времени будет установлена ​​в полночь этого дня.

Чтобы очистить то, что я сказал в своем комментарии о различных обработчиках отправки для разных кнопок, этот код используется node_form():

$form['buttons'] = array();
$form['buttons']['submit'] = array(
  '#type' => 'submit',
  '#access' => !variable_get('node_preview', 0) || (!form_get_errors() && isset($form_state['node_preview'])),
  '#value' => t('Save'),
  '#weight' => 5,
  '#submit' => array('node_form_submit'),
);
$form['buttons']['preview'] = array(
  '#type' => 'submit',
  '#value' => t('Preview'),
  '#weight' => 10,
  '#submit' => array('node_form_build_preview'),
);
if (!empty($node->nid) && node_access('delete', $node)) {
  $form['buttons']['delete'] = array(
    '#type' => 'submit',
    '#value' => t('Delete'),
    '#weight' => 15,
    '#submit' => array('node_form_delete_submit'),
  );
}

Каждая кнопка имеет свой собственный обработчик отправки (определяется с помощью элемента #submit).Если вы установите обработчик отправки на $form с $form['#submit'] = 'submission_function', этот обработчик отправки будет использоваться для каждой кнопки, которая не определяет свой собственный обработчик отправки.

Мне нужно предоставить методдля пользователя, чтобы указать значение в более удобном формате, то есть дд / мм / гггг.

Вы можете использовать три текстовых поля для дня, месяца и года (можно показать их встроенными,и / для размещения между ними будет установлен с помощью '#field_suffix' => '/').Преимущество использования поля формы даты заключается в том, что поля дня, месяца и года упорядочены на основе формата даты, установленного для сайта;если формат даты показывает год перед днем ​​и месяцем, то также поле даты будет показывать год перед двумя другими полями.Другим преимуществом является то, что вам не нужно создавать собственный код для проверки ввода, полученного от пользователя.
Значением поля даты является массив, содержащий индексы день, месяц и год.

2 голосов
/ 06 августа 2010

Подпись функции, которая вызывается при сохранении, должна быть person_form_submit($form, &$form_state).Отсюда вы можете использовать массив $form_state для получения ваших значений и обработки их так, как вы хотите.Я не о том, что вы используете person_form($node), так как для построения формы вы должны использовать person_form($form_state) в качестве функции построителя форм.Ознакомьтесь с документацией по созданию форм в Drupal: http://drupal.org/node/751826.

Чтобы получить метку времени из даты, я бы использовал функцию php strtotime () .

0 голосов
/ 14 декабря 2010
$d = $form_state['values']['dob'];
$mydateval = $d['year'].'-'.$d['month'].'-'.$d['day'];
...