Калькулятор на Drupal без программирования. Переходи на темную сторону силы! Познай мощь D7!

Аватар пользователя VasyOK VasyOK 17 января в 1:22
5

Товарищ https://drupal.ru/username/bumble у себя на сайте https://blogpost.pp.ua/drupal/93 рассмотрел возможность формы заказа чего нибудь на webform. А что если к этой форме приделать калькулятор? Ура, такая возможность есть благодаря модулю webform_calculator
Модуль позволяет ставить на вебформу новое поле типа формула.

Краткая инструкция

У модуля есть 2 не очевидных момента:

1. Обработка списков.

Есть переменная {rayon}. Принимает значения в зависимости от того, что выбрано в списке поля район. Естественно несколько районов могут иметь одинаковое значение переменной. Если заполнять поле район так:

3500|Дзержинский район
3500|Индустриальный район
3500|Ленинский район

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

3500|Дзержинский район
3500.0|Индустриальный район
3500.00|Ленинский район

2. Ограниченное количество математических функций (и операторов).

На момент поста используется dev версия модуля. В ней работает больше операторов по сравнению с текущей «зеленой» версией. Например оператор возведения в степень.

Мне была необходима функция округления в большую сторону — ceil.
Полез в файл модуля matheval.class.php и добавил ее в конец поддерживаемых функций так:


public $fb = array(  // built-in functions
        'sin','sinh','arcsin','asin','arcsinh','asinh',
        'cos','cosh','arccos','acos','arccosh','acosh',
        'tan','tanh','arctan','atan','arctanh','atanh',
        'sqrt','abs','ln','log','ceil'); /*вот она в конце*/
?>

Всё! Новая функция работает. Она же из PHP.

Результат тут.
http://kapital-trans.ru/arenda-kran-borta-perm
http://kapital-trans.ru/kran-bort-kamaz

Полная инструкция.

Если кто-то не понял как сделана форма заказа, привожу методичку ниже. Инструкция установки вебформы перекликается с рецептом bumble. ИТ профессионалы могут не читать.

Задача

Сделать калькулятор аренды техники. Единица техники (самосвал, трактор) — отдельная нода. Для рассчета используется поле Цена — целое число, разделители тысяч, преффикис, суффикс в настройках не заданы. Стоимость аренды техники зависит от:

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

Используются модули

Модули должны быть как минимум включены. Обращаем внимание на дату поста если в скобках указана версия.
colorbox
colorbox_node
webform
webform_ajax (7.x-1.1+4-dev)
webform_calculator (7.x-2.0-beta1+5-dev)
webform_default_fields

Компоненты вебформы

Создаем материал типа webform с компонентами. Настройки компонентов чуть ниже.

Техника/модель

Район

Почему после точки нули? Скроллим наверх и читаем краткую инструкцию.
n|Другой — свой вариант района. Цена будет договорная :)

Количество часов


Время на дорогу. Вот и наша первая формула. Просто получает число из списка районов.

Общее время. Еще одна формула.

Стоимость с учетом дороги. Не так важно что делает функция ceil, как откуда эта функция берется. Крутим вверх к краткой инструкции п.2.
Сообщение об ошибке — договорная, появляется если пользователь ввел район, которого нет в списке (или еще что-то ввел, что не предусмотрел разработчик).

Настройки вебформы

Эти обязательные. Остальные настройки — по желанию.

Пустая вебформа

Полученная форма работает. Но ничего не считает.

Вьюха для вывода кнопки заказа на ноде.

Все настройки полей и контекстных фильтров на скринах.

Контекстный фильтр вьюхи

Код кнопки

Вбита формула
<a class="colorbox-node" href="/arenda-tehniki?product=[title]&tzena=[field_prise]" rel="nofollow" data-inner-width="600" data-inner-height="620">Заказать</a>

Тут:
colorbox-node – класс от модуля Colorbox node
arenda-tehniki — урл нашей вебформы. Если пилите по это методичке самое время вернуться на вебформу и задать его.
?product=[title]&tzena=[field_prise] — соприкосновение полей вьюхи с полями формулы на вебформе.
rel="nofollow" — директива для сеонистов, которые не хотят индексировать форму по ссылке.
data-inner-width="600" data-inner-height="620" — ширина и высота всплывающего окна. Можно не использовать.

Вывод кнопки на ноде.

Полученная вьюха — это блок. Выводим его в нужном месте. Можно вывести блок программно. Можно добавить условия в фильтр вюхи. Или даже использовать модуль context. Можно воспользоваться модулем viewfield и тогда не будет потребности в выводе блока.

В результате это должно выглядеть как-то так:

По нажатию на кнопку закзать должна появится вебформа в колорбоксе. Заголовок формы (На скрине «Аренда техники») можно убрать через CSS или правку шаблонов.

Вывод конопки заказа для группы нод

Вьюху из примера можно модифицировать, для вывода группы нод (скрин ниже). Кнопка Заказать будет передавать на вебформу данные со своей ноды. Настройки полей аналогичны предыдущей вьюхе. Только на этот раз поля не скрыты.

Должно получиться что-то типа:

Всё. Надеюсь кому-то пригодится. Кому что не понятно — спрашиваем. Критика разрешается.

Комментарии

Аватар пользователя mailfox.ru mailfox.ru 22 января в 17:06

webform в D8 вооще могучая штука, претендует занять свою нишу в ядре как в своё время views