Annonce

  •  » Plugins
  •  » [Personal Plugin] Ajouter des colonnes dans la liste des users en admi

#1 2007-06-13 00:02:43

rub
Former Piwigo Team
Lille
2005-08-26
5239

[Personal Plugin] Ajouter des colonnes dans la liste des users en admi

Reprend un début de discussion dans le topic [Plugin] Faire son plugin personnel pour y intégrer ses modifications.

rub a écrit:

Eric a écrit:

Bonsoir !

Je suis un assidu des cours du soir du professeur rub ;-) Mais j'ai quelques soucis pour faire mes devoirs. [mode fayot = On]Je ne pense pourtant pas être le cancre de la classe et "je_ne_dors_pas_au_fond_près_de_la_fenêtre_où_il_y_a_le_radiateur".[mode fayot = Off].

Voila ce que je souhaite réussir à obtenir : Ajouter une colonne "Langue" et remonter les paramètres de langue pour chaque visiteur dans la page de gestion des utilisateurs du panneau d'admin (user_list.php et user_list.tpl).

Alors, fort des recommandations très claires de rub sur le wiki, j'ai pondu çà :

Code:

/* Remplace une partie du code par une autre dans un template */
function personal_replace_tpl_code($tlp_handle, $old, $new)
{
  global $template;
 
  $template->loadfile($tlp_handle);
  $template->uncompiled_code[$tlp_handle] = str_replace($old, $new, $template->uncompiled_code[$tlp_handle]);
}

add_event_handler('loc_begin_page_tail', 'personal_user_manager');
 
function personal_user_manager()
{
  global $page, $template;
 
  if
  (
    is_admin() and 
    (script_basename() == 'admin') and
    ($page['page'] == 'user_list')
  )
  {
    personal_replace_tpl_code('tail','
  SELECT DISTINCT u.'.$conf['user_fields']['id'].' AS id,
                u.'.$conf['user_fields']['username'].' AS username,
                u.'.$conf['user_fields']['email'].' AS email,
                ui.status,
                ui.adviser,
                ui.enabled_high','
  SELECT DISTINCT u.'.$conf['user_fields']['id'].' AS id,
                u.'.$conf['user_fields']['username'].' AS username,
                u.'.$conf['user_fields']['email'].' AS email,
                ui.status,
        ui.language,
                ui.adviser,
                ui.enabled_high'
    );
    
    personal_replace_tpl_code('tail',"
  $template->assign_block_vars(
    'user',
    array(
      'CLASS' => ($num % 2 == 1) ? 'row2' : 'row1',
      'ID' => $local_user['id'],
      'CHECKED' => $checked,
      'U_PROFILE' => $profile_url.$local_user['id'],
      'U_PERM' => $perm_url.$local_user['id'],
      'USERNAME' => $local_user['username']
        .($local_user['id'] == $conf['guest_id']
          ? '<BR />['.l10n('is_the_guest').']' : '')
        .($local_user['id'] == $conf['default_user_id']
          ? '<BR />['.l10n('is_the_default').']' : ''),
      'STATUS' => $lang['user_status_'.
        $local_user['status']].(($local_user['adviser'] == 'true')
        ? '<BR />['.l10n('adviser').']' : ''),
      'EMAIL' => get_email_address_as_display_text($local_user['email']),
      'GROUPS' => $groups_string,
      'PROPERTIES' => 
        (isset($local_user['enabled_high']) and ($local_user['enabled_high'] == 'true'))
        ? $lang['is_high_enabled'] : $lang['is_high_disabled']
      )
    );","
  $template->assign_block_vars(
    'user',
    array(
      'CLASS' => ($num % 2 == 1) ? 'row2' : 'row1',
      'ID' => $local_user['id'],
      'CHECKED' => $checked,
      'U_PROFILE' => $profile_url.$local_user['id'],
      'U_PERM' => $perm_url.$local_user['id'],
      'USERNAME' => $local_user['username']
        .($local_user['id'] == $conf['guest_id']
          ? '<BR />['.l10n('is_the_guest').']' : '')
        .($local_user['id'] == $conf['default_user_id']
          ? '<BR />['.l10n('is_the_default').']' : ''),
      'STATUS' => $lang['user_status_'.
        $local_user['status']].(($local_user['adviser'] == 'true')
        ? '<BR />['.l10n('adviser').']' : ''),
      'LANGUAGE' => $local_user['language'],
      'EMAIL' => get_email_address_as_display_text($local_user['email']),
      'GROUPS' => $groups_string,
      'PROPERTIES' => 
        (isset($local_user['enabled_high']) and ($local_user['enabled_high'] == 'true'))
        ? $lang['is_high_enabled'] : $lang['is_high_disabled']
      )
    );"
    );
  }
}

