Форум русской поддержки Joomla!® CMS
08.12.2016, 13:55:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Отправить форму расчёта на email

 (Прочитано 471 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Gedonist
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 14


« : 24.07.2015, 15:55:34 »

Доброго дня!

Есть такая задача: существует форма расчёта стоимости продукта в зависимости от параметров. Форма не только считает стоимость, но и может добавить в таблицу несколько продуктов, а в таблице подсчитывается общий итог всего заказа. Всё это я реализовывал на Joomla 3 без всяких плагинов, лишь на JS и jQuery. Теперь есть задача: полученную таблицу результатов отправлять менеджеру по электронной почте.
Т.е. посетитель приходит на сайт, рассчитывает стоимость, добавляет один или несколько продуктов в заказ, после чего заполняет поля "имя" и "обратный адрес", нажимает кнопку "заказать". После этого менеджеру на e-mail приходит таблица с заказом.

Как работает расчёт и добавление в таблицу можно посмотреть здесь
Показать текстовый блок


Думаю, сторонний плагин здесь уже не поможет. Как реализовать данный функционал минимальными усилиями? можно ли как-то всю таблицу записать в виде HTML в переменную, а затем отправить эту переменную средствами jmail? Плагин по этому поводу писать крайне не хочется, я бы ограничился куском php прям в статье, если это возможно..
Записан
darkghost
Практически профи
*******

Репутация: +75/-0
Offline Offline

Сообщений: 1811



« Ответ #1 : 24.07.2015, 16:26:25 »

Если логически, то хорошо бы привентить переменные и потом уже текстовым файлом отправлять. Но не видя кода тяжело что-то говорить. Тем более, если использовалось -- лишь на JS и jQuery --- даже и не знаю, что и сказать, посоветовать. Ведь данные, стоимость выводятся только на странице 
Записан
bolonia
Осваиваюсь на форуме
***

Репутация: +22/-0
Offline Offline

Сообщений: 197



« Ответ #2 : 24.07.2015, 16:43:44 »

Я бы сделал через модуль. Посмотри как сделан мой модуль, вот исходники:
https://github.com/birdkiwi/mod_simplecallback
Тебе нужно заменить содержимое JS, поменять шаблон. Переименовать и добавить поля для отправки на Email.
Правда ничего сложного тут нет. Если ты на jQuery сделал калькулятор, то и тут разберешься.
Записан
Gedonist
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 14


« Ответ #3 : 24.07.2015, 18:21:56 »

Но не видя кода тяжело что-то говорить.
Ну, за кодом-то дело не станет..

JS
Код:
function updateOrder(){
 
var numWidth = parseCount( document.getElementById("width").value);
var numHeight = parseCount( document.getElementById("height").value);

var resPrint = calcCurt(numHeight, numWidth);

if (checkFreez()){
  labelPrice1.value = resPrint[0];
}
  else {
    labelPrice1.value = resPrint[1];
  }

labelOb.value = resPrint[2];
labelV.value = resPrint[3];
 
}

function checkFreez(){
 
  if (document.getElementById("freez").checked)
  return 1;

  else return 0;
 
}

function getParam(num){
 
  var curType = [];
  curType[0]=["2x200,40%",0.2,0.16,162,172,80,0.0015,0.5];
  curType[1]=["2С…200,80%",0.2,0.12,162,172,80,0.0015,0.5];
  curType[2]=["3С…300,27%",0.3,0.26,295,305,85,0.003, 1];
  curType[3]=["3С…300,53%",0.3,0.22,295,305,85,0.003, 1];
  curType[4]=["3С…300,86%",0.3,0.18,295,305,85,0.003, 1];
  curType[5]=["4С…400,20%",0.4,0.36,445,480,90,0.006, 2];
  curType[6]=["4С…400,40%",0.4,0.32,445,480,90,0.006, 2];
  curType[7]=["4С…400,60%",0.4,0.28,445,480,90,0.006, 2];

  return curType[num];
}


function calcCurt(height, width){
 
  var greb = 380;
  var mont = 370;
 
  makeType(height);
  typeN = getType();
  curType = getParam(typeN);
  var polos = (width-curType[1])/curType[2]+1;
  if (polos<0)polos = 0;
  var poloso = Math.ceil(polos);
  var pogm = height * poloso;
  if (pogm<0)pogm = 0;
  var pogm1=0;
  if (pogm<50)
           pogm1=pogm;
        else {
             if (pogm<100)
                pogm1=50+(poloso-Math.floor(50/height))*height;
               
             else
                pogm1=100+(poloso-Math.floor(100/height))*height;
        }   
  var pogm2 = Math.ceil(pogm1);
  if (pogm2<0)pogm2 = 0;
  var price1 = pogm2 * curType[3];
  var price2 = pogm2 * curType[4];
  var gprice = greb * width;
  var plastPrice = curType[5] * poloso;
  var mprice = mont * width;
  var finalPrice1 = mprice + plastPrice + gprice + price1;
  var finalPrice2 = mprice + plastPrice + gprice + price2;
 
  var obTotal = Math.round(((curType[6] * pogm2)+(width*0.005))*100.0)/ 100.0;
 
  var vTotal = Math.round(((curType[7] * pogm2)+(width * 1.5))*100)/ 100.0;
   
  var result = [finalPrice1,finalPrice2, obTotal, vTotal];
 
  return result;
}

function makeType(height) {
 
  var radio = 0;
 
if (height>0 && height<=2.5){
 
  if (!document.getElementById("case1")){
    clearType();
    radio = document.createElement('input');
radio.setAttribute( 'type', 'radio');
radio.setAttribute( 'name', 'Ztype');
    radio.setAttribute( 'id', 'case1');
    radio.setAttribute( 'value', '0');
tmp = document.getElementById("curType");
    tmp.appendChild( radio );
tmp.appendChild(document.createTextNode("2x200,40%"));

    radio = document.createElement('input');
radio.setAttribute( 'type', 'radio');
radio.setAttribute( 'name', 'Ztype');
    radio.setAttribute( 'value', '1');
    radio.setAttribute( 'defaultChecked', 'true');
radio.setAttribute( 'Checked', 'true');
    tmp.appendChild( radio );
tmp.appendChild(document.createTextNode("2С…200,80%"));
  }
}
 
  else if (height <= 3.2 && height > 2.5) {
   
    if (!document.getElementById("case2")){
     
    clearType();
    radio = document.createElement('input');
radio.setAttribute( 'type', 'radio');
radio.setAttribute( 'name', 'Ztype');
    radio.setAttribute( 'id', 'case2');
    radio.setAttribute( 'value', '2');
tmp = document.getElementById("curType");
    tmp.appendChild( radio );
    tmp.appendChild(document.createTextNode("3С…300,27%"));
     
   
    radio = document.createElement('input');
radio.setAttribute( 'type', 'radio');
radio.setAttribute( 'name', 'Ztype');
    radio.setAttribute( 'value', '3');
    tmp.appendChild( radio );
    tmp.appendChild(document.createTextNode("3С…300,53%"));
   
    radio = document.createElement('input');
radio.setAttribute( 'type', 'radio');
radio.setAttribute( 'name', 'Ztype');
    radio.setAttribute( 'value', '4');
    radio.setAttribute( 'defaultChecked', 'true');
radio.setAttribute( 'Checked', 'true');
    tmp.appendChild( radio );
tmp.appendChild(document.createTextNode("3С…300,86%"));
  }
    }
 
  else if (height <= 4 && height > 3.2) {
   
    if (!document.getElementById("case3")){
     
clearType();
    radio = document.createElement('input');
radio.setAttribute( 'type', 'radio');
radio.setAttribute( 'name', 'Ztype');
    radio.setAttribute( 'id', 'case3');
    radio.setAttribute( 'value', '3');
tmp = document.getElementById("curType");
    tmp.appendChild( radio );
    tmp.appendChild(document.createTextNode("3С…300,53%"));
   
    radio = document.createElement('input');
radio.setAttribute( 'type', 'radio');
radio.setAttribute( 'name', 'Ztype');
    radio.setAttribute( 'value', '4');
    tmp.appendChild( radio );
    tmp.appendChild(document.createTextNode("3С…300,86%"));
     
    radio = document.createElement('input');
radio.setAttribute( 'type', 'radio');
radio.setAttribute( 'name', 'Ztype');
    radio.setAttribute( 'value', '5');
    tmp.appendChild( radio );
    tmp.appendChild(document.createTextNode("4С…400,20%"));

     
    radio = document.createElement('input');
radio.setAttribute( 'type', 'radio');
radio.setAttribute( 'name', 'Ztype');
    radio.setAttribute( 'value', '6');
    radio.setAttribute( 'defaultChecked', 'true');
radio.setAttribute( 'Checked', 'true');
    tmp.appendChild( radio );
    tmp.appendChild(document.createTextNode("4С…400,40%"));
  }
    }

else if (height <= 5 && height > 4) {
   
    if (!document.getElementById("case4")){
     
clearType();
    radio = document.createElement('input');
radio.setAttribute( 'type', 'radio');
radio.setAttribute( 'name', 'Ztype');
    radio.setAttribute( 'id', 'case4');
      radio.setAttribute( 'value', '3');
tmp = document.getElementById("curType");
    tmp.appendChild( radio );
    tmp.appendChild(document.createTextNode("3С…300,53%"));
   
    radio = document.createElement('input');
radio.setAttribute( 'type', 'radio');
radio.setAttribute( 'name', 'Ztype');
    radio.setAttribute( 'value', '4');
    tmp.appendChild( radio );
    tmp.appendChild(document.createTextNode("3С…300,86%"));
     
    radio = document.createElement('input');
radio.setAttribute( 'type', 'radio');
radio.setAttribute( 'name', 'Ztype');
    radio.setAttribute( 'value', '6');
    tmp.appendChild( radio );
    tmp.appendChild(document.createTextNode("4С…400,40%"));

     
    radio = document.createElement('input');
radio.setAttribute( 'type', 'radio');
radio.setAttribute( 'name', 'Ztype');
    radio.setAttribute( 'defaultChecked', 'true');
radio.setAttribute( 'Checked', 'true');
    radio.setAttribute( 'value', '7');
    tmp.appendChild( radio );
    tmp.appendChild(document.createTextNode("4С…400,60%"));
  }
    }
 
    else if (height > 5) {
   
    if (!document.getElementById("case5")){
     
    clearType();
    radio = document.createElement('input');
radio.setAttribute( 'type', 'radio');
radio.setAttribute( 'name', 'Ztype');
    radio.setAttribute( 'id', 'case5');
    radio.setAttribute( 'value', '5'); 
tmp = document.getElementById("curType");
    tmp.appendChild( radio );
    tmp.appendChild(document.createTextNode("4С…400,20%"));
     
   
    radio = document.createElement('input');
radio.setAttribute( 'type', 'radio');
radio.setAttribute( 'name', 'Ztype');
    radio.setAttribute( 'value', '6');
   
     
    tmp.appendChild( radio );

      tmp.appendChild(document.createTextNode("4С…400,40%"));
   
    radio = document.createElement('input');
radio.setAttribute( 'type', 'radio');
radio.setAttribute( 'name', 'Ztype');
    radio.setAttribute( 'value', '7');
    radio.setAttribute( 'defaultChecked', 'true');
radio.setAttribute( 'Checked', 'true');
    tmp.appendChild( radio );
    tmp.appendChild(document.createTextNode("4С…400,60%"));
  }
    }
 
  var inputs = document.getElementsByName("Ztype");
  var input_len = inputs.length;
  for (var i = 0; i < input_len; i++) {
    inputs[i].onclick = updateOrder;
}
 
}

function getType () {
 
  var inputs = document.getElementsByName("Ztype");
  var selectedValue = -1;
  var input_len = inputs.length;
  for (var i = 0; i < input_len; i++) {
    if (inputs[i].checked)
    {
        selectedValue = inputs[i].value;
        break;
    }
}
 
  return selectedValue;
 
}

     
function parseCount(countString) {
        num = +countString;

        return num;
      }

     
function clearType() {
       
       tmp = document.getElementById("curType");
        while (tmp.firstChild) {
   
    tmp.removeChild(tmp.firstChild);
}
 
     
      }

function calcTotal(id) {
 
  var prices = document.getElementsByClassName(id);
 
  var prices_len = prices.length;
  var total=0;
  for( var i = 0; i < prices_len; ++i )
    total += parseCount(prices[i].innerHTML);
 
  return total;
 
}




function Add2Table() {
 
  jQuery.noConflict();
  jQuery("#zakazDiv").show('slow');
  var type = getParam(getType());
  var moroz = checkFreez();
  if (!checkFreez()) moroz = "РґР°";
  else
    moroz = "нет";
 
 
  jQuery( "<tr><td>"+width.value+"</td><td>"+height.value+"</td><td>"+type[0]+"</td><td>"+moroz+"</td><td class=\"priceTd\">"+labelPrice1.value+"</td><td class=\"VTd\">"+labelV.value+"</td><td class=\"OTd\">"+labelOb.value+"</td></tr>" ).insertBefore( "#zakaz > tbody > tr:last" );
 

document.getElementById ( "itogo" ).innerHTML = (calcTotal("priceTd") + " СЂСѓР±.");
 
document.getElementById ( "totalV" ).innerHTML = (calcTotal("VTd")+ "РєРі.");
 
document.getElementById ( "totalO" ).innerHTML = (calcTotal("OTd")+ "Рј. РєСѓР±.");
 
}


HTML
Код:
<h2>Калькулятор стоимости завес ПВХ:</h2>
<div class="calc_form_div">
<form class="calc_form" action="" oninput="updateOrder()">
<div class="left_half">
<ul>
<li>
<legend>Исходный данные:</legend>
</li>
<li><label for="width">Ширина проёма (м.):</label> <input id="width" type="number" name="width" /></li>
<li><label for="height">Высота проёма (м.):</label> <input id="height" type="number" name="height" /></li>
<li><legend>Параметры доставки:</legend></li>
<li>Вес завесы: <output id="labelV" name="labelV" for="width height">0</output> кг.</li>
<li>Объём завесы:  <output id="labelOb" name="labelOb" for="width height">0</output> м3</li>
<li><br/></li>
</ul>
</div>
<div class="right_half">
<ul>
<li>
<legend>Результаты:</legend>
</li>
<li>
<p>Тип плёнки, нахлёст: <span id="curType" class="curType"></span></p>
</li>
<li>
<p>Вид завесы: <span class="curType"><input type="radio" name="freezType" value="0" defaultchecked="true" checked="true" id="freez" onclick = "updateOrder()">Обычная<input type="radio" name="freezType" value="1" onclick = "updateOrder()">Морозостойкая</span>
</p>
</li>
<li>
<p>Стоимость завесы: <span class="result"> <output for="width height" name="labelPrice1" id="labelPrice1">0</output> руб.</span></p>
</li>
<li>
<br />
</li>
<li> <a href="javascript://" class="btn btn-primary fright" onclick="Add2Table();"> Добавить в заказ</a><br/></li>
</ul>
</div>
</form>
</div>
<div id="zakazDiv">
  <table border=1 id="zakaz">
  <caption>Ваш заказ:</caption>
    <tr>
      <th>Ширина:</th>
      <th>Высота:</th>
      <th>Тип плёнки, нахлёст:</th>
      <th>Морозостойкость:</th>
      <th>Цена:</th>
      <th>Вес:</th>
      <th>Объём:</th>
     </tr>
  <tr>
     
      <th colspan="2">Общая стоимость заказа:</th>
      <th id="itogo">0</th>
      <th>Общий вес:</th>
      <th id="totalV">0</th>
      <th>Общий объём:</th>
      <th id="totalO">0</th>
   
      </tr>
  </table>

  <a href="javascript://" id="delButton" onclick="location.reload();" class="pull-right btn btn-primary fright">Удалить заказ </a> </div>
Таблица до того, как в неё добавляются записи, скрыта через CSS
Записан
Gedonist
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 14


« Ответ #4 : 24.07.2015, 18:34:57 »

Я бы сделал через модуль. Посмотри как сделан мой модуль, вот исходники:
https://github.com/birdkiwi/mod_simplecallback
Тебе нужно заменить содержимое JS, поменять шаблон. Переименовать и добавить поля для отправки на Email.
Правда ничего сложного тут нет. Если ты на jQuery сделал калькулятор, то и тут разберешься.

Вообще, изначально у меня была как-раз такая мысль - посмотреть, как сделан мой callback модуль и сделать также. Смотрел код mod_callback, но твой значительно совершеннее. Меня смущает два момента. Во-первых я с этим засяду надолго. Ничего особенно сложного, конечно. Не сложнее, чем написать модуль для Joomla Wink но прежде, чем засяду это делать, хочу убедиться в том, что нет простого решения на 3-5-7 строчек кода..

Второй момент. Информация содержится в таблице, а не в полях ввода. Т.е. в полях ввода может остаться только один товар, а по факту в заказе их может быть два десятка.
Записан
Gedonist
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 14


« Ответ #5 : 24.07.2015, 19:04:58 »

Строго говоря, думаю я смогу написать код php, который соберёт значения из таблицы и отправит их на e-mail. Но пока обычная вставка кода php в тело статьи ничего не даёт - он не выполняется. Это какая-то защита Joomla?
Я пробовал добавлять волшебное слово defined( '_JEXEC' ) or die( 'Restricted access' );
безрезультатно
Записан
bolonia
Осваиваюсь на форуме
***

Репутация: +22/-0
Offline Offline

Сообщений: 197



« Ответ #6 : 25.07.2015, 10:46:58 »

Для таких вещей есть Sourcerer: http://extensions.joomla.org/extension/sourcerer
Записан
Gedonist
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 14


« Ответ #7 : 28.07.2015, 13:03:52 »

Для таких вещей есть Sourcerer: http://extensions.joomla.org/extension/sourcerer
Спасибо за наводку - помогло.
Следующая проблема в том, как передать данные в php обработчик. На сколько я понял, в скрипт обычно передаются значения полей формы. Можно ли заставить php считать данные за HTML таблицы на сайте? навскидку приходит в голову только создание средствами JS невидимых input`ов c нужными данными... но это выглядит как-то коряво.
Записан
bolonia
Осваиваюсь на форуме
***

Репутация: +22/-0
Offline Offline

Сообщений: 197



« Ответ #8 : 28.07.2015, 16:49:05 »

Спасибо за наводку - помогло.
Следующая проблема в том, как передать данные в php обработчик. На сколько я понял, в скрипт обычно передаются значения полей формы. Можно ли заставить php считать данные за HTML таблицы на сайте? навскидку приходит в голову только создание средствами JS невидимых input`ов c нужными данными... но это выглядит как-то коряво.


Через jQuery сохранить полностью таблицу в input. И отправлять ее как HTML-код. Письмо тоже в HTML должно быть.
Записан
Gedonist
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 14


« Ответ #9 : 11.09.2015, 14:54:21 »

Задачу решил, тему можно закрывать.
Сначала хотел с помощью Soucerer`а сделать две страницы: одну с формой, другую - обработчик формы, а дальше задача решается классически, средствами php, вне зависимости от Joomla. Но пришлось бы либо долго заморачиваться с проверками и безопасностью, либо оставить всё в совсем топорном виде на свой страх и риск, поэтому я всё же решил действовать средствами Joomla.

Свой компонент писать тоже довольно долго - нужно глубоко разбираться, решил воспользоваться готовым - Chronoform. Добавил простую форму с контактными данными и одним скрытым полем. После заполнения таблицы, собираю её через js и запихиваю в скрытое поле таким образом:
Код:
function putTable(){
      var iHTML = document.getElementById("zakaz").innerHTML;
    document.getElementById("orderTable").value = '<table>'+iHTML+'</table>';
    }
Дальше форма отправляется на емайл средствами chronoform (т.е. средствами joomla). Там есть встроенные проверки, в том числе на валидность введённых данных. Можно также записывать данные в sql таблицу (только пока не понял, чем её удобно просматривать, не phpMyAdmin`ом же...)
Компонент ставится бесплатно, но просит оформить подписку за деньги. При оформлении подписки появляется возможность перегружать данные в документы Google и, может быть, убрать копирайт.
Я пока убрал копирайт средствами CSS. Для существующих на сегодня задач одна пару-тройку скрытых индексируемых ссылок на сайте проблемой не являются.
Способов "лечения" пятой версии ChronoForms не нашел.
Спасибо всем за советы!



Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet