formAPI submitでコールされる関数に引数をつけたいです

Events happening in the community are now at Drupal community events on www.drupal.org.
ilohas_1020's picture

お世話になっております。
formAPI submitでコールされる関数に引数をつけたいです。

function AAA_form() {

$form['btndDelList'.$i] = array(
    '#type' => 'submit',
    '#value' => t('Test'),
    '#submit' => array('BBB'),←←←ここで呼ぶ関数に引数をつけたい
);
return $form;

}

function BBB($form, $form_state){
//処理

}

上記のコードで
@@呼び出し元@@
 '#submit' => array('BBB',$test)

@@呼び出し先@@
function BBB($form, $form_state,$test){

と変えてやってみましたがダメでした。
よろしくお願い致します。

Comments

初めまして、U-Taroと申します。 formの#subm

u7aro's picture

初めまして、U-Taroと申します。

formの#submitには引数を渡すことはできないので、通常はフォームの配列に#type => valueを使って値を埋め込みます。
送信された値はBBB関数で、$form_state['values']['hoge']と言う配列で使用できます。

function hoge_form($form) {
  $form['hoge'] =array(
  '#type' => 'value',
   '#value' => 'いれたい値',
  );

  $form['btndDelList'.$i] = array(
    '#type' => 'submit',
    '#value' => t('Test'),
    '#submit' => array('BBB'),
  );
  return $form;
}

function BBB($form, $form_state){
  $hoge = $form_state['values']['hoge'];
}

ちなみに#submit => array('BBB',$test)と言う書き方ですと、BBB関数が呼び出された後に$testに入っている文字列の名前の関数が呼び出されてしまいます。

こんにちは、

jun784's picture

こんにちは、 ilohas_1020さん

Drupalではフォームがサブミットされる際は必ず、hook_submit()が行われます。

なので

<?php
function AAA_form(){
 
$form['food'] = array(
     
'#type' => 'textfield',
     
'#title' => t('好きな食べ物は?'),
     
'#default_value' => '麻婆豆腐',
     
'#size' => 60,
     
'#maxlength' => 128,
     
'#required' => TRUE,
  );

 $form[’submit’] = array(
   
'#type' => 'submit',
   
'#value' => t('送信しちゃう'),
 );

  return
$form;
}
?>

のサブミット時にtextfieldに記入された好きな料理の値が勝手に変更されたりした場合に、麻婆豆腐が最高だと伝えるには

function BBB() の変数名を function AAA_submit に変更しこう書きます。

<?php
function AAA_submit($form, &$form_state){
  if(
$form_state['values']['food'] != '麻婆豆腐' or $form_state['values']['food'] != 'マーボードウフ') {
   
$form_state['values']['food'] = '麻婆豆腐';
  }
 
 
drupal_set_message($form_state['values']['food'].'が好きなたべものなんですね!');
}
?>

また、この場合はAAAからBBB(_submit)に引数を渡す場合は

<?php
function AAA_form(){
 
$form['drink'] = array(
     
'#type' => 'hidden',
     
'#value' => 'コーラ',
  );

  return
$form;
}

function
AAA_submit($form, &$form_state){
 
drupal_set_message($form_state['values']['drink'].'は飲み過ぎないように');
}
?>

といったhidden属性で値を渡すか、
form変数に直接、入れる値を入れることで参照できます。
<?php
function AAA_form(){
 
$form['drink'] = 'ペプシ';

  return
$form;
}
?>

form_apiの値や変数に関しては、hook_submit()こちらのAPIリファレンスを参考にしてください。

※今日は昼も夜もマーボードウフだったのでつい。

ilohas_1020's picture

U-Taroさん、jun784さん

お世話になっております。
ご回答ありがとうございます。

お二人のやり方でやったところ出来ました。
ありがとうございます。
基本的なことばかりを聞いてしまい申し訳ないです。

あともう1つなのですが
フォームの配列に文字列を入れた場合は上手くいくのですが
数字の場合だとダメでした。
キャストすればいいだけなのですが、
勉強のため教えて頂ければ幸いです。

よろしくお願い致します。

u7aro's picture

こんにちは、ilohasさん。

数字の場合はダメだとの事ですが、データの型が文字列(string型)に変換されてしまってダメという事ですかね?
もしそうだとしたらphpではあまり問題にはならないと思いますし、もしデータが取得出来ないのでしたら他の問題が考えられます。

ダメな状況をもう少し詳しく書いていただければ、回答を得られやすいと思いますよ

ilohas_1020's picture

U-Taroさん

お世話になっております。
曖昧な質問になってしまいすいませんでした。
もう一度、よく調べてみました。

数字の場合、exit関数で表示されないので出来ないと
思い込んでいました。
しかし型チェックをしてみると整数型となっておりました。
また1を代入した際に、受け取る側で1として受け取っているかをif文で
判定したところ正常に動作していました。

@@データ代入の部分@@
$form['rows'] = array(
  '#type' => 'hidden',
  '#value' => 1,←ここが'1'だとexit関数で表示されるが1だと表示さない
);

@@データ表示の部分@@
$var = $form_state['values']['rows'];

if($var == 1){
 print("1です");←これを表示した
}else{
 print("それ以外");
}

exit($var);

u7aro's picture

こんばんは、ilohasさん。

確かexit関数は文字型じゃないと表示されないんですよね XD

蛇足ですが、モジュールを開発される時は devel モジュールをインストールされることをお勧めします。
このモジュールが有効な状態だと dpm() と言うデバッグに便利な関数が使えます。dpm($var)みたいな使い方ができて、型が配列の場合でも見やすいですし、結果はDrupalのメッセージとして出力されるので、ページを跨る様な処理のときにも有効ですよ。

ilohas_1020's picture

U-Taroさん

お世話になっております。
なるほど、そういう原因だったのですね。

あとdevel モジュールという便利な物があるのですね
早速使ってみたいと思います。

色々とありがとうございました。

日本 コミュニティ: Drupal Japan User Group

Group organizers

Group categories

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds: