API form не могу перенаправить на другую страницу

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

Аватар пользователя gumk gumk 31 января 2009 в 20:24

Добрый день, почему-то не работает функция

function example_nameform_submit($form_id, $form_state) {
   ....                          
    $form_state['redirect'] = 'node/3';
}

перенаправления не происходит, если вставить како-нибудь другое действие, например drupal_set_messege('бла бла бла') то оно выполняется, пробовал вставлять

unset ($form_state['storage']);

пред

$form_state['redirect'] = 'node/3';

тоже не помогает!!!

Комментарии

Аватар пользователя Demimurych Demimurych 31 января 2009 в 20:49

и не должно.

Это свойство нужно определять во время формирования формы.

Если Вам нужно перенаправить форму во время сабмита то выполняйте просто

return 'куда мне надо'

Аватар пользователя gumk gumk 31 января 2009 в 21:47

сделал return drupal_goto (все равно в итоге она и используется) просто читал книгу про drupal 6 а там написано, что можно в сабмите определить, а переопределять можно при формировании формы, может я конечно не правильно понял...

а как сделать желательно без использования баз данных, что бы $form_state была доступна и на дугой странице, объявленной в этом же модуле? сделать ее глобальной или как?

Аватар пользователя neochief neochief 31 января 2009 в 21:51

Demimurych, Не сбивайте человека, он все делает правильно. Ваш совет примерним исключительно для пятого друпала.

Касательно проблемы, продемонстрируйте полный код модуля. Без эого невозможно сказать наверняка в чем проблема.

Аватар пользователя gumk gumk 1 февраля 2009 в 1:11

если вкратце

//hook_menu
.....
затем
function formexample_page() {
  return drupal_get_form('formexample_nameform');
}
function formexample_nameform($form_id, $form_state = NULL) {
  $form_state['formexample']['spam_score'] = 90;
  $form['user_name'] = array(
    '#title' => t('имя'),
    '#type' => 'textfield',
    '#description' => t('Please enter your name.'),
        '#required' => TRUE
  );
  $form['user_soname'] = array(
    '#title' => t('фамилия'),
    '#type' => 'textfield',
    '#description' => 'Please enter your soname.',
        '#required' => TRUE
  );
    $form['user_threname'] = array(
    '#title' => t('очество'),
    '#type' => 'textfield',
    '#description' => 'Please enter your очество.',
        '#required' => TRUE
  );
  $form['dateline'] = array(
  '#title' => t('Дата рождения'),
  '#type' => 'date',
  '#description' => 'Укажите вашу дату рождения',
  '#required' => TRUE,
  '#default_value' => array (
  'month' => format_date(time(), 'castom', 'n'),
  'day' => format_date(time(), 'castom', 'j'),
  'year' => format_date(time(), 'castom', 'Y'),
  )
  );
}
function formexample_nameform_submit($form_id, $form_state) {
   drupal_set_message ('бла бла бла') //выполняется
   unset ($form_state['storage']); //на всякий случай делаю хотя оно вроде и так пусто              
    $form_state['redirect'] = 'node/3'; //пере направления не происходит
}

функцию валидации не использовал, пробовал ее добавлять результата нет

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

А почему вы не хотите добавить в свою форму свойство #redirect и проверить, работает ли с ним? Хотя странно, что не работает редирект сейчас, ибо у вас всё правильно, на мой взгляд.

$form['#redirect'] = 'node/3'
Аватар пользователя neochief neochief 1 февраля 2009 в 15:27

Ну, вестимо, сударь. Значение $form_state нужно передавать по ссылке:

function formexample_nameform_submit($form, &$form_state) {

В функции формы тоже неправильный заголовок, но он пока у вас не вызвал проблем

function formexample_nameform($form_state) {
Аватар пользователя Demimurych Demimurych 1 февраля 2009 в 12:11

"neochief" wrote:
Demimurych, Не сбивайте человека, он все делает правильно. Ваш совет примерним исключительно для пятого друпала.

Касательно проблемы, продемонстрируйте полный код модуля. Без эого невозможно сказать наверняка в чем проблема.

ну да ну да

не обратил внимание на тег друпал 6

Аватар пользователя gumk gumk 2 февраля 2009 в 23:59

Спасибо, помогло, а еще по API вопрос: если в hook_form_alter () в форму другого модуля добавить еще одно поле, то как потом это поле сохранить, имею ввиду как перехватить submint той формы?
И можно ли в своей функции как-то передать значение $form_state ?

за ворпосы сильно не пинайте, учу друпал вместе с PHP

Аватар пользователя gumk gumk 17 февраля 2009 в 19:43

neochief, спасибо помогло,
теперь другая проблема, почему-то после сохранения формы в базу форма date в базу записывает 1 и все, как поправить?

$form['datelineus'] = array(
  '#title' => t('дата рождения'),
  '#type' => 'date',
  '#description' => 'дата рождения',
  '#required' => TRUE,
  '#weight' => 6,
  );
Аватар пользователя gumk gumk 17 февраля 2009 в 22:48

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

Аватар пользователя neochief neochief 18 февраля 2009 в 0:25

хе-х, для создания такблиц, нужно использовать SchemaAPI, который и обеспечит правильное создание типов столбцов. Вот здесь описаны типы данных, которые оно подставит, если будете делать все как положено.

Аватар пользователя jeehadina jeehadina 14 марта 2009 в 10:45

я чесно говоря в ступоре, по какой-то причине drupal не делает редирект.
имеем свежую установку drupal 6.10
тестовый модуль test.module

<?php

function test_form_alter(&$form$form_state$form_id) {
  if (
$form_id == 'page_node_form') {
    
$form['#submit'][] = 'test_node_redirect';
  }
}

function 

test_node_redirect($form, &$form_state) {
  
$form_state['redirect'] = 'admin';
}

?>

все функции срабатывают, но редиректа не происходит...
что не так делаю?
Заранее благодарен!

Аватар пользователя jeehadina jeehadina 15 марта 2009 в 7:51

проблеме решена двумя постами выше.
полный код модуля:

<?php
function test_form_alter(&$form$form_state$form_id) {
  if (
$form_id == 'page_node_form') {
    
// $form['#submit'][] = 'test_node_redirect'; вот это не работает...
    
$form['buttons']['submit']['#submit'][] = 'test_node_redirect';
  }
}

function 

test_node_redirect($form, &$form_state) {
  
$form_state['redirect'] = 'admin';
}
?>