Drupal: как отобразить результаты формы на той же странице, что и форма - PullRequest
7 голосов
/ 29 апреля 2010

Как мне распечатать результаты отправки формы на той же странице, что и сама форма?

Соответствующее hook_menu:

    $items['admin/content/ncbi_subsites/paths'] = array(
        'title' => 'Paths',
        'description' => 'Paths for a particular subsite',
        'page callback' => 'ncbi_subsites_show_path_page',
        'access arguments' => array( 'administer site configuration' ),
        'type' => MENU_LOCAL_TASK,
    );

обратный вызов страницы:

function ncbi_subsites_show_path_page() {
  $f = drupal_get_form('_ncbi_subsites_show_paths_form');
  return $f;
}

Функция построения формы:

   function _ncbi_subsites_show_paths_form() {
      // bunch of code here

      $form['subsite'] = array(
        '#title' => t('Subsites'),
        '#type' => 'select',
        '#description' => 'Choose a subsite to get its paths',
        '#default_value' => 'Choose a subsite',
        '#options'=> $tmp,
      );

      $form['showthem'] = array(
        '#type' => 'submit',
        '#value' => 'Show paths',
        '#submit' => array( 'ncbi_subsites_show_paths_submit'),    
      );

      return $form;
    }

Функция отправки (пропущена функция проверки для краткости)

function ncbi_subsites_show_paths_submit( &$form, &$form_state ) {
  //dpm ( $form_state );
  $subsite_name = $form_state['values']['subsite'];
  $subsite = new Subsite( $subsite_name ); //y own class that I use internally in this module
  $paths = $subsite->normalized_paths;

  // build list
  $list = theme_item_list( $paths );
}

Если я распечатаю эту переменную $ list, это именно то, что мне нужно, но я не уверен, как получить ее на странице с исходной страницей формы, созданной из 'ncbi_subsites_show_path_page'. Любая помощь очень ценится!

Ответы [ 5 ]

7 голосов
/ 29 апреля 2010

Ключевая информация в размещенной Никитом ссылке: $ form_state ['rebuild']. Вот некоторая информация из документации по Drupal 7, которая, как я считаю, применима к Drupal 6 ...

$ form_state ['rebuild']: обычно после всего обработка формы завершена и отправить обработчики побежал, форма считается выполненным и drupal_redirect_form () будет перенаправлять пользователь на новую страницу, используя GET запрос (поэтому обновление браузера не повторно отправьте форму). Однако если для 'rebuild' установлено значение TRUE, затем новая копия формы немедленно построен и отправлен в браузер; вместо перенаправления. Это используется для многошаговые формы, такие как волшебники и формы подтверждения. Кроме того, если форма обработчик проверки установил 'rebuild' ИСТИНА и ошибка проверки произошло, то форма перестраивается до возвращения, разрешающая форма элементы, которые будут изменены, в зависимости от обстоятельств к конкретной ошибке проверки.

2 голосов
/ 29 апреля 2010
1 голос
/ 25 февраля 2015

Это полный рабочий пример страницы и списка на одной странице

<?php


/*
* Implements hook_mennu()
*/
function test_menu() {
  $items['test'] = array(
    'title'             => t('Test'),
    'page callback'     => 'test_search_page',
    'access callback'   => True,
  );

  return $items;
}


function test_search_page(){
    $form = drupal_get_form('test_search_form');

    return $form;
}


function test_search_form($form, &$form_state){
  $header = array(t('id'), t('name'), t('firstname'));
  $rows = Null;
  $form['name'] = array(
    '#type'             => 'textfield',
    '#title'            => t('Name'),
    '#required'         => True,
    '#default_value'    => isset($_GET['name']) ? $_GET['name'] : Null
  );

  $form['submit'] = array(
    '#type'           => 'submit',
    '#value'          => t('submit'),
  );



  if (isset($_GET['name'])){
    $rows = get_data();
  }
  $form['table'] = array(
    '#theme' => 'table',
    '#header' => $header,
    '#rows' => $rows,
    '#empty' => t('Aucun résultat.')
  );
  $form['pager'] = array('#markup' => theme('pager'));

  /*
  if (isset($form_state['table'])) {
    $form['table']  = $form_state['table'];
  }
  $form['pager'] = array('#markup' => theme('pager'));
  */
  return $form;
}

