所以,我的形式有这个元素:
<?php
$form['order']['date'] = array(
'#type' => 'date',
'#title' => 'Order date',
);
在表单提交函数中,我有这样的数组:
[values] => Array
(
[date] => Array
(
[year] => 2010
[month] => 11
[day] => 27
)
)
我正在寻找一种简单的方法来将这个数组保存在数据库中,然后我希望能够从数据库中提取这个日期,以便将其替换回编辑表单。
这有drupal api功能吗?
答案 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;