3

所以,我的表单中有这个元素:

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

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

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

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

是否有为此的drupal api函数?

4

7 回答 7

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->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'),
    ),
  );
}

我没有对此进行测试,因此您需要进行实验。

希望这可以帮助!

于 2011-01-18T00:31:58.100 回答
1

您可以将其序列化并将其作为序列化数组存储在数据库中。然后,当您想要显示它时,您在数据库列上调用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,  
);
于 2010-11-27T20:56:08.493 回答
0

我可以为您指明正确的方向。

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

profile 模块有一个例子(虽然很难找到):

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

:)

于 2010-11-28T10:51:06.957 回答
0

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

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

于 2010-11-27T21:20:26.723 回答
0

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

于 2011-03-28T17:40:49.030 回答
0

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

这是一个简单的例子:

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

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

于 2011-11-03T18:17:14.703 回答
-1

我想我找到了一种简单的方法,但它不使用 Drupal api。

$date = implode($form_state['values']['date']); // $date = 20101127;
于 2010-11-28T06:14:49.217 回答