first major round of EMS changes. much more to come late tonight.

This commit is contained in:
Matthew Wilson 2006-04-07 00:02:45 +00:00
parent f3404c319a
commit 2c60283ba3
27 changed files with 5196 additions and 33 deletions

View file

@ -24,6 +24,227 @@ use WebGUI::Commerce::Item;
use WebGUI::Utility;
use Data::Dumper;
#-------------------------------------------------------------------
sub _getFieldHash {
my $self = shift;
return $self->{_fieldHash} if ($self->{_fieldHash});
my %hash;
tie %hash, "Tie::IxHash";
%hash = (
"eventName"=>{
name=>"Event Name",
type=>"text",
compare=>"text",
method=>"text",
columnName=>"title",
tableName=>"p",
initial=>1
},
"eventDescription"=>{
name=>"Description",
type=>"text",
compare=>"text",
method=>"text",
columnName=>"description",
tableName=>"p",
initial=>1
},
"maxAttendees"=>{
name=>"Max Attendees",
type=>"text",
compare=>"numeric",
method=>"integer",
columnName=>"maximumAttendees",
tableName=>"e",
initial=>1
},
"seatsAvailable"=>{
name=>"Seats Available",
type=>"text",
method=>"integer",
compare=>"numeric",
calculated=>1,
initial=>1
},
"price"=>{
name=>"Price",
type=>"text",
compare=>"numeric",
method=>"float",
columnName=>"price",
tableName=>"p",
initial=>1
},
"startDate"=>{
name=>"Starts",
type=>"dateTime",
compare=>"numeric",
method=>"dateTime",
columnName=>"startDate",
tableName=>"e",
initial=>1
},
"endDate"=>{
name=>"Ends",
type=>"dateTime",
compare=>"numeric",
method=>"dateTime",
columnName=>"endDate",
tableName=>"e",
initial=>1
},
"requirement"=>{
name=>"Requirement",
type=>"select",
list=>{''=>'Select One'},
# list=>$self->_getAllEvents(),
compare=>"boolean",
method=>"selectList",
calculated=>1,
initial=>1
}
);
# Add custom metadata fields to the list, matching the types up
# automatically.
my $fieldList = $self->getEventMetaDataArrayRef;
foreach my $field (@{$fieldList}) {
my $dataType = $field->{dataType};
my $compare = $self->_matchTypes($dataType);
my $type;
if ($dataType =~ /^date/i) {
$type = lcfirst($dataType);
} elsif ($compare eq 'text' || $compare eq 'numeric') {
$type = 'text';
} else {
$type = 'select';
}
$hash{$field->{fieldId}} = {
name=>$field->{name},
type=>$type,
method=>$dataType,
initial=>$field->{autoSearch},
compare=>$compare,
calculated=>1,
metadata=>1
};
if ($hash{$field->{fieldId}}->{type} eq 'select') {
$hash{$field->{fieldId}}->{list} = $self->_matchPairs($field->{possibleValues});
}
}
$self->{_fieldHash} = \%hash;
return $self->{_fieldHash};
}
#-------------------------------------------------------------------
sub _matchPairs {
my $self = shift;
my $options = shift;
my %hash;
tie %hash, 'Tie::IxHash';
$hash{''} = 'Select One';
foreach (split("\n",$options)) {
my $val = $_;
$val =~ s/\s//g;
$val =~ s/\n//g;
$hash{$val} = $val;
}
return \%hash;
}
#-------------------------------------------------------------------
sub _matchTypes {
my $self = shift;
my $dataType = lc(shift);
return 'text' if (
WebGUI::Utility::isIn($dataType, qw(
codearea
email
htmlarea
phone
text
textarea
url
zipcode
))
);
return 'numeric' if (
WebGUI::Utility::isIn($dataType, qw(
date
datetime
float
integer
interval
))
);
return 'boolean' if (
WebGUI::Utility::isIn($dataType, qw(
checkbox
combo
selectlist
checklist
contenttype
databaselink
fieldtype
group
ldaplink
radio
radiolist
selectbox
selectlist
template
timezone
yesno
))
);
return 'text';
}
#-------------------------------------------------------------------
sub buildMenu {
my $self = shift;
my $var = shift;
my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem');
my $fields = $self->_getFieldHash();
my $counter = 0;
my $js = "var filterList = {\n";
foreach my $fieldId (keys %{$fields}) {
my $field = $fields->{$fieldId};
$js .= ",\n" if($counter++ > 0);
my $fieldName = $field->{name};
my $fieldType = $field->{type};
my $compareType = $field->{compare};
my $autoSearch = $field->{initial};
$js .= qq|"$fieldId": {|;
$js .= qq| "name":"$fieldName"|;
$js .= qq| ,"type":"$fieldType"|;
$js .= qq| ,"compare":"$compareType"|;
$js .= qq| ,"autoSearch":"$autoSearch"|;
if($fieldType eq "select") {
my $list = $field->{list};
my $fieldList = "";
foreach my $key (keys %{$list}) {
$fieldList .= "," if($fieldList ne "");
my $value = $list->{$key};
$value =~ s/"/\"/g;
$fieldList .= qq|"$key":"$value"|
}
$js .= qq| ,"list":{ $fieldList }|;
}
$js .= q| }|;
}
$js .= "\n};\n";
$var->{'search.filters.options'} = $js;
$var->{'search.data.url'} = $self->getUrl;
}
#-------------------------------------------------------------------
=head2 checkConflicts ( )
@ -159,6 +380,13 @@ sub definition {
label=>$i18n->get('global prerequisite'),
hoverHelp=>$i18n->get('global prerequisite description')
},
globalMetadata =>{
fieldType=>"yesNo",
defaultValue=>1,
tab=>"properties",
label=>$i18n->get('global metadata'),
hoverHelp=>$i18n->get('global metadata description')
},
);
push(@{$definition}, {
assetName=>$i18n->get('assetName'),
@ -345,6 +573,64 @@ sub getPrerequisiteEventList {
return $self->session->db->buildHashRef($sql);
}
#------------------------------------------------------------------
=head2 getEventMetaDataArrayRef ( )
Returns an arrayref of hash references of the metadata fields.
Checks $self->get("globalMetadata") by default; otherwise uses the first parameter.
=head3 useGlobalMetadata
Whether or not to use the asset's global setting, and the override.
=cut
sub getEventMetaDataArrayRef {
my $self = shift;
my $useGlobalMetadata = shift;
my $productId = shift;
$useGlobalMetadata = ($useGlobalMetadata)?$useGlobalMetadata:$self->get("globalMetadata");
my $globalWhere = ($useGlobalMetadata == 0 || $useGlobalMetadata == 'false')?" where assetId='".$self->getId."'":'';
return $self->getEventMetaDataFields($productId) if $productId;
return $self->session->db->buildArrayRefOfHashRefs("select * from EventManagementSystem_metaField $globalWhere order by sequenceNumber, assetId");
}
#-------------------------------------------------------------------
=head2 getEventMetaDataFields ( productId )
Returns a hash reference containing all metadata field properties.
=head3 productId
Which product to get metadata for.
=cut
sub getEventMetaDataFields {
my $self = shift;
my $productId = shift;
my $useGlobalMetadata = shift;
my $globalWhere = ($useGlobalMetadata == 0 || $useGlobalMetadata == 'false')?" where f.assetId='".$self->getId."'":'';
my $sql = "select f.*, d.fieldData
from EventManagementSystem_metaField f
left join EventManagementSystem_metaData d on f.fieldId=d.fieldId and d.productId=".$self->session->db->quote($productId)." $globalWhere order by f.sequenceNumber";
tie my %hash, 'Tie::IxHash';
my $sth = $self->session->db->read($sql);
while( my $h = $sth->hashRef) {
foreach(keys %$h) {
$hash{$h->{fieldId}}{$_} = $h->{$_};
}
}
$sth->finish;
return \%hash;
}
#------------------------------------------------------------------
=head2 getRequiredEventName ( prerequisiteId )
@ -647,6 +933,12 @@ sub validateEditEventForm {
"maximumAttendees" => $i18n->get("add/edit event maximum attendees"),
);
my $mdFields = $self->getEventMetaDataFields;
foreach my $mdField (keys %{$mdFields}) {
next unless $mdFields->{$mdField}->{required};
$requiredFields{'metadata_'.$mdField} = $mdFields->{$mdField}->{name};
}
$errors = $self->checkRequiredFields(\%requiredFields);
#Check price greater than zero
@ -767,13 +1059,13 @@ sub www_deleteEvent {
return $self->session->privilege->insufficient unless ($self->session->user->isInGroup($self->get("groupToAddEvents")));
#Remove this event as a prerequisite to any other event
$self->session->db->write("delete from EventManagementSystem_prerequisiteEvents where requiredProductId=?".
$self->session->db->write("delete from EventManagementSystem_prerequisiteEvents where requiredProductId=?",
[$eventId]);
$self->deleteOrphans;
#Remove the event
$self->deleteCollateral('EventManagementSystem_products', 'productId', $eventId);
$self->session->db->write("delete from products where productId=?",[$eventId]);
$self->deleteCollateral('products','productId',$eventId);
$self->reorderCollateral('EventManagementSystem_products', 'productId');
return $self->www_manageEvents;
@ -803,6 +1095,30 @@ sub www_deletePrerequisite {
#-------------------------------------------------------------------
=head2 www_edit ( )
Edit wobject method.
=cut
sub www_edit {
my $self = shift;
return $self->session->privilege->insufficient() unless $self->canEdit;
my ($tag) = ($self->get("className") =~ /::(\w+)$/);
my $tag2 = $tag;
$tag =~ s/([a-z])([A-Z])/$1 $2/g; #Separate studly caps
$tag =~ s/([A-Z]+(?![a-z]))/$1 /g; #Separate acronyms
$self->getAdminConsole->setHelp(lc($tag)." add/edit", "Asset_".$tag2);
my $i18n = WebGUI::International->new($self->session,'Asset_Wobject');
my $addEdit = ($self->session->form->process("func") eq 'add') ? $i18n->get('add') : $i18n->get('edit');
my $i18n2 = WebGUI::International->new($self->session,'Asset_EventManagementSystem');
$self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEventMetadata'), $i18n2->get('manage event metadata'));
$self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEvents'), $i18n2->get('manage events'));
return $self->getAdminConsole->render($self->getEditForm->print,$addEdit.' '.$self->getName);
}
#-------------------------------------------------------------------
=head2 www_editEvent ( errors )
Method to generate form to Add or Edit an events properties including prerequisite assignments and event approval.
@ -918,6 +1234,38 @@ sub www_editEvent {
-name => "approved",
-value => 0 || $event->{approved}
);
# add dynamically added metadata fields.
my $meta = {};
my $fieldList = $self->getEventMetaDataArrayRef;
if ($pid ne 'new') {
$meta = $self->getEventMetaDataFields($pid);
} else {
foreach my $field1 (@{$fieldList}) {
$meta->{$field1->{fieldId}} = $field1;
$meta->{$field1->{fieldId}}->{fieldData} = $field1->{defaultValues};
}
}
my $i18n3 = WebGUI::International->new($self->session, "Asset");
foreach my $field (@{$fieldList}) {
my $dataType = $meta->{$field->{fieldId}}{dataType};
my $options;
# Add a "Select..." option on top of a select list to prevent from
# saving the value on top of the list when no choice is made.
if($dataType eq "selectList") {
$options = {"", $i18n3->get("Select")};
}
$f->dynamicField(
name=>"metadata_".$meta->{$field->{fieldId}}{fieldId},
label=>$meta->{$field->{fieldId}}{name},
hoverHelp=>$meta->{$field->{fieldId}}{label},
value=>($self->session->form->process("metadata_".$meta->{$field->{fieldId}}{fieldId},$dataType) || $meta->{$field->{fieldId}}{fieldData}),
extras=>qq/title="$meta->{$field->{fieldId}}{label}"/,
possibleValues=>$meta->{$field->{fieldId}}{possibleValues},
options=>$options,
fieldType=>$dataType
);
}
my $prerequisiteList = $self->getPrerequisiteEventList($pid);
if ( scalar(keys %{$prerequisiteList}) > 0) {
@ -977,6 +1325,7 @@ sub www_editEvent {
my $output = $f->print;
$self->getAdminConsole->setHelp('add/edit event','Asset_EventManagementSystem');
$self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEvents'),$i18n->get("manage events"));
$self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEventMetadata'), $i18n->get('manage event metadata'));
my $addEdit = ($pid eq "new" or !$pid) ? $i18n->get('add', 'Asset_Wobject') : $i18n->get('edit', 'Asset_Wobject');
return $self->getAdminConsole->render($output, $addEdit.' '.$i18n->get('event'));
}
@ -1005,13 +1354,20 @@ sub www_editEventSave {
$pid = $self->setCollateral("EventManagementSystem_products", "productId",
{
productId => $pid,
startDate => $self->session->datetime->humanToEpoch($self->session->form->get("startDate")),
endDate => $self->session->datetime->humanToEpoch($self->session->form->get("endDate")),
startDate => $self->session->form->process("startDate",'dateTime'),
endDate => $self->session->form->process("endDate",'dateTime'),
maximumAttendees => $self->session->form->get("maximumAttendees"),
approved => $self->session->form->get("approved")
},1,1
);
#Save the event metadata
my $mdFields = $self->getEventMetaDataFields;
foreach my $mdField (keys %{$mdFields}) {
my $value = $self->session->form->process("metadata_".$mdField,$mdFields->{$mdField}->{dataType});
$self->session->db->write("insert into EventManagementSystem_metaData values (".$self->session->db->quoteAndJoin([$mdField,$pid,$value]).") on duplicate key update fieldData=".$self->session->db->quote($value));
}
#Save the standard product data
$event = {
productId => $pid,
@ -1108,11 +1464,250 @@ sub www_manageEvents {
$self->getAdminConsole->setHelp('event management system manage events','Asset_EventManagementSystem');
$self->getAdminConsole->addSubmenuItem($self->getUrl('func=editEvent;pid=new'), $i18n->get('add event'));
$self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEventMetadata'), $i18n->get('manage event metadata'));
return $self->getAdminConsole->render($output, $i18n->get("manage events"));
}
#-------------------------------------------------------------------
=head2 www_manageEventMetadata ( )
Method to display the event metadata management console.
=cut
sub www_manageEventMetadata {
my $self = shift;
return $self->session->privilege->insufficient unless ($self->session->user->isInGroup($self->get("groupToAddEvents")));
my $output;
my $metadataFields = $self->getEventMetaDataArrayRef('false');
my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem');
my $count = 0;
my $number = scalar(@{$metadataFields});
foreach my $row1 (@{$metadataFields}) {
my %row = %{$row1};
$count++;
$output .= "<div>".
$self->session->icon->delete('func=deleteEventMetaDataField;fieldId='.$row{fieldId},$self->getUrl,$i18n->get('confirm delete event metadata')).
$self->session->icon->edit('func=editEventMetaDataField;fieldId='.$row{fieldId}, $self->getUrl).
$self->session->icon->moveUp('func=moveEventMetaDataFieldUp;fieldId='.$row{fieldId}, $self->getUrl,($count == 1)?1:0);
$output .= $self->session->icon->moveDown('func=moveEventMetaDataFieldDown;fieldId='.$row{fieldId}, $self->getUrl,($count == $number)?1:0).
" ".$row{name}." ( ".$row{label}." )</div>";
}
$self->getAdminConsole->addSubmenuItem($self->getUrl('func=editEventMetaDataField;fieldId=new'), $i18n->get("add new event metadata field"));
$self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEvents'), $i18n->get('manage events'));
return $self->getAdminConsole->render($output, $i18n->get("manage event metadata"));
}
#-------------------------------------------------------------------
sub www_editEventMetaDataField {
my $self = shift;
my $fieldId = shift || $self->session->form->process("fieldId");
my $error = shift;
return $self->session->privilege->insufficient unless ($self->session->user->isInGroup($self->get("groupToAddEvents")));
my $i18n2 = WebGUI::International->new($self->session,'Asset_EventManagementSystem');
my $i18n = WebGUI::International->new($self->session,"WebGUIProfile");
my $f = WebGUI::HTMLForm->new($self->session, (
action => $self->getUrl."?func=editEventMetaDataFieldSave;fieldId=".$fieldId
));
my $data = {};
if ($error) {
# load submitted data.
$data = {
name => $self->session->form->process("name"),
label => $self->session->form->process("label"),
dataType => $self->session->form->process("dataType",'fieldType'),
visible => $self->session->form->process("visible",'yesNo'),
required => $self->session->form->process("required",'yesNo'),
possibleValues => $self->session->form->process("possibleValues",'textarea'),
defaultValues => $self->session->form->process("defaultValues",'textarea'),
};
$f->readOnly(
-name => 'error',
-label => 'Error:',
-value => '<span style="color:red;font-weight:bold">'.$error.'</span>',
);
} elsif ($fieldId ne 'new') {
$data = $self->session->db->quickHashRef("select * from EventManagementSystem_metaField where fieldId=?",[$fieldId]);
} else {
# new field defaults
$data = {
name => $i18n2->get('type name here'),
label => $i18n2->get('type label here'),
dataType => 'text',
visible => 0,
required => 0,
autoSearch => 0
};
}
$f->text(
-name => "name",
-label => $i18n->get(475),
-hoverHelp => $i18n->get('475 description'),,
-extras=>(($data->{name} eq $i18n2->get('type name here'))?' style="color:#bbbbbb" ':'').' onblur="if(!this.value){this.value=\''.$i18n2->get('type name here').'\';this.style.color=\'#bbbbbb\';}" onfocus="if(this.value == \''.$i18n2->get('type name here').'\'){this.value=\'\';this.style.color=\'\';}"',
-value => $data->{name},
);
$f->text(
-name => "label",
-label => $i18n->get(472),
-hoverHelp => $i18n->get('472 description'),
-value => $data->{label},
-extras=>(($data->{label} eq $i18n2->get('type label here'))?' style="color:#bbbbbb" ':'').' onblur="if(!this.value){this.value=\''.$i18n2->get('type label here').'\';this.style.color=\'#bbbbbb\';}" onfocus="if(this.value == \''.$i18n2->get('type label here').'\'){this.value=\'\';this.style.color=\'\';}"',
);
$f->yesNo(
-name=>"visible",
-label=>$i18n->get('473a'),
-hoverHelp=>$i18n->get('473a description'),
-value=>$data->{visible}
);
$f->yesNo(
-name=>"required",
-label=>$i18n->get(474),
-hoverHelp=>$i18n->get('474 description'),
-value=>$data->{required}
);
my $fieldType = WebGUI::Form::FieldType->new($self->session,
-name=>"dataType",
-label=>$i18n->get(486),
-hoverHelp=>$i18n->get('486 description'),
-value=>ucfirst $data->{dataType},
-defaultValue=>"Text",
);
my @profileForms = ();
foreach my $form ( sort @{ $fieldType->get("types") }) {
next if $form eq 'DynamicField';
my $cmd = join '::', 'WebGUI::Form', $form;
eval "use $cmd";
my $w = eval {"$cmd"->new($self->session)};
push @profileForms, $form if $w->get("profileEnabled");
}
$fieldType->set("types", \@profileForms);
$f->raw($fieldType->toHtmlWithWrapper());
$f->textarea(
-name => "possibleValues",
-label => $i18n->get(487),
-hoverHelp => $i18n->get('487 description'),
-value => $data->{possibleValues},
);
$f->textarea(
-name => "defaultValues",
-label => $i18n->get(488),
-hoverHelp => $i18n->get('488 description'),
-value => $data->{defaultValues},
);
$f->yesNo(
-name => "autoSearch",
-label => 'Initial Search Field',
-hoverHelp => 'Make this appear as a Filter Field on the Advanced Search screen by default',
-value => $data->{autoSearch},
);
my %hash;
foreach my $category (@{WebGUI::ProfileCategory->getCategories($self->session)}) {
$hash{$category->getId} = $category->getLabel;
}
$f->submit;
$self->getAdminConsole->setHelp('event management system manage events','Asset_EventManagementSystem');
$self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEventMetadata'), $i18n2->get('manage event metadata'));
$self->getAdminConsole->addSubmenuItem($self->getUrl('func=editEventMetaDataField;fieldId=new'), $i18n2->get("add new event metadata field"));
$self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEvents'), $i18n->get('manage events'));
return $self->getAdminConsole->render($f->print, $i18n2->get("add new event metadata field"));
}
#-------------------------------------------------------------------
sub www_editEventMetaDataFieldSave {
my $self = shift;
return $self->session->privilege->insufficient unless ($self->session->user->isInGroup($self->get("groupToAddEvents")));
my $error = '';
my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem');
foreach ('name','label') {
if ($self->session->form->get($_) eq "" ||
$self->session->form->get($_) eq $i18n->get('type name here') ||
$self->session->form->get($_) eq $i18n->get('type label here')) {
$error .= sprintf($i18n->get('null field error'),$_)."<br />";
}
}
return $self->www_editEventMetaDataField(undef,$error) if $error;
my $newId = $self->setCollateral("EventManagementSystem_metaField", "fieldId",{
fieldId=>$self->session->form->process('fieldId'),
name => $self->session->form->process("name"),
label => $self->session->form->process("label"),
dataType => $self->session->form->process("dataType",'fieldType'),
visible => $self->session->form->process("visible",'yesNo'),
required => $self->session->form->process("required",'yesNo'),
possibleValues => $self->session->form->process("possibleValues",'textarea'),
defaultValues => $self->session->form->process("defaultValues",'textarea'),
autoSearch => $self->session->form->process("autoSearch",'yesNo')
},1,1);
return $self->www_manageEventMetadata();
}
#-------------------------------------------------------------------
=head2 www_moveEventMetaDataFieldDown ( )
Method to move an event down one position in display order
=cut
sub www_moveEventMetaDataFieldDown {
my $self = shift;
my $eventId = $self->session->form->get("fieldId");
return $self->session->privilege->insufficient unless ($self->session->user->isInGroup($self->get("groupToAddEvents")));
$self->moveCollateralDown('EventManagementSystem_metaField', 'fieldId', $eventId);
return $self->www_manageEventMetadata;
}
#-------------------------------------------------------------------
=head2 www_moveEventMetaDataFieldUp ( )
Method to move an event metdata field up one position in display order
=cut
sub www_moveEventMetaDataFieldUp {
my $self = shift;
my $eventId = $self->session->form->get("fieldId");
return $self->session->privilege->insufficient unless ($self->session->user->isInGroup($self->get("groupToAddEvents")));
$self->moveCollateralUp('EventManagementSystem_metaField', 'fieldId', $eventId);
return $self->www_manageEventMetadata;
}
#-------------------------------------------------------------------
=head2 www_deleteEventMetaDataField ( )
Method to move an event metdata field up one position in display order
=cut
sub www_deleteEventMetaDataField {
my $self = shift;
my $eventId = $self->session->form->get("fieldId");
return $self->session->privilege->insufficient unless ($self->session->user->isInGroup($self->get("groupToAddEvents")));
$self->deleteCollateral('EventManagementSystem_metaField', 'fieldId', $eventId);
$self->reorderCollateral('EventManagementSystem_metaField', 'fieldId');
$self->deleteCollateral('EventManagementSystem_metaData', 'fieldId', $eventId); # deleteCollateral doesn't care about assetId.
return $self->www_manageEventMetadata;
}
#-------------------------------------------------------------------
=head2 www_moveEventDown ( )
Method to move an event down one position in display order
@ -1167,7 +1762,7 @@ sub www_saveRegistration {
city => $self->session->form->get("city", "text"),
state => $self->session->form->get("state", "text"),
zipCode => $self->session->form->get("zipCode", "text"),
country => $self->session->form->get("country", "selectList"),
country => join("\n",$self->session->form->get("country", "selectList")),
phone => $self->session->form->get("phoneNumber", "phone"),
email => $self->session->form->get("email", "email")
},0,0
@ -1183,7 +1778,6 @@ sub www_saveRegistration {
}
$counter++;
}
#use Data::Dumper; print "<pre>".Dumper($self->session)."</pre>";
return $self->www_view;
}
@ -1201,6 +1795,12 @@ sub prepareView {
my $templateId = $self->get("displayTemplateId");
my $template = WebGUI::Asset::Template->new($self->session, $templateId);
$template->prepare;
my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem');
my $language = $i18n->getLanguage(undef,"languageAbbreviation");
$self->session->style->setScript($self->session->config->get('extrasURL').'/calendar/calendar.js',{ type=>'text/javascript' });
$self->session->style->setScript($self->session->config->get('extrasURL').'/calendar/lang/calendar-'.$language.'.js',{ type=>'text/javascript' });
$self->session->style->setScript($self->session->config->get('extrasURL').'/calendar/calendar-setup.js',{ type=>'text/javascript' });
$self->session->style->setLink($self->session->config->get('extrasURL').'/calendar/calendar-win2k-1.css', { rel=>"stylesheet", type=>"text/css", media=>"all" });
$self->{_viewTemplate} = $template;
}
@ -1208,24 +1808,99 @@ sub prepareView {
sub view {
my $self = shift;
my %var;
my $keywords = $self->session->form->get("searchKeywords");
my @keys;
push(@keys,$keywords) if $keywords;
unless ($keywords =~ /^".*"$/) {
foreach (split(" ",$keywords)) {
push(@keys,$_) unless $keywords eq $_;
}
} else {
$keywords =~ s/"//g;
@keys = ($keywords);
}
my $searchPhrases;
if (scalar(@keys)) {
$searchPhrases = " and ( ";
my $count = 0;
foreach (@keys) {
$count++;
$searchPhrases .= ' and ' unless $count == 1;
my $val = $self->session->db->quote('%'.$_.'%');
$searchPhrases .= "(p.title like $val or p.description like $val)";
}
$searchPhrases .= " )";
}
if ($self->session->form->get("advSearch")) {
$searchPhrases = '';
my $fields = $self->_getFieldHash();
my $counter = 0;
for (my $cfilter = 1; $cfilter < 30; $cfilter++) {
my $value = $self->session->form->get("cfilter_t".$cfilter);
my $fieldId = $self->session->form->get("cfilter_s".$cfilter);
next if ($fieldId eq 'seatsAvailable' || $fieldId eq 'registration');
if ($value && defined $fields->{$fieldId}) {
my $compare = $self->session->form->get("cfilter_c".$cfilter);
#Format Value with Operator
$value =~ s/%//g;
my $field = $fields->{$fieldId};
if ($field->{type} =~ /^date/i) {
$value = $self->session->datetime->setToEpoch($value);
} else {
$value = lc($value);
}
if($compare eq "eq") {
$value = "=".$self->session->db->quote($value);
} elsif($compare eq "ne"){
$value = "<>".$self->session->db->quote($value);
} elsif($compare eq "notlike") {
$value = "not like ".$self->session->db->quote("%".$value."%");
} elsif($compare eq "starts") {
$value = "like ".$self->session->db->quote($value."%");
} elsif($compare eq "ends") {
$value = "like ".$self->session->db->quote("%".$value);
} elsif($compare eq "gt") {
$value = "> ".$value;
} elsif($compare eq "lt") {
$value = "< ".$value;
} elsif($compare eq "lte") {
$value = "<= ".$value;
} elsif($compare eq "gte") {
$value = ">= ".$value;
} elsif($compare eq "like") {
$value = " like ".$self->session->db->quote("%".$value."%");
}
$searchPhrases .= " and" if($counter);
$counter++;
unless ($compare eq 'numeric') {
$searchPhrases .= " lower(".$field->{tableName}.'.'.$field->{columnName}.") ".$value;
} else {
$searchPhrases .= " ".$field->{tableName}.'.'.$field->{columnName}." ".$value;
}
}
}
$searchPhrases &&= " and ( ".$searchPhrases." )";
}
my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem');
# Get the products available for sale for this page
my $sql = "select p.productId, p.title, p.description, p.price, p.templateId, e.approved, e.maximumAttendees
my $sql = "select p.productId, p.title, p.description, p.price, p.templateId, e.approved, e.maximumAttendees, e.startDate, e.endDate
from products as p, EventManagementSystem_products as e
where
p.productId = e.productId and approved=1
and e.assetId =".$self->session->db->quote($self->get("assetId"))."
and p.productId not in (select distinct(productId) from EventManagementSystem_prerequisites)";
and e.assetId =".$self->session->db->quote($self->get("assetId")).$searchPhrases;
# ."
# and p.productId not in (select distinct(productId) from EventManagementSystem_prerequisites)";
$var{'basicSearch.formHeader'} = WebGUI::Form::formHeader($self->session,{action=>$self->getUrl.'?advSearch=0'});
$var{'advSearch.formHeader'} = WebGUI::Form::formHeader($self->session,{action=>$self->getUrl.'?advSearch=1'});
$var{isAdvSearch} = $self->session->form->get('advSearch');
$var{'search.formFooter'} = WebGUI::Form::formFooter($self->session);
$var{'search.formSubmit'} = WebGUI::Form::submit($self->session, {value=>'Filter'});
my $p = WebGUI::Paginator->new($self->session,$self->getUrl,$self->get("paginateAfter"));
$p->setDataByQuery($sql);
my $eventData = $p->getPageData;
my @events;
#We are getting each events information, passing it to the *events* template and processing it
#The html returned from each events template is returned to the Event Manager Display Template for arranging
#how the events are displayed in relation to one another.
foreach my $event (@$eventData) {
my %eventFields;
@ -1237,16 +1912,18 @@ sub view {
$eventFields{'numberRegistered'} = $numberRegistered;
$eventFields{'maximumAttendees'} = $event->{'maximumAttendees'};
$eventFields{'seatsRemaining'} = $event->{'maximumAttendees'} - $numberRegistered;
$eventFields{'startDate.human'} = $self->session->datetime->epochToHuman($event->{'startDate'});
$eventFields{'endDate.human'} = $self->session->datetime->epochToHuman($event->{'endDate'});
$eventFields{'eventIsFull'} = ($eventFields{'seatsRemaining'} == 0);
if ($eventFields{'eventIsFull'}) {
$eventFields{'purchase.label'} = "Sold Out";;
$eventFields{'purchase.label'} = $i18n->get('sold out');
}
else {
$eventFields{'purchase.url'} = $self->getUrl('func=addToCart;pid='.$event->{'productId'});
$eventFields{'purchase.label'} = $i18n->get('add to cart');
}
push (@events, {'event' => $self->processTemplate(\%eventFields, $event->{'templateId'}) });
push (@events, {'event' => $self->processTemplate(\%eventFields, $event->{'templateId'}), %eventFields });
}
$var{'checkout.url'} = $self->getUrl('op=viewCart');
$var{'checkout.label'} = "Checkout";
@ -1261,7 +1938,8 @@ sub view {
$var{'canManageEvents'} = 0;
}
$p->appendTemplateVars(\%var);
$self->buildMenu(\%var);
$var{'ems.wobject.dir'} = $self->session->config->get("extrasURL")."/wobject/EventManagementSystem";
my $templateId = $self->get("displayTemplateId");
return $self->processTemplate(\%var, undef, $self->{_viewTemplate});
}

View file

@ -788,9 +788,11 @@ sub new {
my $self = {};
$self->{_session} = shift;
$self->{_groupId} = shift;
return $self->{_session}->{groupData}->{$self->{_groupId}} if $self->{_session}->{groupData}->{$self->{_groupId}};
my $override = shift;
bless $self, $class;
$self->_create($override) if ($self->{_groupId} eq "new");
$self->{_session}->{groupData}->{$self->{_groupId}} = $self;
return $self;
}
@ -1005,6 +1007,7 @@ sub set {
my $value = shift;
$self->get("groupId") unless ($self->{_group}); # precache group stuff
$self->{_group}{$name} = $value;
$self->session->{groupData}->{$self->getId} = undef;
$self->session->db->setRow("groups","groupId",{groupId=>$self->getId, $name=>$value, lastUpdated=>$self->session->datetime->time()});
}

View file

@ -169,7 +169,7 @@ If you want to add anything special to your form like javascript actions, or sty
=head3 enctype
The ecapsulation type for this form. This defaults to "multipart/form-data" and should probably never be changed.
The encapsulation type for this form. This defaults to "multipart/form-data" and should probably never be changed.
=head3 tableExtras

View file

@ -87,7 +87,7 @@ sub get {
my $output = eval($cmd);
$self->session->errorHandler->warn("Couldn't get value from ".$cmd." because ".$@) if ($@);
$output = $self->get($id,$namespace,"English") if ($output eq "" && $language ne "English");
return $output;
return $output || $id;
}
@ -210,7 +210,7 @@ sub new {
bless( {
_session => $session,
_namespace => $namespace,
_language => $language,
_language => ($language || $session->user->profileField('language')),
},$class);
}

View file

@ -199,6 +199,34 @@ sub buildHashRef {
return \%hash;
}
#-------------------------------------------------------------------
=head2 buildArrayRefOfHashRefs ( sql )
Builds an array reference of hash references of data
from a series of rows. Useful for returning many rows at once.
=head3 sql
An SQL query. The query must select at least two columns of data, the first being the key for the hash, the second being the value. If the query selects more than two columns, then the last column will be the value and the remaining columns will be joined together by a colon ":" to form a complex key. If the query selects only one column, then the key and the value will be the same.
=head3 params
An array reference containing values for any placeholder params used in the SQL query.
=cut
sub buildArrayRefOfHashRefs {
my @array;
my $sth = $_[0]->read($_[1],$_[2]);
while (my $data = $sth->hashRef) {
push(@array,$data);
}
$sth->finish;
return \@array;
}
#-------------------------------------------------------------------

View file

@ -17,6 +17,7 @@ package WebGUI::Session::ErrorHandler;
use strict;
use Log::Log4perl;
use Data::Dumper;
use Apache2::RequestUtil;
=head1 NAME
@ -387,6 +388,8 @@ sub showDebug {
my $text = $self->session->stow->get('debug_error');
$text =~ s/\n/\<br \/\>\n/g;
my $output = '<div style="text-align: left;background-color: #800000;color: #ffffff;">'.$text."</div>\n";
$text = $self->session->form->paramsHashRef();
$output .= '<div style="text-align: left;background-color: #ffffff;color: #000000;"><pre>Form Variables:'.Dumper($text)."</pre></div>\n" if(scalar(keys %{$text}));
$text = $self->session->stow->get('debug_warn');
$text =~ s/\n/\<br \/\>\n/g;
$output .= '<div style="text-align: left;background-color: #ffdddd;color: #000000;">'.$text."</div>\n";

View file

@ -167,11 +167,13 @@ Gets a hash ref of all the params passed in to this class, and their values. Thi
sub paramsHashRef {
my $self = shift;
unless ($self->{_paramsHashRef}) {
my $hash;
my %hash;
tie %hash, "Tie::IxHash";
foreach ($self->param) {
$hash->{$_} = $self->process($_);
my @arr = $self->process($_);
$hash{$_} = (scalar(@arr) > 1)?\@arr:$arr[0];
}
$self->{_paramsHashRef} = $hash;
$self->{_paramsHashRef} = \%hash;
}
return $self->{_paramsHashRef};
}

View file

@ -362,9 +362,13 @@ sub moveDown {
my $self = shift;
my $urlParams = shift;
my $pageURL = shift || $self->session->url->getRequestedUrl;
my $disabled = shift;
my $i18n = WebGUI::International->new($self->session,'Icon');
my $output = '<p style="display:inline;vertical-align:middle;"><a href="'.$self->session->url->gateway($pageURL,$urlParams).'">';
$output .= '<img src="'.$self->_getBaseURL().'moveDown.gif" style="vertical-align:middle;border: 0px;" alt="'.$i18n->get('Move Down').'" title="'.$i18n->get('Move Down').'" /></a></p>';
my $output = '<p style="display:inline;vertical-align:middle;">';
$output .= '<a href="'.$self->session->url->gateway($pageURL,$urlParams).'">' unless $disabled;
$output .= '<img src="'.$self->_getBaseURL().'moveDown.gif" style="vertical-align:middle;border: 0px;" alt="'.$i18n->get('Move Down').'" title="'.$i18n->get('Move Down').'" />';
$output .= '</a>' unless $disabled;
$output .= '</p>';
return $output;
}
@ -466,9 +470,13 @@ sub moveUp {
my $self = shift;
my $urlParams = shift;
my $pageURL = shift || $self->session->url->getRequestedUrl;
my $disabled = shift;
my $i18n = WebGUI::International->new($self->session,'Icon');
my $output = '<p style="display:inline;vertical-align:middle;"><a href="'.$self->session->url->gateway($pageURL,$urlParams).'">';
$output .= '<img src="'.$self->_getBaseURL().'moveUp.gif" style="vertical-align:middle;border: 0px;" alt="'.$i18n->get('Move Up').'" title="'.$i18n->get('Move Up').'" /></a></p>';
my $output = '<p style="display:inline;vertical-align:middle;">';
$output .= '<a href="'.$self->session->url->gateway($pageURL,$urlParams).'">' unless $disabled;
$output .= '<img src="'.$self->_getBaseURL().'moveUp.gif" style="vertical-align:middle;border: 0px;" alt="'.$i18n->get('Move Up').'" title="'.$i18n->get('Move Up').'" />';
$output .= '</a>' unless $disabled;
$output .= '</p>';
return $output;
}

View file

@ -279,6 +279,18 @@ our $I18N = { ##hashref of hashes
context => q|Link to add an event to the event manager|,
},
'manage event metadata' => {
message => q|Manage Event Metadata|,
lastUpdated => 1138908251,
context => q|Link to manage event metadata|,
},
'add new event metadata field' => {
message => q|Add new Event Metadata Field|,
lastUpdated => 1138908251,
context => q|In Manage Event Metadata screen|,
},
'null field error' => {
message => q|The %s field cannot be blank.|,
lastUpdated => 1138908251,
@ -426,6 +438,36 @@ allows you to edit events, delete events, or change their order.</p>
lastUpdated => 1131394072,
},
'global metadata' => {
message => q|Use Global Event Metadata|,
lastUpdated => 1140469381,
},
'global metadata description' => {
message => q|Whether or not to use all other Event Management Systems Metadata Fields when assigning metadata to events and searching for events.<br /><br />The management screen list of metadata fields for this asset will still remain limited to those created by this EMS asset.<br />|,
lastUpdated => 1140469381,
},
'type name here' => {
message => q|Type Name Here|,
lastUpdated => 1140469381,
},
'type label here' => {
message => q|Type Label Here|,
lastUpdated => 1140469381,
},
'sold out' => {
message => q|Sold Out|,
lastUpdated => 1140469381,
},
'confirm delete event metadata' => {
message => q|Are you certain you want to delete this metadata field? The metadata values for this field will be deleted from all events, including events in other EMS wobjects that are set to use global metadata.|,
lastUpdated => 1140469381,
},
};
1;