Есть форма, реализована через блок, на ее выходе есть переменная. Есть страница созданная с помощью hook_menu. Каким образом можно передать значение параметра на эту страницу и вызвать ее отображение?
Есть форма, реализована через блок, на ее выходе есть переменная. Есть страница созданная с помощью hook_menu. Каким образом можно передать значение параметра на эту страницу и вызвать ее отображение?
Комментарии
action формы указываете страницу назначения
при сабмите формы страница назначения отобразится
или я не вкурил вопрос?
Возможно я что-то неправильно понял?
Форма запроса в блоке и его сабмит:
<?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;
}
?>
Если вбить что-либо в тестовое поле и нажать сабмит то просто перезагрузится текущая страница.
в форму где fn_request добавьте
$form['#action'] = url('serch');
Если сделать как Вы сказали и убрать эту же строчку из mymodule_form_submit, то CMS выдает ошибку:
Notice: Undefined variable: form_state в функции mymodule_proc()
drupal_set_message('custom submit has been invoked');
$form_state['redirect'] = 'serch';// = url('serch', array('absolute' => true))
}
$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'ом?
Собственно сейчас у меня оно работает следующим образом:
$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.
так ты ж сам написал $_GET , выведи post
$form['result'] = array(
'#markup' => 'Проверка вывода данных<br>'. print_r($_POST),
);
return $form;
}
Эмммм... если просто поменять команду с $_GET на $_POST там где она получается, то оно не изменит того что в адресной строке после перехода будет писаться domen.ru/serch/?ich=текст запроса. Наверное все таки нужно как-то изменить способ передачи, а не получения.
То есть заменив на Ваш пример у меня все равно в адресной строке идет отображение переменной.
Тут указана причина.
да и зачем данные выводить на другой странице ,если для этого предусмотрены messages
drupal_set_message('custom submit has been invoked' . $form_state['values']['NAME_VALUE']);
}
да ты же сам передаешь get параметр
$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;
}
зачем его передавать - пиши так
$form_state['redirect'] ='serch';
}
function mymodule_proc(){
$form['result'] = array(
'#markup' => 'Проверка вывода данных<br><pre>'.print_r($_POST) . '</pre>',
);
return $form;
}
Написал, только вместо
"Проверка вывода данных
343434апвац3339"
Он мне выдал
"Проверка вывода данных
1"
И еще вопросы:
чисто логически не могу понять(
поверить) как можно передать переменную не называя ее в явном виде?Здесь явно видно что мы передаем значение в переменной ich
'serch',
array(
'query' => array(
'ich' => $form_state['values']['fn_request'],
),
),
);>
Тут делаем простой редирект без какой либо передачи данных
Если конечно, сам факт редиректа не подразумевает автоматическую передачу всех параметров формы методом Post.
print_r($_POST) означает перебор и вывод всего что передано. Если на исходной форме будет несколько полей для передачи, а на странице-получателе эти поля нужно будет по отдельности обработать, тогда как к ним обращаться?
Есть проблема в моей вариации с get'ом
Друпал ругается на строчку
'#markup' => 'Проверка вывода данных<br>'.$_GET["ich"],
Undefined index: ich в функции mymodule_proc()
В чем может быть проблема?
Из перевода понятно: он считает что ich это не объявленный(неопределенный) индекс некоторого массива. Вопрос в том как его представить друпалу?
На всякий случай: у меня drupal 7.
Мысли в слух:
При реализации в html у формы есть два параметра method и action
Неужели нет аналогов в Form API?
То есть, если создавать форму через hook_form, то возможно ли там указать каким методом должна вестись передача данных и куда отправлять эти данные?