Ajax отправляет только выбранные данные - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть код ajax, который работает, только если я выбираю опцию для всех выборов.

Выпуск

Select box 1 (option selected)
Select Box 2 (option selected)
Select Box 3 (option didn't select)

result: code 500 (won't send data)

//////////////////////

Select Box 1 (option selected)
Select Box 2 (option selected)
Select Box 3 (option selected)

result: code 200 (sending data)

Код

<script defer>
$(document).ready(function() {
    $('body').on("change", ".autosubspecifications", function() {
      var form = $(this).closest('form');
      var id = form.find('input[name="product_id"]').val();

      // An array to store the subspecifications values.
      var spec_array = [];

      // A loop to go through all them.
      form.find('select.autosubspecifications option:selected').each(function(){
        spec_array.push($(this).val());
      });

      console.log(id);
      $.ajax({
        type: "post",
        url: '{{ url('admin/spacssendto') }}',
        data: {
          '_token': $('input[name=_token]').val(),
          'product_id': id,
          'subspecifications': spec_array,
        },
        success: function (data) {
          alert('Specifications added successfully.');
          console.log($(this));
        },
        error: function (data) {
          console.log(data);
        }
      });
    });
  });
</script>

Что я хочу

Нужно ли отправлять данные в том виде, в котором они были выбраны, если я выбираю опции для двух или даже в одном из полей выбора, получаю код 200, чтобы не заставлять выбирать значения для всех моих выборов.

Есть идеи?

Обновление

вот мой бэкэнд (контроллер)

public function spacssendto(Request $request)
{
      $this->validate($request, array(
          'product_id' => 'required',
          'subspecifications' => 'required',
        ));
        $product = Product::find($request->product_id);
        $product->subspecifications()->sync($request->subspecifications, false);
}

Метод синхронизации

Что делает мой метод синхронизации,должен хранить product_id и subspecification_id в таблице с именем product_subspecification

database

one

how data are passing currently

two

Ошибка

как ответ моей сети (когда я не выбираю опцию из всех моих окон выбора), я получаю:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`u641790295_kargr`.`product_subspecification`, CONSTRAINT `product_subspecification_subspecification_id_foreign` FOREIGN KEY (`subspecification_id`) REFERENCES `subspecifications` (`id`)) (SQL: insert into `product_subspecification` (`product_id`, `subspecification_id`) values (21, ))

Обновление 2

Я внес некоторые изменения для того, чтобы игнорировать пустые значения подвидов и избежать ошибки в серверной части, вот мой текущий код:

public function spacssendto(Request $request) {
        $this->validate($request, array(
          'product_id' => 'required',
          'subspecifications' => 'required',
        ));
        $product = Product::find($request->product_id);

        $looped = $request->subspecifications;
        $spec = [];
        foreach($looped as $loope){
            if($loope != ''){
                $spec[] = $loope;
            }
        }

        if(isset($spec)) {
            $product->subspecifications()->sync($spec, false);
        }
    }

таким образом я получаю только те элементы массива, которые имеют значения(изображение № 2 выше).

Пока все хорошо,

Проблема возникает, когда я заменяю один из моих предыдущих вариантов, и, кроме редактирования, он добавляется.

sample

1

2

3

4

Любая идея, как я могу сделать эту замену?

PS: метод синхронизации по умолчанию делает эту замену, но так как яУ меня проблема с пустыми значениями и при условии, что если в моем контроллере теперь я потерял возможность замены синхронизации.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Этот вопрос решен на 50% (Обновление 1) для проблемы в (Обновление 2). Я задал новый вопрос [здесь]

0 голосов
/ 19 сентября 2018

Код возврата 500 означает, что ваш внутренний код (за вашим вызовом ajax) не работает.Что вы можете сделать, это либо:

1) исправить этот код на бэкэнде для обработки пропущенных значений, т.е. если он не находит то, что ему нужно, - обработать эту ситуацию соответствующим образом (например, используя значение по умолчанию), такэто не ошибка

2), или вы можете сделать то же самое на стороне клиента (js), заполнив пропущенные значения.Что-то вроде:

    ...
          // A loop to go through all of selects.
          form.find('select.autosubspecifications').each(function() 
          {
            var selectedOption = $(this).val() || "sensible-default-value";
            spec_array.push(selectedOption);
          });
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...