Créer une page avec un form et un table de résultat

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,
j'avais l'impression que c'etait simple mais au final non.
J'ai une page de recherche d'uilisateur. Je renseigne dans un formulaire un nom et un prenom, ca me retourne une liste paginée d'utilisateur. (liste qui proviens d'un webservice et non de la liste des utilisateurs drupal)

Avec Drupal, j'ai réussi à faire le formulaire, la liste, mais impossible d'avoir la pagination quand je mets les deux ensembles.
J'ai beau cherché, je ne trouve pas d'explication claires sur mon probleme.

Voici le code actuellement utilisé:

function collectivite_search_user_form($form, &$form_state) {
    $form['name'] = array(
      '#type' => 'textfield',
      '#title' => t('Name'),
      '#required'   => True,
    );
    $form['firstname'] = array(
      '#type' => 'textfield',
      '#title' => t('Firstname'),
      //'#required'   => True,
    );
    $form['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Submit'),
    );
    if (isset($form_state['table'])) {
        $form['table'] = $form_state['table'];
    }
    return $form;
}

function collectivite_search_user_form_submit($form, &$form_state) {
    module_load_include('inc', 'collectivite', 'collectivite.api');
    $results = collectivite_ws_get_users($form_state['values']['name'], $form_state['values']['firstname']);
    if(is_object($results->Dossier)){
            $rows[] = array(
                'id'       => $results->Dossier->id,
                'nom'       => $results->Dossier->nom,
                'prenom'    => $results->Dossier->prenom,
            );
    }else{
        foreach($results->Dossier as $dossier) {       
            $rows[] = array(
                'id'       => $dossier->id,
                'nom'       => $dossier->nom,
                'prenom'    => $dossier->prenom,
            );
        }

    }

    $paging = pager_array_splice($rows, 5);
    $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);
}

Une idée ?

Merci.

===== EDIT =====
J'ai trouvé la solution sans l'utilisation des sessions ce qui est plus propre :)

    <?php
   
   
   
/<em>
    * 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'));
   
      /</
em>
      if (isset(
$form_state['table'])) {
       
$form['table']  = $form_state['table'];
      }
     
$form['pager'] = array('#markup' => theme('pager'));
      <
em>/
      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;
    }
    /</
em>
       
$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);
    }
?>
Forum : 
Tags : 

Bonjour,

Le pager s'affiche convenablement mais au clique vous perdez la table ?
Si c'est le cas, rien d'étrange, tout fonctionne correctement.

Le pager de Drupal fonctionne en Get et le form en Post...

La solution va vous paraître évidente :
Dans le _submit() il vous faut stocker, en variables de session, les données renseignées, et les redistribuer au formulaire via #default_value.

Regardez comment est construite la page user_admin_account(), l’exemple est plutôt lourd mais réponds bien à votre problème.