保存日期数组DB
所以,我在我的形式有这样的元素:保存日期数组DB
<?php
$form['order']['date'] = array(
'#type' => 'date',
'#title' => 'Order date',
);
在表单提交功能我有这样的数组:
[values] => Array
(
[date] => Array
(
[year] => 2010
[month] => 11
[day] => 27
)
)
我正在寻找一种简单的方法将这个数组保存在数据库中,然后我希望能够从数据库中提取此日期,以便将其替换回编辑表单。
是否有drupal的API函数呢?
我想我找到了一个简单的方法来做到这一点,但它不使用Drupal API。
$date = implode($form_state['values']['date']); // $date = 20101127;
你可以只是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,
);
首先,它取决于你如何存储日期。时间戳或日期或日期时间或一些自定义格式?
您不会找到任何API将日期转换为日期字符串,但是如果您使用日期模块创建日期字段,则日期模块会将数据转换为数据库使用的通常ISO格式的日期字符串。
我可以指出你在正确的方向。
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
:)
我认为日期模块会给你的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'),
),
);
}
我没有测试过这一点,所以你需要进行试验。
希望这会有所帮助!
Drupal使用(un)序列化数据库中的日期数组,我假设它是一个配置文件字段。如果你使用serialize把它写入db,Drupal可以使用它。
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变量在你的数据库插入/更新。
这将是一个非常糟糕的主意,如果你需要对日期做任何事情,比如最近10次,全部来自11月份等。这可以用SQL来完成,但是如果你序列化日期而不是将它保存为一个日期。 – googletorp 2010-11-27 21:16:51
是的,需要ORDER BY`date`。 – 2010-11-28 06:07:20
是的,坏主意。另外:你应该总是编程到一个界面。在你的表单API中有这样的事情不会促进重用和可读性。使用一些帮助函数来处理格式并在表单中委托给它们。 – Rimian 2010-11-28 10:43:15