我正在写一个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日期,每天一个月,一个月和一年 - 这正是我想要的,到目前为止一直很好。
现在,当用户点击“保存”按钮时,我需要能够访问这些元素值 - 但我现在有两个问题:
我已经用Google搜索了一段时间,但条款'drupal'和'date'似乎只是指向了Date模块扩展 - 当然我不需要扩展来处理这样的简单日期:-o < / p>
提前致谢
答案 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'];