「さらに追加」分類用語ウィジェット


8

私は、1つの重要な違いを除いて、通常の用語の参照ウィジェットと同様のフィールドウィジェットを作成しようとしています。ユーザーは、複数の新しい分類用語を同時に追加できる必要があります。

ここに画像の説明を入力してください

私は機能が分類/オプション/リストモジュールが提供するものに類似しているポイントに到達しました(つまり、チェックボックス/ラジオが表示され、保存など)。

ここで私が使用しているコードの重要なビットがあります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を追加することに関しては、チェックボックスの#optionsを再構築する関数を呼び出す#ajaxを使用するべきだと思いますか?

前もって感謝します!

編集- 私の最初の質問は非常にあいまいでした、これが私が試したことのいくつかの詳細です:

  $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;
}

エンティティを保存すると、保存されたというメッセージが表示されます。テーブルのフィールドを確認すると、フィールドが保存されていません。何が悪いのですか?

回答:


2

私はhook_field_widget_form()あなたが既存の要素に子要素を追加するだけでこれを行うことができると確信しています(これはあなたの現在のコードがどこにあると思いますか)

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

それが機能しない場合は、を使用すると確実に機能しますhook_field_widget_form_alter()

たとえば、次はalt、Media Selectorウィジェットを使用してImageフィールドタイプのフィールドを有効にする小さな関数です(何らかの理由で、デフォルトでは有効になっていません)。

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機能に関しては、間違いなく正しい方向に進んでいると思います。Examplesの Field Exampleモジュールには、役立つサンプルコードがいくつかあると思います。


答えをありがとう、それは私にそれを続けるために私にいくつかの良い情報を与えたので、それを完全に答えていないので私はそれを賛成投票しました!あなたの答えのおかげで私が試したことについていくつかのより多くの情報を与える私の編集をチェックしてください。
splatio 2012年

@splatは動作するウィジェットを実装できましたか?共有してもよろしいですか?
Joe Beuckman、2012

ジョーさん、申し訳ありませんでしたが、これを解決することができず、複雑なアプローチを使用してしまいました。うまくいけば、ここに投稿してください。将来に向けて興味があります。喜んでお答えさせていただきます。
splatio

@splatioあなたはあなたに別のアプローチについていくつかの情報を与えることができますか?
vfclists 2012


0

私はちょうどあなたのニーズに合うかもしれない分類の他のモジュールを見つけました。

これは、オプションの「-その他-」を分類選択リストに追加する単純なモジュールです。適切な権限を持つユーザーは、新しい用語を作成できます。

Drupal 7ポートについては、次を確認してください:Port Taxonomy Other to D7direct link)。

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