Категория:
Опубликовано:

Форма быстрого заказа (#2 - Entityform)

Fastbuy form

В прошлый раз мы рассматривали способ отправки информации со страницы заполнения формы, сделанной с помощью модуля Webform.

Но Webform считается устаревшим, и на его смену уже почти встали Entityform и его брат для D8 - eForm.

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

Создаем форму

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

И так, после установки и включения модуля Entityform, переходим на страницу создания формы (admin/structure/entityform_types/add).

Создаем форму, все настройки вносим по своим предпочтениям. Я только указал страницу формы (Submit URL alias) и изменил текст кнопки для отправки (Submit Button Text), для всех остальных параметров указал значение "<none>". Скриншот создания формы.

Форма создана, можно перейти к добавлению полей.

Преимущество Entityform перед Webform, как раз заключается в том, что Entityform является полноценной сущностью Drupal. Соответственно может использовать все типы полей доступных в системе, как ноды, термины или пользователи. Добавляем обычные текстовые поля "Имя" и "Телефон".

Поля формы

Теперь перейдем к созданию поля для информации о товаре. В примере с Webform мы создавали скрытое поле со значением по умолчанию, в которое помещали токен для замещение информацией из текущего запроса. Здесь нам нужно поступить также, вот только в Drupal'е нет скрытых полей из коробки. Но, как всегда, есть модуль - Field Hidden, решающий эту проблему. Устанавливаем его и включаем.

Теперь нам доступны новые типы полей: "Hidden decimal", "Hidden float", "Hidden integer", "Hidden text" и "Hidden long text". Из всего этого изобилия нам понадобится только "Hidden text". Его и добавим:

Скрытое поле

В настройках поля, открываем список доступных токенов (предоставляются модулем Token):

Просмотр токенов

В списке раскрываем блок "Текущая страница", и от туда копируем токен [current-page:query:?]

Нужный токен

Знак вопроса в токене заменяем на имя параметра, в котором потом будем передавать значение с заголовком товара. Я задам параметр product, таким образом мой токен будет иметь следующий вид:

[current-page:query:product]

Скриншот настройки поля.

Форма готова. Скриншот готовой формы. Можем её посмотреть:

Форма быстрого заказа

Все гуд - поля "Имя" и "Телефон" отображаются, поле "Товар" - скрыт.

Добавляем ссылку на вывод формы

Как и в примере по Webform, создадим блок с кнопкой (ссылкой) "Заказать", по нажатию на которую будет открываться окно с формой заказа. О том как это делается можно прочесть более детально в посте Всплывающие окна. Colorbox.

Во время создания формы я указал страницу отображения формы "buy_form", по этому адресу и будет доступна наша форма, и ссылку на эту страницу с параметром "product" мы будем передавать в блоке.

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

В поле "Заголовок" отключаем вывод поля ссылкой на ноду:

Отключение ссылки на содержимое

Перезаписываем выводимый результат - пункт "Заменить выводимое полем значение" устанавливаем значение "Заказать". Отмечаем пункт "Выводить это поле в виде ссылки" - "Путь ссылки" указываем:

buy_form?product=[title]

Перезаписать результат

Добавляем класс ссылки "colorbox-node":

Класс ссылки

И добавляем контекстный фильтр по NID:

Контекстный фильтр по NID

Все. Скрин готового представления.

Теперь выводим блок в нужный регион на странице настройки блоков (admin/structure/block), и радуемся результату.

Вот так, мы все сделали, достаточно просто. Если возникнут вопросы - спрашивайте в комментариях.

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

Комментарии

А где в этом модуле указывается e-mail, на который будут уходить письма?

Письма отправляются правилами, в частности нужен модуль Entity Rules.

Спасибо! Попробую сейчас разобраться, как это сделать.

Ссылка, выведенная через
buy_form?product=[title]
передает на форму одно поле из вьюхи - [title]

А если вывести 2 поля вьюхи?
Пробовал buy_form?product=[title]&usluga=[title_1] - не работает.
Может операнд "&" неправильный?

buy_form?product=[title]&usluga=[title_1]

Именно так и нужно выводить.

Нужно проверить есть ли поле (с токеном [title_1]), и настроен ли параметр "usluga" в форме.

Значение по умолчание в скрытом поле:
[current-page:query:product&usluga]
Путь ссылки в views
buy_form?product=[title]&usluga=[title_1]
На выходе ссылка имеет вид:
buy_form?product=Починить Ноутбук Dell insperion x2&usluga=Установка ГТА5
Форма работает, но скрытое поле НЕ получает значание 2-х параметров. Если параметр один - все норм.

[current-page:query:product&usluga] - неправильно!

Правильно:

[current-page:query:product] - для поля в котором должно быть значение товара (продукта...)

[current-page:query:usluga] - для поля в котором должно быть значение услуги

Если 2 значения нужно поместить в 1 поле, нужно писать что-то вроде этого:

[current-page:query:product] [current-page:query:usluga] - все в одно поле.

Спасибо! Понял!

Здравствуйте. Вы описали как заказать товар, на странице которого находится покупатель. Подскажите пожалуйста как сделать, чтобы можно было заказать сразу несколько товаров одного типа материала. Как сначала выбрать нужные товары, а потом отправить заказ на них через форму заказа?

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

Можно написать свой модулек, решающий задачу.

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

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

Может хоть что то напишете? :) Например так нельзя или ты не понимаешь. Просто может в мелочи ошибка, а я буду биться как рыба об лед не видя очевидного.

