Перейти к содержимому


Фото
- - - - -

Как передать все товары из заказа (foreach) через Ajax (POST)?


  • Чтобы отвечать, сперва войдите на форум
17 ответов в теме

#1 esistema1

esistema1
  • Пользователь
  • 193 сообщений

Опубликовано 21.01.2019 - 11:08

Всем здравствуйте!

Помогите пожалуйста решить проблему..

 

Есть форма отправки заказа в СДЭК

 

<form method="" name="osForm" id="osForm">
{foreach $order->purchases as $p}
<div>
<input  name="numbercdek" value="{$order->id|escape}" class="ot12" id="numbercdek{$order->id}">
<input  name="fiocdek" value="{$order->name|escape}" class="ot12" id="fiocdek{$order->id}">
<input  name="phonecdek" value="{$order->phone|escape}" class="ot12" id="phonecdek{$order->id}">
<input  name="pvzcdek" value="{$order->cdek_pvz}" class="ot12" id="pvzcdek{$order->id}">
<input  name="skucdek" value="{$p->sku}" class="ot12" id="skucdek{$order->id}">
<input  name="pricecdek" value="{$p->price|string_format:"%.0f"}" class="ot12" id="pricecdek{$order->id}">
<input  name="pnamcdek" value="{$p->product_name}, {$p->variant_name}" class="ot12" id="pnamcdek{$order->id}">
<input  name="citycdek" value="{$order->cdek_city}" class="ot12" id="citycdek{$order->id}">
<input  name="citycodecdek" value="{$order->cdek_city_code}" class="ot12" id="citycodecdek{$order->id}">
</div>
{/foreach}


<div>
<button name="button" type="button" onclick="sendcdek({$order->id})" data-order_id="{$order->id}" class="button_track">Создать заказ</button>
</div>
</form>

 

И скрипт который ее отправляет

 

{literal}
<script>
function sendcdek(order_id){
	var numbercdek = $('#numbercdek'+order_id).val();
	var fiocdek = $('#fiocdek'+order_id).val();
	var phonecdek = $('#phonecdek'+order_id).val();
	var pvzcdek = $('#pvzcdek'+order_id).val();
	var skucdek = $('#skucdek'+order_id).val();
	var pricecdek = $('#pricecdek'+order_id).val();
	var pnamcdek = $('#pnamcdek'+order_id).val();
	var citycdek = $('#citycdek'+order_id).val();
	var citycodecdek = $('#citycodecdek'+order_id).val();	

    $.ajax({
        type: "POST",
        url: "/test/cdek.php",
        data: {number:numbercdek, fiocdek:fiocdek, phonecdek:phonecdek, pvzcdek:pvzcdek, skucdek:skucdek, pricecdek:pricecdek, pnamcdek:pnamcdek, citycdek:citycdek, citycodecdek:citycodecdek}
    }).done(function( result )
        {
        $("#status_pochta2"+order_id).val( result );
           // $("#status_pochta"+order_id).html( result );
        });    
}
</script>
{/literal}

 

Проблема в следующем: когда в заказе один товар, заказ формируется нормально.

А вот когда более одного то post передает данные только по одному последнему товару.

 

Как передать в post запрос все товары?

 



#2 phukortsin

phukortsin
  • Фрилансер
  • 729 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 21.01.2019 - 11:23

Сейчас для нескольких товаров в форме одинаково называются поля, в результате значения затираются.

Начать с того, что форму создавать правильно, например,   name="numbercdek[]"...



#3 esistema1

esistema1
  • Пользователь
  • 193 сообщений

Опубликовано 21.01.2019 - 11:31

Названия полей сделал уникальными

<input  name="skucdek[]" value="{$p->sku}" class="ot12" id="skucdek{$order->id}">

 

А что необходимо подправить в скрипте чтобы все заработало (сейчас также передается только 1 товар)?



#4 esistema1

esistema1
  • Пользователь
  • 193 сообщений

Опубликовано 21.01.2019 - 12:44

Ни одна вариация не срабатывает...

var numbercdek = [$('#numbercdek'+order_id).val()];

var numbercdek[] = $('#numbercdek'+order_id).val();

 

Подскажите, пожалуйста, что подправить чтобы отправились все товары.



Пробовал еще так

var numbercdek = document.getElementsByName('numbercdek');

 

но тоже результата нет.



#5 Sheeft

Sheeft
  • Администратор
  • 1 652 сообщений
  • Пользователь
  • Откуда:Москва

Опубликовано 21.01.2019 - 13:25

