-1

チェックボックスの結果を最後にレビューページに渡したい段階的なフォームがあります。

ステップ 1 と 2 にチェックボックスがありますが、ステップ 3 でこれらを表示するにはどうすればよいですか?

以下で実行しようとしましたが、結果をエコーアウトすることはできません。

<form class="form" method="POST" action="<?php the_permalink(); ?>">
<? if (!$_POST['step']) { ?>
<input type="hidden" name="step" value="1" />
<div class="steps" style="float:left;">
  <p style="font-size:17px!IMPORTANT;"><b>Step 1 of 3</b></p>
</div>
<div class="progress-buttons" style="float:right;">
  <button class="next" type="submit" name="submit">Next</button>
</div>
<div class="clear"></div>
<?php $posts = get_field('options');
                            if( $posts ):
                            $items = 0;
                            foreach( $posts as $post): // variable must be called $post (IMPORTANT)
                                setup_postdata($post); ?>
<p style="clear:right;float:right;margin-right:60px;">
  <input type="checkbox" name="hardware[]" value="<?php the_title(); ?>">
  Select</p>
<?php $items++; endforeach;
                            wp_reset_postdata(); // IMPORTANT - reset the $post object so the rest of the page works correctly
                            endif; ?>
</div>
</div>
<? } else if ($_POST['step'] == 1) {
foreach($_POST as $name => $value) {
    if ($name == "hardware") {
        $_SESSION[$name] = $_POST[$name];
    } else if ($name <> "step") { echo "<input type=\"hidden\" name=\"$name\" value=\"$value\" />"; }
} ?>
<input type="hidden" name="step" value="2" />
<div class="steps" style="float:left;">
  <p style="font-size:17px!IMPORTANT;"><b>Step 2 of 3</b></p>
</div>
<div class="progress-buttons" style="float:right;"> <a class="back" href="<?php the_permalink(); ?>?<?= $field ?>" >Back</a>
  <button class="next" type="submit" name="submit">Next</button>
</div>
<?php $posts = get_field('accessories');
                            if( $posts ):
                            $items = 0;
                            foreach( $posts as $post): // variable must be called $post (IMPORTANT)
                                setup_postdata($post); ?>
<p style="clear:right;float:right;margin-right:60px;">
  <input type="checkbox" name="accessories[]" value="<?php the_title(); ?>">
  Select</p>
<?php $items++; endforeach;
                            wp_reset_postdata(); // IMPORTANT - reset the $post object so the rest of the page works correctly
                            endif; ?>
</div>
</div>
<? } else if ($_POST['step'] == 2) {
foreach($_POST as $name => $value) {
    if ($name == "accessories") {
        $_SESSION[$name] = $_POST[$name];
    } else if ($name <> "step") { echo "<input type=\"hidden\" name=\"$name\" value=\"$value\" />"; }
} ?>
<input type="hidden" name="step" value="3" />
<div class="steps" style="float:left;">
  <p style="font-size:17px!IMPORTANT;"><b>Step 3 of 3</b></p>
</div>
<div class="progress-buttons" style="float:right;"> <a class="back" href="<?php the_permalink(); ?>?<?= $field ?>" >Back</a>
  <button class="next" type="submit" name="submit">Next</button>
</div>
<div class="clear"></div>
<p>System spec</p>
<?php
$hardware = $_POST['hardware'];
$accessories = $_POST['accessories'];
if( is_array($_SESSION['hardware']) ){
    foreach ($_SESSION['hardware'] as $val) {
        $hardwareresults .= $val.",\n";
    }
}
if( is_array($_SESSION['accessories']) ){
    foreach ($_SESSION['accessories'] as $val) {
        $accessoriesresults .= $val.",\n";
    }
}
?>
<ul>
  <li><?php echo $hardwareresults; ?></li>
  <li><?php echo $accessoriesresults; ?></li>
</ul>
<? } else if ($_POST['step'] == 3) { //do stuff ?>
Last step
<?php } ?>
4

4 に答える 4

0

スクリプトに問題はないようです。セッションに値を適切にプッシュしています。3番目のステップでこれらのセッション値を使用してください。次のコードを試してください。

<?php } else if ($_POST['step'] == 3) { //do stuff  ?>
     <?php 
             echo '<pre>';
             print_r($_SESSION['hardware']);
             print_r($_SESSION['accessories']);
             echo '</pre>';
     ?>
<?php } ?>
于 2012-11-26T04:49:34.523 に答える
0

このことから、問題が何であるかを判断するのは少し難しいですが、最終的には奇妙で不必要なことをしていることになります。

$accessoriesresults .= $val.",\n";

。=は文字列演算子です。配列を連結するために使用しないでください。代わりに:

$accessoriesresults[] = $val;

しかし、なぜとにかくこれをしているのですか?すでに$_SESSIONにこれらの値がありますが、なぜ別の同様の配列を作成したいのですか?$ _SESSIONの内容を印刷してみませんか?

if( is_array($_SESSION['accessories']) ){
    foreach ($_SESSION['accessories'] as $val) {
         echo "<li>$val</li>";
    }
}
于 2012-11-14T21:57:19.323 に答える
0

フォームの永続性は、最も単純な実装では、セッション管理が必要です。つまり、http ポストの値をセッションに設定する必要があります。このコードを実装する方法は、アーキテクチャ (つまり、どのフレームワークを使用しているかどうか) によって異なりますが、基本的にはそれだけで十分です。

例えば

foreach($_POST as $key=>$value){$_SESSION[$key]=$value;}
于 2012-11-26T04:31:42.227 に答える
0

You appear to be overwriting your $_SESSION keys:

foreach($_POST as $name => $value) {

 if ($name == "hardware") {
   //here you just overwrite the 'hardware' key continuously
   $_SESSION[$name] = $_POST[$name];
 } else if ($name <> "step") {
   echo "<input type=\"hidden\" name=\"$name\" value=\"$value\" />";
 }

} 

Written out it looks like:

 if ($name == "hardware") {
   //here you just overwrite the 'hardware' key continuously
   $_SESSION['hardware'] = $_POST['hardware'];
 }

So are you storing multiple values or just a single value?

Further you should check you aren't loosing values along the way using var_dump e.g:

 var_dump($_SESSION['hardware']);
 if( is_array($_SESSION['hardware']) ){
  foreach ($_SESSION['hardware'] as $val) {
     $hardwareresults .= $val.",\n";
  }
 }
 var_dump($hardwareresults);
于 2012-11-20T06:23:10.717 に答える