2011-10-03 75 views
0

我试图创建一个新的表单元素来表示bbcode编辑器,它是工具栏和本地textarea元素的复合对象。 所以我hook_element_info()看起来像:#process回调(Drupal)中元素的名称

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; 
} 
+0

这是Drupal的6或7? – Clive

回答

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']); 
} 
0

好了,意识到这可能是一个有点晚了OP检查,我只是想添加一个答案对于那些可能偶然发现的人来说:)

假设你在使用drupal 7安装:

$element['#name'] 

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

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

它通常是有意义的重新使用_process回调用于Drupal的字段定义的API的自定义字段(即经由hook_field_info和相关钩定义字段时)。在这种情况下请注意,该元素的名称不包含在#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; 
}