cfFormMailerの確認画面での戻るボタン

質問全般・改善要望
kazuike
メンバー
メンバー
記事: 493
登録日時: 2009年8月12日(水) 12:53

cfFormMailerの確認画面での戻るボタン

投稿記事by kazuike » 2020年12月03日(木) 15:01

cfFormMailerの確認画面では、

コード: 全て選択

<button type="submit" name="return" class="btn btn_reset" value="入力ページへ戻る">入力ページへ戻る</button>
のような「name="return"」のsubmitボタンで入力画面に戻る仕様のはずですが、
最新のcfFormMailer(バージョンがよくわからないのですが、class.cfFormMailer.inc.phpは1.6です)では、
この戻るボタンでも、普通に送信されてしまう(「name="send"」のsubmitボタンと同じ)という現象が起こっています。
このあたり、何かご存じの方おられますか?
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
kazuike
メンバー
メンバー
記事: 493
登録日時: 2009年8月12日(水) 12:53

cfFormMailerの確認画面での戻るボタン

投稿記事by kazuike » 2020年12月03日(木) 15:32

おそらく、「assets/snippets/cfFormMailer/bootstrap.php」のバグのようです。
以下のコードで、「$pageType = 'return';」と判定したにもかかわらず、
そのまま下の送信の処理に進んでしまっています。

コード: 全て選択

if ($_POST['_mode'] === 'conf') {
    $pageType = ($mf->validate()) ? 'conf' : 'error';
} elseif ($_POST['_mode'] === 'send') {
    if ($_POST['return']) {
        if (!$mf->validate()) {
            return $mf->raiseError('未知のエラーです');
        }
        $pageType = 'return';
    }
    if ($mf->validate()) {
        if ($mf->isMultiple())    return $mf->raiseError('すでに送信しています');
        if (!$mf->isValidToken()) return $mf->raiseError('画面遷移が正常に行われませんでした');
        if (!$mf->sendMail())     return $mf->raiseError($mf->getError());

        $mf->storeDataInSession();
        $mf->storeDB();
        $pageType = 'comp';
    } else {
        $pageType = 'error';
    }
} else {
    $pageType = 'input';
}

とりあえず、

コード: 全て選択

if ($mf->validate()) {

コード: 全て選択

elseif ($mf->validate()) {
に修正すると良いように思います。
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
tktools
メンバー
メンバー
記事: 9
登録日時: 2020年8月17日(月) 09:13

cfFormMailerの確認画面での戻るボタン

投稿記事by tktools » 2020年12月07日(月) 10:09

木下です。

github で公開されているコードを確認してみましたが
以前のバージョンではActionをswitch caseで判別していて下記のようになっています。

コード: 全て選択

/**
 * Action
 */
switch($_POST['_mode']) {
    case 'conf':
        $pageType = ($mf->validate()) ? 'conf' : 'error';
        break;
    case 'send':
        if ($_POST['return']) {
            if (!$mf->validate()) {
                return $mf->raiseError('未知のエラーです');
            }
            $pageType = 'return';
            break;
        }
        if ($mf->validate()) {
            if ($mf->isMultiple())    return $mf->raiseError('すでに送信しています');
            if (!$mf->isValidToken()) return $mf->raiseError('画面遷移が正常に行われませんでした');
            if (!$mf->sendMail())     return $mf->raiseError($mf->getError());
           
            $mf->storeDataInSession();
            $mf->storeDB();
            $pageType = 'comp';
        }
        else {
            $pageType = 'error';
        }
        break;
    default:
        $pageType = 'input';
}


コード: 全て選択

$pageType = 'return';

の下には

コード: 全て選択

break;

が入っているので処理はswitch文の最後まで飛んでいるので
提案されているように

コード: 全て選択

elseif ($mf->validate()) {

とすることで同等になると思います。
noka
メンバー
メンバー
記事: 91
登録日時: 2013年6月19日(水) 10:02

cfFormMailerの確認画面での戻るボタン

投稿記事by noka » 2020年12月08日(火) 13:11

こんにちは。

私の認識では、公式・作者・yamaさんを比較して、最もきちんとメンテナンスされているのは、yamaさんのフォークリポジトリ
https://github.com/yama/cfFormMailer
かなと思っています。

ご指摘の件、私も気づいて、github上でyamaさんにPRしてました・・・。
別件のバリデーションの不具合修正も入っていますので、今更ながら共有しておきます・・・。
https://github.com/yama/cfFormMailer/pulls?q=is%3Apr+is%3Aclosed

とりいそぎ