
10.04.2019, 18:35
|
Аспирант
|
|
Регистрация: 10.04.2019
Сообщений: 37
|
|
Отправка нескольких форм на сервер
Здравствуйте.
Все формы с указанным селектором нужно отправить на сервер. Допустим этих форм может быть 100500, и их нужно отправлять аяксом, что бы без перезагрузки.
Что у меня есть: полный перечень форм, как элементов DOM:
function Multiple_AddToCart() {
var allForms=document.getElementsByClassName('variations_form');
// здесь в цикле отправить все формы
location.reload(); // после отправки всех форм перезагрузить страницу
}
Мне нужно сделать всё это обычным JS.
ЛИБО, в уже имеющийся код встроить jQuery - но я не знаю как это делать, с jQuery ещё не работал. На сайте присутствует код jQuery - поэтому какая-то библиотека на борту уже имеется.
Как я пришёл к такой задаче: исходя из требования заказчика, там где должна была быть единичная отправка формы - нужно организовать отправку нескольких форм, и что бы это всё правильно работало.
Как это делать ?
P. S. Про требование заказчика лучше не спрашивайте, потому что это ещё не весь абсурд. Дальше возможно мне нужно будет реализовать поле страны доставки как атрибут товара.
Последний раз редактировалось berkut_0, 10.04.2019 в 18:38.
|
|

10.04.2019, 19:10
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от berkut_0
|
форм может быть 100500
|
А если не "секрет заказчика", что такое на странице, что требует так много форм?
|
|

10.04.2019, 19:27
|
Аспирант
|
|
Регистрация: 10.04.2019
Сообщений: 37
|
|
Сообщение от laimas
|
что требует так много форм?
|
Это я привёл в качестве примера. Количество вообще не должно иметь никакого значения. На деле же форм может от 1 до "сколько угодно". Но ещё раз - это должно не иметь значения, сколько бы форм не было - их все нужно отправить на сервер как submit, только по очереди без перезагрузки страницы. А страницу перезагрузить только после отправки всех форм.
|
|

10.04.2019, 19:32
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от berkut_0
|
Количество вообще не должно иметь никакого значения.
|
Ну как сказать. Хотя сразу скажу, что код оправление не будет сложным. Можно все таки узнать для чего это?
Вы же не можете в цикле одну за одной отправлять, необходимо отправлять последующую, когда будет принята предыдущая (получен ответ сервера). Но может можно обойтись одним запросом к серверу, что было бы более логичным и продуктивным. Так что все таки отправляется таким огромным числом форм?
|
|

10.04.2019, 19:49
|
Аспирант
|
|
Регистрация: 10.04.2019
Сообщений: 37
|
|
Сообщение от laimas
|
что все таки отправляется таким огромным числом форм?
|
От меня требуют реализовать такой функционал, при котором пользователь может отправить в корзину несколько вариаций товара без перезагрузки страницы. Не спрашивайте зачем, заказчик - хозяин-барин.
При этом, как я уже написал, изначально в карточке товара есть возможность добавлять в корзину только по одной вариации.
Логика адаптации интерфейса уже прописана и работает, и у меня теперь есть множество форм, которые нужно отправить на сервер (после чего и выполнить перезагрузку страницы).
Мне не обязательно делать асинхронные запросы; отправил по очереди, и перезагрузка. Так же происходит при одиночной отправке, но (обычно) контролируется браузером (и выполняется безусловная перезагрузка).
Последний раз редактировалось berkut_0, 10.04.2019 в 19:52.
|
|

10.04.2019, 20:07
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от berkut_0
|
пользователь может отправить в корзину несколько вариаций товара без перезагрузки страницы. Не спрашивайте зачем - заказчик хозяин-барин.
|
Я и не собираюсь что-то менять и выпытывать, интересно знать почему такой кавардак. Не может быть у товара десятки тысяч опций. И на странице иметь десятки тысяч товаров тоже не лучшее для пользователя, так ведь? Значит тут не само требование заказчика плохое, а само решение.
Если в цикле один за другим десятки тысяч запросов, то сервер вполне может их заблокировать, так как это будет сродни ddos атаке. И не понятно зачем вообще циклом.
Надо полагать, что пользователь выбирает товары в корзину, при этом он может выбрать N параметров товара. И товар (с его опциями), это и есть одна форма. Так?
Если да, то делают по уму, это выбрал, нажал "Добавить в корзину", а это один запрос.
Можно любой выбор передавать на сервер.
Ну и последний способ, это выбрал кучу товаров и их опций, затем кнопку Добавить, и идет отправка. Но зачем же циклом кучу форм? В цикле нужно только пройтись по полям, собрать те, в которых есть выбор и весь массив данных отправить на сервер сразу одним запросом. А по ответу сервера сделать перезагрузку.
А если не обязательно асинхронный запрос, значит должна быть одна форма, с кучей полей, тут только грамотное именование полей требуется и все. Отправили, вот вам и будет перезагрузка и никаких скриптов не нужно.
Есть только одно НО. В зависимости от языка на сервере, сервер не сможет принять даже несколько десятков тысяч форм, не говоря уже о сотне и более. Это ограничивается настройками сервера - максимальным числом переменных одновременно передаваемых серверу. Его можно конечно и увеличить в настройках, но делать это крайне нежелательно.
То есть подход к решению задачи выбран, мягко сказать, необдуманный.
Последний раз редактировалось laimas, 10.04.2019 в 20:09.
|
|

