Разработка модуля: hook_form(), hook_menu() и как получить $_POST

Я хочу улучшить свои знания в разработке модулей (которые далеки от базовых), поэтому я пытаюсь разработать модуль поиска по периметру. На данный момент я получил блок, содержащий форму:

function perimeter_search_block_view($delta = '') {
  // Define an empty array for the block output.
  $block = array();

  switch($delta) {
    case 'perimeter_search_box':
      $block['subject'] = t('Perimeter search box');
      $block['content'] = drupal_get_form('perimeter_search_form');;
      break;
  }

  return $block;
}

/**
* Implementation of the perimeter search form
* @return array with form data
*/
function perimeter_search_form($form, &$form_state) {
  $form = array(
    '#action' => 'perimeter-search-results',
    'keyword' => array(
      '#type' => 'textfield'
    ),
    'location' => array(
      '#type' => 'textfield'
    ),
    'perimeter' => array(
      '#type' => 'select',
      '#title' => t('Perimeter'),
      '#options' => array('15 km', '30 km', '60 km', '120 km')
    ),
    'submit' => array(
      '#type' => 'submit',
      '#value' => t('Start search')
    )
  );

  return $form;
}

У меня также есть функция для вывода результатов поиска:

/**
* Implementation of hook_menu()
* @return defined menu/page items
*/
function perimeter_search_menu() {
  $items = array();

  // Search results page
  $items['perimeter-search-results'] = array(
    'title' => t('Perimeter search results'),
    'page callback' => 'perimeter_search_results',
    'access arguments' => array('view perimeter search'),
    'type' => MENU_NORMAL_ITEM
  );

  return $items;
}

/**
* Processing job search queries
*/
function perimeter_search_results() {
  $page_content = t('Search results');
  return $page_content;
} 

Мой (простой?) вопрос: как получить данные сообщения (ключевое слово, местоположение, периметр) в моей функции perimeter_search_results()?


person Arne Cordes    schedule 18.03.2011    source источник


Ответы (1)


Легко, вам нужно создать функцию _submit для вашей формы, вот пример:

function perimeter_search_form_submit($form, &$form_state) {
    /*
     * Your data handling goes here on the $form_state['values']['myfieldname']
     * variable.
     */
     drupal_set_message(t('Awesome, you managed to fill the form!'));
}

И если вам нужно подтвердить ..

function perimeter_search_form_validate($form, &$form_state) {
    if($form_state['values'['myfieldname'] == '') {
      form_set_error('', t('Hey, it doesn't work like that!'));
    }
}

Просто помните, что если вы добавите атрибут '#required' => TRUE в поле формы, поле будет автоматически проверено, чтобы всегда требовать это поле, поэтому вам не нужно использовать валидатор для этого поля, если вам просто нужно это он компилируется.

person Matteo    schedule 04.06.2012