2010-12-30 6 views
0

Ziel ist es, ein Formular mit einer Standard-Ergebnismenge auf der Seite anzuzeigen und den Viewer die Ergebnisse auf der Seite durch Formularübertragung filtern. Dieser Teil funktioniert.Drupal: Render-Formular mit Ergebnissen, aber keine Resultset-Abfrage duplizieren

Allerdings: Wenn ein Standardsatz von Ergebnissen enthalten ist, werden bei der ersten Übermittlung zwei Ergebnismengen für die Anzeige erstellt. Nachfolgende Übermittlungen bilden nur eine Ergebnismenge. Abgesehen von diesem zusätzlichen Ergebnissatz funktioniert es wie beabsichtigt.

Ein couple von questions habe über die Anzeige von Formularen und Ergebnissen auf der gleichen Seite zuvor gefragt, und es gibt eine Lullabot article für Drupal5.

Hier ist der Code, den ich zur Zeit bin mit (auf Github @example_formandresults.module)

<?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

Wenn Ihr Ziel darin besteht, ein Formular mit einem Standardresultset auf der Seite anzuzeigen und es dem Viewer zu ermöglichen, die Ergebnisse auf der Seite nach Formularübertragung zu filtern, und wenn dieser Teil funktioniert, was ist das Problem? – Oswald

+0

Im zweiten Absatz der Frage skizziert (vielleicht war ich nicht klar?). Es führt die Resultset-Abfrage zweimal aus, und das fügt Last hinzu - die Abfrage, wenn das neue Formular erstellt wird, ist redundant. Eine Lösung, mit der ich experimentiere (* mögliche Häresie), ist das Ergebnisset in der Themenebene zu erstellen. –

Antwort

0

Zähl- Überprüfung Versuchen ($ form_state [ 'Werte']) oder sogar form_state $ [ 'post'] zu sagen, wenn das Formular gesendet wurde.

Verwandte Themen