Webフォームのチェックボックスコンポーネントのキー/値アイテムを変更するにはどうすればよいですか?
私は この答え に従い、レンダリングと送信の両方で選択リストコンポーネントを正常に変更しました。
複数選択コンポーネントを使用して同じことをしようとしていますが、フォームは正しくレンダリングされますが、送信時に値が保存されません。
これは私のコードです:
function my_form_webform_client_form_30_alter (&$form, &$form_state) {
$form = mycustom_form($form);
}
function mycustom_form($form){
$form['#validate'][] = 'mycustom_webform_validate_form';
$form['#submit'][] = 'mycustom_webform_submit';
dpm($form['submitted']['code']['#options']); // ('0'=>'a value', '1'=>'another value');
$codes = array('foo', 'bar');
foreach ($codes as $key => $value) {
$form['submitted']['code']['#options'][$value] = $value;
}
return $form;
}
function mycustom_webform_validate_form($form, &$form_state) {
dpm($form_state['values']['submitted']);
// selecting all checkboxes I get all the four values
}
function mycustom_webform_submit($form, &$form_state) {
drupal_set_message('<pre>' . print_r($form_state, true) . '</pre>');
// only 'a value' and 'another value' are submitted
}
[〜#〜]更新[〜#〜]
いくつかの値を初期フォームに追加して、プログラムでそれらを操作しようとしました。
送信結果は、操作が行われなかったようなものです。
わかりやすいようにコードを更新します。
更新2
送信フォームをダンプしようとしました。
結果でコードを更新しました。
更新3
コンポーネントから「複数」フラグを削除すると、問題が解決することを確認しました。
残念ながら複数の回答が必要なので、削除できません。
UPDATE 4
これは、hook_webform_select_options_info()を使用して、私が試している別のソリューションです。
function mycustom_webform_select_options_info() {
$items = array();
if (function_exists('_mycustom_users_options')) {
$items['code'] = array(
'title' => t('User codes'),
'options callback' => '_mycustom_users_options',
);
}
return $items;
}
function _mycustom_users_options() {
$output = array();
$codes = mycustom_user_codes(); // <- these values are based on logged user
foreach ($codes as $key => $value) {
$output[$value] = $value;
}
return $output;
}
function mycustom_user_codes() {
$result = // a db query based on user id;
while($usercode = db_result($result)){
$output[] = $usercode;
}
return $output; // array({[0] => 'a value', [1] =>'another value'})
}
次のコードをローカルでテストしましたが、「機能する」という例外があります。ただし、送信結果を管理者として表示すると、フォームの表示時に変更されたキーではなく、元のキーが表示されます(これは私が期待すること)。
_function my_custom_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'webform_client_form_12') { // yours is different
// 'options' is the component name for a multiple-checkbox component.
$form['submitted']['options']['#options'] = array(
1 => 'Foo',
2 => 'Bar',
);
$form['#submit'][] = 'my_custom_submit';
}
}
function my_custom_submit(&$form, &$form_state) {
dpm($form_state);
}
_
dmp($form_state)
は、選択したチェックボックスが実際にチェックされたチェックボックスであることを示し、_webform_submitted_data
_でデータベースを確認すると、レコードがチェックした適切な値を示していることがわかります。
_nid sid cid no data
12 12 2 0 2
_
ここで、_data = 2
_は、変更したオプションで選択したチェックボックスを示しています( "Bar"を選択しています)。
次のsubmission displayは現在存在するキーを表示するため、オプション#2に元の値を選択したことが示されます。これをコンポーネントで「apples」に変更してから送信を更新すると、2番目のオプションが「apples」として表示されます。したがって、別のhook_webform_submission_render_alter()
またはhook_webform_submission_load()
でこれをフォローアップして、送信ビューに表示されているoptionsを変更して、ユーザーが誰であるかが適切になるようにすることができますウェブフォームに記入。
私の提案は、代わりに独自のフォームを作成することです。これは、必要なものに対して複数の動的な側面があるように思え、動的になるデータをシリアル化された配列として独自のテーブルの「データ」列に格納するためです。
Webform3には、プログラムで選択(または複数選択)オプションを設定するためのhook_webform_select_options_info()があります。
私はdrupal 7でこれを効果的に達成できましたが、drupal 6と7のチュートリアルはこちら http:// www。 anexusit.com/blog/how-create-pre-built-list-webform-drupal-67
私が続けるために私が従ったチュートリアルdrupal 7がここにあります http://eureka.ykyuen.info/2012/04/11/drupal-7-dynamic-select -options-for-webform / そして、webformのセットアップ方法の詳細を提供します(非常に似ているはずです)。
これは、フォームを変更してWebフォームに再度ハッキングしようとするのではなく、目的の動作を達成するためのよりクリーンな方法であることが証明されます。
$codes
配列はゼロベースです。これは通常悪いことであり、送信された値を台無しにする可能性があります(特に0キーのオプションをチェックした場合)。 #checkboxesのForm APIドキュメントの一部を次に示します。
チェックされた状態とチェックされていない状態を区別することができないため、#options配列に0キーを含めることはできません。
これは、フォームの生成(「値」と「別の値」のチェックボックスを作成した場合)とフォームの変更、送信などの両方に適用されます。したがって、解決策は、#options
のキーを手動で指定することです。 、 お気に入り
$codes = array(
"foo" => "foo",
"bar" => "bar"
);
または、数値が必要な場合は、
$codes = array(
1 => "foo",
2 => "bar"
);
チェックボックスの0キーは避けてください。
編集:私は、hook_form_alter()で実際にfoo
およびbar
をキーとして使用したことを確認しました。とにかく、チェックボックスを生成するときに0キーがあるので、問題が修正されない場合でも、私の観察は有効です。私はあなたの質問にコメントすることはできません(私の観察にはより適切だったでしょう)ので、この「0キーに注意してください」という警告を回答として残し、表示します。