10.04.2019, 20:15
|
Аспирант
|
|
Регистрация: 10.04.2019
Сообщений: 37
|
|
laimas, хорошо, попробую по другому ...
1. Никто не говорит о десятках тысяч запросов. Теоретический максимум по моей теме - количество размеров обуви (тематика сайта). Может сотня, и то я не думаю что у одного вида обуви в карточке будут доступны сразу все размеры - делим на два. Максимум 50 запросов.
2. Один из исполнителей сказал, что искать здравый смысл не нужно. Нужно сделать как просят.
3. Конкретно до меня донесли месседж, что модификации нужно делать только на фронте, то есть - в браузере, уже исходя из этого понятно, что я не могу модифицировать формирование и приём данных форм. А значит - десятки форм в цикле.
Что-то ещё объяснить ?
Я изначально попытался донести информацию о том, что требования заказчика не обсуждают, поставили такую задачу - делайте что хотите, но в итоге должно быть только так. И подход к решению был выбран соответствующий.
Как всё таки мне отправить эти формы ?
|
|

10.04.2019, 20:26
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Дайте тогда почитать заказчику вот этот материал, может после этого от него не будет бредовых требований на количество форм от 1 до восьмерки на боку.  Именно исходя из этого и ограничивается сервером количество переменных от форм. В РНР, к примеру, это 1000, настроим на большее, значит повысим уязвимость.
Сообщение от berkut_0
|
Как всё таки мне отправить эти формы ?
|
Не отправлять формы по отдельности, а собрать все из форм и отправить одним запросом, это не запрещено?
Вы бы показали код хотя бы двух форм, чтобы хоть какое-то понимание было. Получается же - куча форм и одна кнопка submit, которая и инициализирует их отправку, или как?
Последний раз редактировалось laimas, 10.04.2019 в 20:31.
|
|

10.04.2019, 20:58
|
Аспирант
|
|
Регистрация: 10.04.2019
Сообщений: 37
|
|
Сообщение от laimas
|
Дайте тогда почитать заказчику
|
Заказчик не слушает ничего.
Сообщение от laimas
|
Не отправлять формы по отдельности, а собрать все из форм и отправить одним запросом, это не запрещено?
|
Нет, это не запрещено. Но для этого придётся выполнить структурные глубокие модификации при формировании изначальных данных формы, и написать новые методы приёма этих данных. Всего этого просто нет, как и нет времени на создание всего этого.
Можете посмотреть на пример одной из форм: ссылка на pastebin. Это родной код плагина WooCommerce.
В поле data-product_variations чёрт ногу сломит. Вы предлагаете разобрать всё это по полочкам ? Я например не хочу этим заниматься. А ещё, всё это нужно перекраить так как вы говорите - что бы
Сообщение от laimas
|
собрать все из форм и отправить одним запросом
|
И что бы сервер, приняв этот один запрос, правильно его обработал.
Мне было предложено разработать надстройку над тем, что есть. И я разделяю это предложение, ввиду тех данных формы, ссылку на пример которой я указал выше.
К слову о DDoS на коллизиях: это будет работать только на неуправляемых TCP-соединениях, о чём свидетельствуют приведённые последовательности байтов (hex) в статье по вашей ссылке. Таким грешил когда-то, и дело это не из простых, так что если кто-то воспользуется случаем - то это будет очень заинтересованный человек.
Сообщение от laimas
|
сразу скажу, что код оправление не будет сложным
|
И ради этого мы тут устроили всю эту демагогию ?
Последний раз редактировалось berkut_0, 10.04.2019 в 21:12.
|
|

10.04.2019, 21:35
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от berkut_0
|
В поле data-product_variations чёрт ногу сломит. Вы предлагаете разобрать всё это по полочкам ?
|
А зачем? Это атрибут формы, который содержит json, надо полагать совсем для иных целей.
0: {…}
attributes: Object { attribute_pa_size: "us-11" }
availability_html: ""
backorders_allowed: false
dimensions: Object { length: "", width: "", height: "" }
dimensions_html: "N/A"
display_price: 5
display_regular_price: 5
image: Object { title: "Трололо", url: false, srcset: false, … }
image_id: ""
is_downloadable: false
is_in_stock: true
is_purchasable: true
is_sold_individually: "no"
is_virtual: false
max_qty: ""
min_qty: 1
price_html: "<span class=\"price\"><span class=\"woocommerce-Price-amount amount\"><span class=\"woocommerce-Price-currencySymbol\">€</span>5.00</span></span>"
sku: "10"
и т.д. Это что нужно извлекать и что-то из него передавать что ли?
Сообщение от berkut_0
|
для этого придётся выполнить структурные глубокие модификации при формировании изначальных данных формы, и написать новые методы приёма этих данных. Всего этого просто нет, как и нет времени на создание всего этого.
|
Что такого сложно, это WordPress, то есть РНР, вместо имен name="add-to-cart", name="variation_id", name="attribute_pa_size", name="quantity", именовать как name="add-to-cart[]", name="variation_id[]", name="attribute_pa_size[]", name="quantity[]". Два поля передают ID продукта, можно оставить и одно, то есть не передавать на сервер product_id, ну или первый. Сервер и получит массивы id продуктов и их количество. А еще лучше именовать так: name="quantity[id продукта]", так все будет связано по Id товара. На сервере нужно просто принимать не один товар, а циклом переданные. Разве это так сложно написать?
Но странно вот что. Если это код одной формы, то каждая имеет кнопку добавления в корзину, а нужно отправить все формы со страницы? Если отправка по выбору пользователя, то есть нажали "добавить", то одна форма и будет отправлена, нажать сразу на все кнопки добавить пользователь никак не сможет, а сделать это программно, значит добавить товары в корзину не по воле пользователя. Что-то я не пойму механизма, не могу врубится - кто и как должен запустить механизм отправки, и главное чего?
Последний раз редактировалось laimas, 10.04.2019 в 21:49.
|
|
|
|