Отправить без перезагрузки страницы - PullRequest
0 голосов
/ 01 марта 2019

У меня есть 2 раскрывающихся списка, как показано ниже;

<div class="form-group">
<label>Category</label>
<select class="form-control bg-dark btn-dark text-white" id="drpcategory" name="drpcategory" onchange="submit()" required>
<?php
$category = ''.$dir.'/template/post/category.txt';
$category = file($category, FILE_IGNORE_NEW_LINES);

foreach($category as $category)
{
echo "<option value='".$category."'>$category</option>";
}
?>
</select>
</div>

<div class="form-group">
<label>Item</label>
<select class="form-control bg-dark btn-dark text-white" id="drpitem" name="drpitem">
<?php
$category = $_POST['drpcategory'];
$item = ''.$dir.'/template/post/'.$category.'/item.txt';
$item = file($item, FILE_IGNORE_NEW_LINES);

foreach($item as $item)
{
echo "<option value='".$item."'>$item</option>";
}
?>
</select>
</div>

Раскрывающийся список drpitem заполняется в соответствии с выбором, выбранным из раскрывающегося списка drpcategory.В настоящее время я могу поймать переменную $category в drpitem по $_POST['drpcategory'], и она работает.Но проблема в том, что я использую функцию submit() для события onchange в drpcategory, так что вся страница просто перезагружается, а затем drpitem заполняется, как и ожидалось.Это заставляет drpcategory вернуться к выбору по умолчанию, так как он не помнит, какое значение он имел до перезагрузки страницы.

Как я могу поймать $_POST['drpcategory'] в drpitem без перезагрузкистраница?Я пытаюсь придерживаться PHP и использовать минимальное количество JavaScript, если это необходимо.

Этот вопрос был позже обновлен и здесь дан ответ : AJAX POST & PHP POST на той же странице

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

В операторе foreach может быть условие if.

foreach($category as $category_item)
{
    if ($_POST['drpcategory'] == $category_item) {
        echo "<option selected value='".$category_item."'>".$category_item."</option>";
    } else {
        echo "<option value='".$category_item."'>".$category_item."</option>";
    }
}

Я вижу, что ваше утверждение foreach в синтаксисе неверно.Не используйте одно и то же имя переменной для списка и элемента.

0 голосов
/ 01 марта 2019

Как только жизненно важная часть информации становится известной, она становится довольно простой, и, без сомнения, вы могли бы найти другие примеры chained select using ajax, но непроверенный пример может быть полезен / интересен.

Событие changeв этом случае запускает ajax-запрос к той же самой странице php - php в верхней части скрипта обрабатывает этот запрос POST и использует данные POST для построения пути к следующему исходному файлу меню.

<?php
    /* top of same page to the javascript/html */
    if( $_SERVER['REQUEST_METHOD']=='POST' && !empty( $_POST['drpcategory'] ) ){
        ob_clean();

        $category=$_POST['drpcategory'];
        $path=$dir.'/template/post/'.$category.'/item.txt';
        $item = file($path, FILE_IGNORE_NEW_LINES);
        foreach( $item as $item ) printf('<option value="%s">%s',$item,$item);

        exit();
    }

?>
<!doctype html>
<html lang='en'>
    <head>
        <meta charset='utf-8' />
        <title>chained select</title>
        <script>
            const ajax=function( params ){
                let xhr=new XMLHttpRequest();
                with( xhr ){
                    onreadystatechange=function(e){
                        if( this.status==200 && this.readyState==4 ){
                            document.querySelector('select[name="drpitem"]').innerHTML=this.response
                        }                       
                    }
                    open( 'POST', location.href, true );
                    setRequestHeader('Content-Type','application/x-www-form-urlencoded');
                    send( params );
                }
            }

            document.addEventListener('DOMContentLoaded', event=>{
                document.querySelector('select[name="drpcategory"]').addEventListener('change',e=>{
                    e.preventDefault();
                    ajax( 'drpcategory='+e.target.value );
                },false);
            },false );

        </script>
    </head>
    <body>
        <div class="form-group">
            <label>Category</label>
            <select class="form-control bg-dark btn-dark text-white" name="drpcategory" required>
            <?php

                $category = $dir.'/template/post/category.txt';
                $category = file($category, FILE_IGNORE_NEW_LINES);

                foreach($category as $category) {
                    printf('<option value="%s">%s',$category,$category);
                }
            ?>
            </select>
        </div>

        <div class="form-group">
            <label>Item</label>
            <select class="form-control bg-dark btn-dark text-white" name="drpitem"></select>
        </div>
    </body>
</html>
0 голосов
/ 01 марта 2019

Вы можете указать значение первого раскрывающегося списка в сеансе.

Затем при отправке вы можете просто установить первое раскрывающееся значение на значение в сеансе.

Никаких изменений в обработке отправки не требуется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...