Простой калькулятор на PHP на основе данных вебформы

Главные вкладки

Аватар пользователя 1541 1541 3 декабря 2012 в 23:17

Добрый день. Мне необходимо сделать пересчет значений из полей вебформы. Подскажите как? Не знаю где ковырнуть чтобы значения выудить из полей и вставить после результат в иное поле. Уберкарт и коммерц не предлагать. И лучше на PHP, если возможно.

Комментарии

Аватар пользователя 1541 1541 3 декабря 2012 в 23:38

Может можно в каком нибудь шаблоне прописать все условия и все? только вот в каком и как выудить значения полей и после проставить их?

Аватар пользователя sg85 sg85 4 декабря 2012 в 1:09

Лучше на Drupal API, и в идеале через аякс, так и наберите в гугле "ajax калькулятор на drupal", примеров будет много

Аватар пользователя sg85 sg85 4 декабря 2012 в 1:31

<?php
$results = db_select('webform_submitted_data','wsd')
->fields('wsd',array('data'))
->condition('nid',$номер_ноды_вашей_формы)
->condition('sid',$номер_ответа_или_как_там_его)
->condition('cid',$номер_компонента)//можно не указывать, тогда в результатах должны быть все, либо через оператор IN выбрать несколько нужных
->execute()->fetchAll();
?>
как-то так, но я понятия не имею чего именно Вам надо, так что лучше почитайте про абстрактный слой БД.

и не совсем понял, чего разбирать?

Аватар пользователя 1541 1541 4 декабря 2012 в 1:34

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

Аватар пользователя sg85 sg85 4 декабря 2012 в 1:43

Тут 2 варианта:
1 через альтер формы добавляете аякс сабмит и описываете функцию этого сабмита(на PHP)
2 через тот же альтер меняете сабмит, описываете его функцию, потом каким то непонятным способом прикручиваете туда старый сабмит и т.д., т.е. влазите в логику работы модуля webform с не совсем понятными костылями.

Вариант 1, с аяксом, проще в разы. Ибо Вам по сути надо написать 10 строк кода на PHP, а не городить огород из костылей как во 2м случае.

Аватар пользователя 1541 1541 4 декабря 2012 в 1:46

"sg85" wrote:
Вариант 1, с аяксом, проще в разы. Ибо Вам по сути надо написать 10 строк кода на PHP
согласен на него:) только вот как. Если с пхп я только начал знакопиться то с аяксом.. дела вообще никак.
"sg85" wrote:
1 через альтер формы добавляете аякс сабмит и описываете функцию этого сабмита(на PHP)
понимаю что так сделать лучше всего и проще но что такое альтер форма и как добавить туда аякс сабмит, правила описания функций. Есть что почитать с примерами по этой теме?

Аватар пользователя sg85 sg85 4 декабря 2012 в 1:53

альтер формы
http://api.drupal.org/api/drupal/modules%21system%21system.api.php/funct...
но лучше
http://api.drupal.org/api/drupal/modules%21system%21system.api.php/funct...

как прикручивать аякс(справочник, не путать с учебником, самоучителем и т.д.):
http://api.drupal.org/api/drupal/developer%21topics%21forms_api_referenc...

а вообще, советую почитать про написание модулей(инфы полно) и что такое хуки в друпал
http://api.drupal.org/api/drupal/includes%21module.inc/group/hooks/7

и по прежнему не совсем понимаю, что именно нужно сделать Wink

Аватар пользователя 1541 1541 4 декабря 2012 в 1:59

Спасибо за литературу, сейчас буду пробовать читать.

"sg85" wrote:
и по прежнему не совсем понимаю, что именно нужно сделать ;)

Обычная веб-форма, сделанная как страница заказа. В ней % полей текстовых: Имя, Адрес, Количество, Цена, Итого. В поле Цена значение приходит из ноды при помощи $_GET, пользователь вводит количество и вот надо количество умножить на цену чтобы в поле Итого получилась сумма.

Аватар пользователя 1541 1541 4 декабря 2012 в 2:02

Есть модуль Webform Calculator, попробовал поставить его. Появился тип поля в веб-форме Formula. Но, документацию не нашел по модулю в пример который в описании написан на орге не подходит. Т.е. вставляю имена полей а ничего не происходит.

