是否可以单独显示有效的Field Widget表单?


21

我有兴趣将Field Widget Form嵌入整个节点编辑表单的上下文之外。

过去,我已经使用drupal_get_form显示了完整的表单,但这似乎不适用于单独的字段表单。

是否可以显示有效的Field Widget表单?最好的方法是什么?

字段窗口小部件和“常规”表单看起来非常相似,因此,如果不可能,那么将窗口小部件表单“更改”为常规表单又需要什么?

这个问题似乎是在要求类似的内容,但我不明白答案。该答案指定使用hook_field_widget_form_alter ; 我不明白的是如何使“字段表单”显示出来,而不是如何在创建后将其挂钩。

Answers:


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; 其设置为隐藏那些小部件。

编辑:好的,ctools具有ctools_field_invoke_field(),从理论上讲,它可以允许您基于每个字段进行工作。我从来没有用过。上面的文字是我的直接经验。


很棒的答案。我花了一天的大部分时间来处理它,它的工作就像我想要的那样。授予赏金,我建议OP将其作为正确答案。我最终创建了一个虚拟内容类型,以便可以像其他任何内容类型一样控制字段,而不是#access = FALSE在这种情况下进行设置。
Letharion 2012年

感谢您确认我担心的问题:单字段小部件实际上无法单独使用。
SMTF 2012年

7

我正在密集使用ttk建议的功能,但是我认为最近的更新使事情变得混乱了。

这是先前解决方案的新版本,可与Drupal 7.22和ctools 7.x-1.3很好地配合使用。

因此,就像上一篇文章一样,您可以像这样调用自定义函数:

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

请注意,实体捆绑包现在是一个参数。我这样做是因为我也在使用此功能来编辑用户。这样,它也可以用于分类术语或任何其他实体。

并且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);
}

此功能为我节省了很多时间,希望它也对您有用!


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默认不包含这样的帮助器功能。


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"))

这似乎是一种以自定义形式使用字段小部件的简便方法。它取决于现有的捆绑软件。就我而言,我使用虚拟的内容类型,在其中我根据需要创建和配置字段。这有点棘手,但对于其他方法也是必需的。只是要注意:上述ctools_field_invoke_field()方法也有效。
BernhardFürst'15

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链接

这将返回在“内容类型”字段上定义的默认窗口小部件形式。

希望这可以帮助某人:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.