Окна выбора PHP POST в цикле не отображают значения в правильном порядке - PullRequest
2 голосов
/ 04 апреля 2019

У меня есть флажок и выпадающий список, чтобы выбрать курс ужина, который циклично показывает 4 комнаты. Когда я выбираю более одной комнаты, я получаю этот вывод, например:

Слоновая комната

три курса

два курса

и

Lion Room

три курса

два курса

Но я хочу этот вывод:

Если я выберу два курса для Слоновой комнаты, я хочу это:

Слоновая комната

два курса

и

Если я выберу три курса для Lion Room, я хочу это:

Lion Room

три курса

Я пытался модифицировать циклы foreach несколькими способами, играя с ними. Я пока не совсем специалист по петлям, и петли внутри петель.

HTML

<?php while ( have_posts() ) : the_post(); ?>

<form name="book-room-form" action="" id="contactForm" method="post">

    <div>
        <label class="form-check-label selected-label" for="room-selected">Select</label>
        <input type="checkbox" class="form-check-input" id="room-selected" name="room-selected[]" value="<?php echo $room_name; ?>">
    </div>

    <select name="dinner-select[]" required>
      <option value="0" selected>Select Dinner Course</option>
      <option value="120">Two Course Dinner</option>
      <option value="200">Three Course Dinner</option>
    </select>

    <button name="submit-request" type="submit" class="btn btn-primary">Submit</button>

</form>

<?php endwhile; // end of the loop. ?>

PHP

if(isset($_POST['submit-request']))
{

    $room_selected = $_POST['room-selected'];
    $numPeople = $_POST['people-select'];
    $dinnerSelect = $_POST['dinner-select'];

    $roomoption = isset($room_selected) ? $room_selected : false;
    if ($roomoption) {
        foreach ($room_selected as $room){
            if($room){
                echo $room . '<br/>';

                $dinneroption = isset($dinnerSelect) ? $dinnerSelect : false;

                if ($dinneroption) {
                    foreach ($dinnerSelect as $dinn){
                        if($dinn >= 200){
                            echo 'three course <br/>';
                        }
                        elseif($dinn == 120) {
                            echo 'two course <br/>';
                        }
                    }
                }
            }
        }
    }
}

Есть идеи, как с этим справиться?

1 Ответ

0 голосов
/ 04 апреля 2019

Кажется странным, что вы бы зациклили форму и включили только один текстовый ввод и одно меню выбора в каждой форме - кажется более логичным, что у вас будет одна форма, а затем зацикливание вокруг элементов ввода, как это:

<!-- can leave the ID for the form as it is outside the loop -->
<form name="book-room-form" id="contactForm" method="post">

    <?php while ( have_posts() ) : the_post(); ?>

    <!--- to segregate the looped form elements -->
    <fieldset>

        <div>
            <label class="form-check-label selected-label" for="room-selected">Select</label>
            <!-- remove id attribute from input -->
            <input type="checkbox" class="form-check-input" name="room-selected[]" value="<?php $room_name; ?>">
        </div>

        <select name="dinner-select[]" required>
          <option value="0" selected>Select Dinner Course
          <option value="120">Two Course Dinner
          <option value="200">Three Course Dinner
        </select>

    </fieldset>

    <?php endwhile;?>

    <!-- a single "submit" button rather than however many were generated by the loop -->
    <button name="submit-request" type="submit" class="btn btn-primary">Submit</button>

</form>

Моя часть PHP не может быть легко протестирована мной, поэтому могут быть проблемы, но вы можете немного ее изменить

if( $_SERVER['REQUEST_METHOD']=='POST' && isset( $_POST['submit-request'], $_POST['room-selected'], $_POST['people-select'], $_POST['dinner-select'] ) ){

    $room_selected = filter_input( INPUT_POST, 'room-selected', FILTER_SANITIZE_STRING );
    $numPeople = filter_input( INPUT_POST, 'people-select', FILTER_SANITIZE_NUMBER_INT );
    $dinnerSelect = filter_input( INPUT_POST, 'dinner-select', FILTER_SANITIZE_NUMBER_INT );

    if( $room_selected & $numPeople & $dinnerSelect ){
        foreach( $room_selected as $room ){

            if( $room ){

                echo $room . '<br/>';

                foreach( $dinnerSelect as $value ){
                    switch( intval( $value ) ){
                        case 120:echo 'two course <br/>';break;
                        case 200:echo 'three course <br/>';break;
                    }
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...