avatar
На сайте уже 595 пользователей

Переделанный модуль Обратной связи под Аренду Квартир

gegelga(8 месяцев назад)

Итак, я решил с вами поделиться своими последними обновлениями. Я разработал их для веб-сайта "Аренда квартир и домов для отпуска". В чем суть идеи? После установки этой функциональности на вашем сайте, вы сможете производить расчет стоимости аренды перед отправкой заказа. Эта сумма будет отображаться после заполнения формы заказа. Пример работы такой функции можно увидеть на следующем веб-сайте: https://fwo-edersee.de/#kontakt.

Для установки, откройте официальное приложение "MAIL" от Ивана и выполните следующие шаги:

Откройте официальное приложение "MAIL" от Ивана.

В меню приложения найдите и откройте "Файловый Менеджер".

В Файловом Менеджере найдите файл integration_page.php модуля MAIL и выберите его для редактирования.

Замените существующий код на следующий код

<?php

if (!class_exists('System')) exit; // Запрет прямого доступа

$mailToAdminStorage = new EngineStorage('module.mail.to.admin');

$emails = $mailToAdminStorage->get('emails');

$fromallform = $mailToAdminStorage->get('fromallform');

if ($MODULE_URI == '/') {

$return = '

<form name="form_mail_module" action="/' . $URI[1] . '/add" method="post" onsubmit="if(document.getElementById(\'roscomnadzor\').checked){updateDatenschutzValue(); this.submit();}else{alert(\'Вы должны согласиться на обработку персональных данных\'); return false;}">

<strong>Ваши введенные данные:</strong><br>

<p>Ваше имя<br><input type="text" name="name" value="" size="26" required></p>

<p>Номер телефона<br><input type="text" name="Telefonnummer" value="" size="26" required></p>

<p>Ваш E-mail (для ответа)<br><input type="text" name="email" value="" size="26" required></p>

<p>Содержание E-mail<br><TEXTAREA NAME="text" ROWS="5" COLS="50" required></TEXTAREA></p>';

if ($fromallform != 1) {

$return .= '<p style="line-height:1;"><img border="1" id="captcha" src="/modules/captcha/captcha.php?rand=' . rand(0, 99999) . '" alt="captcha" onclick="document.getElementById(\'captcha\').src = \'/modules/captcha/captcha.php?\' + Math.random()" style="cursor:pointer;">

<br><span style="font-size:12px; opacity: 0.7;">Нажмите на изображение, чтобы обновить символы.</span></p>

<p>Введите символы с изображения<br><input type="text" name="Captcha" value="" size="10" autocomplete="off" required></p>';

}

$return .= '<p><input type="checkbox" name="Datenschutz" value="ok" id="roscomnadzor"> <label for="roscomnadzor">Я согласен с обработкой <a href="/datenschutz" target="_blank">моих персональных данных.</a></label></p>

<p><input type="checkbox" name="AGB" value="ok" id="agb"> <label for="agb">Я согласен с Общими условиями.</a></label></p>

<p><input type="submit" name="" value="Отправить"></p>

</form>';

} elseif ($MODULE_URI == '/add') {

$Page->clear(); // Очистили страницу

if (md5(strtolower($_POST['Captcha']) . $Config->ticketSalt) != $_COOKIE['captcha'] && $fromallform == false) {

$return .= '<p>Символы с изображения введены неверно</p><p class="p_link_back"><a href="/' . ($Page->isIndexPage() ? '' : $URI[1]) . '">вернуться на главную страницу</a></p>';

} else {

$sit = htmlspecialchars($_SERVER['HTTP_HOST']);

$txt = "На сайте $sit было отправлено письмо\n\n\n\n";

$valid = false;

$guests = isset($_POST['guests']) ? intval($_POST['guests']) : 0;

// Здесь мы вставляем все данные из формы в письмо

foreach ($_POST as $key => $value) {

if ($value != '') {

$txt .= ucfirst(htmlspecialchars($key)) . ": " . htmlspecialchars($value) . "\n\n\n";

$valid = true;

}

}

// Здесь мы получаем общие затраты из формы

$gesamtkosten = $_POST['gesamtkosten'];

if ($valid && $emails !== false) {

// Вставляем детализированную информацию о затратах в письмо

$txt .= "Обзор затрат:\n";

// Здесь следует добавить информацию о затратах из JavaScript-кода

// Базовая стоимость

$txt .= "Базовая стоимость (60€ в ночь)\n";

// Дополнительная плата за короткий срок, если применимо

if ($nights < 7) {

$txt .= "Дополнительная плата за короткий срок (35€ в ночь)\n";

}

// Дополнительные гости, если их больше 2

if ($guests > 2) {

$txt .= "Дополнительные гости (12€ в ночь на каждого гостя)\n";

}

// Туристический налог

$txt .= "Туристический налог (1€ на каждого человека в ночь)\n";

// Общие затраты

$txt .= "Общие затраты ($nights ночей): $gesamtkosten €\n\n";

// Здесь мы отправляем письмо администратору

addmail($emails, "Письмо с сайта $sit", $txt, $Config->adminEmail);

// Здесь мы отправляем подтверждение отправителю

$absenderEmail = $_POST['email']; // Email отправителя из формы

$empfaengerEmail = $absenderEmail; // Email получателя такой же как и у отправителя

// Здесь мы вставляем все данные из формы в подтверждение

$bestaetigungstext = "Здравствуйте, " . $_POST['name'] . "\n\nСпасибо за ваш запрос в FUNTI Vacation Rental. Мы свяжемся с вами как можно скорее после проверки наличия.\n\n";

foreach ($_POST as $key => $value) {

if ($value != '') {

$bestaetigungstext .= ucfirst(htmlspecialchars($key)) . ": " . htmlspecialchars($value) . "\n";

}

}

// Базовая стоимость

$bestaetigungstext .= "Базовая стоимость (60€ в ночь)\n";

// Дополнительная плата за короткий срок, если применимо

if ($nights < 7) {

$bestaetigungstext .= "Дополнительная плата за короткий срок (35€ в ночь)\n";

}

// Дополнительные гости, если их больше 2

if ($guests > 2) {

$bestaetigungstext .= "Дополнительные гости (12€ в ночь на каждого гостя)\n";

}

// Туристический налог

$bestaetigungstext .= "Туристический налог (1€ на каждого человека в ночь)\n";

// Общие затраты

$bestaetigungstext .= "Общие затраты: $gesamtkosten\n\n";

// Здесь мы отправляем сообщение подтверждения отправителю

addmail($empfaengerEmail, "Ваш запрос получен", $bestaetigungstext, $Config->adminEmail);

$return .= '<p>Ваш запрос успешно отправлен</p><p><a href="/">Перейти на главную страницу</a></p>';

} else {

$return .= '<p>Ваш запрос не может быть отправлен</p><p><a href="/">Перейти на главную страницу</a></p>';

}

}

setcookie('captcha', '', time(), '/');

} else {

header(PROTOCOL . ' 404 Not Found');

require('./pages/404.html');

ob_end_flush();

exit();

}

return $return;

?>

А после на главной странице сайта разместите Форму:

<form name="form_mail_module" action="/contact/add" method="post" onsubmit="return validateForm();">

<div class="form-row">

<span class="wpcf7-form-control-wrap tel-317">

<b>Введите персональные данные *</b><br>

<input type="text" name="name" value="" size="40" class="wpcf7-form-control wpcf7-text wpcf7-tel wpcf7-validates-as-required wpcf7-validates-as-tel" aria-required="true" aria-invalid="false" placeholder="Имя и Фамилия">

</span>

<div class="vc_empty_space" style="height: 10px"><span class="vc_empty_space_inner"></span></div>

</div>

<div class="form-row">

<span class="wpcf7-form-control-wrap tel-317">

<input type="tel" name="telefonnummer" value="" size="40" class="wpcf7-form-control wpcf7-text wpcf7-tel wpcf7-validates-as-required wpcf7-validates-as-tel" aria-required="true" aria-invalid="false" placeholder="Номер телефона">

</span>

<div class="vc_empty_space" style="height: 10px"><span class="vc_empty_space_inner"></span></div>

</div>

<div class="form-row">

<span class="wpcf7-form-control-wrap tel-317">

<input type="email" name="email" value="" size="40" class="wpcf7-form-control wpcf7-text wpcf7-tel wpcf7-validates-as-required wpcf7-validates-as-tel" aria-required="true" aria-invalid="false" placeholder="Email">

</span>

<div class="vc_empty_space" style="height: 10px"><span class="vc_empty_space_inner"></span></div>

</div>

<div class="form-row">

<span class="wpcf7-form-control-wrap tel-317">

<b>Выберите дату прибытия и отъезда, а также количество гостей (максимум 5 человек):</b><br>

<label for="arrivalDate">Прибытие:</label>

