Является ли отображение рабочей формы виджета по своему усмотрению?

Я заинтересован в том, чтобы встраивать форму виджета поля вне контекста всей формы редактирования узла.

В прошлом я отображал полные формы, используя drupal_get_form , но, похоже, это не относится к одиночным полям.

Отображается рабочая форма виджета поля? Какой был бы лучший способ сделать это?

Оба виджета поля и «нормальные» формы кажутся очень похожими, поэтому, если это невозможно, что потребуется, чтобы «изменить» форму виджетов в обычную форму?

Этот вопрос , похоже, требует что-то подобное, но я не понимаю ответа. Этот ответ указывает на использование hook_field_widget_form_alter ; я не понимаю, как получить полевую форму, чтобы она отображалась не как ее подключить после ее создания.

21 голос | спросил SMTF 10 MaramSat, 10 Mar 2012 02:08:40 +04002012-03-10T02:08:40+04:0002 2012, 02:08:40

5 ответов


18

VBO делает что-то подобное в файле modify.action.inc:

$form_key = 'bundle_' . $bundle_name;
$form[$form_key] = array(
  '#type' => 'fieldset',
  '#title' => $label,
  '#parents' => array($form_key),
);  
field_attach_form($context['entity_type'], $entity, $form[$form_key], $form_state, LANGUAGE_NONE);  

Итак, вам нужен тип сущности, объект (который может быть пустым объектом с только набором ключей пакета, это то, что на самом деле используется), форму, в которую добавляются виджеты, и язык. Если вы хотите встроить виджеты глубже в форму (не в $ form, а в $ form [$ form_key], как я, или даже глубже), то для этого массива формы должен быть установлен #parents.

Конечно, обратите внимание, что это будет включать в себя виджеты всех полей, принадлежащих этому типу сущности & расслоение. Вот как написаны функции прикрепления. Обход, который потребует от вас переосмыслить довольно много кода; см. фактический код , который делает тяжелый подъем. То, что я делаю, проходит через экземпляры полей, получает каждое $ field_name, и если этот тип поля меня не интересует, я устанавливаю $form[$form_key][$field_name]['#access'] = FALSE;

EDIT: Хорошо, ctools имеет ctools_field_invoke_field (), что теоретически позволяет вам работать на основе каждого поля. Я никогда не использовал его. Текст выше - мой непосредственный опыт.

ответил Bojan Zivanovic 14 MarpmWed, 14 Mar 2012 19:22:49 +04002012-03-14T19:22:49+04:0007 2012, 19:22:49
7

Я интенсивно использовал функцию, предложенную ttk, но я думаю, что последнее обновление повредило вещи ...

Вот новая версия предыдущего решения, которая хорошо работает с Drupal 7.22 и ctools 7.x-1.3.

Итак, как и в предыдущем посте, вы вызываете свою настраиваемую функцию следующим образом:

my_field_attach_form('field_body', 'node', 'blog',  $node, $form, $form_state, LANGUAGE_NONE);

Обратите внимание, что объект bundle теперь является параметром. Я сделал это, потому что я также использовал эту функцию для редактирования пользователей. Таким образом, он также может использоваться для термина таксономии или любого другого объекта.

И my_field_attach_form определяется как:

function my_field_attach_form($field_name, $entity_type, $bundle, $entity, &$form, &$form_state, $langcode = NULL) {

  // Set #parents to 'top-level' if it doesn't exist.
  $form += array('#parents' => array());

  // If no language is provided use the default site language.
  $options = array(
    'language' => field_valid_language($langcode),
    'default' => TRUE,
  );

  // Append to the form
  ctools_include('fields');
  $field_instance = field_info_instance($entity_type, $field_name, $bundle);
  $form += (array) ctools_field_invoke_field($field_instance, 'form', $entity_type, $entity, $form, $form_state, $options);
}

Эта функция спасла меня много времени, надеюсь, что это будет для вас тоже!

ответил jmcouillard 9 AMpTue, 09 Apr 2013 09:13:13 +040013Tuesday 2013, 09:13:13
5

Вот решение, использующее метод ctools_field_invoke_field(). В своей пользовательской форме добавьте:

$form = array();
$node = new stdClass();
$node->type = 'blog';
my_field_attach_form('field_body', 'node', $node, $form, $form_state, LANGUAGE_NONE);

, где функция my_field_attach_form определяется как

function my_field_attach_form($field_name, $entity_type, $entity, &$form, &$form_state, $langcode = NULL) {
  // Set #parents to 'top-level' if it doesn't exist.
  $form += array('#parents' => array());

  // If no language is provided use the default site language.
  $options = array(
    'language' => field_valid_language($langcode),
    'default' => TRUE,
  );
  module_load_include("inc","ctools","includes/fields");
  $form += (array) ctools_field_invoke_field($field_name, 'form', $entity_type, $entity, $form, $form_state, $options);
}

Обратите внимание, что на вашем сайте необходимо включить ctools. Очень плохо, что Drupal не включает в себя вспомогательную функцию, подобную этой по умолчанию.

ответил ttk 21 FriEurope/Moscow2012-12-21T23:06:03+04:00Europe/Moscow12bEurope/MoscowFri, 21 Dec 2012 23:06:03 +0400 2012, 23:06:03
2

Мне не удалось заставить метод ctools работать и решил сделать это таким образом.

Этот код будет внутри функции формы, поэтому $ form и $ form_state будут переданы уже.

function form_function($form, &$form_state) {

Сначала создайте пустой узел типа, у которого есть поле, которое вы хотите отобразить.

    $entity = new stdClass();
    $entity->title = "Temp Object";
    $entity->type = "node_type";
    node_object_prepare($entity);

Я продублировал переменные формы, поэтому я бы не стал сбивать оригинал.

    $temp_form       = $form;
    $temp_form_state = $form_state;
    field_attach_form("node", $entity, $temp_form, $temp_form_state);

Вытащите поле, которое вы ищете, и добавьте его в форму.

    $form["field"] = $temp_form["existing_field"];
}

Я использовал этот метод для отображения виджета выбора таксономии, виджета таксономии и иерархического выбора пользовательская форма. (Таксономический виджет автозаполнения отображает ошибку при отправке)

Наконец, рендеринг и печать

drupal_render(drupal_get_form("form_function"))
ответил Scott Joudry 13 PM000000100000002931 2013, 22:17:29
0

Я создал формы из отдельных полей, используя

field_default_form('entity_type', $entity, $field,$field_instance,LANGUAGE_NONE,$default_value, $form, $form_state);

это должно вернуть требуемую форму виджетов, которую можно использовать в любой форме, например

 $custom_form['form_element_to_display'] = field_default_form('entity_type', $entity, $field,$field_instance,LANGUAGE_NONE,$default_value, $custom_form, $custom_form_state);

Чтобы получить значения для параметра 2 выше, используйте:

$field = field_info_field($field_name);
$field_instance = field_info_instance('node', $field_name, $node_type);

Для других параметров вы можете проверить ссылку api здесь

Это возвращает форму виджета по умолчанию, определенную в поле типов содержимого.

Надеюсь, это поможет кому-то :)

ответил akshay daxini 19 J0000006Europe/Moscow 2015, 15:15:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132