FluxBB.fr

Le site des utilisateurs francophones de FluxBB.

Vous n'êtes pas identifié(e).

#1 08-04-2012 06:50:10

iDevice
Membre
Inscription : 29-09-2011
Messages : 74

[Résolu] Amélioration de la recherche sous "admin_users.php" (mail & signature)

Bonjour,

J'aurai souhaité obtenir à nouveau votre aide...

Cette fois-ci, c'est au sujet de la recherche sous "admin_users.php", et plus précisément au niveau des emails et des signatures.

En fait, je n'arrive pas à comprendre (et donc encore moi à réaliser tongue) comment je pourrai mettre en œuvre une recherche selon les critères suivants :

adminuserphp.png

Comme vous pouvez le voir, j'ai ajouté une checkbox afin de lister tous les utilisateurs ayant une adresse email n'appartenant pas aux domaines .fr ou .com ainsi qu'un menu sélectif pour me permettre de lister les utilisateurs disposant ou non d'une signature.

Pour la checkbox, il est évident qu'elle n'est censée être cochée que si le champs "Adresse électronique" est laissé vierge ou si la recherche sur ce champs est de type identifiant@*

Pour les signatures, le fonctionnement souhaité serait le suivant :
- Valeur "Quelque soit la signature" : Option par défaut devant effectuer une recherche traditionnelle, à savoir que la recherche doit s'effectuer comme si cette option était inexistante.
- Valeur "Avec signature" : Si sélectionnée, la recherche doit se comporter comme si le champs "Signature" est renseigné au moment de la recherche, ou bien ne rechercher que parmi les utilisateurs disposant d'une signature renseignée si jamais le champs "Signature" est laissé vierge.
- Valeur "Aucune signature" : Si sélectionnée, la recherche doit se comporter comme si le champs "Signature" est laissé vierge au moment de la recherche tout en ne recherchant (exclusivement) que parmi les utilisateurs ne disposant d'aucune signature renseignée.

Mon réel problème est donc que je ne vois pas comment je pourrai me débrouiller pour à la fois récupérer le résultat d'une requête SQL (ex pour les emails : SELECT * FROM `users` WHERE (`email` NOT LIKE '%@%.fr' AND `email` NOT LIKE '%@%.com'); ), tout en réutilisant ce dernier pour une seconde requête (afin de "rebondir" sur le cheminement de la recherche classique et actuellement utilisée sous la version native de FluxBB 1.4.8 ("PHP, c'est plus fort que moi !").  sad

Du coup, est-ce que l'un d'entre vous pourrait m'aiguiller afin que je n'avance pas à l'aveugle car là je patauge sérieusement...?

Merci d’avance pour votre soutien et votre aide précieuse. wink

Hors ligne

#2 08-04-2012 21:27:39

enum
Membre
Inscription : 22-03-2012
Messages : 41

Re : [Résolu] Amélioration de la recherche sous "admin_users.php" (mail & signature)

Bonjour,


De base, pour le .fr et .com pourquoi ne pas faire 2 recherches *.fr et *.com ?

Et pour rechercher seulement dans les utilisateurs qui ont une signature, on peut mettre :

_*

