Простой калькулятор заказа

Вот задача самая простая, как казалось бы на первый взгляд, но у многих вызывает ступор, народ начинает искать кучу плагинов, модулей и прочих «готовых» решений, усложняя тем самым себе работу, и усложняя работу мне, когда заказчик простит «просто поправить цифру» — а в итоге приходится все переделывать с нуля.
На написание этого калькулятора ушло 20-30 минут времени, на написание статьи уйдет времени больше =))

Начнем с разметки:

<div id="calculator">
	<div class="row">
		<div class="col-md-6 left">
			<div class="form-group row">
				<div class="col-sm-7 col-6">
					<label for="exampleInputEmail1">Площадь потолка:</label>
				</div>
				<div class="col-sm-5 col-6">
					<div class="input-group">
						<input type="text" class="form-control" placeholder="Площадь" id="total_area">
						<div class="input-group-append">
							<span class="input-group-text">м2</span>
						</div>
					</div>
				</div>
			</div>
			<div class="form-group row">
				<div class="col-sm-7 col-6">
					<label for="exampleInputEmail1">Фактура:</label>
				</div>
				<div class="col-sm-5 col-6">
					<select class="form-control" id="factura">
						<option value="300">Любая</option>
						<option value="350">Глянцевые</option>
						<option value="400">Матовые</option>
						<option value="450">Сатиновые</option>
						<option value="500">Цветные</option>
					</select>
				</div>
			</div>
			<div class="form-group row">
				<div class="col-sm-7 col-6">
					<label for="exampleInputEmail1">Общее количество углов:</label>
				</div>
				<div class="col-sm-5 col-6">
					<div class="input-group">
						<input type="text" class="form-control" id="ugol" placeholder="Введите кол-во" data-price="100">
						<div class="input-group-append">
							<span class="input-group-text">шт.</span>
						</div>
					</div>
				</div>
			</div>
			<div class="form-group row">
				<div class="col-sm-7 col-6">
					<label for="exampleInputEmail1">Установка люстры:</label>
				</div>
				<div class="col-sm-5 col-6">
					<div class="input-group">
						<input type="text" class="form-control" id="lustra" placeholder="Введите кол-во" data-price="200">
						<div class="input-group-append">
							<span class="input-group-text">шт.</span>
						</div>
					</div>
				</div>
			</div>
			<div class="form-group row">
				<div class="col-sm-7 col-6">
					<label for="exampleInputEmail1">Точечные светильники:</label>
				</div>
				<div class="col-sm-5 col-6">
					<div class="input-group">
						<input type="text" class="form-control" id="tochka" placeholder="Введите кол-во" data-price="300">
						<div class="input-group-append">
							<span class="input-group-text">шт.</span>
						</div>
					</div>
				</div>
			</div>
			<div class="form-group row">
				<div class="col-sm-7 col-6">
					<label for="exampleInputEmail1">Обход трубы, уходящей в потолок:</label>
				</div>
				<div class="col-sm-5 col-6">
					<div class="input-group">
						<input type="text" class="form-control" id="tryba" placeholder="Введите кол-во" data-price="400">
						<div class="input-group-append">
							<span class="input-group-text">шт.</span>
						</div>
					</div>
				</div>
			</div>
		</div>
		<div class="col-md-6 right">
			<div class="h4">Примерная стоимость:</div>
			<div class="total-price">
				<span id="totalprice">0</span> руб.
			</div>
			<div class="mb-4" style="font-size: 17px;">(*точная стоимость потолка устанавливается замерщиком)</div>
			<div class="row">
				<div class="col-sm-6">
					<div class="form-group">
						<input type="text" name="your-name" value="" size="40" class="form-control" aria-required="true" aria-invalid="false" placeholder="Ваше имя">
					</div>
				</div>
				<div class="col-sm-6">
					<div class="form-group">
						<input type="tel" name="tel-412" value="" size="40" class="form-control" aria-required="true" aria-invalid="false" placeholder="Ваш телефон">
					</div>
				</div>
				<div class="col-sm-12">
					<textarea name="your-message" class="form-control" rows="4" id="zakaz_total" aria-required="true" aria-invalid="false"></textarea>
				</div>
			</div>
		</div>
	</div>
</div>

Теперь по порядку, в данном примере использованы <input type=»text» data-price=»»> — с дата-атрибутом data-price и <select> с опциями <option value=»»></option>.

В поле textarea помещаю все переменные, для отправки их в заказ. В данном случае я не вижу смысле отправлять кучу полей, когда можно отправить только одно textarea.

<span id=»totalprice»>0</span> — span для вывода результата расчета.

Зачем используется data-атрибут? Все просто, в формуле — введенное значение в input будет множится на data-атрибут.

Далее скрипты:

jQuery( function ( $ ) {
  $('#calculator .form-control').on('input', function(){
		
		var total_area = new Number($('#total_area').val());
		var factura = new Number($('#factura option:selected').val());
		var factura_name = new Number($('#factura option:selected').val());
		var ugol = new Number($('#ugol').val());
		var lustra = new Number($('#lustra').val());
		var tochka = new Number($('#tochka').val());
		var tryba = new Number($('#tryba').val());

		var ugol_p = new Number($('#ugol').attr('data-price'));
		var lustra_p = new Number($('#lustra').attr('data-price'));
		var tochka_p = new Number($('#tochka').attr('data-price'));
		var tryba_p = new Number($('#tryba').attr('data-price'));

		var total = (factura * total_area) + (ugol * ugol_p) + (lustra * lustra_p) + (tochka * tochka_p) + (tryba * tryba_p);
		var str = total;

		$('#totalprice').text(parseInt(str).toLocaleString('ru-RU'));
		
		$('#zakaz_total').val( 
			'Площадь потолка: ' + total_area + '\n' + 
			'Фактура: ' + factura + '\n' + 
			'Общее количество углов: ' + ugol + '\n' + 
			'Установка люстры: ' + lustra + '\n' + 
			'Точечные светильники: ' + tochka + '\n' +
			'Обход трубы, уходящей в потолок: ' + tryba + '\n' +
			'Рассчет: ' + total + '\n'
		);
		
		
	});
	
});

Так как калькулятор именно простой, то и код такой же.

$(‘#calculator .form-control’).on(‘input‘, function(){ — запускает функцию работы калькулятора действие натравливается на «input» — то есть когда происходит изменение в любом input-е — калькулятор высчитывает новую цену. Можно натравить на другие действия: click change и т.д.

Далее нужно задать переменные:

var «Имя переменной» = new Number($(‘ID input-а’).val()); — здесь будет использоваться значение, введенное в поле.

var «Имя переменной»= new Number($(‘ID input-а’).attr(‘data-price’)); — здесь будет использоваться значение из data-атрибута.

Для select-ов: var «Имя переменной» = new Number($(‘ID-селекта option:selected‘).val()); — option:selected — при выборе опции селекта из списка — берем его значение value.

После необходимо перемножить ранее введенные значения:

var «Имя переменной для результата» = (Имя переменной * Имя переменной) + (Имя переменной * Имя переменной);

показываем результат в блоке:

$(‘ID блока где показывать‘).text(‘Имя переменной для результата‘);

Наш калькулятор заработал, но я хочу что бы цифры результата показывались с форматирование, для этого «Имя переменной для результата» обернем в parseInt(Имя).toLocaleString(‘ru-RU’), получиться должно вот так:

$(»ID блока где показывать»).text(parseInt(‘Имя переменной для результата‘).toLocaleString(‘ru-RU’)); — теперь наши цифры отображаются красиво.

Теперь мне нужно поместить введенные результаты в одно поле textarea:

$(‘ID textarea-и‘).val(
‘Площадь потолка: ‘ + total_area + ‘\n’ +
‘Фактура: ‘ + factura + ‘\n’ +
‘Общее количество углов: ‘ + ugol + ‘\n’ +
‘Установка люстры: ‘ + lustra + ‘\n’ +
‘Точечные светильники: ‘ + tochka + ‘\n’ +
‘Обход трубы, уходящей в потолок: ‘ + tryba + ‘\n’ +
‘Расчет: ‘ + total + ‘\n’
);

готовый пример можно посмотреть на codepen.

See the Pen Contact Form — Pen a Day 20 0

Теперь о том, как не мучиться со скриптом отправки сообщений, а быстро связать этот код с Contact Form 7 — плагин для WordPress.

В вышеуказанном плагине создаем одно поле [textarea* your-message id:zakaz_total] с кнопкой отправки и выводим шорткод вместо нашего textarea — как выше и писал — в него будет помещена вся информация о нашем заказе и отправлена с помощью плагина.

Оставить коммментарий

Ваш e-mail не будет опубликован *