選択したチェックボックス(分類)は、選択したボックスの値を新しい選択リストに入力します


7

*質問への回答:カスタムモジュールのhook_node_submitでデータを保存するにはヘルプが必要です *


Drupal 7では、カスタムコンテンツタイプがあります。これには、そのコンテンツのカテゴリを選択するための複数選択用語参照があります。

次に、以前に選択したカテゴリから1つを選択し、何らかの方法で「メイン」カテゴリとしてマークする必要があります。

次のオプションを持つ複数選択用語参照フィールドがあるとします。

Apples
Bananas
Pears
Oranges
Grapes
Pineapples

ユーザーは、リンゴ、梨、ブドウを選択します。今私はどちらかが必要です:

  1. プログラムでこれらの選択した項目ごとに別のフィールドを作成し(おそらくAjaxコールバックを使用)、ラジオボタンを使用して、選択した用語の1つだけを選択できるようにします。
  2. チェックされたアイテムの横に(おそらくAjaxを使用して)ラジオフィールドを作成します。ここで、選択されたアイテムからメインのラジオフィールドを選択できます。

誰かこれについて何か考えがありますか?

より明確にするために、私は1つのコンテンツタイプにこれらのリストを多数用意しています。各リストを単一の値リストとして繰り返すことはオプションではありません。

私の最善の策は、hook_form_alter()ある種のAJAXコールバックでを使用して、ユーザーがチェックしたティックボックスの横に単一のラジオボタンを作成するか、指定されたリストでチェックされた各項目の新しいラジオフィールドリストをプログラムで作成することです。

更新: わかりました、それを行うための最良の方法は、ajaxを使用して、チェックされた各チェックボックスのラジオボタンを作成するカスタムモジュールを作成し、メイン要素として使用する要素を選択できるようにすることです。

したがって、税条件の値にアクセスする前にフォームがレンダリングされるのを待つ必要があるためhook_form_alter()#after_build関数を追加するために使用しました。

これがこれまでの私のモジュールです。私はたくさんのコメントを使用しているので、私が何をしようとしているのかがはっきりしているはずです:

MYMODULE.module

/**
 * Implementation of HOOK_form_alter()
 * Do the ajax form alteration
 */
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {

  // 1.CONTENT FORM
  // I created a custom content type 'content' and added a term
  // reference to it 
  if($form_id == 'content_node_form') {

    // tax term ref is the main part, so let us
    // remove title and body fields
    unset($form['body']);
    unset($form['title']);

    // do our stuff after the form has been rendered ...
    $form['#after_build'][] = 'MYMODULE_after_build';

  }
}

/**
 * after_build function for content_node_form
 */
function MYMODULE_after_build(&$form, &$form_state) {

    dsm($form);  

    // In the after_build call we can now actually use the 
    // element_children function to grab the values of the fields that
    // don't start with a hash tag #
    // in this test case 1,2,3,4 and 5

    // wrap each of the elements rendered ...
    foreach(element_children($form['field_taxonomy']['und']) as $key) {

      $form['field_taxonomy']['und'][$key] += array(

        // this is added before the element and then replaced by our callback ..
        // we use the $key value in the id so that we know which div to replace 
        // depending on which checkbox is checked ...
        '#prefix' => '<div class="taxonomy_term_wrapper">
                        <div id="callback_replace_'.$key.'">Replace Me ' . $key . '</div>',

        // this is added after the element so we basically wrap around it ..
        '#suffix' => '</div>',

        // add some ajax stuff here ...
        '#ajax' => array(
          // name of the callback function to call upon change
          'callback' => 'MYMODULE_callback',
          // the id of the element that will be replaced
          'wrapper' => 'callback_replace_'.$key,
          // replace the wrapper
          'method' => 'replace',
          // what kind of effect do we want ...
          'effect' => 'fade',
          // show progress on callback
          'progress' => array('type' => 'throbber'),
        ),
      ); 



      if (!empty($form_state['values']['field_taxonomy']['und'][$key])) {
        // the form to show upon change ...
        $form['field_taxonomy']['und']['main_cat'] = array(
          // we want a radio button
          '#type' => 'radio',
          '#title' => t('Test Title'),
          '#description' => t('Test Description ...'),
          '#default_value' => empty($form_state['values']['field_taxonomy']['und'][$key]) ?
                              $form_state['values']['field_taxonomy']['und'][$key] :
                              $form_state['values']['field_taxonomy']['und'][$key],
        );
      }

    }

  return $form;
} 

function MYMODULE_callback($form, $form_state) {
 return $form['field_taxonomy']['und']['main_cat'];
}

これは、ボックスをチェックする前の状態です。

これは、ボックスをチェックする前の状態です。

レンダリングされたフォームのHTMLは次のとおりです。

スクリーンショット


それ自体は実際の答えではありませんが、例モジュールを見てみてください。それはあなたの道に沿ってあなたを助けるかもしれないいくつかのきちんとしたajaxフォームの例を持っています:) drupal.org/project/examples
Chapabu

こんにちはチャパブ、回答ありがとうございます。私はajaxの例を使用しましたが、私の問題は、コードを追加するためにafter_buildを使用する必要があるという事実にあり、今はそれが何もしないのに困惑しています...これまでのところ、モジュール。多分あなたはエラーを見ることができます
tecjam

hmm .. after_buildで(すばやく)異なることがわかる唯一のことは、フォーマットです。Drupalのドキュメントでは、次のようになっているはずです-$ form ['#after_build'] => array( 'MYMODULE_after_build');
Chapabu

$ form ['#after_build'] => array( 'MYMODULE_after_build'); $ form ['#after_build'] [] = 'MYMODULE_after_build'と同じです。-[]に注意してください
tecjam

また、after_build関数は、分類法の用語をカスタムdivにラップし、replace divを追加するため、正常に機能するようです。コールバックだけが機能しない..
tecjam

回答:


1

アイテムをチェックボックスとして作成します。それらが選択された後、これらのアイテムを含むドロップダウンリストを表示するか、別のラジオボタンを使用してプライマリカテゴリを選択します。最初のチェックボックスがオンになるまで、次のコードを使用して2番目のドロップダウンを非表示にできます。

'#states' => array(
'visible' => array(
':input[name="your checkbox"]' => array('checked' => TRUE),
 ),
)

これを非表示にする要素に追加します。これは、チェックボックスがオンの場合にのみ表示されます。


0

2つのリストについて考えてみましょう。1つは、1つの選択を取得するタイトル付きのプライマリと、もう1つは複数です。重複を排除するために、2番目のリストまたは選択に対処する必要があります。


こんにちは、あなたの答えをありがとう。はい、もちろんそれでうまくいきます。しかし、コンテンツ作成ページにはたくさんのリストがあり、それらすべてを2回持つことはオプションではありません。例として、上の質問を単純化しました。
tecjam 2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.