Как Drupal "послать по адресу"?

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

Аватар пользователя ju_monstera ju_monstera 9 февраля 2010 в 23:04

Подозреваю, что вопрос очень простой, я просто что-то очевидное упустила - но не могу найти Sad
Есть функция, ккоторая при переходе по некоему адресу делает то, что мне надо (проверено - работает, если ввести этот URL просто в адресной строке). Я знаю, как получить нужный адрес по данным, введенным в форме. Вопрос: как дальше (в функции по кнопке) сказать Drupal'у "а теперь иди по этому URL"? Есть какая-нибудь функция типа goto - или что?

Комментарии

Аватар пользователя ju_monstera ju_monstera 9 февраля 2010 в 23:14

О, спасибо! Я даже помнила, что где-то что-то такое видела, но почему-то не нашла :-(. На ночь глядя глаз замыленный Smile

Аватар пользователя ju_monstera ju_monstera 12 февраля 2010 в 23:41

Как-то у меня ничего не работает Sad - чего-то я сильно не понимаю. Попытаюсь сформулировать, чего именно:

во-первых, я не знаю, где именно должна задать этот самый '#redirect'? Пробовала задать в обработчике submit - не помогает. А задать в другом месте я не могу, потому что получаю URL в результате обработки.

Но, может быть, я вообще не попадаю в свой обработчик? Его, вроде бы, нужно задавать в свойстве #submit - но я опять-таки не знаю, где именно. Попытка указать его в функции ИмяФормы, где задаются поля и прочие кнопочки, не удалась - Drupal ругается. В разных других модулях люди это все задают в обработчиках alter - так что же, я должна задавать alter для своей собственной формы? В любом случае, в книжке написано, что если свойство #submit не указано, Drupal просто ищет функцию вида ИмяФормы_submit. Однако, не работает.

У меня не такая старая книжка, Вандюк и Вестгейт, 2008 года. В аргументах функций submit там нет никаких $form_state, есть $form_values. Простейший пример выглядит так: а) функция имяФормы, где указаны поля, б) обработчик nodeapi, где указано, куда и когда эту форму вставить, в) обработчик submit, про который написано буквально следующее: "Что-то делаем, потом отправляем пользователя, например, на узел 3: return 'node/3'; Если ничего не вернем, останемся на той же странице". Я все так и сделала - даже URL для проверки указала статический, закомментировав всю собственно обработку - ноль эмоций!

Что я делаю не так?

Аватар пользователя ju_monstera ju_monstera 12 февраля 2010 в 23:54

Код чего, обработчика submit? Там уже ничего не осталось, кроме
$Url = 'libretto/tab/356/357';
$form_values['#redirect'] = $Url;
//return $Url;
Закомментирован альтернативный вариант - ни так, ни так, ни $form['#redirect'], ни $form_state['#redirect'] - никак не работает.

Аватар пользователя ju_monstera ju_monstera 13 февраля 2010 в 0:07

Код формы:

<?phpfunction tab_libretto_addform($node) {
  $list_options = array(
    '357'=>'Лепко',
    '358'=>'Пол'
  );
  $form['tab_lib'] = array(
    '#type' => 'fieldset',
    '#title' => t('Формирование табличного вывода')
  );
  $form['tab_lib']['nid'] = array(
    '#type' => 'value',
    '#value' => $node->nid
  );  
  $form['tab_lib']['translations'] = array(
    '#type' => 'select',
    '#title' => 'Доступные варианты',
    '#default_value' => '0',
    '#options' => $list_options,
    '#multiple' => TRUE,
    '#description' => 'Выберите один или несколько вариантов для вывода в дополнительных столбцах'
  );
  $form['tab_lib']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Сформировать табличку')
  );
  /*
  $form['#submit'] = array(
    'tab_libretto_addform_submit' => array()
  )*/
  
  return $form;
}
?>

$list_options здесь тестовый, в принципе он из базы должен браться. Насчет правильности обработки результатов выбора я тоже не уверена, но даже статический путь не передается:

function tab_libretto_addform_submit($form_id, $form_values) {
  $nid = $form_values['nid'];
  $current_values[$form_values['translations']] = array();
  $cols = '';
  foreach ($current_values as $choice) {
    $cols .= ((strlen($cols)) ? '-' : '').$choice;
  }
  if (strlen($cols)) $Url = 'libretto/tab/'.$nid.'/'.$cols;
  else $Url = 'libretto/tab/'.$nid;

  $Url = 'libretto/tab/356/357';
  $form_values['#redirect'] =  $Url;
  //return $Url;
}

(Как-то у меня со вставкой кода криво получилось Sad )