#process回调中的元素名称(Drupal)

时间:2011-10-03 11:07:22

标签: drupal drupal-fapi

我正在尝试创建一个表示bbcode编辑器的新表单元素,该编辑器是工具栏和本机textarea元素的复合对象。 所以我的hook_element_info()看起来像:

function bbeditor_element_info() {
    $type['bbeditor'] = array(
        '#input' => TRUE,
        '#cols' => 60,
        '#rows' => 5,
        '#resizable' => TRUE,
        '#process' => array('process_bbeditor'),
        '#theme_wrappers' => array('bbeditor', 'form_element'),
    );
    return $type;
}

但是如何在过程函数中获取元素的名称以将其传递到嵌套的textarea元素中?

function process_bbeditor($element, &$form_state) {
    ...
    // Insert the textarea element as a child.
    $name = 'textarea'; // <------------- How do I get the name?
    $element[$name] = $textarea;
    return $element;
}

2 个答案:

答案 0 :(得分:0)

$ form_state变量存储表单状态的信息(意味着你可以使用这个变量来获取表单元素的值)

喜欢:

$form_state['element_name']['value']; 

这将为您提供表单元素的值。我不太确定$ form_state ['element_name']会给你元素的名称,也可能会返回数组。

请使用

进行检查
var_dump($form_state['element_name']);

在你的钩子里打印什么

function process_bbeditor($element, &$form_state) {
    ...

    var_dump($form_state['element_name']);
}

答案 1 :(得分:0)

好的,知道这可能对OP来说有点晚了,我只是想为那些可能偶然发现的人的利益添加一个答案:)

假设您正在进行drupal 7安装:

$element['#name'] 

包含元素的名称,前提是它具有名称。如果通过drupal_get_form呈现它将自动接收名称,在这种情况下,它接收初始表单数组中相应数组元素的名称。也可以直接设置#name属性,例如

$form['bbeditor_test'] = array(
  '#type' => 'bbeditor',
  '#name' => 'use-this-name',
  // some more stuff ....
);

对于为Drupal的字段API定义的自定义字段(即通过hook_field_info和相关挂钩定义字段时)重复使用_process回调通常是有意义的。在这种情况下请注意,该元素的名称不包含在#name属性中,而是包含在#field_name属性中。

因此,假设process_bbeditor也用于字段API字段,我们会有类似的内容:

function process_bbeditor($element, &$form_state,$form) {
  // some stuff ...
  $element_name = ''; 
  if (isset($element['#name'])) {
    $element_name = $element['#name'];
  }
  elseif (isset($element['#field_name'])) {
    $element_name = $element['#field_name'];
  }
  else {  // to handle the rare case when drupal_render is called directly on the parent array and #name isn't set
    $element_name = 'undefined';
  }
  // some more stuff using $element_name ....
  return $element;
}