Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.06.2021, 08:40
Аватар для nastya97core
Аспирант
Отправить личное сообщение для nastya97core Посмотреть профиль Найти все сообщения от nastya97core
 
Регистрация: 04.04.2020
Сообщений: 60

Как можно отправить на сервер массив с данными в случае их изменения?
Здравствуйте. Есть таблица, где строки - это записи из БД. Мне нужно редактировать эти записи (изменять одно из значений записи).
есть значения:
  • id
  • список товаров
  • стоимость
  • статус

В таблице все строки не редактируемые кроме последнего - статус.
<table>
    <tr>
        <td>1</td>
        <td>что-то что-то что-то что-то</td>
        <td>123123</td>
        <td>
<select name="select">
  <option value="value1">Значение 1</option>
  <option value="value2" selected>Значение 2</option>
  <option value="value3">Значение 3</option>
</select>
</td>
    </tr>
    <tr>
        <td>2</td>
        <td>что-то что-то</td>
        <td>141414</td>
        <td>
<select name="select">
  <option value="value1">Значение 1</option>
  <option value="value2" selected>Значение 2</option>
  <option value="value3">Значение 3</option>
</select>
</td>
    </tr>
    <tr>
        <td>3</td>
        <td>что-то что-то</td>
        <td>333333</td>
        <td>
<select name="select">
  <option value="value1">Значение 1</option>
  <option value="value2" selected>Значение 2</option>
  <option value="value3">Значение 3</option>
</select>
</td>
    </tr>
</table>
<button>СОХРАНИТЬ</button>


