5

私はフォームと送信ボタンを持っており、真か偽かをチェックします。

true の場合は、別のページにリダイレクトします。

false の場合は、同じページにとどまり、エラー メッセージを出力します。

エラーメッセージはフラッシュメッセンジャーで出力されます。ただし、送信が false の場合、最初の試行で印刷されない場合があり、2 回目のクリックで常に印刷されます。

私は何か間違ったことをしましたか?また、別のフラッシュメッセンジャー名を設定する方法はありますか? フラッシュメッセンジャーを使用している他のページでは、ページが更新されたときにエラーが出力されるためです。

コードは次のとおりです。

if(isset($_POST['submit'])) {
    // code to inputfields

    if(true) {
        //redirect to some page
    } else {
        // print the flash error on the same page
        $this->_helper->flashMessenger->addMessage(" This email is already taken");
        $this->view->messages = $this->_helper->flashMessenger->getMessages();
    }
}

HTML:

<center>
            <div style="color:red">
            <?php if (count($this->messages)) : ?>
                <?php foreach ($this->messages as $message) : ?>
                <div id="field_name">
                <strong style="text-transform:capitalize;">Email </strong>
                    - <?php echo $this->escape($message); ?>
                </div>
                <?php endforeach; ?>
            <?php endif; ?>
            </div>
        </center>
4

1 に答える 1

9

flashmessenger は実際には何らかのリダイレクトで使用するように設計されているため、表示されるメッセージはおそらく前のアクションの実行からのものです。現在のコードは、最初の「投稿」中にメッセージをフラッシュしません。

次のようなことを試してみると、運が良いかもしれません:

public function init()
{
    //This will catch any messege set in any action in this controller and send
    //it to the view on the next request.
    if ($this->_helper->FlashMessenger->hasMessages()) {
        $this->view->messages = $this->_helper->FlashMessenger->getMessages();
    }
}

public function someAction()
{
    if(isset($_POST['submit'])) {
    // code to inputfields
        if(true) {
        //redirect to some page
        } else {
            // print the flash error on the same page
            $this->_helper->flashMessenger->addMessage(" This email is already taken");
            //will redirect back to original url. May help, may not
            $this->_redirect($this->getRequest()->getRequestUri());
        }
    }
}

これは、あなたが試みているように見えることを示す、私がコード化したアクションです。

public function updatetrackAction()
    {
        //get the page number
        $session = new Zend_Session_Namespace('page');
        $id = $this->getRequest()->getParam('id');
        //get the entity object
        $model = new Music_Model_Mapper_Track();
        $track = $model->findById($id);
        //get the form
        $form = new Admin_Form_Track();
        $form->setAction('/admin/music/updatetrack/');
        //test for 'post' 'valid' and update info
        if ($this->getRequest()->isPost()) {
            if ($form->isValid($this->getRequest()->getPost())) {
                $data = $form->getValues();

                $newTrack = new Music_Model_Track($data);

                $update = $model->saveTrack($newTrack);
                //add message
                $this->message->addMessage("Update of track '$update->title' complete!");
                //redirects back to the same page number the request came from
                $this->getHelper('Redirector')->gotoSimple('update', null, null, array('page' => $session->page));
            }
        } else {
            //if not post display current information
            //populate() only accepts an array - no objects -
            $form->populate($track->toArray());
            $this->view->form = $form;
        }
    }
于 2013-02-02T07:59:38.150 に答える