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 ;
}
フォームを表示し、デフォルトの結果セットをページに表示し、ビューアがフォーム提出によってページ上の結果をフィルタリングできるようにする場合、このパートが問題の場合は何ですか? – Oswald
質問の2番目のパラグラフで説明されています(多分私は明確ではありませんでしたか?)。結果セットのクエリを2回実行します。これにより、負荷が追加されます。新しいフォームを作成するときのクエリは冗長です。私が取り組むべき解決策の1つは、テーマ層に結果セットを構築することです。 –