Аватар пользователя 1541 1541 4 декабря 2012 в 2:26

"sg85" wrote:
http://drupal.org/project/computed_field[/quote]
установил но найти его не могу. как настраивать или куда ставить поле, в веб-форме ничего нового не добавилось... А не подскажите в Webform Calculator какой синтаксис?

Аватар пользователя sg85 sg85 4 декабря 2012 в 2:29

не пользовался им.

computed_field предоставляет поле для fields, т.е. ищите его в виджетах(или как они там) в настройках полей типа материала Вашей веб формы.

Аватар пользователя 1541 1541 4 декабря 2012 в 2:34

"sg85" wrote:
computed_field предоставляет поле для fields, т.е. ищите его в виджетах(или как они там) в настройках полей типа материала Вашей веб формы

Хорошо, спасибо за информацию буду разбираться.:)

Аватар пользователя sg85 sg85 4 декабря 2012 в 9:42

Я так понял, что данные должны браться откуда-то из БД, так что в любом случае эти данные нужно сперва получить и вывести.

Аватар пользователя 1541 1541 4 декабря 2012 в 13:15

"Chyvakoff" wrote:
А перемножить два числа яваскриптом религия не позволяет? Вы ещё Views + VBO для этой задачи прикрутите...

позволяет, но JS не владею. Можете что то конкретное подсказать?
"sg85" wrote:
Я так понял, что данные должны браться откуда-то из БД, так что в любом случае эти данные нужно сперва получить и вывести.

я их передаю в эту форму с помощью $_GET, и подставляю в поля. А вот из этих полей уже надо снова выудить и перемножыть. Computed Fields не вариант, т.к. он добавляет типы полей в тип материала а не в саму форму.

Аватар пользователя sg85 sg85 4 декабря 2012 в 16:14

"1541" wrote:
позволяет, но JS не владею. Можете что то конкретное подсказать?