<input type="date" id="arrivalDate" name="anreise" required onchange="calculateCost()">

<label for="departureDate">Отъезд:</label>

<input type="date" id="departureDate" name="abreise" required onchange="calculateCost()">

<label for="guests">Количество гостей (максимум 5 человек):</label>

<input type="number" id="guests" name="Personen" min="1" max="5" required onchange="calculateCost()">

<button type="button" onclick="calculateCost()">Рассчитать стоимость</button>

<p id="totalCost" style="padding-top: 60px;"></p>

<p id="nightsCount" style="padding-top: 10px;"></p>

<p id="errorText" style="color: red;"></p>

</span>

</div>

<script>

function calculateCost() {

const arrivalDate = document.getElementById("arrivalDate").value;

const departureDate = document.getElementById("departureDate").value;

const guests = parseInt(document.getElementById("guests").value);

if (!arrivalDate || !departureDate || isNaN(guests) || guests < 1) {

document.getElementById("errorText").innerText = "Пожалуйста, заполните все обязательные поля: Дата прибытия, Дата отъезда и Количество гостей.";

document.getElementById("totalCost").innerText = ""; // Сбросить общую стоимость, так как расчет не выполнен.

return;

}

const baseCost = 60;

const shortStaySurcharge = 35;

const weeklyRate = 58;

const additionalPersonCost = 12;

const touristTax = 1; // Курортный сбор за ночь на человека

const arrival = new Date(arrivalDate);

const departure = new Date(departureDate);

if (arrival >= departure) {

document.getElementById("errorText").innerText = "Дата отъезда должна быть после даты прибытия.";

return;

}

const timeDifference = departure.getTime() - arrival.getTime();

const nights = Math.ceil(timeDifference / (1000 * 3600 * 24));

if (nights < 3) {

document.getElementById("errorText").innerText = "Минимальное количество ночей - 3.";

return;

}

// Показать количество ночей

document.getElementById("nightsCount").innerText = `Количество ночей: ${nights}`;

let totalCost = 0;

if (nights < 7) {

totalCost = (baseCost + shortStaySurcharge) * nights;

} else {

totalCost = weeklyRate * nights;

}

// Дополнительные расходы за гостей

if (guests > 2) {

totalCost += (guests - 2) * additionalPersonCost * nights;

}

// Добавить курортный сбор

const touristTaxCost = guests * nights * touristTax;

totalCost += touristTaxCost;

const baseCostExplanation = `Базовая стоимость (${baseCost}€ за ночь)`;

const shortStaySurchargeExplanation = `Сбор за короткий срок пребывания (${shortStaySurcharge}€ за ночь)`;

const weeklyRateExplanation = `Недельная ставка (${weeklyRate}€ за ночь)`;

const additionalPersonCostExplanation = `Дополнительные гости (${additionalPersonCost}€ за ночь за человека)`;

const touristTaxExplanation = `Курортный сбор (${touristTax}€ за ночь на человека)`;

const explanations = [baseCostExplanation];

if (nights < 7) {

explanations.push(shortStaySurchargeExplanation);

} else {

explanations.push(weeklyRateExplanation);

}

if (guests > 2) {

explanations.push(additionalPersonCostExplanation);

}

explanations.push(touristTaxExplanation);

const explanationText = explanations.join(" + ");

document.getElementById("errorText").innerText = "";

// Изменить значение в форме

const gesamtkostenValue = totalCost.toFixed(2);

document.getElementById("errorText").innerText = "";

document.getElementById("totalCost").innerHTML = `Общая стоимость: ${gesamtkostenValue}€ (${explanationText})`;

// Обновите скрытое поле формы

document.getElementById("gesamtkosten").setAttribute("value", gesamtkostenValue + "€");

// Показать количество ночей

document.getElementById("nightsCount").innerText = `Количество ночей: ${nights}`;

// Установить значение в скрытом поле

document.getElementById("nightsCountField").value = nights;

}

// Функция calculateCost() вызывается только при нажатии кнопки

document.querySelector("button[type='button']").addEventListener("click", calculateCost);

</script>

<!-- Код создан и предоставлен bi-verleih.de -->

<script type="text/javascript">

function checkTimes() {

var anreiseZeit = document.getElementById("anreiseuhrzeit").value;

var abreiseZeit = document.getElementById("abreiseuhrzeit").value;

// Здесь вы можете определить правила валидации времени прибытия и времени отъезда

var erlaubteAnreiseZeit = "15:00";

var erlaubteAbreiseZeit = "10:00";

var anreiseWarnung = document.getElementById("anreiseWarnung");

var abreiseWarnung = document.getElementById("abreiseWarnung");

if (anreiseZeit < erlaubteAnreiseZeit) {

anreiseWarnung.innerHTML = "Прибытие до 15:00 часов не разрешено.";

} else {

anreiseWarnung.innerHTML = "";

}

if (abreiseZeit > erlaubteAbreiseZeit) {

abreiseWarnung.innerHTML = "Отъезд после 10:00 часов не разрешен.";

} else {

abreiseWarnung.innerHTML = "";

}

// Предотвращение стандартного действия формы

return false;

}

</script>

</div>

<div class="vc_empty_space" style="height: 10px"><span class="vc_empty_space_inner"></span></div>

<div class="form-row">

<b>Введите время прибытия и отъезда *</b><br>

Прибытие: После 15:00. Гибкие условия обсуждаются. Отъезд: До 10:00. При отсутствии согласования позднего отъезда будет начислен полный день.<br>

<label for="anreiseuhrzeit"><b>Время прибытия *</b></label>

<input type="time" id="anreiseuhrzeit" name="anreiseuhrzeit" required onchange="checkTimes()" placeholder="15:00">

<span id="anreiseWarnung" style="color: red;"></span>

</div>

<div class="form-row">

<label for="abreiseuhrzeit"><b>Время отъезда *</b></label>

<input type="time" id="abreiseuhrzeit" name="abreiseuhrzeit" required onchange="checkTimes()" placeholder="10:00">

<span id="abreiseWarnung" style="color: red;"></span>

</div>

<div style="display: none;">

<input type="hidden" name="gesamtkosten" id="gesamtkosten" value="">

<input type="hidden" name="Übernachtungen" id="nightsCountField" value="">

</div>

<div class="form-row-txt-area">

<div class="form-textarea">

<span class="wpcf7-form-control-wrap textarea-698">

<b>Введите сообщение *</b><br>

<textarea name="Сообщение" cols="40" rows="10" class="wpcf7-form-control wpcf7-textarea" aria-invalid="false" placeholder="Сообщение"></textarea>

</span>

</div>

</div>

<p style="line-height: 1; padding-top: 20px;"><br><img border="1" id="captcha" src="/modules/captcha/captcha.php?rand='.rand(0, 99999).'" alt="captcha" onclick="document.getElementById(\'captcha\').src = \'/modules/captcha/captcha.php?\' + Math.random()" style="cursor: pointer;"></p>

<p>Введите символы с изображения<br><input type="text" name="Captcha" value="" size="10" autocomplete="off" required></p>

<!-- Согласие на обработку персональных данных -->

<div class="form-row">

<input type="checkbox" id="roscomnadzor" name="Datenschutz">

<label for="roscomnadzor">Я согласен на обработку персональных данных. Дополнительную информацию можно найти в нашей <a href="https://fwo-edersee.de/datenschutz" target="_blank">Политике конфиденциальности</a>.</label>

</div>

<!-- Согласие с общими условиями -->

<div class="form-row">

<input type="checkbox" id="agb" name="AGB">

<label for="agb">Я согласен с <a href="https://fwo-edersee.de/agb" target="_blank">Общими условиями</a>.</label>

</div>

<!-- Кнопка отправки формы -->

<p><input type="submit" value="Отправить" class="wpcf7-form-control wpcf7-submit"><span class="ajax-loader"></span></p>

</form>

<script>

function updateDatenschutzValue() {

const datenschutzCheckbox = document.getElementById("roscomnadzor");

const datenschutzValueField = document.querySelector('input[name="Datenschutz"]');

if (datenschutzCheckbox.checked) {

datenschutzValueField.value = "да";

} else {

datenschutzValueField.value = "нет";

}

// Также вызовите функцию обновления соглашения о предоставлении услуг (AGB)

updateAgbValue();

}

function updateAgbValue() {

const agbCheckbox = document.getElementById("agb");

const agbValueField = document.querySelector('input[name="AGB"]');

if (agbCheckbox.checked) {

agbValueField.value = "да";

} else {

agbValueField.value = "нет";

}

}

</script>

</form>

Пользуйтесь и не забудьте указать при пользовании обратную ссылку на мой сайт https://bi-verleih.de/

Вернуться назад к другим темам

Ответы пользователей

Чтобы оставлять сообщения необходимо авторизоваться
Нет ни одного сообщения
Вступайте в нашу группу https://vk.com/myengine