[Решено] Результаты заполнения формы webform на родительской странице

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

Аватар пользователя aparfilov aparfilov 23 июля 2010 в 11:40

Здравствуйте, светила друпальной науки! Дошел я таки до создания формы обратной связи. Последние штрихи, так сказать.
Суть вопроса.
Создал форму с webform 6.x-2.9, темизировал ее с помощью node-webform.tpl.php и вставил в ноду(страница) с помощью CCK. Отображается, полет нормальный. Но! Мне не нравится как она себя ведет после заполнения. Заполняю форму на странице, которая призвана показывать контакты и ее соответственно (изображение 1 в аттаче). После заполнения она переадрессует на сообщение об отправке и под сообщением дает ссылку на себя, как на материал (изображение 2 в аттаче). Переходим по ссылке и попадаем на материал опрос с формой (изображение 3 в аттаче).
Вопрос знатокам. Как научить ее чтобы после заполнения возвращалась та же страница (нода призванная служить для показа контактов) и при этом выводилось сообщение об успешной отправке? Аякс не обязателен.

ВложениеРазмер
Иконка изображения step1.png33.19 КБ
Иконка изображения step2.png13.1 КБ
Иконка изображения step3.png28.87 КБ

Комментарии

Аватар пользователя t3hk0d3 t3hk0d3 23 июля 2010 в 12:41

Прочитайте внимательнее поле заполнения ответа:

«Сообщение с подтверждением заполнения или ссылка, на которую будет переправлен пользователь, после заполнения опросника. :»

Это и есть ответ на ваш вопрос.

Те вам надо туда запихать вот это:

«message: Сообщение успешно отправлено, скоро отвечу!»

Аватар пользователя t3hk0d3 t3hk0d3 23 июля 2010 в 12:47

На всякий случай, вот код который отвечает за перенаправления:

<?php

// Check confirmation field to see if redirect should be to another node or a message.
  
if (isset($form_state['values']['submission'])) {
    
drupal_set_message(t('Submission updated.'));
    
$redirect NULL;
  }
  elseif (
valid_url(trim($node->webform['confirmation']), TRUE)) { // <--- перенаправление по внешней ссылке
    
$redirect trim($node->webform['confirmation']);
  }
  
// Check if the form should redirect to an internal URL, strip tags off
  // first in case a WYSIWYG editor messed it up.
  
elseif (preg_match('/^internal:/'trim(strip_tags($node->webform['confirmation'])))) { // <--- перенаправление по внутренней ссылке (например 'node/123/edit')
    
$path preg_replace('/^internal:/'''trim(strip_tags($node->webform['confirmation'])));
    
$redirect = array(trim($path), 'sid='$sid);
  }
  elseif (
preg_match('/^message:/'$node->webform['confirmation'])) { // <--- вас вот это интересует, просто печать сообшения
    
$message preg_replace('/^message:/'''$node->webform['confirmation']);
    
drupal_set_message($message);
    
$redirect NULL;
  }
  else {
    
$redirect = array('node/'$node->nid .'/done''sid='$sid); // <!--- а вот так у вас сейчас происходит
  
}
  
$form_state['redirect'] = $redirect;

?>
Аватар пользователя aparfilov aparfilov 23 июля 2010 в 16:09

Странно. antevgen написал сообщение, на почту пришло, а тут не отображается.
Продублирую на всякий:

"А зачем webform? Существует модуль contact, который входит в ядро. Желаете добавить поля? Делайте в собственном модуле реализацию модуля hook_form_alter()." wrote:

antevgen, дело в том, что webform планируется применять не только как форму контактов и "запиливать" ее в любом случае придется. Например заявку на семинар,услугу или еще что-то в этом роде.
Всеже, спасибо!

Аватар пользователя aparfilov aparfilov 23 июля 2010 в 16:50

t3hk0d3 , Спасибо за код! Я правильно понимаю: вставлять его нужно в тоже поле, что предназначено для сообщения после отправки, только формат ввода выставить PHP?

