2010-11-27 54 views
3

所以,我在我的形式有這樣的元素:保存日期數組DB

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

在表單提交功能我有這樣的數組:

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

我正在尋找一種簡單的方法將這個數組保存在數據庫中,然後我希望能夠從數據庫中提取此日期,以便將其替換回編輯表單。

是否有drupal的API函數呢?

回答

-1

我想我找到了一個簡單的方法來做到這一點,但它不使用Drupal API。

$date = implode($form_state['values']['date']); // $date = 20101127; 
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

這將是一個非常糟糕的主意,如果你需要對日期做任何事情,比如最近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

0

首先,它取決於你如何存儲日期。時間戳或日期或日期時間或一些自定義格式?

您不會找到任何API將日期轉換爲日期字符串,但是如果您使用日期模塊創建日期字段,則日期模塊會將數據轉換爲數據庫使用的通常ISO格式的日期字符串。

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

的數據模塊有一個例子(很難找到,雖然它):

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

:)

2

我認爲日期模塊會給你的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'), 
    ), 
); 
} 

我沒有測試過這一點,所以你需要進行試驗。

希望這會有所幫助!

0

Drupal使用(un)序列化數據庫中的日期數組,我假設它是一個配置文件字段。如果你使用serialize把它寫入db,Drupal可以使用它。

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變量在你的數據庫插入/更新。