Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Стоимость сборки (https://javascript.ru/forum/misc/74180-stoimost-sborki.html)

_marisha 20.06.2018 07:36

Стоимость сборки
 
Доброго времени суток!

Необходимо:

Добавить возможность для покупателя рассчитать и оплатить стоимость сборки приобретаемой мебели.
Т.е. при оформлении заказа покупатель перед выбором доставки имеет возможность поставить галочку в пункте "Сборка мебели".
Стоимость сборки рассчитывается на основании суммарной стоимости выбранных покупателем позиций - это 5% от суммы заказа (без учета доставки) с округлением вверх до 10 руб (минимальная цена сборки 300руб)

В корзине выведен чекбокс (файл "test.php")
<div data-property-id-row="22" class="clearfix">
	<label>
				<div class="bx_logotype">
			<span style="background-image:url(/images/logo-default-d.gif);"></span>
		</div>
	</label>
	<div class="bx_block r1x3 pt8">
		<input type="checkbox" id="sbor" onchange="fun1()">
		<div class="bx_description">
			<?=GetMessage("COST_OF_ASSEMBLY_SUMM")?><span style="font-weight: bold;"> 300</span>
		</div>
	</div>
</div>

Происходит проверка чекбокса (выбран/не выбран)
<script type="text/javascript">
function fun1() {
var chbox;
chbox=document.getElementById('sbor');
    if (chbox.checked) {
        //alert('Выбран');
       var message;
       message = '1';
       alert(message);
    }
    else {
        //alert ('Не выбран');
        var message;
       message = '0';
       alert(message);
    }
}
</script>

Подскажите, пожалуйста, каким образом возможно записать значение (выбран/ не выбран, т.е. 1/0) в переменную php и далее данную переменную предавать в другой файл (summary.php)? Спасибо.

laimas 20.06.2018 08:17

Цитата:

Сообщение от _marisha
каким образом возможно записать значение (выбран/ не выбран, т.е. 1/0) в переменную php и далее данную переменную предавать в другой файл (summary.php)?

Отправляйте на сервер выбор пользователя, храните его (сессия/база). Непосредственно на клиенте, это либо куки, либо сессионное хранилище (не отправляя на сервер и сервер может не знать об этом).

_marisha 20.06.2018 08:49

laimas, спасибо что откликнулись.
Возможно ли показать как на данном примере будет выглядеть?
Или примеры на что отталкиваться? Спасибо.

laimas 20.06.2018 09:51

_marisha,
можно и примеры, скажите только как именно нужно? Ведь если речь идет о переменной хранящейся на сервере, то только передача ее на сервер, клиент тут не помощник. Собственно передать значение некоего поля формы с одной страницы в форму на другой странице можно и через саму форму.

_marisha 20.06.2018 10:18

laimas, как именно нужно, затрудняюсь ответить.

Пробую делать так (найден пример):
function fun1() {
var chbox;
chbox=document.getElementById('sbor');
    if (chbox.checked) {
       var sbor = '1';
      $(document).ready(function(){
          $.ajax({
          url: "summary.php",
          type : "POST",
          data : {sbor:sbor},
      }); 
    }
    else {
        //alert ('Не выбран');
        var message;
       message = '0';
       alert(message);
    }
}

В summary.php echo $_POST['sbor']; пусто
Возможно данный вариант не подходит для решения в данном случае...

laimas 20.06.2018 10:28

Ошибка в коде - строку 6 удалите (не закрыто тело условия, да и $(document).ready(function() тут совсем ни к чему).

_marisha 20.06.2018 10:42

laimas,
function fun1() {
var chbox;
chbox=document.getElementById('sbor');
    if (chbox.checked) {
       var sbor = '1';
          $.ajax({
          url: "summary.php",
          type : "POST",
          data : {sbor:sbor},
         });
    }
    else {
        var message;
       message = '0';
       alert(message);
    }
}

В summary.php echo $_POST['sbor']; пусто

_marisha 20.06.2018 11:10

Если сделать так:
function fun1() {
var chbox;
chbox=document.getElementById('sbor');
    if (chbox.checked) {
       var sbor = '1';
          $.ajax({
          url: "summary.php",
          type : "POST",
          data : {sbor:sbor},
          success: function (data) {
          alert (data);
          },
          error: function(){
          alert ("No PHP script: ");
          } 
         });
    }
    else {
        var message;
       message = '0';
       alert(message);
    }
}

То при отмеченном чекбоксе возвращает "No PHP script: "

laimas 20.06.2018 11:26

Запрос будет, а ошибку (ответ сервера: статус) нужно анализировать.

_marisha 20.06.2018 11:32

laimas,
$.ajax({
          url: "/sale.order.ajax/.default/summary.php",
          data : {sbor:sbor},
          type : "POST",
          success: function (data) {
          alert ("data");
          },
          error: function(){
          alert ("No PHP script: ");
          } 
         });

Извините, не верно был указан путь к файлу.
Сейчас срабатывает первое условие alert ("data");
Но если сделать alert (data);, то data пустое значение, т.е. в alert пусто...

laimas 20.06.2018 11:35

Цитата:

Сообщение от _marisha
Но если сделать alert (data);, то data пустое значение, т.е. в alert пусто...

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

Nexus 20.06.2018 11:37

Цитата:

Сообщение от laimas
Проверяйте что у вас на сервере. Пусто, значит сервер ничего не возвращает, либо логика кода на сервере хромает.

Советую воспользоваться devTools, вкладка "Network", фильтр "xhr".

laimas 20.06.2018 11:41

Цитата:

Сообщение от Nexus
Советую воспользоваться devTools

В devTools "пустота" выглядит краше. :)

_marisha 20.06.2018 11:56

Вложений: 1
Nexus,
При отмеченном чекбоксе строка summary.php (скрин "XHR")

Nexus 20.06.2018 12:01

_marisha, нажмите на "summary.php", появится подробная информация о запросе.
Вам нужна будет вкладка "Response" или "Preview", если сервер json возвращает.

_marisha 20.06.2018 12:12

Вложений: 2
Nexus,
На вкладке "Response" пусто, "Preview" тоже пусто

Nexus 20.06.2018 12:16

_marisha, значит сервер ничего не возвращает.
В этом случае серверу положено возвращать 204 код, не 200.

laimas 20.06.2018 12:36

_marisha,
вопрос гласит "получить на сервере, чтобы передать на другую страницу".

Ajax, это асинхронный запрос, то есть есть основания задержаться на данной странице, но определив выбор, и только потом перейти на другую страницу?

_marisha 20.06.2018 12:59

Вложений: 1
laimas, возможно вопрос мной сформирован не верно.
Оформление заказа происходит в компоненте "sale.order.ajax".

В данном компоненте есть файлы:
"delivery.php" - отвечает за выбор доставки,
"paysystem.php" - отвечает за выбор платежной системы, "summary.php" - где производится расчет суммы заказа (вместе с доставкой, со скидками и тп).
Все эти файлы подключаются в "template.php".

В "template.php" произведено подключение "test.php", в котором выведен чекбокс и происходит проверка на заполненность чекбокса.

Далее, если чекбокс выделен, то необходимо информацию о чекбоксе передать в "summary.php" (т.е. проверить, если чекбокс выделен, то отобразить при оформлении заказа надпись "Сборка" и рядом вывести сумму сборки (скрин "Сборка"))

laimas 20.06.2018 13:09

_marisha,
это объясняет диспозицию, но не то как должно работать. Можно отдать клиенту форму, где он что-то рассчитывает, затем отправляет ее на delivery.php, выбирает доставку, отправляет на paysystem.php, выбирает оплату и т.д. То есть никаких Ajax и каждый раз запрос новой страницы, а все выбранное пользователем на каждой странице хранится на сервере (последовательное заполнение формы). А можно выбранное в каждой предыдущей форме добавлять с следующую скрытыми полями и оно будет доступно на финишной странице.

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

_marisha 20.06.2018 13:55

laimas, все решить асинхронными запросами с одной страницы.
Подскажите, пожалуйста, каким образом возможно реализовать?

Поидее, страница то одна (по крайней мере при выборе "службы доставки", "платежной системы"), т.е. адресная строка остается неизменной http://test.ru/order
Просто сам компонент собирает информацию из кучи других файлов.

laimas 20.06.2018 14:32

Цитата:

Сообщение от _marisha
каким образом возможно реализовать?

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

Можно только гадать. Допустим, что все эти файлы (сервера) содержат элементы формы, которые определяют наборы для выбора оплаты/доставки и пр. В этом случае по адресу http://test.ru/order можно передавать один и тот же параметр запроса, но с различными значениями, которые определяют какой из файлов серверу нужно подключить, чтобы вернуть на запрос клиента эти поля. Клиент получив этот html код добавляет его в форму. А может это json, на основе которого уже клиент добавит в форму поля.

Невозможно конкретно ответить на ваш вопрос основываясь на предположениях, а приводить примеры кода на все случаи утомительно. )

_marisha 21.06.2018 13:33

Доставка же как-то обрабатывается :) :
$clickHandler = "onClick = \"BX('ID_DELIVERY_ID_".$arDelivery["ID"]."').checked=true;submitForm();\"";
				?>
					<div class="bx_block w100 vertical">

						<div class="bx_element">

							<input type="radio"
								id="ID_DELIVERY_ID_<?= $arDelivery["ID"] ?>"
								name="<?=htmlspecialcharsbx($arDelivery["FIELD_NAME"])?>"
								value="<?= $arDelivery["ID"] ?>"<?if ($arDelivery["CHECKED"]=="Y") echo " checked";?>
								onclick="submitForm();"
								/>

							<label for="ID_DELIVERY_ID_<?=$arDelivery["ID"]?>" <?=$clickHandler?>>

laimas, В любом случае спасибо за помощь :)

laimas 21.06.2018 14:25

Этот кусок кода ни о чем никому не скажет. Что значит обрабатывается, если вопрос был как передать и передать далее, ... Можно только заметить, что лишнего в коде предостаточно, и почему то не флажок, а радио кнопка, если только это не одна из.

Не известно, что за сервеные файлы и их назначение, и прочие вопросы, что я выше указывал. А значит и помочь вам никто не сможет.


Часовой пояс GMT +3, время: 11:58.