Добавление модификаторов товара

Тема в разделе "JavaScript", создана пользователем immortal727, 9 ноя 2020.

  1. immortal727

    immortal727

    Регистрация:
    17 май 2018
    Сообщения:
    17
    Симпатии:
    0
    В основной форме создал блок для добавления модификаторов товара
    https://yadi.sk/i/bjxz7zZK51urUg
    При клике по кнопке добавляется строчка в таблице.
    Мне надо получить массив этих значений и получить их в специальном методе?
    Массив нужен вида
    $data = [
    'modif' => [
    [
    'color' => 'Желтый',
    'price' => '200',
    ],
    [
    'color' => 'Синий',
    'price' => '100',
    ],
    ]
    ];

    Где-то немного недопонимаю аякс. Кто сможет помочь?
    А еще надо учесть, что админ может удалить ненужные параметры, а значит массив обновится

    Скрипт следующий:

    $('#modifiere').click(function (e){
    e.preventDefault();
    let $data = [];
    // Получаем значения всех инпутов
    $('#modifiere').closest('.main').find('input').each(function() {
    $data[this.name] = $(this).val();
    });
    // Отправляем запрос на сервер
    $.ajax({
    url: adminpath + $('#modifiere').data('url') + '?mod-color=' + $data['mod-color'] + '&mod-price=' + $data['mod-price'],
    data: $data,
    // dataType: 'json',
    complete: function(response){
    $('#modifiere').closest('.main').find('.overlay').css({'display':'block'});
    },
    success: function(data){
    setTimeout(function(){
    $('#modifiere').closest('.main').find('.overlay').css({'display':'none'});
    $('.' + $('#modifiere').data('name')).append('<tr>' +
    '<td>' + $data['mod-color'] +'</td>' +
    '<td>' + $data['mod-price'] +'</td>' +
    '<td><a class="btn btn-danger btn-sm" href="#">\n' +
    ' <i class="fas fa-trash">\n' + '</i>\n' + 'Удалить\n' +
    ' </a>\n' +
    ' </td>' +
    '</tr>');
    }, 1000);
    },
    error: function(xhr, ajaxOptions, thrownError) {
    alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
    }
    });
    });
     
  2. SinTaksiS-11

    SinTaksiS-11

    Регистрация:
    10 апр 2023
    Сообщения:
    12
    Симпатии:
    1
    Для того, чтобы получить массив значений из добавленных строк таблицы, можно использовать следующий подход:

    1. Создать пустой массив.
    2. Обойти все строки таблицы, кроме заголовка, и для каждой строки:
    a. Создать объект с двумя свойствами: `'color'` и `'price'`.
    b. Записать в свойство `'color'` значение ячейки таблицы с индексом 0 (первая ячейка строки).
    c. Записать в свойство `'price'` значение ячейки таблицы с индексом 1 (вторая ячейка строки).
    d. Добавить созданный объект в массив.
    3. Использовать полученный массив в нужном методе.

    Пример

    Код:
    ```javascript
    // Функция для получения массива значений из таблицы
    function getModifierData() {
      const data = [];
      $('.' + $('#modifiere').data('name') + ' tr:not(:first-child)').each(function() {
        const color = $(this).find('td:eq(0)').text().trim();
        const price = $(this).find('td:eq(1)').text().trim();
        data.push({ 'color': color, 'price': price });
      });
      return data;
    }
    
    // Обработчик клика по кнопке
    $('#modifiere').click(function(e) {
      e.preventDefault();
      const $data = {};
      // Получаем значения всех инпутов
      $('#modifiere').closest('.main').find('input').each(function() {
        $data[this.name] = $(this).val();
      });
      // Отправляем запрос на сервер
      $.ajax({
        url: adminpath + $('#modifiere').data('url') + '?mod-color=' + $data['mod-color'] + '&mod-price=' + $data['mod-price'],
        data: $data,
        // dataType: 'json',
        complete: function(response) {
          $('#modifiere').closest('.main').find('.overlay').css({ 'display': 'block' });
        },
        success: function(data) {
          setTimeout(function() {
            $('#modifiere').closest('.main').find('.overlay').css({ 'display': 'none' });
            $('.' + $('#modifiere').data('name')).append('<tr>' +
              '<td>' + $data['mod-color'] + '</td>' +
              '<td>' + $data['mod-price'] + '</td>' +
              '<td><a class="btn btn-danger btn-sm" href="#">\n' +
              ' <i class="fas fa-trash">\n' + '</i>\n' + 'Удалить\n' +
              ' </a>\n' +
              ' </td>' +
              '</tr>');
            // Обновляем массив значений
            const modifierData = getModifierData();
            console.log(modifierData); // Выводим массив значений в консоль
          }, 1000);
        },
        error: function(xhr, ajaxOptions, thrownError) {
          alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
        }
      });
    });
    
    ```
    Здесь мы добавили функцию `getModifierData()`, которая обходит все строки таблицы, кроме заголовка, и создает для каждой строки объект с двумя свойствами: `'color'` и `'price'`. Затем мы добавили вызов этой функции внутри обработчика клика по кнопке после добавления новой строки в таблицу.

    Обратите внимание, что вместо `$data` для хранения массива значений мы использовали обычный массив `data`, так как `$data` используется для хранения значений инпутов. Если вы хотите использовать `$data` для хранения массива значений, то можно заменить `const data = []` на `const data = $data.modif || []`, чтобы использовать уже существующий объект `$data.modif`, если он есть, или создать новый пустой массив.