- ベストアンサー
PEAR::HTML_QuickFormで、POSTされたラジオボタン配列の値がprintできないのですが・・・
下記サンプルで、 ソース http://www.okushin.co.jp/information/tanuki03/index.php 画面 http://www.okushin.co.jp/information/tanuki03/tanuki03_frmTanuki/index.php POSTされたラジオボタンの配列の値をprint(またはecho)するには どのように記述したらよいでしょうか。 // 「好きな動物」ラジオボタンのグループ // 第二引数の「名称」が同じボタンの中から一つだけが選択できる。 $animalRdoArr[] = &HTML_QuickForm::createElement('radio','rdoAnimal',null,'犬',0); $animalRdoArr[] = &HTML_QuickForm::createElement('radio','rdoAnimal',null,'猫',1); $animalRdoArr[] = &HTML_QuickForm::createElement('radio','rdoAnimal',null,'こうもり',2); 例えば、「犬」を選択したら0(ゼロ)がPOSTされますが、 (1) print $animalRdoArr[]; →エラーになります (2) print $animalRdoArr; →NULLを返してきます (3) print $rdoAnimal; →NULLを返してきます たぶん、些細な問題でしょうが・・よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まずは、もう少しシンプルな物で、試してみては いかがでしょうか? 自分は、smartyで出力していますので参考になるかどうか分かりませんが、 流れは、確認->よければ->送信 送信後に、exportValuesで、値を配列に格納して、 いますので、ここでその値をDBなどに登録などしております。 <?php //ボタン処理 require_once "Smarty.class.php"; require_once "MySmarty.class.php"; require_once "HTML/QuickForm.php"; require_once "HTML/QuickForm/Renderer/ArraySmarty.php"; $smarty = new MySmarty(); $form = new HTML_QuickForm("Form"); $form->addElement ("text","name","お名前:",array("size"=>30,"maxlength"=>40)); $form->addElement ("text","email","メールアドレス:",array("size"=>30,"maxlength"=>100)); //入力チェック $form->setJsWarnings("必須項目を入力してください。",""); $form->addRule ("name","お名前が入力されていません。","required",NULL,"client"); $form->addRule ("email","メールアドレスが入力されていません。","required",NULL,"client"); if (isset($_POST["BTNG"]["SUBMIT_INDEX"])) { // 確認画面 (入力画面で「送信」クリック時)入力チェック実行 if ($form->validate()) { // 入力が正しい時は「戻る」ボタンと「送信」ボタンを表示 $buttons[] = &HTML_QuickForm::createElement ("submit","RETURN_CONF", "戻る"); $buttons[] = &HTML_QuickForm::createElement ("submit","SUBMIT_CONF", "送信"); $form->addGroup($buttons, "BTNG", null, " "); } else { // 入力が不正な時は「戻る」ボタンのみを表示 $buttons[] = &HTML_QuickForm::createElement ("submit","RETURN_CONF", "戻る"); $form->addGroup($buttons, "BTNG", null, " "); } // 入力内容を凍結 $form->freeze(); } elseif (isset($_POST["BTNG"]["SUBMIT_CONF"])) { if ($form->validate()) { // 入力結果を$valsに格納 $val = $form->exportValues(); echo "{$val['name']}\n"; echo "{$val['email']}"; } } else { // 入力画面表示 (最初と確認画面で「戻る」クリック時) $buttons[] = &HTML_QuickForm::createElement ("submit","SUBMIT_INDEX", "確認"); $form->addGroup ($buttons, "BTNG", null, " "); } $renderer = new HTML_QuickForm_Renderer_ArraySmarty($smarty); $form->accept ($renderer); $smarty->assign ("form", $renderer->toArray()); $smarty->display(basename($_SERVER["SCRIPT_NAME"],".php").".tpl"); ?>
その他の回答 (2)
- f_motion
- ベストアンサー率53% (7/13)
こんにちは、上記サイトは自分も参考にしましたが、 ちょっと分かりづらいのが難点。。。 $form = new HTML_QuickForm("Form");だったら $val = $form->exportValues(); で連想配列で、値が格納されますので、 ラジオボタンの場合は、$val['rdoAnimal']['rdoAnimal'] のような感じで、格納されます、 textのなどの場合は、$val['text'] のように、格納されますので、後はprint_r($val)で 確認してみて下さい。
補足
f_motionさん、詳細な解説ありがとうございました。 > 上記サイトは自分も参考にしましたが 大変心強いです。 わたしが実際に使ってみたのは、HTML_QuickForm_Controllerの方 みたいですが、 >ラジオボタンの場合は、$val['rdoAnimal']['rdoAnimal'] に準拠して組み込んでみましたが、やっぱり出ないみたいです・・うう。 何が間違っているでしょうか・・ 下記、いろんなサンプルから切り貼りしたソースですみませんが <?php require_once("HTML/QuickForm/Action.php"); require_once("HTML/QuickForm/Controller.php"); require_once("HTML/QuickForm/Action/Back.php"); require_once("HTML/QuickForm/Action/Next.php"); require_once("HTML/QuickForm/Action/Display.php"); require_once("HTML/QuickForm/Action/Submit.php"); session_start(); class PageFirst extends HTML_QuickForm_Page { function buildForm() { $this->_formBuilt = true; $this->addElement('header', null, '1 / 3'); $q1Arr[] = &$this->createElement('radio', 'rdoQ1', null, 'はい', 'Y'); $q1Arr[] = &$this->createElement('radio', 'rdoQ1', null, 'ふつう', 'F'); $q1Arr[] = &$this->createElement('radio', 'rdoQ1', null, 'いいえ', 'N'); $this->addGroup($q1Arr, 'q1', 'Q1 嫌いですか?'); $this->addElement('submit', $this->getButtonName('next'), '次へ >>'); $this->setDefaultAction('next'); } } class PageSecond extends HTML_QuickForm_Page { function buildForm() { $this->_formBuilt = true; $this->addElement('header', null, '2 / 3'); $this->addElement('textarea', 'itxaTest', 'メッセージ:', array('rows' => 10, 'cols' => 10)); $prevnext[] =& $this->createElement('submit', $this->getButtonName('back'), '<< 前へ'); $prevnext[] =& $this->createElement('submit', $this->getButtonName('next'), '次へ >>'); $this->addGroup($prevnext, null, '', ' ', false); $this->setDefaultAction('next'); } } class PageThird extends HTML_QuickForm_Page { function buildForm() { $this->_formBuilt = true; $this->addElement("header", null, '3 / 3'); $this->addElement("text","name","名前:", array("size"=>20,"maxlength"=>30)); $this->addElement("submit",$this->getButtonName("back"),"<< 前へ"); $this->addElement("submit",$this->getButtonName("submit"),"完了"); $this->applyFilter("name","trim"); $this->setDefaultAction("next"); } } class MyDisplay extends HTML_QuickForm_Action_Display { function _renderForm($page){ $renderer=$page->defaultRenderer(); $renderer->setHeaderTemplate("\n<tr>\n<td colspan=\"2\">{header}</td>\n</tr>"); $page->accept($renderer); print($renderer->toHtml()); } } class ControllerAction extends HTML_QuickForm_Action { function perform($page, $actionName){ $values=$page->controller->exportValues(); print("Q1:" . $values['rdoQ1']['rdoQ1'] . "<br />"); print("メッセージ:" . $values['itxaTest']."<br />"); print("名前:" . $values['name']."<br />"); $page->controller->container(TRUE); } } $ctrl=new HTML_QuickForm_Controller("myForm"); $ctrl->addPage(new PageFirst("first")); $ctrl->addPage(new PageSecond("second")); $ctrl->addPage(new PageThird("third")); $ctrl->setDefaults(array("name"=>ななし)); $ctrl->addAction("display",new myDisplay()); $ctrl->addAction("back",new HTML_QuickForm_Action_Back()); $ctrl->addAction("next",new HTML_QuickForm_Action_Next()); $ctrl->addAction("process",new ControllerAction()); $ctrl->run(); ?>
- inu2
- ベストアンサー率33% (1229/3720)
お礼
inu2さん、ありがとうございました。 確かにサンプルではprint_rで出力されていました。 array(3) { ["iradYesNo"]=> string(1) "Y" ["name"]=> : : みたいなやつって、print_rの結果だったのですね。 ありがとうございました。
お礼
f_motionさん、詳細なサンプルをご提示いただき、 ありがとうございました。smartyも将来的には お世話になりたいとは思っていますが、 これを参考に目的を達成できそうです。 ありがとうございました。