webgui/lib/WebGUI/Account/Profile.pm
Colin Kuskie b8ba4e2118 Add a method to Account called getUsers, which returns
either the user specified by the uid form param, or the
session user.
Change appendCommonVars to use it.
Remove spotty overrides in plugins.
2009-04-07 21:22:56 +00:00

541 lines
18 KiB
Perl

package WebGUI::Account::Profile;
use strict;
use WebGUI::Exception;
use WebGUI::International;
use WebGUI::Pluggable;
use WebGUI::ProfileCategory;
use WebGUI::ProfileField;
use WebGUI::Utility;
use base qw/WebGUI::Account/;
=head1 NAME
Package WebGUI::Account::Profile
=head1 DESCRIPTION
This is the class which is used to display a users's profile information
=head1 SYNOPSIS
use WebGUI::Account::Profile;
=head1 METHODS
These subroutines are available from this package:
=cut
#-------------------------------------------------------------------
=head2 appendCategoryVars ( var, category [,fields, errors] )
Appends cateogry variables to the hash ref passed in
=head3 var
The hash reference to append template variables to
=head3 category
WebGUI::ProfileCategory object to append variables for
=head3 fields
Optional array ref of fields in this category
=head3 errors
Optional array ref of errors to attach to the category loop
=cut
sub appendCategoryVars {
my $self = shift;
my $var = shift || {};
my $category = shift;
my $fields = shift;
my $errors = shift;
my $selected = $self->store->{selected} || $self->session->form->get("selected");
my $categoryId = $category->getId;
my $categoryLabel = $category->getLabel;
my $shortCategoryLabel = $category->getShortLabel;
my $isActive = $categoryId eq $selected;
my $index = scalar(@{$var->{'profile_category_loop'}}) + 1;
push(@{ $var->{'profile_category_loop'} }, {
'profile_category_id' => $categoryId,
'profile_category_isActive' => $isActive,
'profile_category_is_'.$categoryId => "true", #Test so users can tell what category they are at in the loop
'profile_category_label' => $categoryLabel,
'profile_category_shortLabel' => $shortCategoryLabel,
'profile_category_index' => $index,
'profile_fields_loop' => $fields,
'profile_errors' => $errors,
});
$var->{'profile_category_'.$categoryId."_isActive" } = $isActive;
$var->{'profile_category_'.$categoryId."_label" } = $categoryLabel;
$var->{'profile_category_'.$categoryId."_shortLabel"} = $shortCategoryLabel;
$var->{'profile_category_'.$categoryId."_index" } = $index;
$var->{'profile_category_'.$categoryId."_fields" } = $fields;
#Update the isActive flag to determine the default active tab
$self->store->{hasActiveTab} = ($self->store->{hasActiveTab} || $isActive);
#return $index;
}
#-------------------------------------------------------------------
=head2 appendCommonVars ( var )
Appends common template variables that all profile templates use
=head3 var
The hash reference to append template variables to
=cut
sub appendCommonVars {
my $self = shift;
my $var = shift;
my $session = $self->session;
my $user = $self->getUser;
my $pageUrl = $session->url->page;
$self->SUPER::appendCommonVars($var);
$var->{'edit_profile_url' } = $self->getUrl("module=profile;do=edit");
$var->{'invitations_enabled' } = $user->profileField('ableToBeFriend');
$var->{'profile_category_loop'} = [];
#Append the categories
my $categories = WebGUI::ProfileCategory->getCategories($session, { editable=>1 } );
map { $self->appendCategoryVars($var,$_) } @ { $categories };
unless ($self->store->{hasActiveTab}) {
$var->{'profile_category_loop'}->[0]->{'profile_category_isActive'} = 1;
}
#Append the form submit if it's in edit mode
if($self->method eq "edit" || $self->uid eq "") {
$var->{'is_edit' } = "true";
$var->{'form_header' } = WebGUI::Form::formHeader($session,{
action => $self->getUrl("module=profile;do=editSave")
});
$var->{'form_footer' } = WebGUI::Form::formFooter($session);
}
}
#-------------------------------------------------------------------
=head2 editSettingsForm ( )
Creates form elements for user settings page custom to this account module
=cut
sub editSettingsForm {
my $self = shift;
my $session = $self->session;
my $setting = $session->setting;
my $i18n = WebGUI::International->new($session,'Account_Profile');
my $f = WebGUI::HTMLForm->new($session);
$f->template(
name => "profileStyleTemplateId",
value => $self->getStyleTemplateId,
namespace => "style",
label => $i18n->get("profile style template label"),
hoverHelp => $i18n->get("profile style template hoverHelp")
);
$f->template(
name => "profileLayoutTemplateId",
value => $self->getLayoutTemplateId,
namespace => "Account/Layout",
label => $i18n->get("profile layout template label"),
hoverHelp => $i18n->get("profile layout template hoverHelp")
);
$f->template(
name => "profileEditTemplateId",
value => $self->getEditTemplateId,
namespace => "Account/Profile/Edit",
label => $i18n->get("profile edit template label"),
hoverHelp => $i18n->get("profile edit template hoverHelp")
);
$f->template(
name => "profileViewTemplateId",
value => $self->getViewTemplateId,
namespace => "Account/Profile/View",
label => $i18n->get("profile view template label"),
hoverHelp => $i18n->get("profile view template hoverHelp")
);
$f->template(
name => "profileErrorTemplateId",
value => $self->getErrorTemplateId,
namespace => "Account/Profile/Error",
label => $i18n->get("profile error template label"),
hoverHelp => $i18n->get("profile error template hoverHelp")
);
return $f->printRowsOnly;
}
#-------------------------------------------------------------------
=head2 editSettingsFormSave ( )
Creates form elements for user settings page custom to this account module
=cut
sub editSettingsFormSave {
my $self = shift;
my $session = $self->session;
my $setting = $session->setting;
my $form = $session->form;
$setting->set("profileStyleTemplateId", $form->process("profileStyleTemplateId","template"));
$setting->set("profileLayoutTemplateId", $form->process("profileLayoutTemplateId","template"));
$setting->set("profileDisplayLayoutTemplateId", $form->process("profileDisplayLayoutTemplateId","template"));
$setting->set("profileEditTemplateId", $form->process("profileEditTemplateId","template"));
$setting->set("profileViewTemplateId", $form->process("profileViewTemplateId","template"));
$setting->set("profileErrorTemplateId",$form->process("profileErrorTemplateId","template"));
}
#-------------------------------------------------------------------
=head2 getExtrasStyle ( field, fieldErrors, fieldValue )
This method returns the proper field to display for required fields.
=head3 field
field to check
=head3 fieldErrors
errors returned as a result of validation (see $self->validateProfileFields)
=head3 fieldValue
Value of the field to use when returning the style
=cut
sub getExtrasStyle {
my $self = shift;
my $field = shift;
my $fieldErrors = shift;
my $fieldValue = shift;
my $requiredStyleOff = q{class="profilefield_required_off"};
my $requiredStyle = q{class="profilefield_required"};
my $errorStyle = q{class="profilefield_error"}; #Required Field Not Filled In and Error Returend
return $errorStyle if(WebGUI::Utility::isIn($field->getId,@{$fieldErrors}));
return "" unless ($field->isRequired);
return $requiredStyle unless($self->session->user->profileField($field->getId) || $fieldValue);
return $requiredStyleOff;
}
#-------------------------------------------------------------------
=head2 getEditTemplateId ( )
This method returns the template ID for the edit profile page.
=cut
sub getEditTemplateId {
my $self = shift;
return $self->session->setting->get("profileEditTemplateId") || "75CmQgpcCSkdsL-oawdn3Q";
}
#-------------------------------------------------------------------
=head2 getErrorTemplateId ( )
This method returns the template ID used to display the error page.
=cut
sub getErrorTemplateId {
my $self = shift;
return $self->session->setting->get("profileErrorTemplateId") || "MBmWlA_YEA2I6D29OMGtRg";
}
#-------------------------------------------------------------------
=head2 getLayoutTemplateId ( )
This method returns the template ID for the account layout.
=cut
sub getLayoutTemplateId {
my $self = shift;
my $session = $self->session;
my $method = $self->method;
my $uid = $self->uid;
return $session->setting->get("profileLayoutTemplateId") || "FJbUTvZ2nUTn65LpW6gjsA";
}
#-------------------------------------------------------------------
=head2 getStyleTemplateId ( )
This method returns the template ID for the main style.
=cut
sub getStyleTemplateId {
my $self = shift;
return $self->session->setting->get("profileStyleTemplateId") || $self->SUPER::getStyleTemplateId;
}
#-------------------------------------------------------------------
=head2 getViewTemplateId ( )
This method returns the template ID for the view profile page.
=cut
sub getViewTemplateId {
my $self = shift;
return $self->session->setting->get("profileViewTemplateId") || "2CS-BErrjMmESOtGT90qOg";
}
#-------------------------------------------------------------------
=head2 www_edit ( )
The edit page for the user's profile.
=cut
sub www_edit {
my $self = shift;
my $errors = shift || {};
my $session = $self->session;
my $user = $session->user;
my $var = {};
#Handle errors
my @errorFields = ();
$var->{'profile_errors'} = [];
if( scalar(keys %{$errors}) ) {
#Warnings and errors are the same here - set the fields so we can tell which fields errored
@errorFields = (@{$errors->{errorFields}},@{$errors->{warningFields}});
#Build the error message loop
map {
push( @{$var->{'profile_errors'}},{ error_message => $_ })
} @{$errors->{errors}};
}
my $count = 0;
#Set the active flag to the default. We'll know more later
$self->store->{hasActiveTab} = 0;
#Initialize the category template loop which gets filled inside the loop
$var->{'profile_category_loop'} = [];
#Cache the privacy settings
my $privacySettingsHash = WebGUI::ProfileField->getPrivacyOptions($session);
#Get the editable categories
my $categories = WebGUI::ProfileCategory->getCategories($session, { editable => 1 } );
foreach my $category (@{ $categories } ) {
my @fields = ();
foreach my $field (@{ $category->getFields( { editable => 1 } ) }) {
my $fieldId = $field->getId;
my $fieldLabel = $field->getLabel;
my $fieldForm = $field->formField({ extras=>$self->getExtrasStyle($field,\@errorFields,$user->profileField($fieldId)) });
my $fieldRequired = $field->isRequired;
my $fieldExtras = $field->getExtras;
my $fieldViewable = $field->isViewable;
my $rawPrivacySetting = $user->getProfileFieldPrivacySetting($fieldId);
my $fieldPrivacySetting = $privacySettingsHash->{$rawPrivacySetting};
my $fieldPrivacy = WebGUI::Form::selectBox($session,{
name => "privacy_$fieldId",
options => $privacySettingsHash,
value => $rawPrivacySetting,
extras => (!$fieldViewable) ? " disabled" : ""
});
#Create a seperate template var for each field
my $fieldBase = 'profile_field_'.$fieldId;
$var->{$fieldBase.'_form' } = $fieldForm;
$var->{$fieldBase.'_label' } = $fieldLabel;
$var->{$fieldBase.'_required' } = $fieldRequired;
$var->{$fieldBase.'_extras' } = $fieldExtras;
$var->{$fieldBase.'_privacy_form' } = $fieldPrivacy;
$var->{$fieldBase.'_field_viewable' } = $fieldViewable;
$var->{$fieldBase.'_privacy_setting' } = $fieldPrivacySetting;
$var->{$fieldBase.'_privacy_is_'.$rawPrivacySetting } = $rawPrivacySetting;
push(@fields, {
'profile_field_id' => $fieldId,
'profile_field_form' => $fieldForm,
'profile_field_label' => $fieldLabel,
'profile_field_required' => $fieldRequired,
'profile_field_extras' => $fieldExtras,
'profile_field_viewable' => $fieldViewable,
'profile_field_privacy_form' => $fieldPrivacy,
'profile_field_privacy_setting' => $fieldPrivacySetting,
'profile_field_privacy_is_'.$rawPrivacySetting => $rawPrivacySetting,
});
}
#Append the category variables
$self->appendCategoryVars($var,$category,\@fields,$var->{'profile_errors'});
}
#If not category is selected, set the first category as the active one
unless ($self->store->{hasActiveTab}) {
$var->{'profile_category_loop'}->[0]->{'profile_category_isActive'} = 1;
}
#Call the superclass common vars method cause we don't need to build the categories again
$self->SUPER::appendCommonVars($var);
return $self->processTemplate($var,$self->getEditTemplateId);
}
#-------------------------------------------------------------------
=head2 www_editSave ( )
The page which saves the user's profile and returns them to their profile view.
=cut
sub www_editSave {
my $self = shift;
my $session = $self->session;
my $fields = WebGUI::ProfileField->getEditableFields($session);
my $retHash = $session->user->validateProfileDataFromForm($fields);
push (@{$retHash->{errors}},@{$retHash->{warnings}});
unless(scalar(@{$retHash->{errors}})) {
my $profile = $retHash->{profile};
my $privacy = {};
foreach my $fieldName (keys %{$profile}) {
$session->user->profileField($fieldName,$profile->{$fieldName});
my $privacySetting = $session->form->get("privacy_".$fieldName);
next unless $privacySetting;
$privacy->{$fieldName} = $privacySetting;
}
$session->user->setProfileFieldPrivacySetting($privacy);
}
#Store the category the error occurred in the object for reference
$self->store->{selected} = $retHash->{errorCategory};
return $self->www_edit($retHash);
}
#-------------------------------------------------------------------
=head2 www_view ( )
The display page of the .
=cut
sub www_view {
my $self = shift;
my $session = $self->session;
my $var = {};
my $uid = $self->uid;
my $selected = $session->form->get("selected"); #Allow users to template tabs or other category dividers
my $active = 0; #Whether or not a category is selected
my $counter = 1; #Count the number of categories being displayed
#Ensure uid is passed in if they want to view a profile. This controls the tab state.
return $self->www_edit unless ($uid);
my $user = WebGUI::User->new($session,$uid);
$self->appendCommonVars($var);
$var->{'can_edit_profile' } = $uid eq $session->user->userId;
#Check user privileges
unless ($user->profileIsViewable($session->user)) {
my $i18n = WebGUI::International->new($session,'Account_Profile');
return $self->showError(
$var,
$i18n->get("profile not public error"),
$var->{'back_url'},
$self->getErrorTemplateId
);
}
#Cache the privacy settings
my $privacySettingsHash = WebGUI::ProfileField->getPrivacyOptions($session);
$var->{'profile_category_loop' } = [];
foreach my $category (@{WebGUI::ProfileCategory->getCategories($session,{ visible => 1})}) {
my @fields = ();
foreach my $field (@{$category->getFields({ visible => 1 })}) {
next unless ($user->canViewField($field->getId,$session->user));
my $rawPrivacySetting = $user->getProfileFieldPrivacySetting($field->getId);
my $privacySetting = $privacySettingsHash->{$rawPrivacySetting};
my $fieldId = $field->getId;
my $fieldLabel = $field->getLabel;
my $fieldValue = $field->formField(undef,2,$user);
my $fieldRaw = $user->profileField($fieldId);;
#Create a seperate template var for each field
my $fieldBase = 'profile_field_'.$fieldId;
$var->{$fieldBase.'_label' } = $fieldLabel;
$var->{$fieldBase.'_value' } = $fieldValue;
$var->{$fieldBase.'_raw' } = $fieldRaw;
$var->{$fieldBase.'_privacySetting' } = $privacySetting;
$var->{$fieldBase.'_privacy_is_'.$rawPrivacySetting } = "true";
push(@fields, {
'profile_field_id' => $fieldId,
'profile_field_is_'.$fieldId => "true",
'profile_field_label' => $fieldLabel,
'profile_field_value' => $fieldValue,
'profile_field_raw' => $fieldRaw,
'profile_field_privacySetting' => $privacySetting,
'profile_field_privacy_is_'.$rawPrivacySetting => "true",
});
}
#Don't bother displaying the category if there's nothing in it.
next unless (scalar(@fields));
#Append the category variables
$self->appendCategoryVars($var,$category,\@fields);
}
#If not category is selected, set the first category as the active one
unless ($self->store->{hasActiveTab}) {
$var->{'profile_category_loop'}->[0]->{'profile_category_isActive'} = 1;
}
my $privacySetting = $user->profileField("publicProfile") || "none";
$var->{'profile_privacy_'.$privacySetting } = "true";
$var->{'acceptsPrivateMessages'} = $user->acceptsPrivateMessages($session->user->userId);
$var->{'acceptsFriendsRequests'} = $user->acceptsFriendsRequests($session->user);
return $self->processTemplate($var,$self->getViewTemplateId);
}
1;