75505
PHP初心者です。sublimeTextを使用してフォームを作成しています。

元々構築してあったものを手探りで追加しているのですが、  
`// セレクト項目設定` の箇所がフォームに反映されません。

確認画面を押すとエラー文字がでるページへ移行されますが、その時はフォームに反映され選択できるようになります。  
（添付画像参照）

初歩的なご質問となり申し訳ございませんが何かコードが足りないでしょうか?  
ご回答よろしくお願い致します。

※コードにならない部分は省略しております。

**発生している問題**  
最初のページには選択項目が表示されない。(真っ白)  
その後確認画面へを押すと文字が選択できるようになる。

* * *

以下PHP

```

    protected $controller = 'Sample';
    protected $formTemplateDirectory = 'Sample/';
    
    public function __construct() {
        parent::__construct();
    
        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            // POSTデータを取得
            $this->arrForm = $this->_objForm->getForm($_POST);
            $this->setFormItem();
            $this->setSelectItem();
            // ページ切り替え
            switch ($this->arrForm['mode']) {
                case 'confirm':
                    // 確認画面
                    $this->confirm();
                    break;
                case 'complate':
                    // 完了画面
                    $this->complate();
                    break;
                case 'back':
                    // 確認画面から戻ってきた場合
                    $this->getSessionData($this->arrForm['mode']);
                    $this->_objPage->setAssign("key", $this->arrForm['key']);
                    $this->_tpl = $this->formTemplateDirectory . $this->controller . "_input.tpl";
                    break;
                default:
                    $this->_tpl = $this->formTemplateDirectory . $this->controller . "_input.tpl";
                    break;
            }
        } else {
            // 入力画面
            $this->index();
        }
        // フォームをSmartyにアサイン
        $this->_objPage->setAssign("arrForm", $this->arrForm);
    
    }
    
    // 入力画面
    private function index () {
        // CSRFトークンをセットする
        $this->setCsrfToken();
        // 初期値を格納する
        $this->setDefaultData();
        $this->_tpl = $this->formTemplateDirectory . $this->controller . "_input.tpl";
    }
    
    // 確認画面
    private function confirm () {
        // CSRFトークンをチェックする
        $this->checkCsrfToken($this->arrForm['key']);
        // エラーチェック
        $arrErr = $this->getErrCheck();
        if (count($arrErr) > 0) {
            // エラーあり
            $this->arrForm['mode'] = "confirm";
            $this->_tpl = $this->formTemplateDirectory . $this->controller . "_input.tpl";
            $this->_objPage->setAssign("arrErr", $arrErr);
        } else {
            // エラーなし
            // Sessionへ入力値を格納する
            $this->setSessionData();
            // 確認画面表示
            $this->arrForm['mode'] = "complate";
            $this->_tpl = $this->formTemplateDirectory . $this->controller . "_confirm.tpl";
        } 
    }
    
    // 完了画面
    private function complate () {
        $error_flag = false;
        // CSRFトークンをチェックする
        $this->checkCsrfToken($this->arrForm['key']);
        // Sessionから入力値を取得する
        $this->getSessionData();
        // エラーチェック
        $arrErr = $this->getErrCheck();
        if (count($arrErr) > 0) {
            // 入力エラー
            $error_flag = true;
            $this->createLog('complate Function getErrCheck Error');
            $this->arrForm['mode'] = "confirm";
            $arrErr['complate_error'] = "validation";
            $this->_tpl = $this->formTemplateDirectory . $this->controller . "_input.tpl";
            $this->_objPage->setAssign("arrErr", $arrErr);
        } else {
            // エラーなし
            // contactdate 文字化け修正
            $contactdate = date('Y年n月j日 H時i分');
            $this->_objPage->setAssign("arrForm", $this->arrForm);
            $this->_objPage->setAssign("arrGenre", $this->_arrGenre);
            $this->_objPage->setAssign("contactdate", $contactdate);
    
            // 管理者宛てメール送信
            try {
                \Util::sendmail(
                    \Service\Constans::$admin_mail_to[$this->controller],
                    \Service\Constans::$admin_mail_cc[$this->controller],
                    \Service\Constans::$admin_mail_bcc[$this->controller],
                    \Service\Constans::$admin_mail_from_addr[$this->controller],
                    \Service\Constans::$admin_mail_from_name[$this->controller],
                    \Service\Constans::$admin_mail_title[$this->controller],
                    $this->_objPage->getHtml($this->formTemplateDirectory . "mail/" . $this->controller . "_mail.tpl"),
                    false // SMTP
                );
            } catch (Exception $ex) {
                // 送信エラー
                $error_flag = true;
                $this->createLog($ex);
                $this->createLog('complate Function sendmail admin Error');
                $arrErr['send'] = "送信に失敗しました。";
                $arrErr['complate_error'] = "sendmail";
                $this->_tpl = $this->formTemplateDirectory . $this->controller . "_input.tpl";
                $this->_objPage->setAssign("arrErr", $arrErr);
            }
    
            // ユーザー宛てメール送信
            try {
                \Util::sendmail(
                    array($this->arrForm['mail'] => $this->arrForm['name']),
                    null, // ユーザーメール CC
                    null, // ユーザーメール BCC
                    \Service\Constans::$customer_mail_from_addr[$this->controller],
                    \Service\Constans::$customer_mail_from_name[$this->controller],
                    \Service\Constans::$customer_mail_title[$this->controller],
                    $this->_objPage->getHtml($this->formTemplateDirectory . "mail/" . $this->controller . "_mail_return.tpl"), 
                    false // SMTP
                );
            } catch (Exception $ex) {
                // 送信エラー
                $error_flag = true;
                $this->createLog($ex);
                $this->createLog('complate Function sendmail customer Error');
                $arrErr['send'] = "送信に失敗しました。";
                $arrErr['complate_error'] = "sendmail";
                $this->_tpl = $this->formTemplateDirectory . $this->controller . "_input.tpl";
                $this->_objPage->setAssign("arrErr", $arrErr);
            }
        }
    
        if (!$error_flag) {
            // Session削除
            \Session::destroy('', true);
            // 完了画面へ遷移
            header("Location: thanks.html#thanks");
            exit();
        }
    }
    
    function getErrCheck() {
        $arrErr = $this->_objForm->getFormCheck($this->arrForm);
    
    
    
        return $arrErr;
    }
    
    // フォーム項目設定
    function setFormItem() {
        $this->_objForm->addParam("type", "お問合せ内容", array("require"));
        $this->_objForm->addParam("name", "お名前", array("require"));
        $this->_objForm->addParam("tel", "電話番号", array("require"));
        $this->_objForm->addParam("mail", "メールアドレス", array("require", "mail"));
        $this->_objForm->addParam("contents", "お問い合わせ内容", array());
    }
    
    // セレクト項目設定
    function setSelectItem($arrForm) {
        $arrItem = array();
    
        $arrItem["type"] = array(
                ""=>"お選び下さい",
                "選択項目1"=>"選択項目1",
                "選択項目2"=>"選択項目1",
                "選択項目3"=>"選択項目3"
        );
        // Smartyにアサイン
        $this->_objPage->setAssign("arrItem", $arrItem);
    }
    
    
    // フォーム画面設定
    function getFormDisplay() {
        return $this->_objPage->getHtml($this->_tpl);
    }
    
    /*
     * 初期値を格納する
     */
    function setDefaultData() {
        $this->arrForm = array(
            'type' => '',
            'name' => '',
            'tel' => '',
            'mail' => '',
            'contents' => '',
            // csrfのキーは格納しない
        );
    }
    
    /*
     * Sessionへ入力値を格納する
     */
    function setSessionData() {
        \Session::set('type', $this->arrForm['type']);
        \Session::set('name', $this->arrForm['name']);
        \Session::set('tel', $this->arrForm['tel']);
        \Session::set('mail', $this->arrForm['mail']);
        \Session::set('contents', $this->arrForm['contents']);
        // csrfのキーは格納しない
    }
    
    /*
     * Sessionから入力値を取得する
     */
    public function getSessionData() {
        $this->arrForm['type'] = \Session::get('type');
        $this->arrForm['name'] = \Session::get('name');
        $this->arrForm['tel'] = \Session::get('tel');
        $this->arrForm['mail'] = \Session::get('mail');
        $this->arrForm['contents'] = \Session::get('contents');
        $this->arrForm['key'] = \Session::get('key');
    }
    
```

