2010-12-30 5 views
0

ページにデフォルトの結果セットを含むフォームを表示し、ビューアがフォーム提出によってページ上の結果をフィルタリングできるようにします。この部分は動作します。Drupal:結果を含むフォームをレンダリングしますが、結果セットクエリを複製しません。

ただし、デフォルトの結果セットが含まれている場合、最初のサブミッションは表示用に2つの結果セットを作成します。その後の提出では、結果セットは1つしか作成されません。この追加の結果セットビルドとは別に、意図したとおりに動作します。

questionsは、同じページにフォームと結果を表示するように頼んでおり、Drupal5にはLullabot articleがあります。ここで

は、私は(example_formandresults.module @ GitHubの上で利用可能)現在使用しているコード

<?php 

/** 
* Implementation of hook_menu(). 
*/ 
function example_formandresults_menu() { 
    $items['example_formandresults'] = array(
    'title' => 'Example: Form and Results', 
    'description' => 'Show a form and its results on the same page.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('example_formandresults_form'), 
    'access arguments' => array('access content'), 
    'type' => MENU_NORMAL_ITEM, 
) ; 
    return $items ; 
} 

/** 
* Form builder function. 
*/ 
function example_formandresults_form(&$form_state = NULL) { 
    /* Setting rebuild to true should prevent the results table being built twice. */ 
    $form_state['rebuild'] = TRUE ; 

    if (is_null($form_state) || !$form_state['submitted']) { 
    drupal_set_message('Form has not been submitted.'); 
    /* set default 'since' value to unix timestamp of "one week ago" */ 
    $form_state['storage']['since'] = strtotime('-1 week'); 
    } 
    else { 
    $form_state['storage']['since'] = strtotime($form_state['values']['since']['year'] .'-'. $form_state['values']['since']['month'] .'-'. $form_state['values']['since']['day']); 
    } 

    $form['since'] = array(
    '#type' => 'date', 
    '#title' => t('Since'), 
    '#description' => t('Show entries since the selected date.'), 
    '#default_value' => array(
     'month' => format_date($form_state['storage']['since'], 'custom', 'n'), 
     'day' => format_date($form_state['storage']['since'], 'custom', 'j'), 
     'year' => format_date($form_state['storage']['since'], 'custom', 'Y'), 
    ), 
    '#weight' => 5, 
) ; 

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

    if ($form_state['submitted']) { 
    $form['results'] = array(
     '#value' => example_formandresults_resultstable($form_state), 
     '#type' => 'markup', 
     '#weight' => 10, // bottom of form 
    ) ; 
    } 

    return $form ; 
} 

/** 
* Build results table. 
*/ 
function example_formandresults_resultstable($form_state) { 
    drupal_set_message('Building results table.', 'status', TRUE); 
    dpm($form_state, 'form state'); 
    $sql = "SELECT uid FROM {users} WHERE login >= %d ORDER BY login"; 
    $qry = db_query($sql, $form_state['storage']['since']); 
    while ($uid = db_result($qry)) { 
    $account = user_load($uid); 
    /* there are plenty of good examples on how to theme tables in 
    * forms; this isn't one. 
    */ 
    $rows[] = array(
     $account->name, 
     format_date($account->login), 
    ) ; 
    } 
    // dpm($rows, 'rows'); 
    $headers = array('Name', 'Last Login'); 
    $result = t("<h3>Accounts logged in since: %since</h3>", array('%since' => format_date($form_state['storage']['since']))) ; 
    $result .= theme('table', $header, $rows) ; 
    return $result ; 
} 
+0

フォームを表示し、デフォルトの結果セットをページに表示し、ビューアがフォーム提出によってページ上の結果をフィルタリングできるようにする場合、このパートが問題の場合は何ですか? – Oswald

+0

質問の2番目のパラグラフで説明されています(多分私は明確ではありませんでしたか?)。結果セットのクエリを2回実行します。これにより、負荷が追加されます。新しいフォームを作成するときのクエリは冗長です。私が取り組むべき解決策の1つは、テーマ層に結果セットを構築することです。 –

答えて

0

は伝えるために([ '値'] $ form_state)あるいは$ form_state [ 'ポスト']のカウントをチェックしてみますフォームが提出されている場合。

関連する問題