Colorbox показывает ровно то, что есть на странице, которую в нем выводят. Без разницы - обычные поля, или коллекции полей...

Проверьте права доступа к странице с формой.

Думаю не в правах непосредственно дело, у меня, как у админа, есть права на все, да и галки все на месте.

Не готов назвать причину подобного поведения. Проверьте все, сбросьте кеши... Подобное поведение ранее не наблюдал.

когда делал попап на вебформ то такая проблема возникала при ссылке типа webform/#id, сменил на node/#id и все заработало, а с ентити не делал такого.

подскажите пожалуйста, produkt у Вас это тип материала? Я вставляю именно его, может в этом проблема?

Адрес страницы на которой размещается форма указывается при создании, в поле "Submit URL alias". На эту страницу и следует ссылаться.

"produkt" - имя параметра, в котором я передавал имя товара.

[current-page:query:obj] это значение по умолчанию поля, rooms_booking?obj=[title] это перезаписанный урл, rooms-booking это Submit URL alias, и все равно нет прав доступа.

Смотрите сформированную ссылку - должна вести на существующую страницу (попробуйте открыть без Colorbox'а).

пишет что страницу не найдено

Ссылайтесь на существующие страницы.

так в том то и проблема что страница формы по ссылке /rooms-booking есть. Поля есть, заполнить можно.

извините что столь долго портил Вам нервы) Привычка выставлять нижний дефис меня завела в эти дебри. Все работает. Спасибо за статью. Если бы еще ответил по мере возможности на другую проблему то был бы очень благодарен) Как же все таки вытащит в форму селектовое поле из материала. Референсом пробую но тут тоже тупик.

Слишком глубоко ветка зашла. Новую начну.

Поясните подробнее, что Вы пытаетесь сделать? Вывести в форму (Entityform) поле из ноды, переданной в параметре?

да, есть отель с разными типами номеров, при создании материала они формируются коллекцией полей (могу переделать просто в селект) вот этот список надо передать в форму для выбора уже в ней,. Пробую по тому же принцыпу [current-page:query:field_number_types] в значение по умолчанию, но значения не подтягиваются.

Поймите сам принцип - в параметр передается просто значение (GET-параметр). Передавать списки, особенно большие - как минимум плохая идея...

Вы можете передать 1 параметр, например NID материала (номера), и в форме уже делать с ним необходимые манипуляции.

Есть всевозможные Viewfield, с подобными модулями можно попробовать "наколхозить" что-то похожее. По сути - создаете представление с контекстным фильтром по NID, и в нем выводите нужные поля, далее добавляете поле-представление в форму (Entityform), в котором передаете аргументом параметр из запроса (NID ноды номера/комнаты). Как-то так...

Но, конечно же, более правильно в этом случае - написать небольшой модулек, решающий эту проблему.

понял, спасибо, буду копать в сторону модуля)

Здравствуйте! Сделал все по инструкции, вроде проверил кучу раз. Вместо заголовка выводится в поле выводится [current-page:query:product]
что это может значить, подскажите пжлста.

Аналогичная проблема, может кто то подскажет в чем может быть причина?