以下tpi

```

    <form action="./#confirm" method="post" name="contact_confirm">
    <dl>
    <dt><label for="type">内容<span class="req">必須</span></label></dt>
    <dd>
    <select name="type" class="job_form" />
    {html_options options=$arrItem.type selected=$arrForm.type}
    </select>
    <p class="error">{$arrErr['type']['error_message']}</p>
    </dd>
        
    <dt><label for="name">お名前<span class="req">必須</span></label></dt>
    <dd><input type="text" id="name" name="name" placeholder="例：サンプル" value="{$arrForm['name']}">
    {if isset($arrErr['name']['error_message']) }<p class="error">{$arrErr['name']['error_message']}</p>{/if}</dd>
    <dt><label for="tel">電話番号<span class="req">必須</span></label></dt>
    <dd><input type="tel" id="tel" name="tel" placeholder="例：000-000-0000" value="{$arrForm['tel']}">
    {if isset($arrErr['tel']['error_message']) }<p class="error">{$arrErr['tel']['error_message']}</p>{/if}</dd>
    <dt><label for="email">メールアドレス<span class="req">必須</span></label></dt>
    <dd><input type="email" id="email" name="mail" placeholder="例：example" value="{$arrForm['mail']}">
    {if isset($arrErr['mail']['error_message']) }<p class="error">{$arrErr['mail']['error_message']}</p>{/if}</dd>
    <dt><label for="contents">お問合わせ内容</label></dt>
    <dd><textarea name="contents" placeholder="例：〇月〇日" id="contents">{$arrForm['contents']}</textarea>{if isset($arrErr['contents']['error_message']) }<p class="error">{$arrErr['contents']['error_message']}</p>{/if}</dd>
    </dl>
    <div class="submit"><input value="入力内容のご確認へ" type="submit"></div>
    <input type="hidden" id="key" name="key" value="{$key}" />
    <input type="hidden" name="mode" value="confirm" />
    </form>
    
```

