Разработка на модул: 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