Мне нужно чтобы, если пользователь изменил select одной из строк и нажал "сохранить" - на сервер отправился бы массив, в котором был список id и их новых статусов, чтобы я потом могла пройти его перебором и записать в БД
foreach ($_POST as $value) {
$datasave["data"] = [
			"number"=>$value['id'],
			"status"=>$value['select'],
		];
		$orders = myapi("collections/save/", "orders", $api, json_encode($datasave));

Последний раз редактировалось nastya97core, 07.06.2021 в 08:58.
Ответить с цитированием
  #2 (permalink)  
Старый 07.06.2021, 11:03
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,124

Сообщение от nastya97core
Мне нужно чтобы, если пользователь изменил select одной из строк и нажал "сохранить" - на сервер отправился бы массив, в котором был список id и их новых статусов, чтобы я потом могла пройти его перебором и записать в БД
Так формируй такой массив
[
   {id: 'ИД1', status: 'Статус1'},
   ...
   {id: 'ИДN', status: 'СтатусN'}
]

потом его можно преобразовать в json- строку и отправить на сервер...
Ответить с цитированием
  #3 (permalink)  
Старый 07.06.2021, 11:08
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,124

Можно вообще формировать такой УРЛ
<url>?id=id1&st=st1&id=id2&st=st2&id=id3&st=st3&...&id=idN&st=stN

Тогда на сервере (в request) будут доступны два массива
id: ['id1', ..., 'idN']

и
st: ['st1', ..., 'stN']
Ответить с цитированием
  #4 (permalink)  
Старый 07.06.2021, 17:48
Аватар для nastya97core
Аспирант
Отправить личное сообщение для nastya97core Посмотреть профиль Найти все сообщения от nastya97core
 
Регистрация: 04.04.2020
Сообщений: 60

ksa,
а если бы у меня в одной строке было несколько редактируемых параметров, то как в этом случае быть? К примеру в записи с id=1 было изменено input.name = price и input.name = status. А в записи с id=2 только input.name = status. Как бы мне их можно было объединить в один? Ладно в {id: 1} мы можем заранее знать, что это id. А как быть с остальными? Ведь я не знаю будет ли price или status, или даже всё вместе: {price: '123', status: 'Статус 2'}. У меня просто не удалось прописать свой ключ (подставить в ключ переменную)
Ответить с цитированием
  #5 (permalink)  
Старый 07.06.2021, 21:29
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,124

nastya97core, если изменения не "однородны" - тогда вариант со строкой json более гибок...

Сообщение от nastya97core
К примеру в записи с id=1 было изменено input.name = price и input.name = status. А в записи с id=2 только input.name = status. Как бы мне их можно было объединить в один? Ладно в {id: 1} мы можем заранее знать, что это id. А как быть с остальными?
получится нечто похожее на такой массив объектов
[
   {id: 1, price: '123', status: 'Статус 2'},
   {id: 2, status: 'Статус 3'},
]

Останется только переделать его в json-строку и можно отправлять на сервер.
Если серверный язык не умеет работать со json-строками - можно придумать другой формат строк, который серверу будет более удобен.
Ответить с цитированием
  #6 (permalink)  
Старый 08.06.2021, 10:35
Аватар для nastya97core
Аспирант
Отправить личное сообщение для nastya97core Посмотреть профиль Найти все сообщения от nastya97core
 
Регистрация: 04.04.2020
Сообщений: 60

ksa,
У меня тупик как раз с формированием этого массива. Как его сделать?
Как мне прописать ключ, если я даже заранее не знаю, будет ли он? Вот этот вариант {status: ''} - сделает изменения в БД и сотрёт данные...
Ответить с цитированием
  #7 (permalink)  
Старый 08.06.2021, 13:08
Аватар для nastya97core
Аспирант
Отправить личное сообщение для nastya97core Посмотреть профиль Найти все сообщения от nastya97core
 
Регистрация: 04.04.2020
Сообщений: 60

вот такая таблица.
https://jsfiddle.net/pos2yb0j/

Нужно, чтобы при сохранении создавался массив только изменённых
[
   {id: a1, info: '123', status: 'Статус 2'},
   {id: a2, status: 'Статус 3'},
]


помогите
Ответить с цитированием
  #8 (permalink)  
Старый 08.06.2021, 13:39
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

nastya97core,

а можно исходный массив , а не таблицу?
Ответить с цитированием
  #9 (permalink)  
Старый 08.06.2021, 14:45
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,124

Сообщение от nastya97core
Нужно, чтобы при сохранении создавался массив только изменённых
Как вариант...

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="https://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<style>
table {
   border-collapse: collapse;
}

td {
   border: 1px solid grey;
   min-width: 10vw;
       padding: 10px;
}

input {
  border:none;
  border-bottom:1px solid black;
}
</style>

<script>
$(function() {
	$('input, select').on('change', function() {
		const o = $(this)
		o.addClass('on')
		o.parents().parent().addClass('on')
	})
	$('#test').on('submit', function() {
		let a = []
		$('#data > tbody > tr.on').each(function() {
			let obj = {}
			const o = $(this)
			const id = o.find('td:first-child').text()
			obj.id = id
			o.find('.on').each(function() {
				obj[this.name] = this.value
			})
			a.push(obj)
		})
		alert(JSON.stringify(a))
		return false
	})
})
</script>
</head>
<body>
<form id='test'>
<table id='data'>
  <thead>
  <tr>
    <td>id</td>
    <td>Стоимость</td>
    <td>Инфо</td>
    <td>Статус</td>
  </tr>
  </thead>
  <tbody>
  <tr>
    <td>a1</td>
    <td><input type="text" name='sum' value="123"></td>
    <td><input type="text" name='info' value="перезвонить"></td>
    <td><select name='status'>
        <option value="value1" selected>В обработке</option>
        <option value="value2">Завершен</option>
        <option value="value3">Невозможен</option>
      </select></td>
  </tr>
  <tr>
    <td>a2</td>
    <td><input type="text" name='sum' value="1413"></td>
    <td><input type="text" name='info'></td>
    <td><select name='status'>
        <option value="value1">В обработке</option>
        <option value="value2" selected>Завершен</option>
        <option value="value3">Невозможен</option>
      </select></td>
  </tr>
  <tr>
    <td>a3</td>
    <td><input type="text" name='sum' value="222"></td>
    <td><input type="text" name='info'></td>
    <td><select name='status'>
        <option value="value1" selected>В обработке</option>
        <option value="value2">Завершен</option>
        <option value="value3">Невозможен</option>
      </select></td>
  </tr>
  </tbody>
</table>

<button>Сохранить</button>
</form>

</body>
</html>

Последний раз редактировалось ksa, 08.06.2021 в 18:49.
Ответить с цитированием
  #10 (permalink)  
Старый 08.06.2021, 14:47
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

таблица массив изменений
nastya97core,
<!DOCTYPE html>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
</head>
<body>
    <table>
        <tr>
            <td>id</td>
            <td>Стоимость</td>
            <td>Инфо</td>
            <td>Статус</td>
        </tr>
        <tr class="test">
            <td>a1</td>
            <td>123</td>
            <td><input type="text" value="перезвонить"></td>
            <td><select name="select">
                    <option value="value1" selected>В обработке</option>
                    <option value="value2">Завершен</option>
                    <option value="value3">Невозможен</option>
                </select></td>
        </tr>
        <tr class="test">
            <td>a2</td>
            <td>1413</td>
            <td><input type="text"></td>
            <td><select name="select">
                    <option value="value1">В обработке</option>
                    <option value="value2" selected>Завершен</option>
                    <option value="value3">Невозможен</option>
                </select></td>
        </tr>
        <tr class="test">
            <td>a3</td>
            <td>222</td>
            <td><input type="text"></td>
            <td><select name="select">
                    <option value="value1" selected>В обработке</option>
                    <option value="value2">Завершен</option>
                    <option value="value3">Невозможен</option>
                </select></td>
        </tr>
    </table>
    <button>Сохранить</button>
    <pre id="out"></pre>
    <script>
        const getData = _ => [...document.querySelectorAll('.test')].map(({ cells }) => {
            let [id, price, info, status] = [...cells].map(({
                textContent,
                children
            }) => children.length ? children[0].value : textContent);
            return {
                id,
                info,
                status
            }
        });
        let currentArr = getData();
        document.querySelector('button').addEventListener('click', _ => {
            let arr = getData();
            arr = arr.filter((obj, i) => {
                let el = currentArr[i],
                    test;
                ['info', 'status'].forEach(k => obj[k] === el[k] ? delete obj[k] : (test = true))
                return test
            })
            out.innerHTML = JSON.stringify(arr, "", 1)
        })
    </script>
</body>
</html>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
массив, распределение суммы как можно более равномерно рони Общие вопросы Javascript 15 18.06.2018 15:21
Форма для загрузки файла по ссылке kupidon Общие вопросы Javascript 64 18.02.2018 18:23
Как собрать все данные из таблицы, и отправить массив на сервер optsar AJAX и COMET 14 11.12.2015 07:58
Отправить массив клиенту в ответ на ajax ascherbakov AJAX и COMET 14 03.12.2014 01:12
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48