Помощь начинающим веб
разработчикам

Выводим значения ноды в вебформу через GET

25.01.2013

Хочу затронуть такую не очень сложную, но очень распространенную тему в drupal, как вывод любых значений ноды, будь то заголовок материала или поля - в форму. Данный метод широко распространён при создании небольших интернет-витрин, где нет необходимости вести глубокие отчёты и использовать различные методы доставки и так далее, хотя Ubercart и Commerce с этим так же легко справляются, но согласитесь, что для реализации простого функционала использовать тяжёлые модули не имеет под собой ни какой грамотной основы. Итак приступим, давайте создадим новый тип материала, например – продукция, которая будет иметь 3 дополнительных поля

  • Изображение
  • Артикул
  • Цена

Как создаётся тип материала и его поля рассказывать не буду, и так знаете, покажу лишь результат

И создадим несколько нод только, что созданного типа материала, у меня это выглядит вот так

С продукцией разобрались, теперь нам необходима форма для заказа. В форму мы должны будем передать 3 значения

  • Заголовок
  • Артикул
  • Цена

Для начала создадим необходимую нам форму, кто не знает как это реализовывается идём сюда и читаем внимательно. Кто в курсе смотрим на результат, примерно такая же форма должна быть и у вас

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

node.tpl.php

И впишем в него ссылку на данную форму (я использую шаблон Bartik)

Заказать 

Сохраняем и видим, что теперь ссылка присутствует у всех нод.

Но по клику по ссылке «Заказать», мы видим, что поля веб формы пустые

Давайте теперь всё это дело исправлять, если вы хоть немного знаком ы с PHP, то наверняка слышали про передачу данных через GET, именно его мы и будем использовать. Для начала нам необходимо построить передачу этих данных, для этого нам понадобятся машинные имена полей для нашего типа материала «Продукция» и машинные имена нашей формы, а именно:

Поля «Продукции»

  • Артикул -> field_product_artikul
  • Цена -> field_product_price

Поля вебформы

  • Название продукта -> name_product
  • Артикул -> artikul
  • Цена -> price

Теперь строим передачу. Давайте для начала передадим заголовок в форму, заголовок в ноде выводится как

<?php print $title;?>

Открываем файл

node.tpl.php

В том месте, где мы выводили ссылку на форму и дописываем вот такую конструкцию

?name_product=<?php print $title;?> 

Сохраняем файл. Но этого не достаточно, теперь нам необходимо вывести данное значение в поле формы «Название продукта», для этого переходим к полям веб формы и открываем на редактирование поле «Название продукта» и в качестве значения по умолчанию пишем

%get[name_product]

И сохраняем.

Теперь посмотрим, что у нас из этого получилось, кликаем по «заказать» в ноде

И видим, что значение передалось. Теперь давайте передадим «Артикул в форму». Опять Открываем файл

node.tpl.php

В том месте где мы выводили ссылку на форму и дописываем к уже имеющейся ссылке вот такую конструкцию

&artikul=<?php $node->field_product_artikul['und']['0']['safe_value'];?>

Замечу, что данным кодом

<?php $node->field_product_artikul['und']['0']['safe_value'];?>

Мы вытащили лишь значение поля, а не всё поле целиком. Теперь опять же переходим в редактирование полей вебформы, а именно нас интересует поле «Артикул», и в качестве значения по умолчанию записываем

%get[artikul] 

Сохраняем и смотрим, что получилось, кликаем по «Заказать»

И видим, что всё выводится как нам и необходимо. Следующее поле «цена» выводится абсолютно индентичным образом, разве только название полей меняются, думаю с этим вы без труда справитесь. На этом всё.

Обновление 12.01.2015

В версиях 7.x-4.x и выше get параметры передаются через токен, например ссылка имеет вид:

  1. <a href="http://example.com/node/123?foo=bar" title="передать значение через get">передать значение через get</a>

