web-dev-qa-db-ja.com

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

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

enter image description here

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

以下は、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;
}
_

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

8
splatio

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

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

それがうまくいかない場合は、 hook_field_widget_form_alter() を使用すれば確実にうまくいくと思います。

たとえば、以下は、Media Selectorウィジェットを使用してImageフィールドタイプの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機能に関しては、間違いなく正しい方向に進んでいると思います。 Examples のField Exampleモジュールには、役立つサンプルコードがいくつかあると思います。

2
Clive

モジュール Hierarchical Select は、少なくとも達成したいことに非常に近くなります。そのウィジェットは少し異なって見えますが、基本的に同じ仕事をし、カスタマイズの良い出発点になるでしょう。分類法のデモ 私が訪れた場所 を見てください。

別のオプションは Autocomplete Deluxe モジュールかもしれません。

1
s.Daniel

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

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

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

0
DE51GN