@OMP_KG

Как сформировать список select с помощью Ajax запросив с БД MySQL?

Добрый день друзья...
Сформировал маленькую программу по принципу MVC. Однако возникли проблемы при разработке форму.
Задача формы в следующем: имеется три списка - список организаций, должностей и отделов. При выборе отдельную организацию должны одновременно изменяться списки должностей и отделов, поскольку каждая организация имеет свои типы должностей и отделов.
Код такова:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
    </head>
    <title>Заполнение формы</title>
    <body>
        <p>Добавить сотрудника организации</p><hr/>
        <div>
            <form action="#" method="post">
                <p>Введите Фамилию:</p>
                <input type="text" name="surName">
                <p>Введите Имя:</p>
                <input type="text" name="name">
                <p>Введите Отчество:</p>
                <input type="text" name="middleName">
                <p>Укажите организацию:</p>
                <select name="organization_id" id="getOrg">
                    <option disabled selected>Укажите организацию...</option>
                    <?php if (is_array($organizationList)): ?>
                        <?php foreach ($organizationList as $organization): ?>                   
                            <option value="<?php echo $organization['idn']; ?>">
                                <?php echo $organization['name']; ?>
                            </option>
                        <?php endforeach; ?>
                    <?php endif; ?>
                </select>
                <script>

$(document).ready(function(){            
                    $( "#getOrg" ).change(function () {
                        var str = $( this ).val();
                        $.ajax({
                            type: "POST",
                            url: "/cabinet/getInfo/" + str,
                            data: "",                   
                            error: function () {
                                alert( "При выполнении запроса произошла ошибка :(" );
                            },
                            success: function(data){
                                data = JSON.parse(data);                 
                                for(var id in data.departmentList){
                                        $( "#getDep" ).append($("<option value='" + id + "'>"
                                        + data.departmentList[id] + "</option>" ));                                
                                }
                                for(var id in data.personalList){
                                        $( "#getPer" ).append($("<option value='" + id + "'>"
                                        + data.personalList[id] + "</option>" ));                                
                                }
                                $( '#getDep, #getPer' ).prop( 'disabled', false );                            
                            }
                        });
                    });
                });

</script>
                <p id="getDep1">укажите управление (отдел):</p>
                <select name="department" id="getDep" disabled>
                    <option selected disabled>Укажите управление (отдел)...</option>
                </select>
                <p>Укажите должность:</p>
                <select name="position" id="getPer" disabled>
                    <option selected disabled>Укажите должность...</option>
                </select>
            </form>
        </div>  
    </body>
</html>

Далее при выборе организацию из списка скрипт по принципу MVC передает управление к методу actionGetInfo объекта CabinetController:
public function actionGetInfo($idn)
    {
        // Получаем список управлений (отделов) для выпадающего списка
        $department = User::getInfoDep($idn);
        $departmentList = json_encode ($department);
        // Получаем идентификатор типа организаций с БД из таблицы organization
        $idnOfTypeOrg = User::getIdnOfTypeOrg($idn);
        $idnOfTypeOrg = $idnOfTypeOrg['idnOfTypeOrganization'];
        // Получаем список должностей для выпадающего списка
        $personal = User::getInfoPer($idnOfTypeOrg);
        $personalList = json_encode ($personal);
        echo $departmentList;
        echo $personalList;
        return true;   
    }

Далее метод actionGetInfo объекта CabinetController обращается к объекту User, который из БД возвращает двухуровневые массивы
da37e9fb4f0a41478ba67923f83e7e6b.png
Проблема возникает в следующем: при выборе организацию код JavaScript никак не реагирует, даже функция ошибки установленный в $.ajax не срабатывает.
Проблема таится в коде объекта CabinetController и/или в скрипте JavaScript, поскольку объект User возвращает правильный массив.
Как можно это исправить? Где допущена ошибка? Как можно достичь выполнение задачи формы, указанное выше?
Помогите друзья...
  • Вопрос задан
  • 3230 просмотров
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Делать в 2 приема - по смене первого селекта аяксом брать список управлений (отделов) для выпадающего списка, после получения и парсинга срабатывает функция онсукчесс, которая уже запускает второй запрос, список должностей для выпадающего списка. Аякс при всей своей крутости и удобности технология капризная, тут важно отлаживать по шагам, каждый пук проверяя на работоспособность. Куча алертов или консоле_логов в коде сильно помогают, + я использую для отладки пхп скриптов аяксовых свой костылик - функцию которая пишет в файл вывод вардампа, с аяксом это очень удобно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@dmz9
брррррр...
1. для шаблонизатора в пхп лучше делать так
1.1 даже если шаблонизатор не поддерживает шорт-теги, а шаблон это тупо пхп/хтмл файл - всё же стоит выносить пхп код сборки элементов выше чем хтмл-темплейт сам по себе.
1.2 множественное открытие/закрытие тегов тоже не особо кул. дело не в перфомансе а в читаемости.
по сути выглядеть должно как то так
<?php
$optionsArray = array();
if (is_array($organizationList)&&!empty($organizationList))
{
	foreach ($organizationList as $org)
	{
		$optionsArray[]='<option value="'.$org['idn'].'">'.$org['name'].'</option>';
	}
}
?><!DOCTYPE html>
<html>
..............
<select name="organization_id" id="getOrg">
    <option disabled selected>Укажите организацию...</option>
    <?=implode("",$optionsArray)?>
</select>

2. сборка селектов на джиквери
2.1 трогать ДОМ много раз - вредно. семь раз create, один раз append.
2.2 данные лучше присылать в виде "массива" - в пхп это числовой массив.
элементами массива уже могут быть объекты - в пхп это ассоциативный массив.
var data = [{
    idn: 3,
    name: 'first'
}, {
    idn: 4,
    name: 'second'
}, {
    idn: 5,
    name: 'third'
}];
var $select = $('<select/>', {
    class: 'form-control',
    html: $.map(data, function(org) {
        return $('<option/>', {
            value: org.idn,
            text: org.name
        })
    })
}).on('change', function() {
    console.log($(this).val());
}).trigger('change');
$('.container').append($select)

можно пойти дальше и $select вообще не заводить а сразу внутри инструкции аппенда написать весь конструктор селекта
----------------------------
собственно - после каждого изменения (внутри change колбека) запрашиваешь данные еще раз (можно кешировать), перерисовываешь селекты. лучше иметь какое то отдельное хранилище - объект js. после сохранения в него данных, запускаешь метод сборки. это 2 отдельные функции.
можно вынести конструктор селекта в обычную функцию, в которую просто передаешь данные, и возвращается jquery-объект, который в success:function аппендит его в нужное место (а лучше сначала почистить контейнер от старых селектов - $('.container').empty().append($select) ).
----------------------------
для отладки используй хром, открой инструменты разработчика, там есть вкладка network, конкретно должно интересовать тебя - фильтр по XHR, и делай запросы, увидишь что возвращается - json или ошибки от пхп.
Ответ написан
@tester_toster
Зачем JSON.parse?
Можно так:
// Заменить
data = JSON.parse(data); 
// На
dataType: 'JSON'
// перед success:...

В отладчике в браузере в ответе видно массив?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы