0

Не получается обновить список опций в select после добавления новой категории.

Есть форма:

    <form id ="add_category" enctype="multipart/form-data">
&lt;label class=&quot;uk-form-label&quot; for=&quot;form-stacked-text&quot;&gt;Название&lt;/label&gt;
&lt;input type=&quot;text&quot; class=&quot;uk-input&quot; name=&quot;name&quot; id=&quot;name&quot; required&gt;

&lt;label class=&quot;uk-form-label&quot; for=&quot;form-stacked-text&quot;&gt;Родительская&lt;/label&gt;
&lt;select name=&quot;parrent&quot; class=&quot;uk-select&quot; id=&quot;parrent&quot;&gt;
    &lt;option value=&quot;&quot; selected&gt;Без родительской&lt;/option&gt;
    &lt;div id=&quot;addresult_category_list&quot;&gt;&lt;?include $_SERVER['DOCUMENT_ROOT'] . &quot;/updates/category_list_admin.php&quot;;?&gt;&lt;/div&gt;
&lt;/select&gt;

&lt;label class=&quot;uk-form-label&quot; for=&quot;form-stacked-text&quot;&gt;Сортировка&lt;/label&gt;
&lt;input type=&quot;number&quot; class=&quot;uk-input&quot; name=&quot;sort&quot; id=&quot;sort&quot; required&gt;

&lt;div class=&quot;uk-margin&quot;&gt;
&lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;Добавить категорию&quot; id=&quot;submit&quot; class=&quot;uk-button uk-button-default&quot;&gt;

&lt;/div&gt;

В неё подгружаются опции из файла category_list_admin.php его содержимое:

            $sql = "SELECT * FROM category WHERE parrent=''";
            if($result = $conn->query($sql)){ 
                foreach($result as $row){ 
                $category = $row["name"]; 
                $category_id = $row["id"];
                echo "<option value=\"$category_id\">$category</option>";
            } 
            } else { echo "Ошибка: " . $conn->error;}

На странице с формой добавляю скрипт, чтобы после добавления новой категории без перезагрузки страницы в форме появлялись новые опции, но почему-то не работает. Опции в форме не обновляются.

<script>
$("#add_category").submit(function(updatelist){
    $.ajax({
      url: '/updates/category_list_admin.php',
      type: 'POST',
      contentType: false,
      cache: false,
      processData:false,
      success: function(html){  
        $("#addresult_category_list").html(html);
      }  
    });
});

Если я сделаю пустой див (вне формы)

<div id="addresult_category_list2"></div>

и направлю туда ответ аякса

   <script>
    $("#add_category").submit(function(updatelist){
        updatelist.preventDefault();
        $.ajax({
          url: '/updates/category_list_admin.php',
          type: 'POST',
          contentType: false,
          cache: false,
          processData:false,
          success: function(html){  
            $("#addresult_category_list2").html(html);
          }  
        });
    });
</script>

то после добавления новой категории, в новом диве корректно отобразится весь список категорий. Почему это не работает в форме с опциями я не понимаю.

  • Как не работает: наступает ночь? Взрывается компьютер? На странице выводятся слова матом? – u_mulder Jul 07 '22 at 12:22
  • @u_mulder забастовка – Алексей Шиманский Jul 07 '22 at 12:22
  • список опций не обновляется – Михаил Горячев Jul 07 '22 at 12:24
  • так ты впихиваешь данные в div а не в option – Алексей Шиманский Jul 07 '22 at 12:24
  • так я впихиваю опции через обработчик в div: echo "<option value=\"$category_id\">$category</option>"; – Михаил Горячев Jul 07 '22 at 12:25
  • первый же echo возвращает контент и успокаивается.....надо накапливать данные и скопом их отправлять....просто на будущее (и на текущее) – Алексей Шиманский Jul 07 '22 at 12:26
  • извините, не очень понятно, а как решить это в моей задаче? По идее весь контент в этом диве после срабатывания скрипта должен обновиться и показать все опции, включая новые. Что значит успокаивается? – Михаил Горячев Jul 07 '22 at 12:31
  • ты в первом же echo отдал контент на клиент...всё. скрипт отработал...... как решить: написано комментом же выше – Алексей Шиманский Jul 07 '22 at 12:36
  • так echo в foreach находится как он может отдавать только первое echo если их там несколько – Михаил Горячев Jul 07 '22 at 12:43
  • echo - вывод в output (читай как ответ). ajax дожидается ответа сервера......понимаешь? – Алексей Шиманский Jul 07 '22 at 12:47
  • а понимаю, что ajax посылает запрос в обработчик, где получает ответ со списком всех опций и заменяет эти данные в div. Если я сделаю пустой див (вне формы) и направлю туда ответ аякса, то после добавления новой категории, в новом диве корректно отобразится весь список категорий. Почему это не работает в форме с опциями я не понимаю. – Михаил Горячев Jul 07 '22 at 12:58
  • Почему ты думаешь, что в select можно вставлять div и что это крректно? – Алексей Шиманский Jul 07 '22 at 13:09
  • Это же работает при первой загрузке страницы <div id="addresult_category_list"><?include $_SERVER['DOCUMENT_ROOT'] . "/updates/category_list_admin.php";?></div> и работает корректно – Михаил Горячев Jul 07 '22 at 13:10
  • 1
    В select нельзя div класть, браузер автоматически удаляет его оттуда, добавляйте option напрямую в select. Рекомендую использовать валидатор для проверки html-страниц, тогда можно будет избежать таких ошибок https://validator.w3.org – pgood Jul 07 '22 at 14:08
  • @pgood действительно удаляет, а есть идея как сделать так чтобы новые опции через аякс добавлялись? – Михаил Горячев Jul 07 '22 at 14:47
  • 1
    Точно также как в div: $("#parrent").html('' + html); – pgood Jul 07 '22 at 15:01
  • 1
    Еще можно обрезать длину массива опций у селекта до одного: $("#parrent").get(0).options.length = 1; так останется только первый option, а потом добавляем полученный аяксом HTML-код $("#parrent").html($("#parrent").html() + html); – pgood Jul 07 '22 at 15:10

0 Answers0