From e6d3126cc518f55ce59bfe0e017bfc9de7cf62a8 Mon Sep 17 00:00:00 2001 From: Yung Han Khoe Date: Wed, 21 May 2008 10:51:40 +0000 Subject: [PATCH] More UserList sort and search changes --- lib/WebGUI/Asset/Wobject/UserList.pm | 99 +++++++++++------------ lib/WebGUI/i18n/English/Asset_UserList.pm | 4 + 2 files changed, 50 insertions(+), 53 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/UserList.pm b/lib/WebGUI/Asset/Wobject/UserList.pm index 2af8291e0..618a7a1b9 100644 --- a/lib/WebGUI/Asset/Wobject/UserList.pm +++ b/lib/WebGUI/Asset/Wobject/UserList.pm @@ -18,8 +18,6 @@ our @ISA = qw(WebGUI::Asset::Wobject); Copyright 2004-2008 United Knowledge -See the doc/license-UserList.txt file for licensing information. - http://www.unitedknowledge.nl developmentinfo@unitedknowledge.nl @@ -36,12 +34,7 @@ The wobject also checks the publicProfile and publicEmail setting for each user. =head1 SYNOPSIS -my $wobject = WebGUI::Wobject::UserList->new(\%properties); - -$text = $wobject->name; - -$html = $wobject->www_edit; -$html = $wobject->www_view; +use WebGUI::Asset::Wobject::UserList; =cut @@ -254,12 +247,21 @@ sub view { my $self = shift; my $form = $self->session->form; + my $url = $self->session->url; my $i18n = WebGUI::International->new($self->session, "Asset_UserList"); - my (%var, @users, @profileField_loop, @profileFields,@profileFieldNames); + my (%var, @users, @profileField_loop, @profileFields); my ($defaultPublicProfile, $defaultPublicEmail, $user, $sth, $sql, $profileField); my $error = $self->session->errorHandler; my $start_time = time(); + my $currentUrlWithoutSort = $self->getUrl(); + foreach ($form->param) { + unless (WebGUI::Utility::isIn($_,qw(orderBy orderType op func)) || $_ =~ /identifier/i || $_ =~ /password/i) { + $currentUrlWithoutSort = $url->append($currentUrlWithoutSort, $url->escape($_) + .'='.$url->escape($form->process($_))); + } + } + # $error->info("time :".(time() - $start_time)); $sth = $self->session->db->read("SELECT field.fieldName, field.label, field.sequenceNumber, field.visible " @@ -268,22 +270,25 @@ sub view { ."ORDER BY category.sequenceNumber, field.sequenceNumber"); while ($profileField = $sth->hashRef){ my $label = WebGUI::Operation::Shared::secureEval($self->session,$profileField->{label}); + my $sortByURL = $url->append($currentUrlWithoutSort,'orderBy='.$url->escape($profileField->{fieldName})); + if ($form->process('orderType') eq 'asc' && $form->process('orderBy') eq $profileField->{fieldName}){ + $sortByURL = $url->append($sortByURL,'orderType=desc'); + } + else{ + $sortByURL = $url->append($sortByURL,'orderType=asc'); + } push(@profileFields, { "fieldName"=>$profileField->{fieldName}, "label"=>$label, "sequenceNumber"=>$profileField->{sequenceNumber}, "visible"=>$profileField->{visible}, }); - push(@profileFieldNames, $profileField->{fieldName}); + push (@profileField_loop, { + "profileField_label"=>WebGUI::Operation::Shared::secureEval($self->session,$profileField->{label}), + "profileField_sortByURL"=>$sortByURL, + }); unless($self->get("showOnlyVisibleAsNamed") && $profileField->{visible} != 1){ $var{'profileField_'.$profileField->{fieldName}.'_label'} = $label; - my $sortByURL = '?orderBy='.$profileField->{fieldName}; - if ($form->process('orderType') eq 'asc' && $form->process('orderBy') eq $profileField->{fieldName}){ - $sortByURL .= ';orderType=desc'; - } - else{ - $sortByURL .= ';orderType=asc'; - } $var{'profileField_'.$profileField->{fieldName}.'_sortByURL'} = $sortByURL; } } @@ -299,41 +304,39 @@ sub view { # $error->info("creating constraint, time :".(time() - $start_time)); my $constraint; - if ($self->session->form->process('search')){ - $constraint = "(".join(' or ', map {'userProfileData.'.$_->{fieldName}.' like "%'.$self->session->form->process('search').'%"'} @profileFields).")"; + if ($form->process('search')){ + # Normal search with one query in one or more fields + $constraint = "(".join(' or ', map {'userProfileData.'.$_->{fieldName}.' like "%'.$form->process('search').'%"'} @profileFields).")"; } - elsif ($self->session->form->process('searchExact')){ - $constraint = "(".join(' or ', map {'userProfileData.'.$_->{fieldName}.' like "'.$self->session->form->process('searchExact').'"'} @profileFields).")"; + elsif ($form->process('searchExact')){ + # Exact search with one query in one or more fields + $constraint = "(".join(' or ', map {'userProfileData.'.$_->{fieldName}.' like "'.$form->process('searchExact').'"'} @profileFields).")"; } else{ + # Mixed normal and exact search with different queries for each field. my @profileSearchFields = (); - my @profileSearchExactFields = (); foreach my $profileField (@profileFields){ - if ($self->session->form->process('search_'.$profileField->{fieldName})){ - push(@profileSearchFields,$profileField); + # Exact search has precedence over normal search + if ($form->process('searchExact_'.$profileField->{fieldName})){ + push(@profileSearchFields,'userProfileData.'.$profileField->{fieldName} + .' like "'.$form->process('searchExact_'.$profileField->{fieldName}).'"'); } - if ($self->session->form->process('searchExact_'.$profileField->{fieldName})){ - push(@profileSearchExactFields,$profileField); + elsif ($form->process('search_'.$profileField->{fieldName})){ + push(@profileSearchFields,'userProfileData.'.$profileField->{fieldName} + .' like "%'.$form->process('search_'.$profileField->{fieldName}).'%"'); } } - my $searchType = $self->session->form->process('searchType') || 'or'; - if (scalar(@profileSearchFields) > 0){ - $constraint = "(".join(' '.$searchType.' ', map {'userProfileData.'.$_->{fieldName}.' like "%' - .$self->session->form->process('search_'.$_->{fieldName}).'%"'} @profileSearchFields).")"; - foreach my $profileSearchField (@profileSearchFields){ - } - } - if (scalar(@profileSearchExactFields) > 0){ - $constraint = "(".join(' '.$searchType.' ', map {'userProfileData.'.$_->{fieldName}.' like"' - .$self->session->form->process('searchExact_'.$_->{fieldName}).'"'} @profileSearchExactFields).")"; + my $searchType = $form->process('searchType') || 'or'; + if (scalar(@profileSearchFields) > 0){ + $constraint = '('.join(' '.$searchType.' ',@profileSearchFields).')'; } } $sql .= " and ".$constraint if ($constraint); # $error->info("created constraint, time :".(time() - $start_time)); - my $orderBy = $self->session->form->process('orderBy') || $self->get('sortBy') || 'users.username'; - my $orderType = $self->session->form->process('orderType') || $self->get('sortOrder') || 'asc'; + my $orderBy = $form->process('orderBy') || $self->get('sortBy') || 'users.username'; + my $orderType = $form->process('orderType') || $self->get('sortOrder') || 'asc'; my @orderByUserProperties = ('dateCreated', 'lastUpdated', 'karma', 'userId'); if(isIn($orderBy,@orderByUserProperties)){ @@ -344,12 +347,12 @@ sub view { ($defaultPublicProfile) = $self->session->db->quickArray("SELECT dataDefault FROM userProfileField WHERE fieldName='publicProfile'"); ($defaultPublicEmail) = $self->session->db->quickArray("SELECT dataDefault FROM userProfileField WHERE fieldName='publicEmail'"); - my $paginatePage = $self->session->form->param('pn') || 1; + my $paginatePage = $form->param('pn') || 1; my $currentUrl = $self->getUrl(); - foreach ($self->session->form->param) { + foreach ($form->param) { unless ($_ eq "pn" || $_ eq "op" || $_ eq "func" || $_ =~ /identifier/i || $_ =~ /password/i) { - $currentUrl = $self->session->url->append($currentUrl, $self->session->url->escape($_) - .'='.$self->session->url->escape($self->session->form->process($_))); + $currentUrl = $url->append($currentUrl, $url->escape($_) + .'='.$url->escape($form->process($_))); } } @@ -410,15 +413,7 @@ sub view { } } # $error->info("created tmpl vars for users, time :".(time() - $start_time)); - foreach my $profileField (@profileFields){ - push (@profileField_loop, { - "profileField_label"=>WebGUI::Operation::Shared::secureEval($self->session,$profileField->{label}), - "profileField_sortByURL"=>'?orderBy='.$profileField->{fieldName}, - }); - } $var{numberOfProfileFields} = scalar(@profileFields); - $var{profileNotPublic_message} = $i18n->get('Profile not public message'); - $var{emailNotPublic_message} = $i18n->get('Email not public message'); $var{profileField_loop} = \@profileField_loop; $var{user_loop} = \@users; $p->appendTemplateVars(\%var); @@ -435,10 +430,9 @@ sub view { } }); - $var{searchFormQuery_label} = $i18n->get('query label'); $var{searchFormQuery_form} = WebGUI::Form::text($self->session,{ name=>'search', - value=>$self->session->form->process("search"), + value=>$form->process("search"), }); $var{searchFormSubmit} = WebGUI::Form::submit($self->session,{value => $i18n->get('submit search label')}); @@ -447,7 +441,6 @@ sub view { # $error->info("global tmpl_vars created, time :".(time() - $start_time)); my $out = $self->processTemplate(\%var,$self->get("templateId")); - $out = $self->processStyle($out) if ($self->session->form->process("func") eq "list"); # $error->info("done, going to return output, time :".(time() - $start_time)); return $out; } diff --git a/lib/WebGUI/i18n/English/Asset_UserList.pm b/lib/WebGUI/i18n/English/Asset_UserList.pm index b12403269..983de5f70 100644 --- a/lib/WebGUI/i18n/English/Asset_UserList.pm +++ b/lib/WebGUI/i18n/English/Asset_UserList.pm @@ -110,6 +110,10 @@ seperated values|, message => q|Profile not public|, lastUpdated => 1081514049 }, + 'No users message' => { + message => q|No users found|, + lastUpdated => 1081514049 + }, 'Email not public message' => { message => q|Email not public|,