потому что надо не в скрипте массив вводить а в форме (первый кусок приведенного вами кода, который html, а не js)



#6 esistema1

esistema1
  • Пользователь
  • 193 сообщений

Опубликовано 21.01.2019 - 14:14

Содержимое формы сейчас выглядит вот так

{foreach $order->purchases as $p}
<div>
<input  name="numbercdek[]" value="{$order->id|escape}" class="ot12" id="numbercdek{$order->id}">
<input style=" display: none;" name="fiocdek[]" value="{$order->name|escape}" class="ot12" id="fiocdek{$order->id}">
<input style=" display: none;" name="phonecdek[]" value="{$order->phone|escape}" class="ot12" id="phonecdek{$order->id}">
<input style=" display: none;" name="pvzcdek[]" value="{$order->cdek_pvz}" class="ot12" id="pvzcdek{$order->id}">
<input style=" display: none;" name="skucdek[]" value="{$p->sku}" class="ot12" id="skucdek{$order->id}">
<input style=" display: none;" name="pricecdek[]" value="{$p->price|string_format:"%.0f"}" class="ot12" id="pricecdek{$order->id}">
<input style=" display: none;" name="pnamcdek[]" value="{$p->product_name}, {$p->variant_name}" class="ot12" id="pnamcdek{$order->id}">
<input style=" display: none;" name="citycdek[]" value="{$order->cdek_city}" class="ot12" id="citycdek{$order->id}">
<input style=" display: none;"  name="citycodecdek[]" value="{$order->cdek_city_code}" class="ot12" id="citycodecdek{$order->id}">
</div>
{/foreach}

 

Подскажите что в ней надо подправить, как ввести массив? По идее эта форма выводит все что надо (все товары), но отправляется только один.



#7 phukortsin

phukortsin
  • Фрилансер
  • 729 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 21.01.2019 - 14:27

Отправлять примерно так:

 

data: $('#osForm').serialize()



#8 esistema1

esistema1
  • Пользователь
  • 193 сообщений

Опубликовано 21.01.2019 - 14:43

Отправлять примерно так:

 

data: $('#osForm').serialize()

 

Я так уже пробовал, отправляет только один товар...



#9 esistema1

esistema1
  • Пользователь
  • 193 сообщений

Опубликовано 21.01.2019 - 14:57

Отправлять примерно так:

 

data: $('#osForm').serialize()

 

Этот код сработал, спасибо. Отправились все товары. Только он сработал для последнего заказа на странице заказов.

Пробую вот так

 

<form method="" name="osForm{$order->id}" id="osForm{$order->id}">

и в скрипте

data: $('#osForm'+order_id).serialize()


 

Пока не получается...



#10 esistema1

esistema1
  • Пользователь
  • 193 сообщений

Опубликовано 21.01.2019 - 15:05

В админке висит два заказа, код вывода формы выше...

У второго заказа в html коде выводится 

<form method="" name="osForm{$order->id}" id="osForm{$order->id}">

 

а у первого нет. Подскажите почему?

 

 

Чертовщина какая то.. form на div меняю - появляется, ставлю form в одном заказе есть во втором нет...


Изменено: esistema1, 21.01.2019 - 15:15


#11 esistema1

esistema1
  • Пользователь
  • 193 сообщений

Опубликовано 21.01.2019 - 15:49

Проблема была во вложенной форме. Всем огромное спасибо за помощь!!!



#12 esistema1

esistema1
  • Пользователь
  • 193 сообщений

Опубликовано 21.01.2019 - 16:11

Появилась следующая проблема.

Теперь массив передается в файл обработчик, там формируется xml примерно следующего содержания

 

<Item WareKey="'.$skucdek.'" Cost="1" Payment="'.$pricecdek.'" Weight="300" Amount="1" Comment="'.$pnamcdek.'">
</Item>

 

Переменная принимается следующей строкой

 

$pnamcdek = $_POST['pnamcdek'];

 

 

Когда в файл отправлялся один товар, значения переменных заполнялись правильно. Теперь вместо значений надпись "Array".

 

Как подставить данные из массива и сгенерировать правильный xml запрос?



#13 phukortsin

phukortsin
  • Фрилансер
  • 729 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 21.01.2019 - 16:25

https://www.internet...p-massivam.html



#14 esistema1

esistema1
  • Пользователь
  • 193 сообщений

Опубликовано 21.01.2019 - 18:20

С инструкцией ознакомился...

Я видимо явно что то делаю не так...

 

Написал в файле

 

