Добрый день. Мне необходимо сделать пересчет значений из полей вебформы. Подскажите как? Не знаю где ковырнуть чтобы значения выудить из полей и вставить после результат в иное поле. Уберкарт и коммерц не предлагать. И лучше на PHP, если возможно.
Добрый день. Мне необходимо сделать пересчет значений из полей вебформы. Подскажите как? Не знаю где ковырнуть чтобы значения выудить из полей и вставить после результат в иное поле. Уберкарт и коммерц не предлагать. И лучше на PHP, если возможно.
Комментарии
Может можно в каком нибудь шаблоне прописать все условия и все? только вот в каком и как выудить значения полей и после проставить их?
Лучше на Drupal API, и в идеале через аякс, так и наберите в гугле "ajax калькулятор на drupal", примеров будет много
Спасибо, но вот как потом его разбирать, мне же надо всего два поля перемножить:(
<?php
$results = db_select('webform_submitted_data','wsd')
->fields('wsd',array('data'))
->condition('nid',$номер_ноды_вашей_формы)
->condition('sid',$номер_ответа_или_как_там_его)
->condition('cid',$номер_компонента)//можно не указывать, тогда в результатах должны быть все, либо через оператор IN выбрать несколько нужных
->execute()->fetchAll();
?>
как-то так, но я понятия не имею чего именно Вам надо, так что лучше почитайте про абстрактный слой БД.
и не совсем понял, чего разбирать?
Разбирать я имел ввиду код аяксового калькулятора. У меня есть вебформа, в ней в одно поле вводится информация пользователем в другое она передается с ноды. И существует пустое поле куда хочу результат вернуть.Вот мне недо значения одного поля умножить на значение другого и результат записать в третье.
Тут 2 варианта:
1 через альтер формы добавляете аякс сабмит и описываете функцию этого сабмита(на PHP)
2 через тот же альтер меняете сабмит, описываете его функцию, потом каким то непонятным способом прикручиваете туда старый сабмит и т.д., т.е. влазите в логику работы модуля webform с не совсем понятными костылями.
Вариант 1, с аяксом, проще в разы. Ибо Вам по сути надо написать 10 строк кода на PHP, а не городить огород из костылей как во 2м случае.
альтер формы
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
и по прежнему не совсем понимаю, что именно нужно сделать
Спасибо за литературу, сейчас буду пробовать читать.
Обычная веб-форма, сделанная как страница заказа. В ней % полей текстовых: Имя, Адрес, Количество, Цена, Итого. В поле Цена значение приходит из ноды при помощи $_GET, пользователь вводит количество и вот надо количество умножить на цену чтобы в поле Итого получилась сумма.
Есть модуль Webform Calculator, попробовал поставить его. Появился тип поля в веб-форме Formula. Но, документацию не нашел по модулю в пример который в описании написан на орге не подходит. Т.е. вставляю имена полей а ничего не происходит.
я и забыл про неё
вообще можно еще это использовать(делал с ним как-то нечто подобное)
http://drupal.org/project/computed_field
не пользовался им.
computed_field предоставляет поле для fields, т.е. ищите его в виджетах(или как они там) в настройках полей типа материала Вашей веб формы.
Хорошо, спасибо за информацию буду разбираться.:)
А перемножить два числа яваскриптом религия не позволяет? Вы ещё Views + VBO для этой задачи прикрутите...
Я так понял, что данные должны браться откуда-то из БД, так что в любом случае эти данные нужно сперва получить и вывести.
позволяет, но JS не владею. Можете что то конкретное подсказать?
я их передаю в эту форму с помощью $_GET, и подставляю в поля. А вот из этих полей уже надо снова выудить и перемножыть. Computed Fields не вариант, т.к. он добавляет типы полей в тип материала а не в саму форму.
$("#field3").value = $("#field1").value * $("#field2").value;
}
А вообще, я так понял, что нужно при выводе формы, просто отобразить пользователю результат умножения полей и эти данные нигде более не используются? Тогда правильнее, наверное, будет через шаблон ноды.
Вот именно. Эти данные только передаются в форму которая пересылается на е-мейл, но они туда передаются стандартными процедурами веб-форм. Я тоже так думаю что через шаблон можно сделать, вопрос как. Точнее вопрос раскладывается на пункты:
1. В каком файле вносить изменения?(сделал файл типа webform-form-$nid.tpl.php)
2. Как в нем достучаться до полей именно формы а не ноды?
1. node--#.tpl.php где # - номер ноды. Не забудьте очистить кеш темизации.
2. посмотрите содержимое переменных
Ну это хорошо, только вот у меня переменные в форме а в ноде нет этих переменных. как тут быть?
Скажите где это написать? В шаблоне ноды? В каком месте? И именно так как тут указано?
Вот мой сайт на нем если нажать перейти к заказу переходит на форму, в которую передаются данные, вот там надо ввести количество. И когда оно введено необходимо чтобы в форме перемножалось на цену и высвечивался результат:(
там все несколько проще, отрывок из 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, где # номер Вашей формы и правите как Вам нужно.
это JS, его писать нигде не нужно, если будете выводить это поле через шаблон.
Есть еще вариант - добавить к форме элемент markup в нужном месте с результатами вычислений через альтер формы. По моему этот вариант будет более правильным.
рекомендую поставить модуль 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 добавляете:
dsm($form_id);//смотрим ID формы
dsm($form);//смотрим какие поля передаются
}
чистите кеш, заходите на Вашу форму под админом, там будет написан её id в статусах друпал, за тем убираете из template.php эту функцию и пишите там нечто-вроде:
$form['res'] = array(//добавляете к форме новое поле
'#type' => 'markup',//тип поля - метка(просто текст)
'#markup' => $form['field1']['#default_value']*$form['field2']['#default_value'].' какой-то там текст';//складываете подсмотренные данные, можно так же использовать $_GET['price'], но стоит предусмотреть случай, когда эта переменная не задана, и а так же есть смысл в check_plain()
);
}
и снова чистите кеш.
Правда не увидел откуда берется 2е поле.
Второе поле это поле формы : Количество
Блин, т.е. это поле при генерации формы пустое? тогда это как раз js
$("#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()
Скажите а можно ли в этом виде задать условие для сравнения? Ну что то типа:
if x>5 and x<7 then "показать это значение"
else
if x>7 and x<10 then "показать поле такое то" "вывести результат там то"?
Что то такое должен получить?
<?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;
});
}
}
?>
что то типа этого?
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();
}
});
});
нет, та хрень выше, это содержимое файла js, т.е. это нужно запихнуть во что то вроде копыта.js(пример названия файла), в template.php должен находиться только php, который будет прикреплять копыта.js к странице
да, да, да. что то типа этого. я только синтаксис немного не понимаю...
я уже понял. сейчас буду пробовать.. кстати id формы при записи необходимо брать в кавычки лии стаивть перед ней $? у меня айдишник получается из нескольких слов через дефис и на конце число. Так и должно быть?
это jQuery
прочтите хоть пару строк про jQuery
id элементов в примере я брал с Вашего сайта, т.е. он должен работать и в том виде что есть сейчас.
Написал в teplate.php :
<?phpfunction phptemplate_form_editwebformclientform16_alter(&$form, &$form_state){
drupal_add_js('/js/computedform.js');
}?>
и создал файл computedform.js с содержимым:
$("#edit-submitted-qount").change(function(){
$("#edit-submitted-itogovaya-summa-zakaza").value = $("#edit-submitted-qount").value * $("#edit-submitted-cena").value;
});
}
Все правильно? А то не считает почемуто..
разобрался в синтаксисе.какой то заколдованый круг. поставил в 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); все равно одни и те же грабли.. может как то иначе необходимо укзаывать путь?
альтер формы точно срабатывает? кеш чистили?
Да, пробовал вставлять алерт на это событие он срабатывает. а вот путь к файлу не срабатывает. Может как то не так вставляю?
какой алерт? в какое событие? если Вы про js, то там у вас не хватает закрывающей скобки и точки с запятой, а это есть синтаксическая ошибка из-за которой файл может быть не отработан, благо эти ошибки показывает фаербаг. Пытается ли подключить js файл и почему не подключает тоже можно увидеть через фаербаг.
пишу вот это:
<?phpfunction zen_form_webform_client_form_16_alter(&$form, &$form_state){
drupal_add_js('jQuery(document).ready(function () { alert("Hello!"); });', 'inline');
}?>
и все срабатывает. А где не хватает скобочки?
$("#edit-submitted-qount").change(function(){
$("#edit-submitted-itogovaya-summa-zakaza").value = $("#edit-submitted-qount").value * $("#edit-submitted-cena").value;
});
}); <=вот тут
вообще $(document).ready при инлайновых вставках, на сколько помню, не нужен.
Ну это я так ставил поглядеть работает ли вообще. А пишет мне ошибку следующую:
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).
в этом фале в этой строке написано:
$file = file_get_contents($filepath);
может ему действительно надо вот так путь укзаывать? :
base_path('theme','zen'. /js/competedform.js','file);
вобщем в шаблоне код следующий, только при нем не ругается:
drupal_add_js("sites/all/themes/zen/js/computedform.js");
}
в файле js код такой:
$("#edit-submitted-qount").change(function(){
$("#edit-submitted-itogovaya-summa-zakaza").value = $("#edit-submitted-qount").value * $("#edit-submitted-cena").value;
});
});
И не считает. Он вообще при каком событии должен высвечивать результат? когда цифры вводишь? Или тут нет вывода?
Вобщем добился я прочтением статей чтобы код заработал. Функция отрабатывает только результат не выводит. Инетересно почему?:(
Сделал проверку алертом:
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!")};
});
});
Алерт вылезает строго после изменения поля, но более ничего не происходит. Пытался вставить код который реализует сравнение. Так же вставил алерт. Алерт вылезает в любом случае. Т.е. код наверное не работает. Странно. Почему...
Я ajax-калькулятор к webform прикрутил (не Drupl Way, а просто jQery Ajax + PHP), на шестерке работало, а после обновления сайта до семерки, перестало работать. Блин, и не пойму почему.. по логике то все тоже самое в форме..
Кажется понял. Отключил drupal.js и alax-калькулятор заработал. И что делать теперь с drupal.js ?
Да не надо было отключать drupal.js, надо было тот кальк привести к виду no-conflict где-то на орге тема про это была.
Да я уже понял. Скрипты отключал по очереди, чтоб выяснить какие конфликтуют. Через drupal.js пришел к информации о замене всех $ на jQuery в своем скрипте.
не обязательно, для большинства достаточно
...
//содержимое js файла
...
})(jQuery);
большинство плагинов, кстати, обернуты в это поумолчанию, так же саму запись
Спасибо, возьму на заметку. Уж лучше оборачивать, чем заменять все $ на что-то еще.