カスタム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']。このフィールドは、語彙用語からのオートコンプリートと、入力した用語が見つからない場合に追加される新しい用語を含むテキストフィールドにしたい

回答:


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

それは単なるタイプミスのようです。無視しても大丈夫だと思います。
BrianV 2012

上記のコードの$ 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 ...").')

);

または語彙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 2012

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())AND 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ナラ

0

@tecjam Drupal 7の場合、ほとんど問題ありません。あなたがしなければならないすべては、語彙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をフィールドの名前に置き換えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.