【问题标题】:Extracting value from Form Date Element on Submit在提交时从表单日期元素中提取值
【发布时间】:2010-08-06 08:14:01
【问题描述】:

我正在编写一个 Drupal 模块,但遇到了一个小问题;

考虑一个包含“出生日期”属性的“人”类型节点。我已将数据库表配置为使用 int 字段以 UNIX 格式(与 Drupal Core 相同)存储日期,但当然我需要为用户提供一种方法以更友好的格式指定值,即 dd/毫米/年年。

在我的模块 Person_form 函数中,我已经配置了日期元素:

$form['dob'] = array(
    '#type' => 'date',
    '#title' => 'Date of Birth',
    '#required' => TRUE,
    '#default_value' => array(
       'day' => format_date($node->dob, 'custom', 'j'),
       'month' => format_date($node->dob, 'custom', 'n'),
       'year' => format_date($node->dob, 'custom', 'Y'),
    ),
);

它在三个下拉列表中显示数据库中的 UNIX 日期,一个代表日、月和年 - 这正是我想要的,到目前为止一切都很好。

现在我需要能够在用户单击“保存”按钮时访问这些元素值 - 但我现在有两个问题:

  1. _form 函数的签名是 Person_form($node) 那么如何访问 $form['dob']['day'/'month'/'year'] 值。 $form 不作为参数传递给函数。
  2. 获得这些值后,生成 UNIX 日期值的最佳方法是什么?

我已经在 Google 上搜索了一段时间,但术语“drupal”和“日期”似乎只是将我指向 Date 模块扩展 - 当然我不需要扩展来处理这样的简单日期 :-o

提前致谢

【问题讨论】:

    标签: drupal datetime drupal-6 drupal-forms


    【解决方案1】:

    hook_form() 被调用以显示表单字段以编辑现有节点或创建新节点。在第一种情况下,要显示的值是 $node 中已经存在的值。 hook_load() 在调用之前加载与节点关联的值;返回值是将添加到节点对象的项目数组(例如,如果返回的数组是array('extra_field' => 'value'),则该节点将具有属性$node->extra_field)。 当节点保存在数据库中时调用hook_update()(实现内容类型的模块应将其自己的值保存在其数据库表中),而调用hook_validate() 来验证用户输入的值。

    由于您有日、月和年,您可以使用mktime() 获取 Unix 时间戳;您获得的时间戳将设置为当天的午夜。

    为了清楚我在评论中所说的不同按钮的不同提交处理程序,这是node_form()使用的代码:

    $form['buttons'] = array();
    $form['buttons']['submit'] = array(
      '#type' => 'submit',
      '#access' => !variable_get('node_preview', 0) || (!form_get_errors() && isset($form_state['node_preview'])),
      '#value' => t('Save'),
      '#weight' => 5,
      '#submit' => array('node_form_submit'),
    );
    $form['buttons']['preview'] = array(
      '#type' => 'submit',
      '#value' => t('Preview'),
      '#weight' => 10,
      '#submit' => array('node_form_build_preview'),
    );
    if (!empty($node->nid) && node_access('delete', $node)) {
      $form['buttons']['delete'] = array(
        '#type' => 'submit',
        '#value' => t('Delete'),
        '#weight' => 15,
        '#submit' => array('node_form_delete_submit'),
      );
    }
    

    每个按钮都有自己的提交处理程序(使用项目#submit 定义)。如果您将$form 的提交处理程序设置为$form['#submit'] = 'submission_function',则该提交处理程序将用于未定义其自己的提交处理程序的每个按钮。

    我需要提供一种方法让用户以更友好的格式指定值,即 dd/mm/yyyy。

    您可以使用三个文本字段来表示日、月和年(可以内联显示它们,并且可以使用 '#field_suffix' => '/' 设置放置在它们之间的 /)。使用日期表单字段的好处是,日月年字段按照网站设置的日期格式排序;如果日期格式显示日期和月份之前的年份,那么日期字段也将显示其他两个字段之前的年份。另一个优点是您无需创建自定义代码来验证从用户获得的输入。
    日期字段的值是一个包含索引日、月和年的数组。

    【讨论】:

    • 嗯,对于您的情况,可能是比我更好的答案。我的回答是给出构建自定义表单的示例。 Kiamlaluno 的回答给出了在代码中构建内容类型的更多细节。这是完整的文档链接:drupal.org/node/231019。我至少会浏览一下本页底部的代码示例。
    • 感谢你们在这个问题上的帮助,我现在已经按照我的意愿工作了。这似乎太微不足道了,我以为我错过了一些简单的东西。事实上,网上的一些例子把我引向了错误的方向。
    • 另见node_example.module;查看 bkildow 报告的页面和这个页面,您应该更好地理解用于实现内容类型模块的代码。
    • 我正在阅读 APress Pro Drupal Development 这本书,它似乎有一些不足之处。
    【解决方案2】:

    保存时调用的函数的签名应该是person_form_submit($form, &$form_state)。从这里您可以使用$form_state 数组来检索您的值并按照您的需要处理它们。我不是关于您使用person_form($node),因为要构建您应该使用person_form($form_state) 作为表单构建器功能的表单。查看在 Drupal 中构建表单的文档:http://drupal.org/node/751826

    要从日期获取时间戳,我会使用 php 函数 strtotime()

    【讨论】:

    • hook_form_submit 是否仅在保存时调用,还是我需要在某处检查“操作”?
    • 每次提交表单时都会调用表单的提交处理程序(Drupal 不使用任何hook_form_submit() 挂钩)。您可以使用不同的提交处理程序,每个提交按钮一个。在示例中,如果您有“保存”和“预览”按钮,您可以将提交处理程序附加到“预览”,并将一个附加到表单。这样,您就可以准确地知道调用了处理程序的操作。
    • 不是 100% 确定您将一个附加到“预览”和一个附加到表单的意思。
    • hook_form() 被调用为hook_form($node, $form_state),而不是hook_form($form_state)
    • 好吧(我想)我会进一步研究一下,谢谢大家。
    【解决方案3】:
    $d = $form_state['values']['dob'];
    $mydateval = $d['year'].'-'.$d['month'].'-'.$d['day'];
    

    【讨论】:

    • 请添加一些解释为什么这个代码应该工作等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多