如何以自定义Drupal形式添加分类术语参考字段


9

菜单项定义drupal_get_form为回调函数,并从回调函数返回表单。如何taxonomy_term_reference在此表单中添加字段?

$items['files/add'] = array(
      'title' => 'Add file',
      'description' => 'Allows users to add files',
      'type' => MENU_CALLBACK,
      'page callback' => 'drupal_get_form',
      'page arguments' => array('mymodule_add_file'),
      'access callback' => TRUE,
    );
function mymodule_add_file($form, &$form_state) {
    drupal_set_title("Add file");
    $form['mymodule_form'] = array(
      '#type' => 'fieldset',
      '#tree' => TRUE,
      '#collapsable' => FALSE,
      '#title' => 'Adding file to locker room',
    );

    $form['mymodule_form']['file'] = array(
      '#type' => 'managed_file',
      '#title' => 'Upload file',      
    );

    $form['mymodule_form']['tag'] = array(
      '#type' => 'taxonomy_term_reference',
      '#title' => 'Tags',
    );  

    return $form;
}

我不确定如何为添加taxonomy_term_reference字段$form['mymodule_form']['tag']。我希望此字段是一个具有自动完成的词汇字段的文本字段,并且当找不到输入的术语时要添加新术语

Answers:


5

对于Drupal 7,代码是这样的,其中field_tags是小部件类型为自动完成的节点中的分类字段。

<?php
   $node=node_load($nid);
    $tags = array();
    foreach ($node->field_tags['und'] as $item) {
      $tags[$item['tid']] = isset($item['taxonomy_term']) ?  $item['taxonomy_term'] : taxonomy_term_load($item['tid']);
    }
    $form['tags'] = array(
      '#type' => 'textfield',
      '#default_value' => taxonomy_implode_tags($tags),
      '#title' => 'Add Tags',
      '#autocomplete_path' => 'taxonomy/autocomplete/field_tags',
      '#maxlength' => 1024,
      '#element_validate' => array('taxonomy_autocomplete_validate')
    );
?>

page代码末尾在做什么?接缝到我像无效的PHP代码?
FLY 2012年

这似乎只是一个错字。我相信,您可以放心地忽略它。
BrianV

有了上面代码的$ form部分,我得到了分类法字段,该字段显示在表单中。自动完成也可以。但是,如何将提交的值存储在节点的分类字段中?$submitted_tags = $form_state['values']['tags']; $node->field_tags[LANGUAGE_NONE][0]['value'] = $submitted_tags;对我不起作用。只是给我错误。
deinqwertz 2012年

0

您需要包括词汇表ID-您应该能够对其进行硬编码,因此

$form['mymodule_form']['tag'][$vocabulary->vid] = array(
  '#type' => 'textfield',
  '#default_value' => $typed_string,
  '#maxlength' => 100,
  '#autocomplete_path' => 'taxonomy/autocomplete/'. $vocabulary->vid,
  '#required' => $vocabulary->required,
  '#title' => $vocabulary->name,
  '#description' => t('Some description ...").')

);

或vocab id 5

$form['mymodule_form']['tag']['5'] = array(
  '#type' => 'textfield',
  '#default_value' => $typed_string,
  '#maxlength' => 100,
  '#autocomplete_path' => 'taxonomy/autocomplete/5',
  '#required' => $vocabulary->required,
  '#title' => $vocabulary->name,
  '#description' => t('Some description ...").')
);

未经测试,但应该可以。其他在这里有雄鹿:http : //drupal.org/node/854216


您确定这也适用于D7吗?我无法正常工作。它在taxonomy.module中提供了例外
Srihitha Narra

嗯,是的,它可以工作,但不完全是应该的方式。
tecjam 2011年

1
这行不通。Drupal 7的taxonomy_autocomplete要求将字段名称作为参数传递。本示例使用Drupal 6的分类法自动完成语法。
BrianV

0

我用了这个,我可以自动完成回调,但是不适用于指定的分类标准词汇。相反,它返回了所有词汇的结果

  $element['test'] = array(
      '#type' => 'textfield',
      '#default_value' => isset($items[$delta]['test']) ? $items[$delta]['test'] : NULL,
      '#maxlength' => 100,
      '#autocomplete_path' => 'taxonomy/autocomplete/37',
   );

我不太确定为什么要这样说。


我做了类似的尝试,下面给出了SELECT t.tid AS tid,t.name AS name FROM {taxonomy_term_data} t WHERE(t.vid IN())和t.name LIKE:db_condition_placeholder_0 ESCAPE&#039; \\&# 039;)LIMIT 10 OFFSET 0; Array([:db_condition_placeholder_0] =&gt;%imag%)并且mysql在&#039; \\&#039;附近给出异常。LIMIT OFFSET 0&#039;
Srihitha Narra

0

@tecjam对于Drupal 7,您几乎拥有它。您所要做的就是使用字段名称而不是vocab id。

像这样:

 $element['test'] = array(
 '#type' => 'textfield',
  '#default_value' => isset($items[$delta]['test']) ? $items[$delta]['test'] : NULL,
  '#maxlength' => 100,
  '#autocomplete_path' => 'taxonomy/autocomplete/field_name',
);

用您的字段名称替换field_name。

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.