代码之家  ›  专栏  ›  技术社区  ›  DilbertDave

在提交时从表单日期元素提取值

  •  1
  • DilbertDave  · 技术社区  · 15 年前

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

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

    在我的模块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'][日/月/年]值。$form不作为参数传递给函数。
    2. 一旦我有了这些值,生成Unix日期值的最佳方法是什么?

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

    提前谢谢

    3 回复  |  直到 12 年前
        1
  •  2
  •   avpaderno    15 年前

    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
  •  2
  •   avpaderno    14 年前

    保存时调用的函数的签名应为 person_form_submit($form, &$form_state) . 从这里你可以使用 $form_state 数组来检索值并按您的需要对其进行处理。我不是关于你使用 person_form($node) ,以生成您应该使用的表单 person_form($form_state) 作为窗体生成器函数。查看drupal中构建表单的文档: http://drupal.org/node/751826 .

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

        3
  •  0
  •   Peter O. Manuel Pinto    12 年前
    $d = $form_state['values']['dob'];
    $mydateval = $d['year'].'-'.$d['month'].'-'.$d['day'];