从提交中的表单日期元素中提取值

时间:2010-08-06 08:14:01

标签: drupal datetime drupal-6 drupal-forms

我正在写一个Drupal模块,并且遇到了一个应该是一个微不足道的问题;

考虑一个'Person'类型节点,其中包含'出生日期'属性。我已经将数据库表配置为使用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日期值的最佳方法是什么?
  3. 我已经用Google搜索了一段时间,但条款'drupal'和'date'似乎只是指向了Date模块扩展 - 当然我不需要扩展来处理这样的简单日期:-o < / p>

    提前致谢

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

调用

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' => '/'。使用日期表单字段的专家是根据为站点设置的日期格式对日期,月份和年份字段进行排序;如果日期格式显示日期和月份之前的年份,那么日期字段也会显示其他两个字段之前的年份。另一个专家是您不需要创建自定义代码来验证从用户获得的输入 日期字段的值是包含索引日,月和年的数组。

答案 2 :(得分:0)

$d = $form_state['values']['dob'];
$mydateval = $d['year'].'-'.$d['month'].'-'.$d['day'];