«Джинса» на Drupal или как «заказывать» материалы

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

Аватар пользователя direqtor direqtor 21 января 2009 в 11:09

При создании небольших сайтов часто бывает нужна какая-нибудь нестандартная особенность. Например, на сайте-каталоге товаров и/или услуг требуется форма заказа, привязанная к материалу (ноде). Подобный функционал: ссылка «Заказать» и форма для отправки сообщения с уже заполненной информацией о странице, которую заказали, уже близок к корзине онлайн-магазина. Но согласитесь, ставить ubercart или e-commerce ради одной нестандартной возможности несколько непрактично.

Всего-то надо немного расширить возможности штатных модулей. Итак, нам нужна форма отправки сообщения. Для ее создания воспользуемся модулем webform. Скачав и установив этот модуль обычным способом, мы получаем новый тип материала Webform, который позволяет создавать различные формы подтверждаемые пользователем. Создадим одну такую форму. Пусть ее NID равен 10 - он будет нам нужен, чтобы составить ссылку заказа. Добавим в эту форму несколько полей, Например имя посетителя, его адрес электронной почты и так далее. Не забудьте указать настройки e-mail для формы, тогда результат ее заполнения будет отправлен вам по электронной почте.

Пусть у нас также есть тип материала Продукт (product), который и представляет то, что наш пользователь будет заказывать. Идем в папку с шаблоном нашей темы и делаем там копию файла node.tpl.php под именем node-product.tpl.php. Открываем файл и добавляем в него нашу ссылку на форму заказа, сразу после переменной $content:

  <?php
    if ($page) {
      ?><div class="order">» <?php
        print l(t('Order'), 'node/10', array('query'=>array('product'=>$node->nid)))
      ?></div><?php
    };
  ?>

Теперь при просмотре полной ноды типа product у нас будет видна гиперссылка на нашу форму (node/10) с параметром NID текущей ноды в строке запроса. Перейдя по ссылке мы попадаем на форму. Дело осталось за небольшим. Как минимум в форме надо все-таки проинформировать посетителя, что он заказывает, да и вам не мешало бы получить адрес искомой страницы вашего сайта.

Для реализации этого функционала добавим в нашу форму еще два поля. Первое поле типа markup назовем Продукт. В его настройках занесем в Значение PHP-код:

<?php
 if($node=node_load($_GET['product']))
   print '<span class="label">' . t('Product') . ': </span>' . l($node->title, 'node/'.$node->nid)
?>

Пользователь увидит заголовок той ноды, которую он заказывает. Чтобы этот код обрабатывался как PHP, а не выводился в форму в виде текста, необходимо включить модуль ядра PHP-фильтр на странице сайта admin/build/modules.

Добавим еще одно поле типа hidden (скрытое). Значение по умолчанию выставим таким:

http://имя-вашего-сайта.ru/node/%request[product]

Теперь в нашей форме по умолчанию будет забит адрес исходной ноды сформированный при помощи токена %request[product], который позволяет обратится к параметрам строки запроса и получить значение product. Этот адрес будет отослан в письме вам, что и позволит найти интересующую пользователя страницу сайта.

Вот и все. Ваш материал «заказан».

«Джинса» на Drupal или как «заказывать» материалы

Комментарии

Аватар пользователя fasdalf@fasdalf.ru fasdalf@fasdalf.ru 22 января 2009 в 10:23

Знаете за что я люблю drupal.ru? За то что тут в тот же день, как сталкиваюсь с новой проблемой, тут постят ответы на половину моих вопросов.

Аватар пользователя dikovina dikovina 3 февраля 2009 в 18:52

Здравствуйте, Валентин!
Спасибо за статью, все получается как надо. У меня возник вопрос: а возможно ли подобным образом вытаскивать не только заголовок страницы, но и содержащиеся в ней другие поля, сформированные через CCK?

У меня возникло предположение, что возможно, но не совсем понятно, на что менять title. в этом коде:

"direqtor" wrote:

<?php if($node=node_load($_GET['product'])) print '' .
t('Product') . ':
' . l($node->title, 'node/'.$node->nid) ?>

Аватар пользователя direqtor direqtor 4 февраля 2009 в 4:48

"dikovina" wrote:
У меня возникло предположение, что возможно, но не совсем понятно, на что менять title. в этом коде:

