保存日期数组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, 
); 
+2

这将是一个非常糟糕的主意,如果你需要对日期做任何事情,比如最近10次,全部来自11月份等。这可以用SQL来完成,但是如果你序列化日期而不是将它保存为一个日期。 – googletorp 2010-11-27 21:16:51

+0

是的,需要ORDER BY`date`。 – 2010-11-28 06:07:20

+0

是的,坏主意。另外:你应该总是编程到一个界面。在你的表单API中有这样的事情不会促进重用和可读性。使用一些帮助函数来处理格式并在表单中委托给它们。 – Rimian 2010-11-28 10:43:15

首先,它取决于你如何存储日期。时间戳或日期或日期时间或一些自定义格式?

您不会找到任何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变量在你的数据库插入/更新。