将日期数组保存到db

时间:2010-11-27 13:28:28

标签: drupal date drupal-6 drupal-fapi

所以,我的形式有这个元素:

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

在表单提交函数中,我有这样的数组:

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

我正在寻找一种简单的方法来将这个数组保存在数据库中,然后我希望能够从数据库中提取这个日期,以便将其替换回编辑表单。

这有drupal api功能吗?

7 个答案:

答案 0 :(得分:2)

我认为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-&gt; 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 :(得分:1)

您可以serialize将其存储为数据库中的序列化数组。然后,当您想要显示它时,可以在数据库列上调用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,  
);

答案 2 :(得分:0)

首先,这取决于您需要如何存储日期。时间戳或日期或日期时间或某些自定义格式?

您不会找到任何API将日期转换为日期字符串,但如果您使用日期模块创建日期字段,则日期模块会将数据转换为具有数据库使用的通常ISO格式的日期字符串。

答案 3 :(得分:0)

我可以指出你正确的方向。

API中有功能为您完成工作。日期有点繁琐,需要一些耐心。

查看表单参考API中的date元素。您可以使用钩子来进行格式化。

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

:)

答案 4 :(得分:0)

Drupal对db中的日期数组使用(un)序列化,我假设它是一个配置文件字段。如果使用serialize将其写入db,Drupal可以使用它。

答案 5 :(得分:0)

Drupal中日期存储的首选方法是UNIX时间格式。我建议使用mktime function或类似的东西将表单中的日期转换为UNIX时间。

这是一个简单的例子:

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

然后在数据库插入/更新中使用$ my_date变量。

答案 6 :(得分:-1)

我想我发现了一种简单的方法,但它没有使用Drupal api。

$date = implode($form_state['values']['date']); // $date = 20101127;