Имя элемента в обратном вызове #process (Drupal) - PullRequest
0 голосов
/ 03 октября 2011

Я пытаюсь создать новый элемент формы, представляющий редактор 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 голосов
/ 30 июля 2014

Хорошо, зная, что это может быть немного поздно для ОП, я просто хочу добавить ответ в пользу тех, кто может наткнуться на это:)

Предполагается, что вы используете друпал 7:

$element['#name'] 

содержит имя элемента при условии, что у него есть имя. Он будет автоматически получать имя, если он будет обработан через drupal_get_form, и в этом случае он получает имя соответствующего элемента массива в исходном массиве формы. Также можно напрямую установить атрибут #name, например,

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

Часто имеет смысл повторно использовать обратный вызов _process для настраиваемых полей, определенных для API полей Drupal (т.е. при определении полей с помощью 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;
}
0 голосов
/ 03 октября 2011

$ переменная form_state хранит информацию о состоянии формы (означает, что вы можете использовать эту переменную для получения значения элемента формы)

Like:

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