Каким образом можно передать данные из формы на другую страницу и вызвать ее отображение?

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

Аватар пользователя Lavio Lavio 29 января 2014 в 7:38

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

Комментарии

Аватар пользователя Kaer Kaer 29 января 2014 в 10:23

"Lavio" wrote:
Каким образом можно передать значение параметра на эту страницу

action формы указываете страницу назначения
"Lavio" wrote:
вызвать ее отображение

при сабмите формы страница назначения отобразится

или я не вкурил вопрос?

Аватар пользователя Lavio Lavio 29 января 2014 в 11:03

Kaer wrote:
"Lavio" wrote:
Каким образом можно передать значение параметра на эту страницу

action формы указываете страницу назначения
"Lavio" wrote:
вызвать ее отображение

при сабмите формы страница назначения отобразится

или я не вкурил вопрос?


Возможно я что-то неправильно понял?

Форма запроса в блоке и его сабмит:

<?php
function mymodule_form($form, &$form_state){
$form['fn_request'] = array(
'#type' => 'textfield',
'#title' => 'Запрос',
'#size' => 20,
'#maxlength' => 20,
'#required' => TRUE,
 );
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Отправить',
 );
return 
$form;
}
function 
mymodule_form_submit($form, &$form_state)
    {
    
$form['#action'] = url('serch');
        return 
$form;
    }
?>

По факту передается таблица в html верстке или массив данных. Для примера упростил что передается то что напишут в тестовом поле.

Код той страницы:

<?php
function mymodule_menu() {
  
$items = array();
  
//форма обработки запроса
  
$items['serch'] = array(
    
'title' => 'Результат',
    
'page callback' => 'drupal_get_form',
    
'page arguments' => array('mymodule_proc'),
    
'type' => MENU_CALLBACK,
  );

  return 

$items;
}
function 
mymodule_proc($form$form_state)
    {
    
$form['result'] = array(
        
'#markup' => 'Проверка вывода данных<br>'.$form_state['values']['fn_request'],
     );
    return 
$form;
    }
?>

Если вбить что-либо в тестовое поле и нажать сабмит то просто перезагрузится текущая страница.

Аватар пользователя Lavio Lavio 31 января 2014 в 6:17

Kaer wrote:
в форму где fn_request добавьте

$form['#action'] = url('serch');


Если сделать как Вы сказали и убрать эту же строчку из mymodule_form_submit, то CMS выдает ошибку:

Notice: Undefined variable: form_state в функции mymodule_proc()

Аватар пользователя drupby drupby 31 января 2014 в 6:42
 function mymodule_form_submit($form,$form_state){
   drupal_set_message('custom submit has been invoked');
   $form_state['redirect'] = 'serch';// = url('serch', array('absolute' => true))
   }
function mymodule_menu() {
  $items = array();
  //форма обработки запроса
  $items['serch'] = array(
    'title' => 'Результат',
    'page callback' => 'mymodule_proc',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );

  return $items;
}
function mymodule_proc()
    {
    $content['result'] = array(
        '#markup' => 'Проверка вывода данных<br>'.$_POST['xyz'],
     );
    return $content;
    }

Аватар пользователя Lavio Lavio 31 января 2014 в 11:17

drupby wrote:

 function mymodule_form_submit($form,$form_state){
   drupal_set_message('custom submit has been invoked');
   $form_state['redirect'] = 'serch';// = url('serch', array('absolute' => true))
   }
function mymodule_menu() {
  $items = array();
  $items['serch'] = array(
    'title' => 'Результат',
    'page callback' => 'mymodule_proc',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );

  return $items;
}
function mymodule_proc()
    {
    $content['result'] = array(
        '#markup' => 'Проверка вывода данных<br>'.$_POST['xyz'],
     );
    return $content;
    }

Спасибо за еще один подход. Все красиво. Однако, где задается параметр xyz который потом передается на новую страницу и вытаскивается там POST'ом?

Собственно сейчас у меня оно работает следующим образом:

function mymodule_form($form, &$form_state){
$form['fn_request'] = array(
'#type' => 'textfield',
'#title' => 'Запрос',
'#size' => 20,
'#maxlength' => 20,
'#required' => TRUE,
 );

$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Отправить',
 );
return $form;
}

function mymodule_menu() {
  $items = array();
  $items['serch'] = array(
    'title' => 'Результат',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('mymodule_proc'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}
function mymodule_form_submit($form, &$form_state){
 $form_state['redirect'] = array(
 'serch',
 array(
 'query' => array(
 'ich' => $form_state['values']['fn_request'],
 ),
 ),
 );
}

function mymodule_proc(){
$form['result'] = array(
'#markup' => 'Проверка вывода данных<br>'.$_GET["ich"],
);
return $form;
}

Единственное что мне в моем подходе не нравится - это то что в адресной строке видно передаваемый параметр (domen.ru/serch/?ich=текст запроса). В документации по API толком ни чего не сказано по поводу как передать переменную с помощью $form_state['redirect'] и как именно реализовать $_POST вариант. Хотя, может я не там читал или что-то упустил.

Пожалуйста подскажите альтернативный вариант чтобы не было видно переменной в адресной строке или вариант основанный на $_POST.

Аватар пользователя drupby drupby 31 января 2014 в 16:55

"Lavio" wrote:
это то что в адресной строке видно передаваемый параметр (domen.ru/serch/?ich=текст запроса).

так ты ж сам написал $_GET , выведи post

function mymodule_proc(){
$form['result'] = array(
'#markup' => 'Проверка вывода данных<br>'. print_r($_POST),
);
return $form;
}
Аватар пользователя Lavio Lavio 2 февраля 2014 в 18:16

drupby wrote:
"Lavio" wrote:
это то что в адресной строке видно передаваемый параметр (domen.ru/serch/?ich=текст запроса).

так ты ж сам написал $_GET , выведи post

function mymodule_proc(){
$form['result'] = array(
'#markup' => 'Проверка вывода данных<br>'. print_r($_POST),
);
return $form;
}

Эмммм... если просто поменять команду с $_GET на $_POST там где она получается, то оно не изменит того что в адресной строке после перехода будет писаться domen.ru/serch/?ich=текст запроса. Наверное все таки нужно как-то изменить способ передачи, а не получения.
То есть заменив на Ваш пример у меня все равно в адресной строке идет отображение переменной.

drupby wrote:
да и зачем данные выводить на другой странице ,если для этого предусмотрены messages

Тут указана причина.

Аватар пользователя drupby drupby 31 января 2014 в 17:08

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

function mymodule_form_submit($form,&$form_state){
   drupal_set_message('custom submit has been invoked' . $form_state['values']['NAME_VALUE']);
   
}
Аватар пользователя drupby drupby 2 февраля 2014 в 18:44

"Lavio" wrote:
то оно не изменит того что в адресной строке после перехода будет писаться domen.ru/serch/?ich=текст запроса.

да ты же сам передаешь get параметр

function mymodule_form_submit($form, &$form_state){
 $form_state['redirect'] = array(
 'serch',
 array(
 'query' => array(
 'ich' => $form_state['values']['fn_request'],
 ),
 ),
 );
}
function mymodule_proc(){
$form['result'] = array(
'#markup' => 'Проверка вывода данных<br>'.$_GET["ich"],
);
return $form;
}

зачем его передавать - пиши так

function mymodule_form_submit($form, &$form_state){
 $form_state['redirect'] ='serch';
}
function mymodule_proc(){
$form['result'] = array(
'#markup' => 'Проверка вывода данных<br><pre>'.print_r($_POST) . '</pre>',
);
return $form;
}
Аватар пользователя Lavio Lavio 3 февраля 2014 в 14:27

drupby wrote:

зачем его передавать - пиши так

Написал, только вместо
"Проверка вывода данных
343434апвац3339"

Он мне выдал
"Проверка вывода данных
1"

И еще вопросы:
чисто логически не могу понять(поверить) как можно передать переменную не называя ее в явном виде?
Здесь явно видно что мы передаем значение в переменной ich

$form_state['redirect'] = array(
 'serch',
 array(
 'query' => array(
 'ich' => $form_state['values']['fn_request'],
 ),
 ),
 );>

Тут делаем простой редирект без какой либо передачи данных

$form_state['redirect'] ='serch';

Если конечно, сам факт редиректа не подразумевает автоматическую передачу всех параметров формы методом Post.

print_r($_POST) означает перебор и вывод всего что передано. Если на исходной форме будет несколько полей для передачи, а на странице-получателе эти поля нужно будет по отдельности обработать, тогда как к ним обращаться?

Есть проблема в моей вариации с get'ом
Друпал ругается на строчку
'#markup' => 'Проверка вывода данных<br>'.$_GET["ich"],
Undefined index: ich в функции mymodule_proc()
В чем может быть проблема?
Из перевода понятно: он считает что ich это не объявленный(неопределенный) индекс некоторого массива. Вопрос в том как его представить друпалу?

На всякий случай: у меня drupal 7.

Мысли в слух:
При реализации в html у формы есть два параметра method и action

<form method="post" action="service.php">

Неужели нет аналогов в Form API?
То есть, если создавать форму через hook_form, то возможно ли там указать каким методом должна вестись передача данных и куда отправлять эти данные?