最初にサイトにアクセスしたとき(何も表示されない)

[![最初にサイトにアクセスしたとき\(何も表示されない\)](https://i.stack.imgur.com/2tD8K.png)](https://i.stack.imgur.com/2tD8K.png)

その後入力内容の確認(画面移行後)  
選択表示が出現して選択しメールが飛ぶようになる。

[![画像の説明をここに入力](https://i.stack.imgur.com/Img2q.png)](https://i.stack.imgur.com/Img2q.png)
CC BY-SA 4.0
2021-04-23T11:56:23.000
75479
2021-04-26T05:03:07.040
2021-04-23T12:18:41.217
3060
44970
question
javascript php html
PHPで打ち込んだセレクト項目がフォームに反映されない
POSTメソッドの時にフォームに必要な項目を作成しているようです。  
最初の画面表示がGETで来るということは項目作成ロジックが通っていないようです。

```

    if ($_SERVER['REQUEST_METHOD'] === 'POST') {//POSTメソッドの時に
        // POSTデータを取得
        $this->arrForm = $this->_objForm->getForm($_POST);
        $this->setFormItem();//フォーム項目をセットする
        $this->setSelectItem();//セレクト項目をセットする
    
```

「入力」、「確認」、「完了」、「確認から戻ってきた」それぞれの画面でフォームが必要な画面で適切に処理を実行されるようにしましょう。

今回の場合は入力画面にでればいいのでindexを呼び出す部分だけでいいとは思います

```

    if ($_SERVER['REQUEST_METHOD'] === 'POST') {//POSTメソッドの時に
        // POSTデータを取得
        $this->arrForm = $this->_objForm->getForm($_POST);
        $this->setFormItem();
        $this->setSelectItem();
    
    //中略
    
    } else {
        // 入力画面
        $this->setFormItem();
        $this->setSelectItem();
        $this->index();
    }
    
```

しかし、これだとelse分岐の中で同じ処理を書いてしまっているので、  
いっそ条件分岐の前にフォームのデータを作成する処理を書いてしまえばよいと思います。

```

    $this->setFormItem();
    $this->setSelectItem();
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {//POSTメソッドの時に
        // POSTデータを取得
        $this->arrForm = $this->_objForm->getForm($_POST);
    
    //中略
    
    } else {
        // 入力画面
        $this->index();
    }
    
```
CC BY-SA 4.0
2021-04-26T05:03:07.040
75505
2021-04-26T05:03:07.040
22665
75479
answer