function test_search_form_submit($form, &$form_state){
   $form_state['redirect'] = array(
    // $path
    'test',
    // $options
    array('query' => array('name' => $form_state['values']['name'])),
    // $http_response_code
    302,
  );
}

//$header = array(t('id'), t('name'), t('firstname'));

function get_data(){
    $data =  array(
        0   => array(
            'id' => '0',
            'name'  => 'pokpokpok',
            'firstname' => 'pokpokpok',
        ),
        1   => array(
            'id' => '1',
            'name'  => 'pokpokpok',
            'firstname' => 'pokpokpok',
        ),
        2   => array(
            'id' => '2',
            'name'  => 'pokpokpok',
            'firstname' => 'pokpokpok',
        ),
        3   => array(
            'id' => '3',
            'name'  => 'pokpokpok',
            'firstname' => 'pokpokpok',
        ),
        4   => array(
            'id' => '4',
            'name'  => 'pokpokpok',
            'firstname' => 'pokpokpok',
        ),
        5   => array(
            'id' => '5',
            'name'  => 'pokpokpok',
            'firstname' => 'pokpokpok',
        ),
        6   => array(
            'id' => '6',
            'name'  => 'pokpokpok',
            'firstname' => 'pokpokpok',
        ),
        7   => array(
            'id' => '7',
            'name'  => 'pokpokpok',
            'firstname' => 'pokpokpok',
        ),
        8   => array(
            'id' => '8',
            'name'  => 'pokpokpok',
            'firstname' => 'pokpokpok',
        ),
        9   => array(
            'id' => '9',
            'name'  => 'pokpokpok',
            'firstname' => 'pokpokpok',
        ),
        10   => array(
            'id' => '10',
            'name'  => 'pokpokpok',
            'firstname' => 'pokpokpok',
        ),
        11   => array(
            'id' => '11',
            'name'  => 'pokpokpok',
            'firstname' => 'pokpokpok',
        )
    );
    $paging = pager_array_splice($data, 2);

    return $paging;
}
/*
    $header = array(t('id'), t('name'), t('firstname'));

    $form_state['table'] = array(
      '#theme' => 'table',
      '#header' => $header,
      '#rows' => $paging,
      '#empty' => t('Aucun r?sultat.')
    );

    $form_state['rebuild'] = True;*/


function pager_array_splice($data, $limit = 9, $element = 0) {
  global $pager_page_array, $pager_total, $pager_total_items;
  $page = isset($_GET['page']) ? $_GET['page'] : '';

  // Convert comma-separated $page to an array, used by other functions.
  $pager_page_array = explode(',', $page);

  // We calculate the total of pages as ceil(items / limit).
  $pager_total_items[$element] = count($data);
  $pager_total[$element] = ceil($pager_total_items[$element] / $limit);
  $pager_page_array[$element] = max(0, min((int)$pager_page_array[$element], ((int)$pager_total[$element]) - 1));
  return array_slice($data, $pager_page_array[$element] * $limit, $limit, TRUE);
}
0 голосов
/ 27 октября 2011

Для Drupal7 я нахожу, что если вы используете $form_state['rebuild'], то переменные формы лучше всего доступны из суперглобальной переменной PHP $_POST (или $_REQUEST). Однако, если вы используете $form_state['redirect'], решение с $_SESSION лучше (вместо использования $_GET или $_REQUEST).

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

0 голосов
/ 30 декабря 2010

Drupal6 node.module и dblog.module делают это для admin / content / node и admin / reports / dblog, предоставляя обратный вызов страницы, который включает отображаемую форму в свой вывод.

modules/dblog/dblog.admin.inc
dblog_overview()

modules/node/node.admin.inc
node_admin_nodes()

При отправке формы обновленные настройки фильтра хранятся в $ _SESSION.

При обратном вызове страницы результаты отображаются на основе настроек фильтра, сохраненных в $ _SESSION.

$ _ SESSION - это просто еще один глобальный элемент здесь (хотя и постоянный).

...