2011-10-03 76 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; 
}