Сохранить массив дат в БД - PullRequest
3 голосов
/ 27 ноября 2010

Итак, у меня есть этот элемент в моей форме:

<?php
$form['order']['date'] = array(
        '#type'          => 'date',
        '#title'         => 'Order date',
      );

В функции отправки формы я получил такой массив:

[values] => Array
    (
        [date] => Array
            (
                [year] => 2010
                [month] => 11
                [day] => 27
            )
    )

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

Есть ли для этого функции drupal api?

Ответы [ 7 ]

2 голосов
/ 18 января 2011

Я думаю, что модуль Date даст вам вызовы API для этого.

В моем случае мои требования были довольно просты, и я не хотел создавать дополнительную зависимость от модуля, поэтому я использовал следующее для формирования объекта PHP DateTime:

$date_arr = $form_state['values']['date'];
if ($date_arr['year'] && $date_arr['month'] && $date_arr['day']) {
  $date = new DateTime();
  $date->setDate($date_arr['year'], $date_arr['month'], $date_arr['day']);
} else {
  $date = NULL;
}

Для хранения в базе данных (как метка времени UNIX, как и соглашение Drupal), я использовал $ date-> getTimestamp ().

Мне не нужно было возвращать дату в форму, но если бы я это сделал, я бы попробовал что-то вроде:

$query = db_query("select mydate from table");
while ($fields = db_fetch_array($query)) {
  $date = new DateTime();
  $date->setTimestamp($fields[0]);
  $form['order']['date'] = array(
    '#type'          => 'date',
    '#title'         => 'Order date',
    '#default_value' => array(
      year  => $date->format('Y'),
      month => $date->format('m'),
      day   => $date->format('d'),
    ),
  );
}

Я не проверял это, поэтому вам нужно экспериментировать.

Надеюсь, это поможет!

1 голос
/ 27 ноября 2010

Вы можете просто сериализовать и сохранить его как сериализованный массив в базе данных. Затем, когда вы хотите отобразить его, вы вызываете unserialize для столбца базы данных, и вы возвращаете исходный массив.

//in your submit function
$date = serialize($values['date']);
$sql = "UPDATE foobar SET date = '%s' WHERE id = '%d'";
db_query($sql, $date, $some_id);

//in your form function
$date_array = db_result(db_query("SELECT date FROM foo WHERE id = '%d'", $some_id));
$form['date'] = array(
  '#type' => 'date',
  '#title' => 'Order date',
  '#default_value' => $date_array,  
);
0 голосов
/ 03 ноября 2011

Предпочтительный метод хранения даты в Drupal - в формате времени UNIX. Я бы порекомендовал преобразовать дату в вашей форме во время UNIX, используя функцию mktime или что-то подобное.

Вот простой пример:

$my_date = mktime(23, 59, 59, $order->values['date']['month'], $order->values['date']['day'], $order->values['date']['year']);

Затем используйте переменную $ my_date в вашей вставке / обновлении БД.

0 голосов
/ 28 марта 2011

Drupal использует (не) сериализацию для массива дат в БД, я предполагаю, что это поле профиля.Если вы используете serialize для записи в БД, Drupal может использовать его.

0 голосов
/ 28 ноября 2010

Я могу указать вам правильное направление.

В API есть функциональность, которая сделает всю работу за вас.Сроки немного неудобно и потребует некоторого терпения.

Посмотрите на элемент даты в API ссылки на форму.Вероятно, есть крючок, который вы можете использовать для форматирования.

http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html/6

Вы должны быть знакомы с hook_elements ().Есть некоторые атрибуты, которые вас заинтересуют, такие как «#process», где вы можете добавить обратные вызовы к элементу даты, которые выполняются при отправке формы.Этот крюк очень недооценен.

http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_elements/6

У модуля профиля есть пример (хотя его трудно найти):

http://api.drupal.org/api/drupal/modules--profile--profile.module/function/profile_form_profile/6

Даты в основном хранятся в базе данных как метки времени.Их можно легко преобразовать с помощью format_date:

http://api.drupal.org/api/drupal/includes--common.inc/function/format_date/6

:)

0 голосов
/ 28 ноября 2010

Я думаю, что нашел простой способ сделать это, но он не использует API Drupal.

$date = implode($form_state['values']['date']); // $date = 20101127;
0 голосов
/ 28 ноября 2010

Прежде всего, это зависит от того, как нужно хранить дату. Отметка времени или дата или дата-время или какой-то другой формат?

Вы не найдете API для преобразования даты в строку даты, но если вы используете модуль даты для создания поля даты, модуль даты преобразует данные в строку даты с обычным форматом ISO, который используют базы данных.

...