1

我正在编写一个 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

提前致谢

4

3 回答 3

2

hook_form()被调用以显示表单字段以编辑现有节点或创建新节点。在第一种情况下,要显示的值是 中已经存在的值$nodehook_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'),
  );
}

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

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

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

于 2010-08-06T13:46:51.047 回答
2

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

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

于 2010-08-06T12:51:53.597 回答
0
$d = $form_state['values']['dob'];
$mydateval = $d['year'].'-'.$d['month'].'-'.$d['day'];
于 2010-12-14T11:08:46.647 回答