И еще... С друпалом месяц с небольшим, а с PHP вообще на вы. В какое место в коде нужно вставить ID ноды для внутреннего редиректа. Ну, и куда вставить сообщение после отправки тоже не знаю(((

Аватар пользователя t3hk0d3 t3hk0d3 23 июля 2010 в 16:56

aparfilov wrote:
t3hk0d3 , Спасибо за код! Я правильно понимаю: вставлять его нужно в тоже поле, что предназначено для сообщения после отправки, только формат ввода выставить PHP?

Да (надеюсь под "кодом" вы имеете ввиду не то что я написал во втором комменте)
aparfilov wrote:
И еще... С друпалом месяц с небольшим, а с PHP вообще на вы. В какое место в коде нужно вставить ID ноды для внутреннего редиректа. Ну, и куда вставить сообщение после отправки тоже не знаю(((

Ок давай в примерах:

Переход на ноду номером 123
«internal:node/123»

Отображение сообщения на той-же странице
«message:Привет»

Аватар пользователя aparfilov aparfilov 23 июля 2010 в 17:22

"t3hk0d3" wrote:
Да (надеюсь под "кодом" вы имеете ввиду не то что я написал во втором комменте)

Вот теперь я точно запутался ROFL

"t3hk0d3" wrote:
Ок давай в примерах:

Переход на ноду номером 123
«internal:node/123»

Отображение сообщения на той-же странице
«message:Привет»

Это я понял. Вставляем эти дела в поле:
Сообщение с подтверждением заполнения или ссылка, на которую будет переправлен пользователь, после заполнения опросника. :
если по-отдельности, то
они работают как часы. Если постивить вместе вот так(без кавычек естессно):
"internal:node/20
message:Привет"
то передрессация проходит на главную, а в адресной строке отображается %%%Привет%%% и еще куча каракулей.

Вот я и думал, что код, который ты написал во втором комменте можно куда-то воткнуть и онбудет и переадрессовывать а затем выводит сообщение. Только куды этот код девать..?

Конечно можно для данной ситуации поместить остальные контактные данные над полями и в меню дать ссылку на форму как на ноду, а не как у меня сейчас через CCK. Но для будущего функционала это не по феншую как-то.

Аватар пользователя t3hk0d3 t3hk0d3 23 июля 2010 в 17:37

aparfilov wrote:
"t3hk0d3" wrote:
Да (надеюсь под "кодом" вы имеете ввиду не то что я написал во втором комменте)

Вот теперь я точно запутался ROFL

"t3hk0d3" wrote:
Ок давай в примерах:

Переход на ноду номером 123
«internal:node/123»

Отображение сообщения на той-же странице
«message:Привет»

Это я понял. Вставляем эти дела в поле:
Сообщение с подтверждением заполнения или ссылка, на которую будет переправлен пользователь, после заполнения опросника. :
если по-отдельности, то
они работают как часы. Если постивить вместе вот так(без кавычек естессно):
"internal:node/20
message:Привет"
то передрессация проходит на главную, а в адресной строке отображается %%%Привет%%% и еще куча каракулей.

Вот я и думал, что код, который ты написал во втором комменте можно куда-то воткнуть и онбудет и переадрессовывать а затем выводит сообщение. Только куды этот код девать..?

Конечно можно для данной ситуации поместить остальные контактные данные над полями и в меню дать ссылку на форму как на ноду, а не как у меня сейчас через CCK. Но для будущего функционала это не по феншую как-то.

Там нельзя одновременно переадресовывать и писать сообщение.

Код который я во втором комменте привел - это код из модуля webform который отвечает за действия после отправки формы.

никто не мешает тебе его модифицировать, например сделать его таким:

<?php

// Check confirmation field to see if redirect should be to another node or a message.
  
if (isset($form_state['values']['submission'])) {
    
drupal_set_message(t('Submission updated.'));
    
$redirect NULL;
  }
  elseif (
valid_url(trim($node->webform['confirmation']), TRUE)) { // <--- перенаправление по внешней ссылке
    
$redirect trim($node->webform['confirmation']);
  }

  

// добавляем новое поведение
  
elseif (preg_match('/^messageandredirect:'trim(strip_tags($node->webform['confirmation'])))){
     
$content preg_replace('/^messageandredirect:/'''trim(strip_tags($node->webform['confirmation'])));
     list(
$message$path) = explode('|'$content2);
     
drupal_set_message($message);
     
$redirect = array(trim($path), 'sid='$sid);
  }
  
// Check if the form should redirect to an internal URL, strip tags off
  // first in case a WYSIWYG editor messed it up.
  
elseif (preg_match('/^internal:/'trim(strip_tags($node->webform['confirmation'])))) { // <--- перенаправление по внутренней ссылке (например 'node/123/edit')
    
$path preg_replace('/^internal:/'''trim(strip_tags($node->webform['confirmation'])));
    
$redirect = array(trim($path), 'sid='$sid);
  }
  elseif (
preg_match('/^message:/'$node->webform['confirmation'])) { // <--- вас вот это интересует, просто печать сообшения
    
$message preg_replace('/^message:/'''$node->webform['confirmation']);
    
drupal_set_message($message);
    
$redirect NULL;
  }
  else {
    
$redirect = array('node/'$node->nid .'/done''sid='$sid); // <!--- а вот так у вас сейчас происходит
  
}
  
$form_state['redirect'] = $redirect;

?>

соответственно пихать туда надо
«messageandredirect:привет!|node/123»

Аватар пользователя aparfilov aparfilov 23 июля 2010 в 17:32

Ага! Вижу что это листинг кода файла webform.module оказывается не все так плохо))) но что с этим делать ума не приложу.

Аватар пользователя aparfilov aparfilov 23 июля 2010 в 17:35

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

"t3hk0d3" wrote:
например сделать его таким:

(((

Аватар пользователя t3hk0d3 t3hk0d3 23 июля 2010 в 17:39

aparfilov wrote:
t3hk0d3 , опередил с сообщением. Как видно из моего предыдущего, до меня начало доходить)))
только вот коммент твой обрубило
"t3hk0d3" wrote:
например сделать его таким:

(((

а чего там сложного, там нужно вклинить вот это

<?php
elseif (preg_match('/^messageandredirect:'trim(strip_tags($node->webform['confirmation'])))){
     
$content preg_replace('/^messageandredirect:/'''trim(strip_tags($node->webform['confirmation'])));
     list(
$message$path) = explode('|'$content2);
     
drupal_set_message($message);
     
$redirect = array(trim($path), 'sid='$sid);
  }
?>

Мне сейчас лень патч накатывать, уж извини

Аватар пользователя aparfilov aparfilov 23 июля 2010 в 17:51

Уррааа заработало! t3hk0d3 ты - ГЕНИЙ!

Единственно ошибка. Ты забыл поставить слешь "/" здесь <?php  elseif (preg_match('/^messageandredirect:СЛЕШЬ СЮДА'trim(strip_tags($node->webform['confirmation'])))){?>

А так пучком все))) Спасибо!!!