Submitted by smorele on
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);
}
?>
Bonjour,
Permalien Soumis par Damien LAGUERRE le 19 Février, 2015 - 19:00
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.