Mais c'est tout pourri :-(
Surtout la première partie personal_replace_tpl_code qui attaque un code non tpl ! Je sais : je suis mauvais... Mais je ne demande qu'à m'améliorer.

Dans mon cas, comment peut-on modifier un code php par le biais d'un plugin perso ? Un peu comme pour l'email obligatoire mais en plus complexe ?

Les problèmes actuellement pour ton cas sont:
  o le remplacement du code php n'est pas possible (sauf à faire que le plugin le fasse lui-même)
  o le remplacement du tpl n'est pas possible aussi car il manque des evenements (en 1.7.1, il y a ce qu'il faut pour modifier tous les éléments.

Les voies possibles:
  o Modifier le contenu de la valeur ADMIN_CONTENT dans le tpl, c'est le code compilé (HTML pur) de la liste des users
  o Utiliser du javascript pour modifier le contenu d'une cellule ou en rajouter

rub a écrit:

Eric a écrit:

Merci rub.

Je crois que je vais attendre la 1.7.1 dans ce cas ;-)

Mais, j'ai peut-être une idée à suivre...

Eric a écrit:

rub a écrit:

Eric a écrit:

Merci rub.

Je crois que je vais attendre la 1.7.1 dans ce cas ;-)

Mais, j'ai peut-être une idée à suivre...

Cette idée est issue d'un vieux mod (v1.4 ou 1.5 - je ne sais plus) que j'ai pu adapter pour chaque version successive de PWG. Ce soir j'ouvrirai une discussion sur le sujet. A savoir, la possibilité d'afficher des colonnes d'info en plus (ou en moins) dans la gestion des utilisateurs.

rub a écrit:

Code:

add_event_handler('loc_begin_page_tail', 'personal_test');

function personal_test()
{
  global $page;

  if
  (
    is_admin() and 
    (script_basename() == 'admin') and
    ($page['page'] == 'user_list')
  )
  {
    global $template;

    //$template->output = str_replace($template->get_var('ADMIN_CONTENT'), '', $template->output);
    $template->output = '';
    $template->parse('header');


    personal_add_after_tpl_code('user_list',
    '<th>{lang:Groups}</th>',
    '
    <th>{lang:language}</th>
    ');

    personal_add_after_tpl_code('user_list',
    '<td>{user.GROUPS}</td>',
    '
    <td>{user.LANG}</td>
    ');

    /*$v = $template->_tpldata['user' . '.'][];
    $template->_tpldata[$blockname . '.'][] = array_merge($v, arr);*/
    
    global $lang, $conf, $start, $groups, $profile_url, $perm_url;

    foreach ($page['filtered_users'] as $num => $local_user)
    {
      // simulate LIMIT $start, $conf['users_page']
      if ($num < $start)
      {
        continue;
      }
      if ($num >= $start + $conf['users_page'])
      {
        break;
      }
      $v = $template->_tpldata['user'.'.'][$num];
      $template->_tpldata['user'.'.'][$num] = array_merge($v, array('LANG' => $num.' A REMPLIR'));
    }

    $template->assign_var_from_handle('ADMIN_CONTENT', 'user_list');
    $template->parse('admin');
  }
}

Quel beau TP que tu m'as donné! lol...
Ca fonctionne, il ne reste plus qu'à renseigner la langue (et plus).
Avec $page['filtered_users'], tu peux avoir la liste des users pour lesquels il faut rechercher la langue.

Eric a écrit:

Waouh ! Cà déchire !

Faut déjà que j'épluche ton code pour comprendre les rudiments du pourquoi et du comment (pas envie de mourir idiot :-) ).

J'essaye çà pour voir ;-)

Eric a écrit:

Ci-après, mes réflexions sur le sujet qui nous intéresse. Déjà pour voir si j'ai vraiment pigé et aussi car çà m'aide à faire le point.

Je pense avoir compris la substitution de template et j'ai reconnu une partie du code de user_list.php. Le pb est de pouvoir "surcharger" la requète initiale :

Code:

SELECT DISTINCT u.'.$conf['user_fields']['id'].' AS id,
                u.'.$conf['user_fields']['username'].' AS username,
                u.'.$conf['user_fields']['email'].' AS email,
                ui.status,
                ui.adviser,
                ui.enabled_high
  FROM '.USERS_TABLE.' AS u
    INNER JOIN '.USER_INFOS_TABLE.' AS ui
      ON u.'.$conf['user_fields']['id'].' = ui.user_id
    LEFT JOIN '.USER_GROUP_TABLE.' AS ug
      ON u.'.$conf['user_fields']['id'].' = ug.user_id
  WHERE u.'.$conf['user_fields']['id'].' > 0';

par celle remontant l'info supplémentaire (ici la langue) :

Code:

SELECT DISTINCT u.'.$conf['user_fields']['id'].' AS id,
                u.'.$conf['user_fields']['username'].' AS username,
                u.'.$conf['user_fields']['email'].' AS email,
                ui.status,
                ui.language,
                ui.adviser,
                ui.enabled_high
  FROM '.USERS_TABLE.' AS u
    INNER JOIN '.USER_INFOS_TABLE.' AS ui
      ON u.'.$conf['user_fields']['id'].' = ui.user_id
    LEFT JOIN '.USER_GROUP_TABLE.' AS ug
      ON u.'.$conf['user_fields']['id'].' = ug.user_id
  WHERE u.'.$conf['user_fields']['id'].' > 0';

Comme tu l'as dit, $page['filtered_users'] remonte les users. Il est issu de la requête initiale retournée par get_filtered_user_list(). Mon raisonnement était de refaire une requête complète un peu dans ce style :

Code:

(...)
    /*$v = $template->_tpldata['user' . '.'][];
    $template->_tpldata[$blockname . '.'][] = array_merge($v, arr);*/
    
    global $page, $lang, $conf, $start, $groups, $profile_url, $perm_url;

  $query = '
SELECT DISTINCT u.'.$conf['user_fields']['id'].' AS id,
                u.'.$conf['user_fields']['username'].' AS username,
                u.'.$conf['user_fields']['email'].' AS email,
                ui.status,
                ui.language,
                ui.adviser,
                ui.enabled_high
  FROM '.USERS_TABLE.' AS u
    INNER JOIN '.USER_INFOS_TABLE.' AS ui
      ON u.'.$conf['user_fields']['id'].' = ui.user_id
    LEFT JOIN '.USER_GROUP_TABLE.' AS ug
      ON u.'.$conf['user_fields']['id'].' = ug.user_id
  WHERE u.'.$conf['user_fields']['id'].' > 0';
  if (isset($filter['username']))
  {
    $query.= '
  AND u.'.$conf['user_fields']['username'].' LIKE \''.$filter['username'].'\'';
  }
  if (isset($filter['group']))
  {
    $query.= '
    AND ug.group_id = '.$filter['group'];
  }
  if (isset($filter['status']))
  {
    $query.= '
    AND ui.status = \''.$filter['status']."';";
  }
;

  $result = pwg_query($query);
  while ($row = mysql_fetch_array($result))
  {
    $user = $row;
  }

  return $user;
  
    foreach ($page['filtered_users'] as $num => $local_user)
    {
      // simulate LIMIT $start, $conf['users_page']
      if ($num < $start)
      {
        continue;
      }
      if ($num >= $start + $conf['users_page'])
      {
        break;
      }
      $v = $template->_tpldata['user'.'.'][$num];
      $template->_tpldata['user'.'.'][$num] = array_merge($v, array('LANG' => $local_user['language']));
    }

    $template->assign_var_from_handle('ADMIN_CONTENT', 'user_list');
    $template->parse('admin');
  }
}

Mais tu t'en doute, çà ne fonctionne pas. :

Code:

Notice: Undefined index: language in d:\web\developpement\easyphp1-8\www\infernoweb\phpwebgallery\plugins\Plugin_perso2\main.inc.php on line 120

Pas si simple, finalement...

Hors ligne

#2 2007-06-13 00:21:23

rub
Former Piwigo Team
Lille
2005-08-26
5239

Re: [Personal Plugin] Ajouter des colonnes dans la liste des users en admi

Petite explication de ce j'ai fait.

1 - J'ai ajouté du code dans le TPL
2 - N'ayant pas les triggers qui vont bien, j'ai vidé tout ce qui a généré par le template (output) et tout régénéré (avec le nouveau TPL code)
3 - Avant la regenration, je parcoure la liste des utilisateurs pour mettre la nouvelle valeur dans le champ qui va bien


RAF: Effectivement, il faut refaire une requête.
Perso, j'aurais parcouru la liste des users avec la méthode du start et mis dans un tableau l'ensemble des IDs users.
Puis, j'aurais fait un requete pour récupérer les infos nécessaires pour liste uniquement (vive mla fonction implode).
Puis mise à jour de la liste $page['filtered_users'] avec l'info de la query (peut-être by-passer)
Et pour finir mise à jour du 'A REMPLIR'.

Voila en gros une façon de faire tout dépend comme tu va gérer les tableaux.

Hors ligne

#3 2007-06-14 14:30:40

rub
Former Piwigo Team
Lille
2005-08-26
5239

Re: [Personal Plugin] Ajouter des colonnes dans la liste des users en admi

Eric, tu as réussi? Ou bien sûrement, tu n'as pas eu le temps?

Hors ligne

#4 2007-06-14 23:38:50

Eric
Former Piwigo Team
VALENCE (FR)
2005-03-25
4579

Re: [Personal Plugin] Ajouter des colonnes dans la liste des users en admi

Je viens de rentrer du boulot et effectivement, je n'ai pas eu le temps d'approfondir.

Mais mes essais précédents se sont soldés par un échec : Je me retrouve toujours confrontés à des problèmes de variables non définies alors qu'elles le sont dans la requète d'origine (user_list.php). Je suis tenté alors de faire des include() mais je sais que ce n'est pas la solution.

Alors je cherche encore... Mes connaissances en Php n'évoluent pas aussi vite que je le souhaiterai, malheureusement.

Je vais essayer de me libérer quelques heures ce week-end pour revoir çà.

Hors ligne

#5 2007-06-15 00:23:36

rub
Former Piwigo Team
Lille
2005-08-26
5239

Re: [Personal Plugin] Ajouter des colonnes dans la liste des users en admi

Eric a écrit:

Je vais essayer de me libérer quelques heures ce week-end pour revoir çà.

Par contre moi, ca ne sera pas avant lundi!

Mais ne t'en fais pas, tu vas réussir ;-)

Hors ligne

  •  » Plugins
  •  » [Personal Plugin] Ajouter des colonnes dans la liste des users en admi

Pied de page des forums

Propulsé par FluxBB

github twitter newsletter Faire un don Piwigo.org © 2002-2024 · Contact