На что-то вроде $node->field_имя_поля[0]['value']

Посмотрите что выдает для ваших нод print_r($node) и используйте то, что вам нужно.

Аватар пользователя direqtor direqtor 6 февраля 2009 в 6:58

"AntonTau" wrote:
Валентин, подскажите, пожалуйста, какие изменения в Вашем коде необходимо сделать для Drupal 5.x

gumk прав - никаких.

Аватар пользователя Antoniy Antoniy 6 февраля 2009 в 21:21

Я подумал про другой код для Drupal 5.x в связи со следующими обстоятельствами:

Drupal 5.11 Тестирую на Denver

Материал product создан с помощью CKK. Ноды product выводятся с помощью panels на главной (но это, думаю, другой вопрос).

На странице продукта ошибка:

warning: preg_match() expects parameter 2 to be string, array given in Z:\home\examle.com\www\includes\bootstrap.inc on line 679.

А на странице самой формы заказа webform такое сообщение об ошибке:

* warning: Invalid argument supplied for foreach() in Z:\home\ examle.com\www\modules\node\node.module on line 561.
* warning: implode() [function.implode]: Bad arguments. in Z:\home\ examle.com\www\modules\node\node.module on line 565.
* user warning: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 query: SELECT n.nid, n.vid, n.type, n.status, n.created, n.changed, n.comment, n.promote, n.sticky, r.timestamp AS revision_timestamp, r.title, r.body, r.teaser, r.log, r.format, u.uid, u.name, u.picture, u.data FROM node n INNER JOIN users u ON u.uid = n.uid INNER JOIN examle r ON r.vid = n.vid WHERE in Z:\home\ examle.com\www\includes\database.mysql.inc on line 174.

Аватар пользователя direqtor direqtor 6 февраля 2009 в 12:11

Мы с gumk неправы оба... Smile Сорри.
Есть различия в функции l()

  <?php
    if ($page) {
      ?><div class="order">&raquo; <?php
        print l(t('Order'), 'node/10', 'product='.$node->nid);
      ?></div><?php
    };
  ?>

Как то так...

Аватар пользователя Antoniy Antoniy 6 февраля 2009 в 19:05

Большое спасибо! Буду дальше тестировать. Я и сам об этой функции думал, но знаний английского не хватило, чтобы в API разобраться.

Аватар пользователя Antoniy Antoniy 6 февраля 2009 в 23:43

Видимо код для полей wevform Drupal 5.x тоже другой.

Ошибка:
* warning: Invalid argument supplied for foreach() in Z:\home\ examle.com\www\modules\node\node.module on line 561.
* warning: implode() [function.implode]: Bad arguments. in Z:\home\ examle.com\www\modules\node\node.module on line 565.
* user warning: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 query: SELECT n.nid, n.vid, n.type, n.status, n.created, n.changed, n.comment, n.promote, n.sticky, r.timestamp AS revision_timestamp, r.title, r.body, r.teaser, r.log, r.format, u.uid, u.name, u.picture, u.data FROM node n INNER JOIN users u ON u.uid = n.uid INNER JOIN examle r ON r.vid = n.vid WHERE in Z:\home\ examle.com\www\includes\database.mysql.inc on line 174.

И в поле hidden в отправленном заказе адрес главной страницы, т. е. http://example.com/node

Аватар пользователя realizator@drupal.org realizator@drup... 14 февраля 2009 в 1:27

direqtor - спасибо за отличную идею!
Адаптировал под 5-ку, использую.

Вот решение для Drupal 5.x (спасибо товарищу glu2006 за помощь):
1. В теме node.tpl.php пишем правильную ссылку:
вместо (для друпал 6)

print l(t('Order'), 'node/10',array('query'=>array('product'=>$node->nid)))

пишем (для друпал 5)

print l(t('Order'), 'node/10', array(),'product='.$node->nid, NULL, FALSE, TRUE);

это дает правильные ссылки вида node/10?product=(номер ноды продукта)

2. В поле markup вставляем код:

<?php
if ($_GET['product']) {/* чтобы не выдавал ошибок при простом просмотре формы без заказа*/
$node = node_load($_GET['product']);
 if($node)   print '<span class="label">' . t('Заказано') . ': </span>' . l($node->title, 'node/'.$node->nid);
};?>

Специально добавил строчку if ($_GET['product']), потому что без нее простой просмотр формы без переданных параметров выдавал ворнинги - попытка посмотреть тайтл несуществующей ноды.

Аватар пользователя avialaynen avialaynen 16 июля 2009 в 19:57

Что-то код в поле markup не работает. Выдает:
<?php
if($node=node_load($_GET['tour']))
print '' . t('Product') . ':' . l($node->title, 'node/'.$node->nid)
?>
Делаю все так (ну вместо "product" везде "tour" написал)

Аватар пользователя avialaynen avialaynen 17 июля 2009 в 10:50

direqtor wrote:
Режим поля в PHP-код переключите. Иначе поле просто выдаёт все как текст.

Формат ввода выбран Full HTML, и под полем "Значение" пишет, что разрешен HTML или PHP. Однако не работает

Аватар пользователя avialaynen avialaynen 10 ноября 2015 в 11:46

avialaynen wrote:
direqtor wrote:
Режим поля в PHP-код переключите. Иначе поле просто выдаёт все как текст.

Формат ввода выбран Full HTML, и под полем "Значение" пишет, что разрешен HTML или PHP. Однако не работает

Вот скрины:

Аватар пользователя direqtor direqtor 21 июля 2009 в 2:12

Покопался в настройках своего проекта. Все дело в модуле ядра PHP-фильтр. Если он отключен, то PHP-код не парсится. Включите его обязательно.

Аватар пользователя avialaynen avialaynen 21 июля 2009 в 17:11

direqtor wrote:
Покопался в настройках своего проекта. Все дело в модуле ядра PHP-фильтр. Если он отключен, то PHP-код не парсится. Включите его обязательно.

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

Аватар пользователя volocuga volocuga 27 июля 2009 в 22:35

Вот тут девушка недавно спрашивала,а мне тоже интересно:
если у нас вебформа в блоке на странице,как заполнить титлы вебформы титлами той ноды,на которой собственно находится этот блок?

Аватар пользователя direqtor direqtor 4 августа 2009 в 8:02

Это только способ получить заголовок страницы ноды в переменную $title. А куда вы её заюзаете – ваше дело.

Аватар пользователя Serega_od Serega_od 23 сентября 2009 в 13:44

Спасибо! Еще такой вопрос! При заполнении не всех обязательных полей на форме происходит редирект на форму с ошибкой о том что не все обязательные поля заполнены, НО, что самое главное, при этом теряется связь с продуктом!!! Приходится обратно возвращаться в продукт и нажимать "заказать". Как с этим быть?

Аватар пользователя Serega_od Serega_od 28 сентября 2009 в 23:12

Всё, нашел способ!!!
Добавляем скрытое поле в котором можно прописывать php код(hidden_dynamic), разработанное товарищем [user=anton-l-safin](за что ему отдельное спасибо) (http://www.drupal.ru/node/30338)
и туда уже вставляем код:

<?php
 if($node=node_load($_GET['product']))
   print ($node->field_имяполя[0]['value'].'http://site.com/node/%request[product]')
?>

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

Аватар пользователя Ne_L Ne_L 10 ноября 2009 в 2:18

прошу совета в какую сторону дуиать чтобы это всё сделать в виде CCK поля чтобы во Views вывести и чтобы всё заказанное в корзину складывалось опять же без ubercart и ecommerce

Аватар пользователя izabel izabel 17 ноября 2009 в 16:23

сделала все, как описано выше.
никак не получается увидеть гиперссылку на форму при создании типа материала product:(
что я делаю не так?

в файл node-product.tpl.php нужно добавлять php код после этой строки, да?
<?php if ($links) { ?><div class="links"><?php print $links?></div><?php }; ?>

UPDATE
Решено

Аватар пользователя direqtor direqtor 17 ноября 2009 в 17:15

Да где угодно добавляйте.

Эх, готово дополнение с решением проблемы неправильно заполненых обязательных полей, но нет времени его прилично описать....

Аватар пользователя izabel izabel 17 ноября 2009 в 17:25

direqtor, извините за дурацкий вопрос:). я просто в php не сильна. мягко говоря:)

скажите, а почему ссылка на форму заказа называется "Позиция" или это только у меня такой глюк?:((
как ее можно изменить на слово "Заказать"?

Аватар пользователя direqtor direqtor 17 ноября 2009 в 18:52

Там стоит t('Product'). Сия функция проверяет текущий язык системы и если он отличен от английского ищет в переводах перевод слова Product на текущий язык. Поищите в переводах интерфейса, как переведено это слово. У вас оно, видимо, переведено, как Позиция. Поменяйте. Либо поставьте свое слово в t() и переведите его так, как вам надо.

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 20 марта 2010 в 21:45

Завязано на типе материала. А если изначально все типы неизвестны, но могут проходить через одну форму?

Разобрался, типы ноды не причём.

Аватар пользователя lemet lemet 13 августа 2010 в 16:56

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

Аватар пользователя psyh psyh 31 марта 2011 в 9:24

"rulez22" wrote:
http://имя-вашего-сайта.ru/node/%request[product]
используйте
http://имя-вашего-сайта.ru/node/%get[product]

У меня почему-то от анонимных заказчиков приходят письма без ссылки на страницу товара. Пробовал и %get и %request.

Аватар пользователя direqtor direqtor 18 апреля 2011 в 5:47

Я эту проблему устранил у себя, но вот никак руки не доходят эту статью переписать. Сорри. Как найду время, перепишу.

Аватар пользователя Cowpland Cowpland 14 августа 2011 в 12:44

direqtor wrote:
Я эту проблему устранил у себя, но вот никак руки не доходят эту статью переписать. Сорри. Как найду время, перепишу.

Может кто-нибудь намекнет, как это сделать?

Аватар пользователя drozdyuk drozdyuk 29 июля 2011 в 7:09

Заменяем стандартный модуль webform на этот патченый, еще нужно поставить модуль token.
Он позволяет использовать для полей формы глобальные токены сайта.
Я не мог заставить модуль webform 3.11(который у меня отображался в виде блока непосредственно на странице товара) отправлять мне в письме заголовок товара со страницы которого была заполнена и отправлена форма, а также ссылку на эту страницу.
С помощью данного модуля проблема была решена.
1. Создал необходимые поля для заполнения.
2. Создал поле hidden со значением по умолчанию [[page-title]] (получил название товара)
3. Создал поле hidden со значением по умолчанию [[current-page-url]] (получил ссылку на товар)
Радуюсь Dirol

Аватар пользователя tispoint tispoint 18 августа 2011 в 22:20

Ну вот, оборвалось на самом интересном месте. Тоже интересуюсь решением проблемы анонимных заполнителей заполнятелей формы.

Аватар пользователя sumerokr sumerokr 19 августа 2011 в 0:46

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

вариант 1.
- ставим webform, создаем страничку единой формы заказа.
- заполняем webform-поля. + текстовое поле (или скрытое) со значением по-умолчанию %get[value]
- добавляем в тип контента поле link с именем "вопрос по товару" и по умолчанию прописываем:
--Заголовок - "Задать"
--URL - "node/10?value=[node:nid]" (node/10 - адрес единой формы заказа в этом примере)
вместо [node:nid] можно использовать другие токены, смотря что хотите вытащить. [node:nid] вытащит ID материала. [node:title] азвание материала и т.д.
по идее все, должно работать.

плюсы: все работает
минусы: нужно кликать на ссылку "задать вопрос" и идти на страницу формы. помимо этого, через %get можно вытащить только 1 значение.

вариант 2 (через родные комментарии)
- идем в разрешения ролей и даем анонимам права на постинг комментариев и отменяем права на просмотр.
- настройки комментариев для типа материала ставим такие:

- ставим модуль rules и его зависимости.
- создаем в нем новое правило
-- событие - создание нового комментария
-- действие - отправка е-майл
- заполняем поля (обратите внимание, что токенов здесь совсем мало, но на самом деле работают и другие, причем для всех полей), к примеру для тела письма я заполнил так:

имя отправителя: [comment:name]
e-mail отправителя: [comment:mail]
вопрос по объекту: [comment:node]
номер объекта: [comment:node:nid]
ссылка на объект: [comment:node:url]
сообщение:
[comment:body]

осталось только через "перевод интерфейса" поменять заголовки а-ля "оставить комментарий" на "задать вопрос", или "заказать товар"
если что-то кажется лишним в форме комментариев, можно скрыть через tpl.php, или, если по-деревенски (мой случай), то через css.

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

P.S. все написанное выше работает на д7, насчет д6 не проверял.

Аватар пользователя Айдар Айдар 23 августа 2011 в 23:46

Не, пи...жю! Не срабатывает [node:nid], срабатывает [nid]
Плюс не забыть в настройках поля в типае материала поставить галку "Разрешить пользовательские маркеры".

Аватар пользователя Motorvideo Motorvideo 29 января 2012 в 11:22

"direqtor" wrote:
Добавим еще одно поле типа hidden (скрытое). Значение по умолчанию выставим таким:
http://имя-вашего-сайта.ru/node/%request[product]

Токен %request не работает для анонимных пользователей. Это написано в интерфейсе по заполнению поля hidden. В нижней части экрана. Цитирую:
* * * * *
Special tokens
%profile[ключ] - Any user profile field or value, such as %profile[name] or %profile[profile_first_name]
%get[ключ] - Tokens may be populated from the URL by creating URLs of the form http://example.com/my-form?foo=bar. Using the token %get[foo] would print "bar".
%post[ключ] - Tokens may also be populated from POST values that are submitted by forms.
In addition to %get and %post, the following super tokens may be used, though only with logged-in users: %server, %cookie, and %request. For example %server[HTTP_USER_AGENT] or %session[id].
* * * * *
Я использовал токен %get. Все заработало.

Drupal 6.22, Webform 6.x-3.15.
Спасибо автору за решение.

Аватар пользователя Antoniy Antoniy 31 мая 2012 в 9:03

Спасибо! Адаптировал данное решение для выбора продукта через список продуктов на views.

Делаем в представлении поля:
1) Поля продукта (картинка, заголовок и т. п.)
2) Поле Материал:Nid и скрываем его из вывода.
3) Поле Пользовательский текст, в него вписываем:

&raquo; <a href="/node/10?product=[nid]">Заказать</a>

где node/10 - адрес webform для оформления заказа, а product - машинное наименование типа материала Продукт. [nid] - токен взятый из поля Материал:Nid, которое добавили ранее и скрыли, этот токен будет передавать nid продукта форме оформления заказа.

В итоге адрес по ссылке "Заказать" должен выглядеть, как http://имя-сайта.домен/node/10?product=168 (168 - это nid продукта).

А далее с webform, как описал direqtor в топике

Аватар пользователя Antoniy Antoniy 31 мая 2012 в 14:12

И еще одна фича в связи с views:

Допустим список views с продуктами и сама webform'а заказа блоком на одной странице.
Страница со списком views продуктов имеет путь /products

Поле Пользовательский текст views вместо:
&raquo; <a href="/node/10?product=[nid]">Заказать</a>
Вписываем:
&raquo; <a href="/products?product=[nid]">Заказать</a>

Открывается та же страница со списком продуктов и формой заказа в блоке, но в форме заказа уже появляется заказываемый продукт.

Аватар пользователя Antoniy Antoniy 31 мая 2012 в 22:00

Пока прикрутил всплывающее окно для формы заказа, как описано здесь.

Довольно удобно: пользователь заходит в каталог товаров, кликает "Заказать" на одном из них, и ему всплывает форма заказа, в которой помечено, что он заказывает.

Только вот lightbox думаю придется менять на colorbox или popups API. Iframe lightbox какой-то жестокий)

Еще бы научится передавать в webform не только заголовок ноды, но и значение других полей.

Аватар пользователя Antoniy Antoniy 1 июня 2012 в 22:33

Чтобы nid продукта передавался через поле hidden на email у меня сработало не %request а %get (Drupal 6.25)

Т. е. http://имя-вашего-сайта.ru/node/%get[product]

Ссылки по теме:
Webform: PHP-код в скрытом поле (hidden)

Если в типе материала product используется computed field и использование %get

Аватар пользователя Antoniy Antoniy 2 июня 2012 в 23:46

"Artu" wrote:
спасибо, полезно

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

Аватар пользователя MXM MXM 9 июня 2012 в 7:56

Kremenetskiy wrote:
Только вот вопрос как передавать другие динамические данные из markup в hidden. Сделал в markup генератор случайных чисел типа лотерея, а как передать в hidden, чтобы по почте оправлялось пока не знаю.

Это конечно колхозный вариант, народ рекомендует делать через hook_form_alter(), но т.к. в Drupal'е я пока полный нуб, то сделал так:
1) Создал поле textfield (пустое), назвал его к примеру "link" (Это название ниже используется в submitted[link]). Это поле в форме можно будет скрыть присвоив уникальному классу поля display:hidden...
2) Создал поле markup (PHP filter включен) и в нем прописал следующее:

<?php
if (isset($_GET['product'])){
  if(
$node=node_load($_GET['product'])){
    print 
'<input type="hidden" name="submitted[link]" value="http://site.ru/node/'.$node->nid.'" id="submitted-sponsor"/>';
  }
}
?>

Таким образом у нас происходит подмена submitted[link] изначального тем submitted[link] что мы вычислили (главное чтобы они стояли именно в описанном порядке)

Инструкцию нашел здесь http://www.drupal.ru/node/30338 но со скрытым полем у меня не стало работать

Аватар пользователя Antoniy Antoniy 9 июня 2012 в 9:22

Что-то в value=" " php код у меня не работает, выводится как текст.
не потому ли, что

<?php
print '<input type="hidden" name="submitted[link]" value="http://site.ru/node/'.$node->nid.'" id="submitted-sponsor"/>'
?>

выводит то, что заключено в ' ' как есть (как текст).

Аватар пользователя MXM MXM 10 июня 2012 в 5:43

Код скопировал с рабочего примера - как текст оно и должно выводиться, где идет вычисление там '.$node->nid.'

Аватар пользователя MXM MXM 8 июня 2012 в 7:02

Внесу небольшую поправку. С ошибкой столкнулся на D7, но на D6 думаю она тоже имеет место быть...

Если все делать по предложенному варианту то при обращение к форме с параметром product (h++p://site.ru/node/10?product=200) все работает прекрасно. А если со всеми заданными настройками обращаться к форме на прямую (h++p://site.ru/node/10), то выдается ошибка:
Notice: Undefined index: product в функции eval() (строка 3 в файле Y:\home\***\****\modules\php\php.module(80) : eval()'d code).
Избежать ее поможет простая проверка:

if (isset($_GET['product'])){
  if($node=node_load($_GET['product'])){
    print '<span class="label">' . t('Product') . ': </span>' . l($node->title, 'node/'.$node->nid);
  }
}
Аватар пользователя Antoniy Antoniy 9 июня 2012 в 15:05

"Айдар" wrote:
Не срабатывает [node:nid], срабатывает [nid]
Плюс не забыть в настройках поля в типае материала поставить галку "Разрешить пользовательские маркеры".

А у тебя получилось выставить значение по умолчанию, чтобы полюбому выводилось?

Аватар пользователя Айдар Айдар 9 июня 2012 в 20:23

Не понял про значение по умолчанию - чтобы, если по ссылке без параметра переходишь, то все равно что-то подставлялось?

Аватар пользователя Antoniy Antoniy 9 июня 2012 в 20:51

Заношу я в настройки поля типа link в значение по умолчанию следующее:
node/206/lightbox2?org=[nid]
(node/206 - форма, lightbox2 - чтоб форма во всплвающем айфрейме появлялась, org=[nid] - тип и id материала который нужно заказывать).

А оно (значение по умолчанию) не появляется в поле link у нод (ноды обновлял после создания поля link). Можт PHP-кодом заносить значение по умолчанию?

Хочу сделать, чтобы в поле link у всех нод типа материала вылазило значение по умолчанию, а у некоторых или какбы выключать поле, или очищать его.

Аватар пользователя Айдар Айдар 9 июня 2012 в 21:19

"Kremenetskiy" wrote:
А оно (значение по умолчанию) не появляется в поле link у нод (ноды обновлял после создания поля link).

А оно и не должно получаться - по умолчанию оно стоит вроде только на странице 'node/add'.

Только php-кодом получается.

Аватар пользователя Antoniy Antoniy 11 июня 2012 в 15:12

Токен [nid] работает в link field CCK, поставил модуль Token Fild и токен [nid] там тоже работает.

А вот в текстовых однострочных полях textfield CCK токены не работают. Подскажите, пожалуйста, как сделать чтоб токены в текстовых полях CCK работали?

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

Аватар пользователя Antoniy Antoniy 15 июня 2012 в 14:51

"Kremenetskiy" wrote:
Хочу вставлять ссылку заказа в виде иконки в текстовое поле со списком

Вставляю в CCK поле иконку, а в views прописываю вокруг нее нужную ссылку.

Аватар пользователя Antoniy Antoniy 15 июня 2012 в 14:59

Есть тип материала "Акции", там идет связь с компанией, которая проводит Акцию, по nodreference.
Заказываю материал типа Акция, с этим ясно. А как сделать, чтобы еще подгружался заголовок из поля nodereference, т. е. заголовок Компании, которая эту акцию проводит?

Сделал пока так:

<?php
 
if($node=node_load($_GET['action']))
   print 
'<span class="label">' t('Приз предоставляет') . ': </span>' l($node->field_org_share[0]['nid'], 'node/'.$node->field_org_share[0]['nid']) 
?>

Где action - материал типа Акция
field_org_share - поле nodereference "Компания, проводящая акцию".

С эти кодом выводит следующее:

<span class="label">Приз предоставляет: </span>
<a href="/node/152">152</a>

Т. е. заголовок связанной ноды типа Компания вытащить не могу. Как я понял в nodereference хранится только nid ноды (посмотрел по Devel). Но в поле то выводится заголовок.

Аватар пользователя VVS VVS 24 сентября 2012 в 14:28

Спасибо автору за решение!
В Д7 всё работает, а с модулем Color Node всплювающая форма заказа делается очень легко.

Аватар пользователя Antoniy Antoniy 2 ноября 2012 в 11:44

А как сделать ссылку на значение select формы?

Обратиться к значению select формы можно так:

<?php
$form_state
['values']['tarif1'];
?>
Аватар пользователя Antoniy Antoniy 2 ноября 2012 в 18:04

Пока сделал так
Без использования select

markup:

<?php
if(isset($_GET['tarif']))
print 
'<span class="label"><b>' t('Тариф') . ': </b></span>' . ($_GET['tarif']);
?>

hidden:
Label: Тариф
Value: %get[tarif]

Вид URL с передачей значения:
_domen.com/node/111?tarif=Имя%20тарифа

В итоге получаю:
Триф: Имя тарифа

На мыло уходит также:
Триф: Имя тарифа

Аватар пользователя Antoniy Antoniy 16 ноября 2012 в 4:24

Чтоб сделать запрос к значению select webform надо в значении по умолчанию вставить %get[key]

Например:
Значение по умолчанию:
%get[tarif]
Значения safe_key:
01|Первый
02|Второй
03|Третий

Тогда URL вида /myform?tarif=02
включит option select Второй

Аватар пользователя vinta vinta 16 декабря 2012 в 22:01

а вот меня то же интересует

"lemet" wrote:

Опубликовано lemet в пт, 13/08/2010 - 16:56.
lemet

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


может кто знает как?

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

"vinta" wrote:
может кто знает как?

Идея примерно такая: сделать в ссылке заказа у фирмы передачу ее мыла GET, или POST запросом в скрытое поле Webform, а в настройках Webform, где настраиваются email, сделать компонентом для отправки это скрытое поле.

Таким образом webform может быть один для всех фирм. Заморочка только, чтобы сделать им всем нужную ссылку, или кнопку, с GET, или POST запросом. Но я думаю, можно это как то решить с полем для типа материала, которое будет выводится в виде ссылки и в ссылку будет подставляться email автора ноды с запросом.

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

"vinta" wrote:
может кто знает как?

Вот например Отправка сообщений автору ноды связанной через field from URL

Предположим что адрес формы Webfrorm будет /order
Токен почты автора ноды [node:field-xxx:author:mail]
Ключ поля для подстановки email такой mailseller
В поле для подстановки email фирм пишем: %get[mailseller]

Тогда, создаем поле в материале, или через node.tpl.php, и пишем в нем:

<a href="/order?mailseller=[node:field-xxx:author:mail]">Заказать у этой фирмы</a>

Только вопрос, как будет передаваться через URL символ собаки - @
Лучше все же POST, а не GET

Аватар пользователя VVS VVS 26 октября 2014 в 21:16

"<a href="mailto:P.Selfin@drupal.org">P.Selfin@drupal.org</a>" wrote:

а для д7 и что бы просто в попап окошке открывалось?

Всё просто же, сделал открытие попап с помощью colorbox_node - просто добавил к кнопке класс "colorbox-node":


<?php $node menu_get_object('node');
  print 
l(t('Заказать'), 'node/2/', array('query'=>array('width'=>600,'height'=>400,'product'=>$node->nid), 'attributes' => array('class' => 'button colorbox-node'))).'<br />'
?>

И в скрытом поле должно быть:
http://имя-вашего-сайта.ru/node/%get[product]

Wink

Аватар пользователя vinta vinta 21 сентября 2013 в 13:58

Кажется я свою проблему решил(смотреть на 6 постов выше). Сделал как написал

drozdyuk wrote:
Заменяем стандартный модуль webform на этот патченый, еще нужно поставить модуль token.
Он позволяет использовать для полей формы глобальные токены сайта.
Я не мог заставить модуль webform 3.11(который у меня отображался в виде блока непосредственно на странице товара) отправлять мне в письме заголовок товара со страницы которого была заполнена и отправлена форма, а также ссылку на эту страницу.
С помощью данного модуля проблема была решена.
1. Создал необходимые поля для заполнения.
2. Создал поле hidden со значением по умолчанию [[page-title]] (получил название товара)
3. Создал поле hidden со значением по умолчанию [[current-page-url]] (получил ссылку на товар)
Радуюсь 8-)

Я создал представление для этой вебформы, а это представление добавил как поле к товару с помощью модуля Viewfield, как пользоваться модулем читаем здесь. В качестве адресата поставил [author:mail] и всё работает. Только webform patched надо брать версию 3.18 отсюда, потому что в версии 3.19 письма будут уходит не автору ноды в которую вставлена вебформа, а автору создателя вебформы, т.е. админу сайта. Возможно 3.19 то же может решить эту задачу, только нужен соответствующий токен, но решил не парится. Кто хочет посмотреть пример в дейсвии идём сюда, и кликаем "Задать вопрос продавцу по этому товару"

Аватар пользователя vinta vinta 21 сентября 2013 в 17:50

Это хорошо что поддерживает, вопрос только кому уйдёт письмо, автору ноды или автору вебформы? Как я писал выше, разные версии webform patched отправляют письма разным авторам.

Аватар пользователя Ester03 Ester03 16 декабря 2013 в 1:30

Не получается.
Помогите, пожалуйста!

Делаю сайт на D7. Вылезает вот такая надпись при переходе от ноды к форме заказа
Notice: Undefined index: trainings в функции eval() (строка 2 в файле /home/p5711/public_html/psy-co.ru/modules/php/php.module(80) : eval()'d code).

Честно говоря, ума не приложу откуда это.
product у меня заменено на trainings.

Я правильно понимаю, что в конкретном материале в типе материала trainings надо ставить ссылку руками?
Также не поняла куда именно нужно вставлять кусок кода в файле
node-product.tpl.php

Помогите, пожалуйста! Просто не понимаю, что происходит(((

Аватар пользователя direqtor direqtor 16 декабря 2013 в 3:28

Эта статья за четыре года устарела даже для шестерки. Тут главное идея. Посредством ссылки с параметрами в запросе, заполнить Webform данными оттуда.
В Webform сейчас нужно ставить умолчание в настройках поля %get[имя_параметра]. Каменты выше перечитайте, там несколько вариантов предлагается.

Аватар пользователя DVN DVN 17 февраля 2014 в 0:29

Я делал с помощью модулей панели и Webform. Страницу товара оформлял в панелях, там есть возможность использовать подстановки. Создал там пользовательское содержимое, вот такого вида:

<form action="http://sayt.ru/form1" method="post" >
<input type="hidden" name="title" value="%node:title">
<input type="hidden" name="articul" value="%node:field_articul">
<input type="submit" name="bsubmit" value="Заказать %node:title" />
</form>

Потом в Webform создал форму с полями:
тип Textfield, значение %post[articul] и
тип Textfield, значение %post[title] и.

Теперь, при нажатии кнопки заказать товар, происходит переход на страницу с формой заказа, в которой заполнены нужные поля. Drupal 7.

Аватар пользователя mozh mozh 20 февраля 2014 в 20:09

хм напишу тут..
Не подскажите как передавать значения полей между шагами page break? т.е. есть форма с несколькими шагами, и на последнем шаге нужно выводить (в поле markup) введённую информацию на предыдущих шагах, типо итоговая для проверки перед окончательным заказом