7

フォーム送信の結果をフォーム自体と同じページに印刷するにはどうすればよいですか?

関連する 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」から構築された元のフォーム ページを含むページにそれを取得する方法がわかりません。どんな助けでも大歓迎です!

4

5 に答える 5

7

Nikit が投稿したリンクの重要な情報は $form_state['rebuild'] です。Drupal 6 にも同じことが当てはまると思われる Drupal 7 のドキュメントからの情報を次に示します...

$form_state['rebuild']: 通常、フォーム処理全体が完了し、サブミット ハンドラーが実行された後、フォームは完了したと見なされ、drupal_redirect_form() は GET 要求を使用してユーザーを新しいページにリダイレクトします (したがって、ブラウザーの更新フォームを再送信しません)。ただし、'rebuild' が TRUE に設定されている場合は、フォームの新しいコピーがすぐに作成され、ブラウザーに送信されます。リダイレクトの代わりに。これは、ウィザードや確認フォームなど、複数ステップのフォームに使用されます。また、フォーム検証ハンドラが 'rebuild' を TRUE に設定し、検証エラーが発生した場合、フォームは返される前に再構築され、特定の検証エラーに応じてフォーム要素を変更できるようになります。

于 2010-04-29T02:36:57.023 に答える
1

これは、同じページ上のページとリストの完全に機能する例です

<?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);
}
于 2015-02-25T10:10:33.903 に答える
0

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 は、ここではもう 1 つのグローバルです (永続的なものではありますが)。

于 2010-12-29T21:47:41.460 に答える
0

Drupal7 の場合、 を使用する$form_state['rebuild']と、PHP スーパーグローバル変数$_POST(または$_REQUEST) からフォーム変数に最もよくアクセスできることがわかりました。ただし、 を使用する場合は、 (またはを使用する代わりに) を使用$form_state['redirect']したソリューションの方が優れています。$_SESSION$_GET$_REQUEST

この問題は、専門家にとっても非常に難しいと思います。Drupal には、私たちが知らない、もっと簡単で直感的な方法があるのか​​もしれません。

于 2011-10-27T07:06:05.040 に答える