( _ est n'importe quel caractère et * le "joker" )


Sinon après avoir ajouter les champs, il faut modifier la partie :

else if (isset($_GET['find_user']))
{

  /* cette partie */

Par exemple si votre case à cocher a un name "email_fr_com" il faudra ajouter une ligne :

$email_fr_com= isset($_GET['email_fr_com']) ? pun_trim($_GET['email_fr_com']) : '';

Et ajouter après :

	$like_command = ($db_type == 'pgsql') ? 'ILIKE' : 'LIKE';
	foreach ($form as $key => $input)
	{
		if ($input != '' && in_array($key, array('username', 'email', 'title', 'realname', 'url', 'jabber', 'icq', 'msn', 'aim', 'yahoo', 'location', 'signature', 'admin_note')))
		{
			$conditions[] = 'u.'.$db->escape($key).' '.$like_command.' \''.$db->escape(str_replace('*', '%', $input)).'\'';
			$query_str[] = 'form%5B'.$key.'%5D='.urlencode($input);
		}
	}

Ceci :

if($email_fr_com != '') {
			$conditions[] = '(u.email '.$like_command.' \'%.fr\' OR u.email '.$like_command.' \'%.com\')';
			$query_str[] = 'email_fr_com='.urlencode($email_fr_com);
}

Pour la signature, si vous avez un select avec un name "signature_state", vous pourriez faire également :

$signature_state= isset($_GET['signature_state']) ? pun_trim($_GET['signature_state']) : '';

Et mettre après la même zone :

if($signature_state != '') {
  switch($signature_state)
  {
    case 'empty':
		$conditions[] = 'u.signature NOT '.$like_command.' \'_%\'';
                 break;
    case 'used':
		$conditions[] = 'u.signature '.$like_command.' \'_%\'';
                 break;
  }
  $query_str[] = 'signature_state='.urlencode($signature_state);
}

( vous auriez donc comme value aux options, value="", value="used" et value="empty" )

Cordialement.

Hors ligne

#3 08-04-2012 23:12:30

iDevice
Membre
Inscription : 29-09-2011
Messages : 74

Re : [Résolu] Amélioration de la recherche sous "admin_users.php" (mail & signature)

Bonsoir,

Tout d'abord, un immense MERCI pour votre aide !

Je suis peut-être facilement impressionné, mais j'ai toujours admiré les personnes capables de coder aussi facilement donc vraiment merci. ^^

Au sujet de votre code, cela fonctionne parfaitement pour les emails, mais un hic intervient lorsque je réalise un essai avec les value "used" ou "empty", j'obtiens la fameuse erreur "An error was encountered. Error: Unable to fetch user info." sad

Pour me/nous faciliter la tâche, je suis reparti en reprenant vos labels, ce qui me donne le code ci-dessous :

else if (isset($_GET['find_user']))
{
	$form = isset($_GET['form']) ? $_GET['form'] : array();

	// trim() all elements in $form
	$form = array_map('pun_trim', $form);
	$conditions = $query_str = array();

	$signature_state = isset($_GET['signature_state']) ? pun_trim($_GET['signature_state']) : '';
	$posts_greater = isset($_GET['posts_greater']) ? trim($_GET['posts_greater']) : '';
	$posts_less = isset($_GET['posts_less']) ? trim($_GET['posts_less']) : '';
	$last_post_after = isset($_GET['last_post_after']) ? trim($_GET['last_post_after']) : '';
	$last_post_before = isset($_GET['last_post_before']) ? trim($_GET['last_post_before']) : '';
	$last_visit_after = isset($_GET['last_visit_after']) ? trim($_GET['last_visit_after']) : '';
	$last_visit_before = isset($_GET['last_visit_before']) ? trim($_GET['last_visit_before']) : '';
	$registered_after = isset($_GET['registered_after']) ? trim($_GET['registered_after']) : '';
	$registered_before = isset($_GET['registered_before']) ? trim($_GET['registered_before']) : '';
	$order_by = isset($_GET['order_by']) && in_array($_GET['order_by'], array('username', 'email', 'num_posts', 'last_post', 'last_visit', 'registered')) ? $_GET['order_by'] : 'username';
	$direction = isset($_GET['direction']) && $_GET['direction'] == 'DESC' ? 'DESC' : 'ASC';
	$user_group = isset($_GET['user_group']) ? intval($_GET['user_group']) : -1;

	$query_str[] = 'order_by='.$order_by;
	$query_str[] = 'direction='.$direction;
	$query_str[] = 'user_group='.$user_group;

	if ($signature_state != '')
	{
		switch($signature_state) {
			case 'empty':
				$conditions[] = 'u.signature NOT '.$like_command.' \'_%\'';
				break;
			case 'used':
				$conditions[] = 'u.signature '.$like_command.' \'_%\'';
				break;
		}
		$query_str[] = 'signature_state='.urlencode($signature_state);
	}

	//-- Suite du code... --//

Petite question au passage, comment je sais si je dois utiliser "pun_trim" ou "trim" ?
Je me pose cette question car tout le reste de cette zone de code ne fait mention que de "trim".


Puis, pour le blockform des critères de recherche (en rapport avec le screenshoot de mon premier post), la partie concernée est la suivante :

<tr>
	<th scope="row"><?php echo $lang_admin_users['Signature label'] ?></th>
	<td><input type="text" name="form[signature]" size="35" maxlength="512" tabindex="13" /><br />
	<select name="signature_state" tabindex="14">
		<option value="" selected="selected"><?php echo $lang_admin_users['Param Signature Both'] ?></option>
		<option value="used"><?php echo $lang_admin_users['Param Signature With'] ?></option>
		<option value="empty"><?php echo $lang_admin_users['Param Signature Without'] ?></option>
	</select></td>
</tr>

Je me doute que cela doit provenir d'une erreur de ma part, mais à vrai dire, étant donné que le reste du code est inchangé et que seules ces parties ont été modifiées/ajoutées, je me demande bien pour quelle raison je ne peux interroger les infos utilisateur...?

Encore merci pour votre aide et bonne soirée. wink

Hors ligne

#4 08-04-2012 23:52:46

enum
Membre
Inscription : 22-03-2012
Messages : 41

Re : [Résolu] Amélioration de la recherche sous "admin_users.php" (mail & signature)

le dernier bloc, il fallait le mettre après ceci en fait :

if($email_fr_com != '') {
			$conditions[] = '(u.email '.$like_command.' \'%.fr\' OR u.email '.$like_command.' \'%.com\')';
			$query_str[] = 'email_fr_com='.urlencode($email_fr_com);
}

c'est juste pour que $like_command soit défini, si ce n'est pas défini c'est traité comme '' et ceci était mis dans la requête  :

u.signature '_%'

--ou bien 

u.signature NOT '_%'

ce qui causait l'erreur.

Dernière modification par enum (08-04-2012 23:55:20)

Hors ligne

#5 09-04-2012 01:07:36

iDevice
Membre
Inscription : 29-09-2011
Messages : 74

Re : [Résolu] Amélioration de la recherche sous "admin_users.php" (mail & signature)

Mais carrément !

Si maintenant je me mets à utiliser une variable non définie au préalable... lol

Sincèrement, je te remercie de m'avoir apporté ton aide (et quelle rapidité de réponse en plus).

Dans cette affaire, je ne regrette qu'une chose, c'est de ne jamais avoir apprit à développer comme vous autres, membres de ce forum. Du coup, je crains ne jamais pouvoir te/vous rendre la pareille... ^^

Encore merci pour tout et bonne fin de soirée.

PS: Le problème étant résolu avec une efficacité exemplaire, je passe ce topic en "Résolu". wink

Hors ligne

#6 09-04-2012 10:02:01

Otomatic
Régisseur
Lieu : Paris, France
Inscription : 12-12-2005
Messages : 3 660
Site Web

Re : [Résolu] Amélioration de la recherche sous "admin_users.php" (mail & signature)

iDevice a écrit :

Petite question au passage, comment je sais si je dois utiliser "pun_trim" ou "trim" ?
Je me pose cette question car tout le reste de cette zone de code ne fait mention que de "trim".

Bonjour,

Lorsque l'on pose une question de ce style, il faut toujours aller lire les docs, d'autant plus qu'elles existent en français : pour trim, il est écrit :

Documentation PHP a écrit :

trim() retourne la chaîne str, après avoir supprimé les caractères invisibles en début et fin de chaîne. Si le second paramètre charlist est omis, trim() supprimera les caractères suivants :
    " " (ASCII 32 (0x20)), un espace ordinaire.
    "\t" (ASCII 9 (0x09)), une tabulation.
    "\n" (ASCII 10 (0x0A)), une nouvelle ligne (line feed).
    "\r" (ASCII 13 (0x0D)), un retour chariot (carriage return).
    "\0" (ASCII 0 (0x00)), le caractère NUL.
    "\x0B" (ASCII 11 (0x0B)), une tabulation verticale.

et en regardant ce que fait la fonction pun_trim qui est définie dans include\functions.php :

function pun_trim($str, $charlist = false)
{
	return utf8_trim($str, $charlist);
}

où on peut voir qu'il est utilisé utf8_trim() et non pas trim().
Nota : Ne jamais déduire du nom d'une fonction ce qu'elle est censée faire, même si cela semble intuitif
La fonction utf8_trim() n'est pas une fonction PHP, mais une fonction FluxBB, définie dans include\utf8\trim.php et qui est :

/**
* UTF-8 aware replacement for trim()
* Note: you only need to use this if you are supplying the charlist
* optional arg and it contains UTF-8 characters. Otherwise trim will
* work normally on a UTF-8 string
* @author Andreas Gohr <andi@splitbrain.org>
* @see http://www.php.net/trim
* @see http://dev.splitbrain.org/view/darcs/dokuwiki/inc/utf8.php
* @return string
* @package utf8
* @subpackage strings
*/
function utf8_trim( $str, $charlist=false)
{
	if($charlist === false)
		return trim($str);

	return utf8_ltrim(utf8_rtrim($str, $charlist), $charlist);
}

Donc, dans le cas où on appelle pun_trim($str), sans second paramètre, ça fait exactement la même chose que trim().

Toute cette explication pour vous montrer qu'il faut toujours aller voir les documentations et le code.


Ce n'est pas parce que l'erreur se propage qu'elle devient vérité. Gandhi
Sont différents : ça et sa - est et ait - à et a - ce et se - mes et mais ou met - été et était - c'est et ces - ce-si et ceci
La vie sans musique est tout simplement une erreur, une fatigue, un exil. Friedrich Nietzsche

Hors ligne

Pied de page des forums