то токен примет следующий вид:

  1. [current-page:query:foo]

где [foo] - является ключом

Узнавай о новых статьях сайта - первым. Просто подпишись на рассылку.

Комментарии (22)

Profile picture for user Arcad
Макс
22.10.2013

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

Profile picture for user pantey
pantey
22.10.2013

Писать самому через jQuery. Готовых вариантов не встречал.

Profile picture for user Arcad
Макс
25.10.2013

Еще. Как добавить условие в node.tpl.php, чтобы ссылка ЗАКАЗАТЬ не выводилась под самой формой заказа?

Profile picture for user Arcad
Макс
25.10.2013

Вопрос снят. Удалил строчку из node.tpl.php и добавил в node--product.tpl.php. Теперь ссылка выводится только под продуктом. Спасибо за заметку.

Profile picture for user Arcad
Игорь
15.05.2014

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

Profile picture for user Arcad
Владимир
09.07.2014

Спасибо, отличное решение. Подскажите, а если ноды выводятся через views, каким образом можно передать заголовок в форму?

Profile picture for user Arcad
Игорь
09.07.2014

Если через views, то еще проще.
В настройках поля со сслыкой на форму, нужно нажать "Перезаписать результаты" и изменить адрес по описанному выше принципу.

Profile picture for user Arcad
Владимир098
09.07.2014

Спасибо за ответ. Я создал текстовое поле в типе материалов, в views, в пункте перезаписать результаты выбрал (Выводить это поле в виде ссылки) и вставил (/node/3?title=) но как я понял views не воспринимает это ссылку как php, когда перехожу по этой ссылке, браузер выдает страница не найдена

Profile picture for user pantey
pantey
09.07.2014
заказать

выводить ссылкой - снять.

Profile picture for user Arcad
Гость
26.06.2015

Спасибо. Но только через поле "NID" -- /node/2?name=[title] Установить - Выводить это поле в виде ссылки .

Profile picture for user Arcad
Владимир
09.07.2014

Спасибо) А куда это вставлять если вывод ссылкой снять?

Profile picture for user pantey
pantey
09.07.2014

когда, вы поставили галочку "переписать результат" и у вас появляется поле, вот в него и вставлять.

Profile picture for user Arcad
Владимир098
09.07.2014

Когда я нажимаю "переписать результат" у меня появляется следующие
скрин
Я как понял вы мне привели привели пример, для вставки непосредственно в саму ноду

Profile picture for user pantey
pantey
09.07.2014

нет. Это для поля "Заменить выводимое поле значением"

Profile picture for user Arcad
Владимир098
09.07.2014

Все понял) Ну я и так тоже пробовал, заголовок ноды не передается, в место него передается "[node:title]" Вот если делаю все как в статье, работает отлично, ну вот через views никак. Такое ощущение что он не обрабатывает токены и php, т.е так и есть)

Profile picture for user pantey
pantey
09.07.2014

ссори, не правильно вам написал, вместо

[node:title]

должно быть

[title]
Profile picture for user Arcad
Владимир098
09.07.2014

Спасибо большое!) Все теперь отлично работает)))

Profile picture for user Arcad
kuvirkot
06.10.2014

Приветствую!
у меня выводит в поле значение саму функцию %get[name_product]
никак не найду, в чем причина
ссылку с Заказать в ноду прописал
кэш почистил
модуль php фильтр включил, праава назначил

есть ли распространные возможные причины?

Profile picture for user Arcad
kuvirkot
06.10.2014

при этом token корректно отображает
не может быть конфликт с модулем token?

Profile picture for user Arcad
Сан
24.10.2014

Такая же проблема

Profile picture for user Arcad
Артем
29.09.2015

Таже самая проблема. Как ее решить ? У кого нибудь получилось ?

Profile picture for user pantey
pantey
29.09.2015

читайте ниже обновление от 12.01.2015

Добавить комментарий