foreach($skucdek as $skucdek) {
foreach($pricecdek as $pricecdek) {
foreach($pnamcdek as $pnamcdek) {

$xxx = '<Item WareKey="'.$skucdek.'" Cost="1" Payment="'.$pricecdek.'" Weight="300" Amount="1" Comment="'.$pnamcdek.'">
</Item>';
echo $xxx;
}}}

 

В итоге он выводит

 

<Item WareKey="8148" Cost="1" Payment="990" Weight="300" Amount="1" Comment="Платье, 46"></Item>
<Item WareKey="8148" Cost="1" Payment="990" Weight="300" Amount="1" Comment="Блуза, 46"></Item>

 

Подставляется только последняя переменная pnamcdek. Остальные 2 не меняются. Как сделать чтобы заработало?



#15 esistema1

esistema1
  • Пользователь
  • 193 сообщений

Опубликовано 21.01.2019 - 20:24

Немного разобрался с массивами... Единственное место где должно быть несколько товаров это Тег item

Сделал его вывод таким

foreach($skucdek as $skucde) {
$Item = $order->addChild('Item', ' ');
$Item->addAttribute('Cost', '1');
$Item->addAttribute('Weight', '300');
$Item->addAttribute('Amount', '1');
foreach($skucdek as $skucde) {
$Item->addAttribute('WareKey', $skucde);
}
foreach($pricecdek as $pricecde) {
$Item->addAttribute('Payment', $pricecde);
}
foreach($pnamcdek as $pnamcde) {
$Item->addAttribute('Comment', $pnamcde);
}
;}

 

Если в заказе 2 товара, он создает 2 тега как положено но содержимое тегов одинаковое.

 

<Item Cost="1" Weight="300" Amount="1" WareKey="8148" Payment="990" Comment="Платье, 46"> </Item>
<Item Cost="1" Weight="300" Amount="1" WareKey="8148" Payment="990" Comment="Платье, 46"> </Item>

 

 

Помогите пожалуйста разобраться с этим.



#16 Sheeft

Sheeft
  • Администратор
  • 1 652 сообщений
  • Пользователь
  • Откуда:Москва

Опубликовано 21.01.2019 - 23:31

С инструкцией ознакомился...

Я видимо явно что то делаю не так...

 

Написал в файле

 

foreach($skucdek as $skucdek) {
foreach($pricecdek as $pricecdek) {
foreach($pnamcdek as $pnamcdek) {

$xxx = '<Item WareKey="'.$skucdek.'" Cost="1" Payment="'.$pricecdek.'" Weight="300" Amount="1" Comment="'.$pnamcdek.'">
</Item>';
echo $xxx;
}}}

Хочется поругаться, но помню как сам начинал...

Давайте сначала посмотрим на конструкцию

foreach($skucdek as $skucdek)

вы говорите "Рассмотрим все элементы массива А в виде элемента А" не находите тут противоречий? Нельзя брать переменной название массива, из этого выйдет нереальная каша.

Пойдем дальше

$xxx = '<Item WareKey="'.$skucdek.'"

а тут вы обращаетесь к массиву или уже к переменной? Вот именно что этого уже никто не знает, потому что логика нарушена безумно.



#17 phukortsin

phukortsin
  • Фрилансер
  • 729 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 22.01.2019 - 09:03

Помогите пожалуйста разобраться с этим.

 

Чтобы Вам помочь, надо либо написать полностью готовый код с полной отладкой, либо научить Вас с нуля хотя бы основам программирования.
И то и другое требует серьезных усилий. К таким запросам надо бы с Вашей стороны понимание масштабов задачи и готовность оплачивать немалые труды.

А пока что имеем такую картину: Вы взялись  за задачу довольно непростую даже для специалистов, и пытаетесь ее решать методом случайного тыка и слепого копирования...



#18 esistema1

esistema1
  • Пользователь
  • 193 сообщений

Опубликовано 22.01.2019 - 09:22

Чтобы Вам помочь, надо либо написать полностью готовый код с полной отладкой, либо научить Вас с нуля хотя бы основам программирования.
И то и другое требует серьезных усилий. К таким запросам надо бы с Вашей стороны понимание масштабов задачи и готовность оплачивать немалые труды.

А пока что имеем такую картину: Вы взялись  за задачу довольно непростую даже для специалистов, и пытаетесь ее решать методом случайного тыка и слепого копирования...

 

 

Понял,  в любом случае спасибо за помощь и подсказки. Практически все получилось сделать, еще немного поизучаю и добью этот обмен со СДЭК...






0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых