[Решено - см. коммент]: Контакная форма на каждой странице + скрытое поле с адресом страницы

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

Аватар пользователя mega-burunduk mega-burunduk 28 февраля 2013 в 19:46

Всем привет! Делаю сайт по недвижимости, есть задача, чтобы после описания каждого объекта недвижимости на странице присутствовала форма - что то типа "есть вопросы? пишите!" и простые поля: имя, имейл, текст вопроса. При отправке формы очень хочется чтобы чтобы к ней скрытым полем прилагался адрес страницы с которой сообщение было отправлено, чтобы админ мог понять каким именно объектом интересуется человек.

Я установил модуль webform, но не могу понять как сделать так как мне надо. Мудрые, форумчане, подкиньте дельные советы. Заранее спасибо.

Комментарии

Аватар пользователя k_dmitry k_dmitry 28 февраля 2013 в 20:00

1. Создаете страницу в вебформ, добавляете поле с токеном get
2. Добавляете на страницу ссылку на созданную форму (через блок или темизацию ноды)
3. через get передаете заголовок страницы в вебформу.

Аватар пользователя k_dmitry k_dmitry 28 февраля 2013 в 20:14

"mega-burunduk" wrote:
Можно поподробнее?

не помню как в 6ке в 7ке в поле по умолчанию можно вставить токен, даже коммент есть (%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".), пишите в значение по умолчанию %get[foo]... а на странице foo=title...

Аватар пользователя k_dmitry k_dmitry 28 февраля 2013 в 20:50

"mega-burunduk" wrote:
чтобы после описания каждого объекта недвижимости на странице присутствовала форма

Добавьте скрытое поле с токеном title

Аватар пользователя mega-burunduk mega-burunduk 8 марта 2013 в 13:29

Все решилось выводом вот такого кода:

<?php  require_once drupal_get_path('module''contact') .'/contact.pages.inc';
 
  
//no need to maintain two version of node.tpl.php
  
include "node.tpl.php";

function 

local_contact_page(){
    
$form contact_mail_page();
    
// override default values here if you want
    // next one will select a different category
    //$form['cid']['#default_value'] = 0;
    
return($form);
}

function 

local_contact_page_submit($form_id$form_values){
    return(
contact_mail_page_submit($form_id$form_values));
}

function 

local_contact_page_validate($form$form_state){
    return(
contact_mail_page_validate($form$form_state));
}

print 

drupal_get_form('local_contact_page');    ?>

...сначала в node-emlak.tpl.php - темизацию типа содержимого "недвижимость", а затем просто в блоке. Теперь контактная форма отображается на каждой странице сайта в сайдбаре справа. Спасибо всем за ответы!

Аватар пользователя divined divined 8 марта 2013 в 13:46

И теперь представьте сколько вы получите спама?

Подобные формы надо выводить через JS или же ставить очень сложные капчи (Первый вариант лучше).

Обычная и капча с картинкой роботы проходят на раз-два.

Аватар пользователя mega-burunduk mega-burunduk 8 марта 2013 в 13:49

"divined" wrote:
И теперь представьте сколько вы получите спама?
Подобные формы надо выводить через JS или же ставить очень сложные капчи (Первый вариант лучше).
Обычная и капча с картинкой роботы проходят на раз-два.

Так ведь я только за. Что значит через JS? Это как? Приведите вариант решения, если не сложно. Просто я нашел кое какое решение. Поставил решено. Чтобы те кто имеют аналогичную проблему могли воспользоваться им. Если вы имеете решение лучше - поделитесь! И я, и другие будем вам за это благодарны.

Аватар пользователя mega-burunduk mega-burunduk 8 марта 2013 в 13:57

"divined" wrote:
Буквально через час напишу. Как приеду с работы.

Спасибо Вам за это! Скажу что за основу того что получается в итоге, я брал сайт hturkey.ru - говорят его делал человек с drupal.ru - там к каждой квартире подобная форма приставлена. Но там сложнее - там сообщение уходит автору объявления, а в моем случае - просто админу сайта.

Аватар пользователя divined divined 9 марта 2013 в 0:02

1. Создаем нужную webform, в настройках не забываем указать что форма доступна как блок, а также настроить адрес куда будет отправлен результат сабмита
2. Создаем модуль:

<?php
//Хук на вывод ноды, можно использовать любой другой, а можно просто создать блок, который бы содержал ('<div id="inline_zayavka"></div>'). Зависит от того в какое место вы хотите поместить форму заявки. У меня это середина ноды, поэтому использую хук вывода ноды.
function {module_name}_node_view_alter(&$build) { 
    
//Добавляем яваскрипт файл, это можно сделать внутри блока, или в .info файле модуля или темы.
    
drupal_add_js(drupal_get_path('module''module_name').'/{module_name}.js');

        

//Опционально можно добавить drupal_add_js(array('nid'=>$build['nid']),'settings'); 
        //Сделать доступным номер текущей ноды для javascript

        //Тут чисто мои заморочки (проверка в какие ноыд вставлять форму)
    

if (isset($build['#groups']) && isset($build['#groups']['group_mid_content'])) {
        
//Ну и сам процесс вставки (запись в суфикс тела ноды)
        
$build['body']['#suffix'] = '<div id="inline_zayavka"></div>';
    }
}
//Хук меню, добавляем адрес по которому будет выполнятся функция возвращающая webform через JSON
function {module_name}_menu() {
    
$items['show_ajaxblock'] = array(
        
'access callback' => true,
        
'page callback'=>'_{module_name}_show_ajaxblock',
        
'type'=>MENU_CALLBACK
    
);
    return 
$items;
}

//Сама функция, которая возвращает нужный webform
function _{module_name}_show_ajaxblock() {
        
//Для 7-ки, где client-block-{id} - номер блока webform (можно посмотреть в списке блоков после создания wedform'ы)
    
$block module_invoke('webform','block_view','client-block-{id}');
    
$output "<h3>Получить дополнительную информацию</h3>".render($block['content']);
    
drupal_json_output(array('status'=>true,'data'=>$output));

        

//Для 6-ки немного отличается, можно найти в гугле по запросу "Drupal 6 программный вывод блока"
}
?>

3. Создаем javascript файл, который будет запрашивать форму через ajax после загрузки страницы:

 //Для 7-ки
(function ($) {
        Drupal.behaviors.{module_name} = {
                attach: function (context, settings) {
                   jQuery.ajax({
                     async: true,
                     url: "/show_ajaxblock",
                     success: function(response) {
                       jQuery('#inline_zayavka').html(response.data);
                       //тут опционально можно занести значение из переменной Drupal.settings.nid в значение формы.
                     }
                   });
                }
        }
})(jQuery);

//В 6-ке вроде можно просто:

$(document).ready(function(){
  jQuery.ajax({
    async: true,
    url: "/show_ajaxblock",
    success: function(response) {
      jQuery('#inline_zayavka').html(response.data);
      //тут опционально можно занести значение из переменной Drupal.settings.nid в значение формы.
    }
  });
});

Готово.

Аватар пользователя djserj djserj 19 марта 2013 в 13:21

Здравствуйте!

Подскажите пожалуйста чайнику! Поставил модуль, сделал форму, всё пашет, но не выводит название страницы!!!!
Объясняю. Закинул форму в блок, который выводится на всех страницах. Заголовок ноды вебформы "Задать вопрос". Теперь, когда добавляешь скрытое поле с выводом %nid или %title - после заполнения формы на любой странице приходит "Задать вопрос", а не адрес той страницы, в которой заполнена форма в блоке.
Если добавляю %get[???] - а что туда добавлять? У меня нет никаких соображений, потому что адреса выводятся алиасами!

Using the token %get[foo] would print "bar".), пишите в значение по умолчанию %get[foo]... а на странице foo=title...

Да, но у меня нет параметра FOO, только http://website.ru/alias
Какой параметр вставить в %get[key]???????????????

ЗЫ: пытался вставить в качестве "key" следующие токены: URL, current-page:URL, а также сами токены %nid и %title. Сработал только последний, возвратив "Задать вопрос"... Sad

Аватар пользователя mega-burunduk mega-burunduk 19 марта 2013 в 13:42

До сих пор использую вот это:

<?php  require_once drupal_get_path('module''contact') .'/contact.pages.inc';
 
  
//no need to maintain two version of node.tpl.php
  
include "node.tpl.php";

function 

local_contact_page(){
    
$form contact_mail_page();
    
// override default values here if you want
    // next one will select a different category
    //$form['cid']['#default_value'] = 0;
    
return($form);
}

function 

local_contact_page_submit($form_id$form_values){
    return(
contact_mail_page_submit($form_id$form_values));
}

function 

local_contact_page_validate($form$form_state){
    return(
contact_mail_page_validate($form$form_state));
}

print 

drupal_get_form('local_contact_page');    ?>

в ином примере так и не разобрался.

Аватар пользователя djserj djserj 19 марта 2013 в 15:14

Спасибо, но если бы я только знал, куда это вставлять...

Пока я проблему решил, подставив вместо key-параметра буквочку q (я вспомнил, что когда-то у меня страницы назывались ?q=node/11).
Теперь в сообщении приходит node/11. Ну да ладно, если надо будет можно будет проверить что за страница.

И всё же хотел бы услышать квалифицированный ответ, чтобы приходил именно алиас, ЧПУ (человекопонятный)

Аватар пользователя AHA22 AHA22 18 октября 2013 в 7:54

"djserj" wrote:

Спасибо, но если бы я только знал, куда это вставлять...
Пока я проблему решил, подставив вместо key-параметра буквочку q (я вспомнил, что когда-то у меня страницы назывались ?q=node/11).
Теперь в сообщении приходит node/11. Ну да ладно, если надо будет можно будет проверить что за страница.
И всё же хотел бы услышать квалифицированный ответ, чтобы приходил именно алиас, ЧПУ (человекопонятный)

В Webform 7.x-4.0-beta1 токены работают как Вам нужно.

Аватар пользователя aleksandrbol aleksandrbol 24 ноября 2014 в 16:53

День добрый!

Подскажите, как вытащить mail автора ноды и поместить его в соответствующее поле вебформы, вебформа выводиться в виде блока. Токен [node:author:mail]выводит mail автора вебформы, а требуется выводить mail автора ноды.

Спасибо.