【问题标题】:Save date array to db将日期数组保存到数据库
【发布时间】:2010-11-27 13:28:28
【问题描述】:

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

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

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

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

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

有这方面的drupal api函数吗?

【问题讨论】:

    标签: drupal date drupal-6 drupal-fapi


    【解决方案1】:

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

    我没有测试过这个,所以你需要试验一下。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      您可以只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,  
      );
      

      【讨论】:

      • 这将是一个非常糟糕的主意,如果您需要对日期做任何事情,例如获取最近的 10 个,全部来自 11 月等。这可以使用 SQL 完成,但如果您序列化则不行日期,而不是将其保存为日期。
      • 是的,ORDER BY date 是必需的。
      • 是的,坏主意。另外:您应该始终对接口进行编程。在您的表单 API 中包含这种东西不会促进重用和可读性。使用一些帮助函数来处理格式并在您的表单中委托给它们。
      • 啊。如果您需要按日期订购,那么这确实是个坏主意。
      【解决方案3】:

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

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

      【讨论】:

      • 我在数据库字段中有 INT(10) 格式,我不想使用外部模块。如果我找不到合适的drupal函数,那么我将使用原生php函数。
      【解决方案4】:

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

      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

      :)

      【讨论】:

      • 我还没有找到任何 drupal 方法来转换时间戳格式的日期值数组。我已经探索了配置文件模块,它会序列化日期。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        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 变量。

        【讨论】:

          【解决方案7】:

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

          $date = implode($form_state['values']['date']); // $date = 20101127;
          

          【讨论】:

          • 您确实意识到结果是不是 Unix 时间戳?!?
          • 为什么你认为结果应该是一个Unix时间戳?
          • 因为日期最好存储为 Unix 时间戳。以两个日期为例:9/11/200111/11/2000。毫无疑问,第一个出现在第二个之后,但是一旦您按照自己的方式内爆日期数组,后者将赢得简单的日期比较:2001911 &lt; 20001111。最重要的是,您依赖于一个隐含的假设,即日期元素数组的键的顺序是yearmonthday(它可能随时更改而您不会注意到它)。还有更多,但我想你明白了。
          • 我同意时间戳是更好的方法。但问题是关于日期序列化。没有数据处理之类的。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-16
          • 1970-01-01
          • 2019-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多