“添加更多”分类术语小部件


8

我正在尝试创建一个与普通术语参考小部件相似的字段小部件,只是有一个关键的区别。用户需要能够同时添加多个新的分类法术语,这可能更好地证明了这一点:

在此处输入图片说明

我已经讲到了功能类似于分类法/选项/列表模块所提供的功能(即,显示了复选框/收音机,正在保存等)。

这是我在其中使用的重要代码hook_field_widget_form()

 $element += array(
    '#type' => $multiple ? 'checkboxes' : 'radios',
    '#default_value' => $multiple ? $default_value : reset($default_value),
    '#options' => $options,
    '#value_key' => $value_key,
    '#element_validate' => array('options_field_widget_validate'),
    '#properties' => $properties,
  );

让我感到困惑的是,$ element不是您通常的表单数组,因此我不确定如何添加文本字段和按钮-尤其是它们的值不是要保存的。将这些字段添加到窗口小部件的最佳方法是什么?

至于添加所需的Javascript,我是否认为应该使用#ajax来调用为复选框重新构建#options的函数?

提前致谢!

编辑- 我最初的问题很模糊,这是我尝试过的更多详细信息:

  $element += array(
    '#type' => 'fieldset',
    '#delta' => $delta,
  );

  $element['value'] = array(
    '#type' => $multiple ? 'checkboxes' : 'radios',
    '#default_value' => $multiple ? $default_value : reset($default_value),
    '#options' => $options,
    '#value_key' => $value_key,
    '#element_validate' => array('options_field_widget_validate'),
    '#properties' => $properties,
  );

  $element['text'] = array(
    '#type' => 'textfield',
    '#title' => t('Add another'),
    '#weight' => 5,
  );

这是我所见过的各种示例的融合,似乎使我更加接近。问题是,当我提交实体表单时,出现以下错误:

注意:未定义的索引:taxonomy_field_is_empty()中的tid(modules \ taxonomy \ taxonomy.module的第1402行)。

我仔细研究了此函数,并期望它$item具有结构$item = array('tid', 2)。当使用上面的代码时,似乎是某个地方有一个增量,而最终的结构$item$item = array(0, array('tid', 2)。我无法确定“ 0”来自何处?

另一个编辑

通过更改$ element,我已经可以使用以下代码修复上述错误:

$element += array(
    '#type' => 'fieldset',
    '#process' => array('taxonomy_free_entry_ignore_parent'),
);

并添加功能:

function taxonomy_free_entry_ignore_parent(&$form, &$form_state, $complete) {
  array_pop($form['#parents']);
  return $form;
}

保存实体时,我会收到一条消息,告诉我它已被保存。当我检查表的字段时,它没有被保存。我究竟做错了什么?

Answers:


2

我敢肯定,您可以hook_field_widget_form()通过将子元素添加到现有元素中来实现(我想这是您当前代码所在的位置),例如

$element['text'] = array(
  '#type' => 'textfield',
  '#title' => 'Title',
  // etc...
);

如果那不起作用,我知道如果您使用,那肯定会起作用hook_field_widget_form_alter()

例如,以下是一个小功能,可alt使用“媒体选择器”小部件为“图像”字段类型启用该字段(由于某些原因,默认情况下未启用):

function media_image_attributes_field_widget_form_alter(&$element, &$form_state, &$context) {
  if ($context['field']['type'] == 'image') {
    $element['alt'] = array(
      '#type' => 'textfield',
      '#title' => 'Image Description',
      '#weight' => 10000,
      '#default_value' => count($element['#default_value']) ? $element['#default_value']['alt'] : ''
    );
  }
}

就ajax功能而言,我认为您肯定走对了。我觉得现场实例模块中的例子有一些示例代码,这可能会有帮助。


感谢您的回答,我对其进行了投票,因为它为我提供了一些很好的信息,但尚未完全回答!查看我的编辑,该编辑提供了有关由于您的回答而我尝试过的内容的更多信息。
splatio 2012年

@splat您已经能够实现一个有效的小部件吗?您愿意分享吗?
Joe Beuckman

对不起,乔,我无法解决这个问题,最终使用了一个复杂的方法!如果您能解决问题,请将其发布在这里,因为我对未来有兴趣。我也很乐意接受它作为答案。
splatio

@splatio您能提供有关替代方法的一些信息吗?
vfclists 2012年


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.