0

eコマース関連のウェブサイトのcmsセクションのユーザー情報を検証して保存するページを作成するのに問題があります。

ページの一部には、ユーザーが配送先住所とは異なる請求先住所が必要かどうかを選択するためのオプションが含まれています。これは、ページ上の2つのフォームの1つです。

最初のフォームは、ユーザーが別の請求先住所が必要かどうかを選択するテーブルです。

この選択に基づいて、必要に応じて請求先住所用の追加スペースを含むかどうかにかかわらず、2番目のフォームが生成されます。

これは、物事をコンテキストに入れる最初のフォームに関連するhtmlです。

<form name="isSameAsPostal" action="" method="post">
<table class="adminTable" align="center">
<thead class="tableAddEdit">
    <tr>
        <th colspan="4">Details</th>
        <th colspan="1">Active</th>
    </tr>
</thead>
<tfoot class="tableFooter">
    <tr>
        <td colspan="5">This table stores the users addittional information.</td>
    </tr>
</tfoot>
<tbody>
<tr>
    <td colspan="4">User has different billing address?</td>
    '.$topCont.'
</tr>
</tbody>
</table>
</form>

ご覧のとおり、入力自体はフォームに含まれていません。スクリプトコントローラーで設定される変数として適用されます。

これがコンテキストに物事を置くためのphpです:

if (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 1)
{
    $_SESSION['sameAsPostal'] = 1;
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="0" checked="checked" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
    $otherCont = 'postal';
}
else if (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 0)
{
    $_SESSION['sameAsPostal'] = 0;
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
    $otherCont = 'postal and billing';
}
else
{
    $_SESSION['sameAsPostal'] = 0;
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
    $otherCont = 'postal and billing';
}

これでわかるように、入力の状態が変更されると、javascriptを使用してフォームが自動的に送信されます。

これに基づいて、私が最初にこれを始めたときに私が考えていたように、すべてがほぼ正しく機能します。

コントローラによると、チェックボックスがオンになり、セッション変数$sameAsPostalが「1」に設定されます。これは、2番目のフォーム内で追加の請求オプションの生成をトリガーするために使用されます。

これに伴い、チェックボックスの値は「0」になり、チェックボックスの選択を解除できるようになり$sameAsPostal、コントローラースクリプトの2番目の部分に示されているように、2番目のフォームの請求情報が0に設定されるように削除されます。コントローラの最後の部分は、ページに追加される入力の最初のインスタンスとして含まれています。それがなければ、入力はありません。

とても素晴らしいです、そして私が言ったようにこれはすべてうまくいきます。しかし、私が今直面している問題は、これに対する次の論理的な追加にあります。2番目のフォームが検証され、入力エラーが発生すると、正しいエラーの強調表示が適用されてページが更新されます。この中で、チェックボックスもリセットされ、請求情報セクションが非表示になります。(個々の入力に入力される情報は引き続き保存されますが、チェックボックスがリセットされたため、実際のhtmlは失われます)

だから私はコントローラーにこの追加を試しました:

if (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 1)
{
    $_SESSION['sameAsPostal'] = 1;
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="0" checked="checked" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
    $otherCont = 'postal';
}
else if (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 0)
{
    $_SESSION['sameAsPostal'] = 0;
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
    $otherCont = 'postal and billing';
}
else if (isset($_SESSION['sameAsPostal']) && $_SESSION['sameAsPostal'] == 1)
{
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="0" checked="checked" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
    $otherCont = 'postal';
}
else if ((isset($_SESSION['sameAsPostal']) && $_SESSION['sameAsPostal'] == 1) && (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 0))
{
    $_SESSION['sameAsPostal'] = 0;
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
    $otherCont = 'postal and billing';
}
else
{
    $_SESSION['sameAsPostal'] = 0;
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
    $otherCont = 'postal and billing';
}

そして正直に言うと他にもたくさんあります...しかし、私の論理とこのタスクに関係する実際の論理は異なっているようです。

このコントローラーへの追加により、チェックボックスがオンになっている場合はオフにできなくなります。

チェックボックスの状態をキャッチするためにセッション変数を追加し、次に最初に正しい入力を最初のフォームに適用し、次に必要に応じて請求情報セクションを生成します。

しかし、コントローラースクリプトをどのように構成しても、そのように機能させることはできないようです。

私がこれでどこが間違っているのかに関する情報を提供したり、提案したりできますか?

よろしくお願いします!!

4

1 に答える 1

1

変数を使用する場合$_SESSIONは、それらの値を保存しておくために、毎回セッションを開始していることを確認する必要があります。フォームが初めて送信された後、$_POST配列から取得してチェックボックスの値を保存していると仮定します。

代わりに、送信されたフォームからその値を確認することもできますが、それを質問に結び付けておくために、私が考えることができるのは、セッションを正しく開始していないことだけです。

ちなみに、設定しなくてもコードが壊れることはないので、このようにチェックするだけで済みます。物事を少し複雑にしすぎていると思います。

if($_SESSION['sameAsPostal'] == 1){
    //Do your code for checked
}else{
    //Do your code for unchecked
}

要約するとsession_start()、コードの最初のことを確認し、送信されたフォームから値 (0,1) を取得します。変数の値に応じてチェックボックスをマークするには、次のように簡単にできます。

$checked = ($_SESSION['variable'] == 1)?1:0;
echo "<input type='checkbox' value='$checked' title='My checkbox' />";

AJAX を使用してフォームを送信し、ページが実際にリロードされない場合、ユーザーが実際のページを表示する前に一度だけ実行されるため、もちろん PHP は他に何もしないことに注意してください。おそらく、クライアント側の変数の変更が反映されると想定しているかもしれませんが、そのサーバー側のコードを再実行しない限り反映されません (ページを更新します)。

于 2012-05-27T00:21:08.790 に答える