$(document).ready(function() {
  $("#field3").value = $("#field1").value * $("#field2").value;
}

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

Аватар пользователя 1541 1541 4 декабря 2012 в 17:29

"sg85" wrote:
А вообще, я так понял, что нужно при выводе формы, просто отобразить пользователю результат умножения полей и эти данные нигде более не используются? Тогда правильнее, наверное, будет через шаблон ноды.

Вот именно. Эти данные только передаются в форму которая пересылается на е-мейл, но они туда передаются стандартными процедурами веб-форм. Я тоже так думаю что через шаблон можно сделать, вопрос как. Точнее вопрос раскладывается на пункты:
1. В каком файле вносить изменения?(сделал файл типа webform-form-$nid.tpl.php)
2. Как в нем достучаться до полей именно формы а не ноды?

Аватар пользователя sg85 sg85 4 декабря 2012 в 18:07

1. node--#.tpl.php где # - номер ноды. Не забудьте очистить кеш темизации.
2. посмотрите содержимое переменных

Аватар пользователя 1541 1541 4 декабря 2012 в 19:11

"sg85" wrote:
2. посмотрите содержимое переменных

Ну это хорошо, только вот у меня переменные в форме а в ноде нет этих переменных. как тут быть?

Аватар пользователя 1541 1541 4 декабря 2012 в 19:39

"sg85" wrote:
$(document).ready(function() {
$("#field3").value = $("#field1").value * $("#field2").value;
}

Скажите где это написать? В шаблоне ноды? В каком месте? И именно так как тут указано?

Аватар пользователя 1541 1541 4 декабря 2012 в 23:42

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

Аватар пользователя 1541 1541 5 декабря 2012 в 11:24

"sg85" wrote:
1. node--#.tpl.php где # - номер ноды. Не забудьте очистить кеш темизации
Если на основании этого шаблона делать то он же не даст поля опросника а даст только поля ноды. ИЛи я ошибаюсь?

Аватар пользователя sg85 sg85 5 декабря 2012 в 13:00

там все несколько проще, отрывок из webform_theme в webform.module:

<?php    'webform_form' => array(
      
'render element' => 'form',
      
'template' => 'templates/webform-form',
      
'pattern' => 'webform_form_[0-9]+',
    ),
?>

то бишь копируете templates/webform-form.tpl.php в корень Вашей темы и переименовываете в webform-form-#.tpl.php, где # номер Вашей формы и правите как Вам нужно.

"1541" wrote:
Скажите где это написать? В шаблоне ноды? В каком месте? И именно так как тут указано?

это JS, его писать нигде не нужно, если будете выводить это поле через шаблон.

Есть еще вариант - добавить к форме элемент markup в нужном месте с результатами вычислений через альтер формы. По моему этот вариант будет более правильным.

Аватар пользователя 1541 1541 5 декабря 2012 в 13:06

"sg85" wrote:
то бишь копируете templates/webform-form.tpl.php в корень Вашей темы и переименовываете в webform-form-#.tpl.php, где # номер Вашей формы и правите как Вам нужно.
я уже так и сделал, только как получить доступ к значениям полей не представляю. Пытался присвоить полям переменные, ноничего не выходит. Что такое альтер формы и с чем его едят?

Аватар пользователя sg85 sg85 5 декабря 2012 в 13:25

рекомендую поставить модуль devel, сможете просматривать содержимое переменных через dsm(), очень удобно

http://api.drupal.org/api/drupal/modules%21system%21system.api.php/funct...
в 7 друпале есть возможность прописывать хуки альтеров форм в template.php

если понятия не имеете какой ID у формы, http://api.drupal.org/api/drupal/modules%21system%21system.api.php/funct...
т.е. в template.php добавляете:

function phptemplate_form_alter(&$form, &$form_state, $form_id){
  dsm($form_id);//смотрим ID формы
  dsm($form);//смотрим какие поля передаются
}

чистите кеш, заходите на Вашу форму под админом, там будет написан её id в статусах друпал, за тем убираете из template.php эту функцию и пишите там нечто-вроде:

function phptemplate_form_ИДФОРМЫКОТОРОЕПОДСМОТРЕЛИПРОШЛОЙФУНКЦИЕЙ_alter(&$form, &$form_state){
  $form['res'] = array(//добавляете к форме новое поле
    '#type' => 'markup',//тип поля - метка(просто текст)
    '#markup' => $form['field1']['#default_value']*$form['field2']['#default_value'].' какой-то там текст';//складываете подсмотренные данные, можно так же использовать $_GET['price'], но стоит предусмотреть случай, когда эта переменная не задана, и а так же есть смысл в check_plain()
  );
}

и снова чистите кеш.

Правда не увидел откуда берется 2е поле.

Аватар пользователя sg85 sg85 5 декабря 2012 в 13:34

Блин, т.е. это поле при генерации формы пустое? тогда это как раз js

$(document).ready(function() {
  $("#edit-submitted-qount").change(function(){
    $("#edit-submitted-itogovaya-summa-zakaza").value = $("#edit-submitted-qount").value * $("#edit-submitted-cena").value;
  });
}

что то типа этого, засовываете в имяфайла.js, закидываете куда-нибудь и подключаете где нибудь в том же phptemplate_form_ИДФОРМЫКОТОРОЕПОДСМОТРЕЛИПРОШЛОЙФУНКЦИЕЙ_alter через drupal_add_js()

Аватар пользователя 1541 1541 5 декабря 2012 в 13:45

"sg85" wrote:
что то типа этого, засовываете в имяфайла.js, закидываете куда-нибудь и подключаете где нибудь в том же phptemplate_form_ИДФОРМЫКОТОРОЕПОДСМОТРЕЛИПРОШЛОЙФУНКЦИЕЙ_alter через drupal_add_js()
Спасибо, буду пробовать копать в этом направлении.
Скажите а можно ли в этом виде задать условие для сравнения? Ну что то типа:
if x>5 and x<7 then "показать это значение"
else
if x>7 and x<10 then "показать поле такое то" "вывести результат там то"?

Аватар пользователя 1541 1541 5 декабря 2012 в 14:00

Что то такое должен получить?

<?php
function phptemplate_form_ИДФОРМЫКОТОРОЕПОДСМОТРЕЛИПРОШЛОЙФУНКЦИЕЙ_alter(&$form, &$form_state){
      $(
document).ready(function() {
  $(
"#edit-submitted-qount").change(function(){
    $(
"#edit-submitted-itogovaya-summa-zakaza").value = $("#edit-submitted-qount").value * $("#edit-submitted-cena").value;
  });
}
}
?>
Аватар пользователя sg85 sg85 5 декабря 2012 в 14:47

"1541" wrote:
if x>7 and x<10 then "показать поле такое то" "вывести результат там то"?

что то типа этого?

$(document).ready(function() {
  info_field = $("#edit-submitted-itogovaya-summa-zakaza");
  info_field.hide();
  $("#edit-submitted-qount").change(function(){
    count = $("#edit-submitted-qount").value;
    price = $("#edit-submitted-cena").value;
    if(count > 7 && count < 10 && price > 0){
      info_field.value = count * price;
      info_field.show();
    } else {
      info_field.hide();
    }
  });
});

"1541" wrote:
Что то такое должен получить?

нет, та хрень выше, это содержимое файла js, т.е. это нужно запихнуть во что то вроде копыта.js(пример названия файла), в template.php должен находиться только php, который будет прикреплять копыта.js к странице

Аватар пользователя 1541 1541 5 декабря 2012 в 14:51

"sg85" wrote:
что то типа этого?

да, да, да. что то типа этого. я только синтаксис немного не понимаю...
"sg85" wrote:
нет, та хрень выше, это содержимое файла js, т.е. это нужно запихнуть во что то вроде копыта.js(пример названия файла), в template.php должен находиться только php, который будет прикреплять копыта.js к странице

я уже понял. сейчас буду пробовать.. кстати id формы при записи необходимо брать в кавычки лии стаивть перед ней $? у меня айдишник получается из нескольких слов через дефис и на конце число. Так и должно быть?

Аватар пользователя sg85 sg85 5 декабря 2012 в 15:00

"1541" wrote:
да, да, да. что то типа этого. я только синтаксис немного не понимаю...

это jQuery

"1541" wrote:
кстати id формы при записи необходимо брать в кавычки лии стаивть перед ней $?

прочтите хоть пару строк про jQuery

id элементов в примере я брал с Вашего сайта, т.е. он должен работать и в том виде что есть сейчас.

Аватар пользователя 1541 1541 5 декабря 2012 в 15:22

Написал в teplate.php :

<?phpfunction phptemplate_form_editwebformclientform16_alter(&$form, &$form_state){
    drupal_add_js('/js/computedform.js');
}?>

и создал файл computedform.js с содержимым:

$(document).ready(function() {
  $("#edit-submitted-qount").change(function(){
    $("#edit-submitted-itogovaya-summa-zakaza").value = $("#edit-submitted-qount").value * $("#edit-submitted-cena").value;
  });
}

Все правильно? А то не считает почемуто..

"sg85" wrote:
это jQuery
разобрался в синтаксисе.

Аватар пользователя 1541 1541 5 декабря 2012 в 16:34

какой то заколдованый круг. поставил в template.php

<?phpfunction zen_form_webform_client_form_16_alter(&$form, &$form_state){
    drupal_add_js('sites/all/themes/zen/js/computedform.js','file');
}?>

уже как только не пробовал указывать путь к файлу.. все равно не видит. и base_path('theme','zen'. /js/competedform.js','file); все равно одни и те же грабли.. может как то иначе необходимо укзаывать путь?

Аватар пользователя 1541 1541 5 декабря 2012 в 20:40

Да, пробовал вставлять алерт на это событие он срабатывает. а вот путь к файлу не срабатывает. Может как то не так вставляю?

Аватар пользователя sg85 sg85 5 декабря 2012 в 21:19

какой алерт? в какое событие? если Вы про js, то там у вас не хватает закрывающей скобки и точки с запятой, а это есть синтаксическая ошибка из-за которой файл может быть не отработан, благо эти ошибки показывает фаербаг. Пытается ли подключить js файл и почему не подключает тоже можно увидеть через фаербаг.

Аватар пользователя 1541 1541 5 декабря 2012 в 21:47

пишу вот это:

<?phpfunction zen_form_webform_client_form_16_alter(&$form, &$form_state){
    drupal_add_js('jQuery(document).ready(function () { alert("Hello!"); });', 'inline');
}?>

и все срабатывает. А где не хватает скобочки?

Аватар пользователя sg85 sg85 5 декабря 2012 в 21:59

"1541" wrote:
А где не хватает скобочки?

$(document).ready(function() {
  $("#edit-submitted-qount").change(function(){
    $("#edit-submitted-itogovaya-summa-zakaza").value = $("#edit-submitted-qount").value * $("#edit-submitted-cena").value;
  });
}); <=вот тут

вообще $(document).ready при инлайновых вставках, на сколько помню, не нужен.

Аватар пользователя 1541 1541 5 декабря 2012 в 22:04

Ну это я так ставил поглядеть работает ли вообще. А пишет мне ошибку следующую: Warning: file_get_contents(/js/computedform.js) [function.file-get-contents]: failed to open stream: No such file or directory в функции _locale_parse_js_file() (строка 1488 в файле Z:\home\art1\www\includes\locale.inc).

в этом фале в этой строке написано:

// Load the JavaScript file.
  $file = file_get_contents($filepath);

может ему действительно надо вот так путь укзаывать? :base_path('theme','zen'. /js/competedform.js','file);

Аватар пользователя 1541 1541 5 декабря 2012 в 23:43

вобщем в шаблоне код следующий, только при нем не ругается:

function zen_form_webform_client_form_16_alter(&$form, &$form_state){
        drupal_add_js("sites/all/themes/zen/js/computedform.js");
}

в файле js код такой:

$(document).ready(function() {
  $("#edit-submitted-qount").change(function(){
    $("#edit-submitted-itogovaya-summa-zakaza").value = $("#edit-submitted-qount").value * $("#edit-submitted-cena").value;
  });
});

И не считает. Он вообще при каком событии должен высвечивать результат? когда цифры вводишь? Или тут нет вывода?

Аватар пользователя 1541 1541 6 декабря 2012 в 0:56

Вобщем добился я прочтением статей чтобы код заработал. Функция отрабатывает только результат не выводит. Инетересно почему?:(

Аватар пользователя 1541 1541 6 декабря 2012 в 1:15

Сделал проверку алертом:

jQuery(document).ready(function() {
  jQuery("#edit-submitted-qount").change(function(){
    jQuery("#edit-submitted-itogovaya-summa-zakaza").value = jQuery("#edit-submitted-qount").value * jQuery("#edit-submitted-cena").value;
          { alert("Hello!")};
        });
});

Алерт вылезает строго после изменения поля, но более ничего не происходит. Пытался вставить код который реализует сравнение. Так же вставил алерт. Алерт вылезает в любом случае. Т.е. код наверное не работает. Странно. Почему...

Аватар пользователя Antoniy Antoniy 17 декабря 2012 в 12:18

Я ajax-калькулятор к webform прикрутил (не Drupl Way, а просто jQery Ajax + PHP), на шестерке работало, а после обновления сайта до семерки, перестало работать. Блин, и не пойму почему.. по логике то все тоже самое в форме..

Аватар пользователя sg85 sg85 17 декабря 2012 в 16:15

Да не надо было отключать drupal.js, надо было тот кальк привести к виду no-conflict где-то на орге тема про это была.

Аватар пользователя Antoniy Antoniy 17 декабря 2012 в 16:40

"sg85" wrote:
Да не надо было отключать drupal.js

Да я уже понял. Скрипты отключал по очереди, чтоб выяснить какие конфликтуют. Через drupal.js пришел к информации о замене всех $ на jQuery в своем скрипте.

Аватар пользователя sg85 sg85 17 декабря 2012 в 17:19

не обязательно, для большинства достаточно

(function($){
...
//содержимое js файла
...
})(jQuery);

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

Аватар пользователя Antoniy Antoniy 17 декабря 2012 в 17:25

"sg85" wrote:

(function($){
...
//содержимое js файла
...
})(jQuery);

Спасибо, возьму на заметку. Уж лучше оборачивать, чем заменять все $ на что-то еще.