package WebGUI::Asset::MatrixListing; =head1 LEGAL ------------------------------------------------------------------- WebGUI is Copyright 2001-2012 Plain Black Corporation. ------------------------------------------------------------------- Please read the legal notices (docs/legal.txt) and the license (docs/license.txt) that came with this distribution before using this software. ------------------------------------------------------------------- http://www.plainblack.com info@plainblack.com ------------------------------------------------------------------- =cut use strict; use Tie::IxHash; use Moose; use WebGUI::Definition::Asset; extends 'WebGUI::Asset'; define assetName => ['assetName', 'Asset_MatrixListing']; define tableName => 'MatrixListing'; property screenshots => ( tab => "properties", fieldType => "image", default => undef, maxAttachments => 20, label => ["screenshots label", 'Asset_MatrixListing'], hoverHelp => ["screenshots description", 'Asset_MatrixListing'], ); property description => ( tab => "properties", fieldType => "HTMLArea", default => undef, label => ["description label", 'Asset_MatrixListing'], hoverHelp => ["description description", 'Asset_MatrixListing'], ); property version => ( tab => "properties", fieldType => "text", default => undef, label => ["version label", 'Asset_MatrixListing'], hoverHelp => ["version description", 'Asset_MatrixListing'], ); property score => ( fieldType => 'integer', default => 0, noFormPost => 1, ); property views => ( fieldType => 'integer', default => 0, noFormPost => 1, ); property compares => ( fieldType => 'integer', default => 0, noFormPost => 1, ); property clicks => ( fieldType => 'integer', default => 0, noFormPost => 1, ); property viewsLastIp => ( fieldType => 'text', default => undef, noFormPost => 1, ); property comparesLastIp => ( fieldType => 'text', default => undef, noFormPost => 1, ); property clicksLastIp => ( fieldType => 'text', default => undef, noFormPost => 1, ); property maintainer => ( tab => "properties", fieldType => "user", builder => '_maintainer_default', lazy => 1, label => ["maintainer label", 'Asset_MatrixListing'], hoverHelp => ["maintainer description", 'Asset_MatrixListing'], ); sub _maintainer_default { return shift->session->user->userId; } property manufacturerName => ( tab => "properties", fieldType => "text", default => undef, label => ["manufacturerName label", 'Asset_MatrixListing'], hoverHelp => ["manufacturerName description", 'Asset_MatrixListing'] ); property manufacturerURL => ( tab => "properties", fieldType => "url", default => undef, label => ["manufacturerURL label", 'Asset_MatrixListing'], hoverHelp => ["manufacturerURL description", 'Asset_MatrixListing'] ); property productURL => ( tab => "properties", fieldType => "url", default => undef, label => ["productURL label", 'Asset_MatrixListing'], hoverHelp => ["productURL description", 'Asset_MatrixListing'] ); property lastUpdated => ( default => sub { time() }, noFormPost => 1, fieldType => 'hidden', ); with 'WebGUI::Role::Asset::Comments'; =head1 NAME Package WebGUI::Asset::MatrixListing =head1 DESCRIPTION Describe your New Asset's functionality and features here. =head1 SYNOPSIS use WebGUI::Asset::MatrixListing; =head1 METHODS These methods are available from this class: =cut #---------------------------------------------------------------------------- =head2 canAdd ( ) Override canAdd to ignore its permissions check. Permissions are handled by the parent Matrix. =cut sub canAdd { return 1; } #---------------------------------------------------------------------------- =head2 canEdit ( ) Returns true if the user can edit this asset. C is a WebGUI user ID. Users can edit this Matrix listing if they are the owner, or if they can edit the parent Matrix. =cut sub canEdit { my $self = shift; if ( $self->session->form->process("assetId") eq "new" ) { return $self->getParent->canAddMatrixListing(); } else { return 1 if $self->session->user->userId eq $self->get("ownerUserId"); return $self->getParent->canEdit(); } } #------------------------------------------------------------------- =head2 getAutoCommitWorkflowId Gets the WebGUI::VersionTag workflow to use to automatically commit MatrixListings. By specifying this method, you activate this feature. =cut sub getAutoCommitWorkflowId { my $self = shift; if($self->session->form->process("assetId") eq "new"){ return $self->getParent->get("submissionApprovalWorkflowId"); } return undef; } #------------------------------------------------------------------- =head2 getEditForm ( ) Returns the FormBuilder object that will be used in generating the edit page for this asset. =cut sub getEditForm { my $self = shift; my $session = $self->session; my $db = $session->db; my $matrixId = $self->getParent->getId; my $i18n = WebGUI::International->new($session, 'Asset_MatrixListing'); my $func = $session->form->process("func"); my $form = WebGUI::FormBuilder->new($session, action => $self->getParent->getUrl, ); if ($func eq "add" || ( $func eq "addSave" && $session->form->process("assetId") eq "new")) { $form->addField( "hidden", name => 'assetId', value => 'new', ); $form->addField( "hidden", name => 'className', value => 'WebGUI::Asset::MatrixListing', ); $form->addField( "hidden", name =>'func', value =>'addSave', ); } else { $form->addField( "hidden", name =>'func', value =>'editSave', ); } $form->addField( "text", name =>'title', defaultValue =>'Untitled', label =>$i18n->get("product name label"), hoverHelp =>$i18n->get('product name description'), value =>$self->title, ); $form->addField( "image", name =>'screenshots', defaultValue =>undef, maxAttachments =>20, label =>$i18n->get("screenshots label"), hoverHelp =>$i18n->get("screenshots description"),, value =>$self->screenshots, ); $form->addField( "HTMLArea", name =>'description', defaultValue =>undef, label =>$i18n->get("description label"), hoverHelp =>$i18n->get("description description"), value =>$self->description, ); if ($self->getParent->canEdit) { $form->addField( "user", name =>"ownerUserId", value =>$self->ownerUserId, label =>$i18n->get('maintainer label'), hoverHelp =>$i18n->get('maintainer description'), ); } else{ my $userId; if ($func eq "add"){ $userId = $session->user->userId; } else{ $userId = $self->get('ownerUserId'); } $form->addField( "hidden", name =>'ownerUserId', value =>$userId, ); } $form->addField( "text", name =>'version', defaultValue =>undef, label =>$i18n->get("version label"), hoverHelp =>$i18n->get("version description"), value =>$self->version, ); $form->addField( "text", name =>'manufacturerName', defaultValue =>undef, label =>$i18n->get("manufacturerName label"), hoverHelp =>$i18n->get("manufacturerName description"), value =>$self->manufacturerName, ); $form->addField( "url", name =>'manufacturerURL', defaultValue =>undef, label =>$i18n->get("manufacturerURL label"), hoverHelp =>$i18n->get("manufacturerURL description"), value =>$self->manufacturerURL, ); $form->addField( "url", name =>'productURL', defaultValue =>undef, label =>$i18n->get("productURL label"), hoverHelp =>$i18n->get("productURL description"), value =>$self->productURL, ); foreach my $category (keys %{$self->getParent->getCategories}) { my $fieldset = $form->addFieldset( name => $category, label => $category ); my $attributes = $db->read("select * from Matrix_attribute where category = ? and assetId = ?", [$category,$matrixId]); while (my $attribute = $attributes->hashRef) { $attribute->{label} = $attribute->{name}; $attribute->{subtext} = $attribute->{description}; $attribute->{name} = 'attribute_'.$attribute->{attributeId}; unless($session->form->process('func') eq 'add'){ $attribute->{value} = $db->quickScalar("select value from MatrixListing_attribute where attributeId = ? and matrixId = ? and matrixListingId = ?", [$attribute->{attributeId},$matrixId,$self->getId]); } if($attribute->{fieldType} eq 'Combo'){ my %options; tie %options, 'Tie::IxHash'; %options = $db->buildHash("select value, value from MatrixListing_attribute where attributeId = ? and value != '' order by value",[$attribute->{attributeId}]); $attribute->{options} = \%options; $attribute->{extras} = "style='width:120px'"; } $fieldset->addField( delete $attribute->{fieldType}, %{$attribute}); } } my $buttons = $form->addField( "ButtonGroup", name => "saveButtons", rowClass => "saveButtons" ); $buttons->addButton( "Submit", { name => "send", }); $buttons->addButton( "Button", { name => "cancel", value => $i18n->get('cancel', 'WebGUI'), extras => q{onclick="history.go(-1);" class="backwardButton"}, } ); return $form; } #------------------------------------------------------------------- =head2 getEditTemplate ( ) Override the base method to get the template from the parent Matrix asset. =cut sub getEditTemplate { my $self = shift; my $var = $self->get; my $matrix = $self->getParent; my $template = eval { WebGUI::Asset->newById($self->session, $matrix->get('editListingTemplateId')); }; # TODO: Change to FormBuilder $var->{form} = $self->getEditForm->toHtml; $template->setParam(%{ $var }); $template->style($matrix->getStyleTemplateId); return $template; } #------------------------------------------------------------------- =head2 hasRated ( ) Returns whether the user has already rated this listing or not. =cut sub hasRated { my $self = shift; my $session = $self->session; my $hasRated = $self->session->db->quickScalar("select count(*) from MatrixListing_rating where ((userId=? and userId<>'1') or (userId='1' and ipAddress=?)) and listingId=?", [$session->user->userId,$session->request->env->{"HTTP_X_FORWARDED_FOR"}, $self->getId]); return $hasRated; } #------------------------------------------------------------------- =head2 incrementCounter ( counter ) Increments one of the Matrix Listing's counters. =head3 counter The name of the counter to increment this should be 'views', 'clicks' or 'compares'). =cut sub incrementCounter { my $self = shift; my $db = $self->session->db; my $counter = shift; my $currentIp = $self->session->request->env->{"HTTP_X_FORWARDED_FOR"}; unless ($self->get($counter."LastIp") && ($self->get($counter."LastIp") eq $currentIp)) { $self->update({ $counter."LastIp" => $currentIp, $counter => $self->get($counter)+1 }); } return undef; } #------------------------------------------------------------------- =head2 indexContent ( ) Making private. See WebGUI::Asset::indexContent() for additonal details. =cut around indexContent => sub { my $orig = shift; my $self = shift; my $indexer = $self->$orig(@_); $indexer->setIsPublic(0); return undef; }; #------------------------------------------------------------------- =head2 prepareView ( ) See WebGUI::Asset::prepareView() for details. =cut sub prepareView { my $self = shift; $self->next::method(); my $template = WebGUI::Asset::Template->newById($self->session, $self->getParent->get('detailTemplateId')); $template->prepare; $self->{_viewTemplate} = $template; return undef; } #------------------------------------------------------------------- =head2 processEditForm ( ) Used to process properties from the form posted. =cut sub processEditForm { my $self = shift; my $session = $self->session; my $score = 0; $self->next::method(@_); my $attributes = $session->db->read("select * from Matrix_attribute where assetId = ?",[$self->getParent->getId]); while (my $attribute = $attributes->hashRef) { my $name = 'attribute_'.$attribute->{attributeId}; my $value; if ($attribute->{fieldType} eq 'MatrixCompare'){ $value = $session->form->process($name); $score = $score + $value; } else{ $value = $session->form->process($name,$attribute->{fieldType},$attribute->{defaultValue},$attribute); } $session->db->write("replace into MatrixListing_attribute (matrixId, matrixListingId, attributeId, value) values (?, ?, ?, ?)", [$self->getParent->getId,$self->getId,$attribute->{attributeId},$value]); } $self->update({score => $score}); if ( $self->get('screenshots') ) { my $fileObject = WebGUI::Form::File->new($self->session,{ value=>$self->get('screenshots') }); my $storage = $fileObject->getStorageLocation; my @files; @files = @{ $storage->getFiles } if (defined $storage); foreach my $file (@files) { unless ($file =~ m/^thumb-/){ my ($resizeWidth,$resizeHeight); my ($width, $height) = $storage->getSizeInPixels($file); my $maxWidth = $self->getParent->get('maxScreenshotWidth'); my $maxHeight = $self->getParent->get('maxScreenshotHeight'); if ($width > $maxWidth){ my $newHeight = $height * ($maxWidth / $width); if ($newHeight > $maxHeight){ # Heigth requires more resizing so use maxHeight $storage->resize($file, 0, $maxHeight); } else{ $storage->resize($file, $maxWidth); } } elsif($height > $maxHeight){ $storage->resize($file, 0, $maxHeight); } } } } $self->requestAutoCommit; return undef; } #------------------------------------------------------------------- =head2 purge ( ) This method is called when data is purged by the system. removes collateral data associated with a MatrixListing when the system purges it's data. =cut override purge => sub { my $self = shift; my $db = $self->session->db; $db->write("delete from MatrixListing_attribute where matrixListingId=?",[$self->getId]); $db->write("delete from MatrixListing_rating where listingId=?" ,[$self->getId]); $db->write("delete from MatrixListing_ratingSummary where listingId=?" ,[$self->getId]); return super(); }; #------------------------------------------------------------------- =head2 setRatings ( ratings ) Sets the ratings for a matrix listing =head3 ratings A hashref containing the ratings to set for this listing. =cut sub setRatings { my $self = shift; my $ratings = shift; my $session = $self->session; my $db = $session->db; my $matrixId = $self->getParent->getId; foreach my $category (keys %{$self->getParent->getCategories}) { if ($ratings->{$category}) { $db->write("insert into MatrixListing_rating (userId, category, rating, timeStamp, listingId, ipAddress, assetId) values (?,?,?,?,?,?,?)", [$session->user->userId,$category,$ratings->{$category},time(),$self->getId, $session->request->env->{"HTTP_X_FORWARDED_FOR"}, $matrixId]); } my $sql = "from MatrixListing_rating where listingId=? and category=?"; my $sum = $db->quickScalar("select sum(rating) $sql", [$self->getId,$category]); my $count = $db->quickScalar("select count(*) $sql", [$self->getId,$category]); my $half = sprintf('%.0f', $count/2); my $mean = $sum / ($count || 1); my $median = $db->quickScalar("select rating $sql order by rating limit $half,1",[$self->getId,$category]); $db->write("replace into MatrixListing_ratingSummary (listingId, category, meanValue, medianValue, countValue, assetId) values (?,?,?,?,?,?)",[$self->getId,$category,$mean,$median,$count,$matrixId]); } return undef; } #------------------------------------------------------------------- =head2 updateScore ( ) Updates the score of a MatrixListing. =cut sub updateScore { my $self = shift; my $score = $self->session->db->quickScalar("select sum(value) from MatrixListing_attribute left join Matrix_attribute using(attributeId) where matrixListingId = ? and fieldType = 'MatrixCompare'",[$self->getId]); $self->update({score => $score}); return undef; } #------------------------------------------------------------------- =head2 view ( hasRated ) method called by the container www_view method. =head3 hasRated A boolean indicating if the user has rated this listing. =head3 emailSent A boolean indicating if an email to the listing maintainer was sent. =cut sub view { my $self = shift; my $hasRated = shift || $self->hasRated; my $emailSent = shift; my $session = $self->session; my $db = $session->db; my $i18n = WebGUI::International->new($self->session, "Asset_MatrixListing"); my @categories = keys %{$self->getParent->getCategories}; # Increment views before getting template var hash so that the views tmpl_var has the incremented value. $self->incrementCounter("views"); my $var = $self->get; if ($emailSent){ $var->{emailSent} = 1; } unless($self->hasBeenCommitted){ my $workflowInstanceId = $db->quickScalar("select workflowInstanceId from assetVersionTag where tagId =?" ,[$self->get('tagId')]); $var->{canApprove} = $self->getParent->canEdit; $var->{approveOrDenyUrl} = $self->getUrl("op=manageRevisionsInTag;workflowInstanceId=".$workflowInstanceId .";tagId=".$self->get('tagId')); } $var->{canEdit} = $self->canEdit; $var->{editUrl} = $self->getUrl("func=edit"); $var->{controls} = $self->getToolbar; $var->{comments} = $self->getFormattedComments(); $var->{productName} = $var->{title}; $var->{lastUpdated_epoch} = $self->get('lastUpdated'); $var->{lastUpdated_date} = $session->datetime->epochToHuman($self->get('lastUpdated'),"%z"); $var->{manufacturerUrl_click} = $self->getUrl("func=click;manufacturer=1"); $var->{productUrl_click} = $self->getUrl("func=click"); if($self->get('status') eq 'pending'){ my $revisionDate = $self->get('revisionDate'); $var->{revision} = $revisionDate; $var->{manufacturerUrl_click} .= ';revision='.$revisionDate; $var->{productUrl_click} .= ';revision='.$revisionDate; } $self->session->style->setScript($self->session->url->extras('yui/build/utilities/utilities.js')); $self->session->style->setScript($self->session->url->extras('yui/build/datasource/datasource-min.js')); $self->session->style->setScript($self->session->url->extras('yui/build/datatable/datatable-min.js')); $self->session->style->setScript($self->session->url->extras('yui/build/button/button-min.js')); $self->session->style->setScript($self->session->url->extras('yui/build/json/json-min.js')); $self->session->style->setCss($self->session->url->extras('yui/build/datatable/assets/skins/sam/datatable.css')); # Attributes foreach my $category (@categories) { my $attributes; my @attribute_loop; my $categoryLoopName = $session->url->urlize($category)."_loop"; $attributes = $db->read("select * from Matrix_attribute as attribute left join MatrixListing_attribute as listing using(attributeId) where listing.matrixListingId = ? and category =? and attribute.assetId = ?", [$self->getId,$category,$self->getParent->getId]); while (my $attribute = $attributes->hashRef) { $attribute->{label} = $attribute->{name}; if ($attribute->{fieldType} eq 'MatrixCompare'){ $attribute->{value} = WebGUI::Form::MatrixCompare->new($session,$attribute)->getValueAsHtml; } push(@attribute_loop,$attribute); } $var->{$categoryLoopName} = \@attribute_loop; push(@{$var->{category_loop}},{ categoryLabel => $category, attribute_loop => \@attribute_loop, }); } # Screenshots if ($var->{screenshots}) { my $file = WebGUI::Form::File->new($session,{ value=>$var->{screenshots} }); my $storage = $file->getStorageLocation; my @files; @files = @{ $storage->getFiles } if (defined $storage); $var->{screenshotsUrl} = $self->getUrl('func=viewScreenshots'); $var->{screenshotThumbnail} = $storage->getUrl('thumb-'.$files[0]); } # Rating form my %rating; tie %rating, 'Tie::IxHash'; %rating = ( 1=>"1 - ".$i18n->get('worst label'), 2=>2, 3=>3, 4=>4, 5=>"5 - ".$i18n->get('respectable label'), 6=>6, 7=>7, 8=>8, 9=>9, 10=>"10 - ".$i18n->get('best label') ); my $ratingsTable = "\n \n"; my $ratingForm = WebGUI::HTMLForm->new($session, -extras =>'class="content"', -tableExtras=>'class="content"' ); $ratingForm = WebGUI::HTMLForm->new($session, -extras =>'class="ratingForm"', -tableExtras=>'class="ratingForm"' ); $ratingForm->hidden( -name =>"listingId", -value =>$self->getId ); $ratingForm->hidden( -name =>"func", -value =>"rate" ); foreach my $category (@categories) { my ($mean,$median,$count) = $db->quickArray("select meanValue, medianValue, countValue from MatrixListing_ratingSummary where listingId=? and category=?",[$self->getId,$category]); $ratingsTable .= ''; $ratingForm->selectBox( -name =>$category, -label =>$category, -value =>[5], -extras =>'class="ratingForm"', -options=>\%rating ); } $ratingsTable .= '
".$i18n->get('mean label')." ".$i18n->get('median label')." ".$i18n->get('count label')."
'.$category.''.$mean.''.$median.''.$count.'
'; $ratingForm->submit( -extras =>'class="ratingForm"', -value =>$i18n->get('rate submit label'), -label =>''.$i18n->get('show ratings').'' ); if ($hasRated || $session->form->process('showRatings')) { $var->{ratings} = $ratingsTable; } else { $var->{ratings} = $ratingForm->print; } # Mail form my $mailForm = WebGUI::HTMLForm->new($session, -extras =>'class="content"', -tableExtras=>'class="content"' ); $mailForm->hidden( -name =>"func", -value =>"sendEmail" ); $mailForm->captcha( -name =>"verify" ); $mailForm->email( -extras =>'class="content"', -name =>"from", -value =>$session->user->get("email"), -label =>$i18n->get('your email label'), ); $mailForm->selectBox( -name =>"subject", -extras =>'class="content"', -options =>{ $i18n->get('report error label') =>$i18n->get('report error label'), $i18n->get('general comment label') =>$i18n->get('general comment label'), }, -label =>$i18n->get('request type label'), ); $mailForm->textarea( -rows =>4, -extras =>'class="content"', -columns =>35, -name =>"body", -label =>$i18n->get('comment label'), ); $mailForm->submit( -extras =>'class="content"', -value =>$i18n->get('send button label'), ); $var->{emailForm} = $mailForm->print; my $template = $self->processTemplate($var,undef, $self->{_viewTemplate}); return $self->getParent->processStyle($template); } #------------------------------------------------------------------- =head2 www_click ( ) Redirects to the manufacturerUrl or productUrl and increments clicks. =cut sub www_click { my $self = shift; return $self->session->privilege->noAccess() unless $self->canView; my $session = $self->session; $self->incrementCounter('clicks'); if ($session->form->process("manufacturer")) { $session->response->setRedirect( $self->get('manufacturerURL') ); } else { $session->response->setRedirect( $self->get('productURL') ); } return undef; } #------------------------------------------------------------------- =head2 www_deleteStickied ( ) Sets the sort scratch variable. =cut sub www_deleteStickied { my $self = shift; return $self->session->privilege->noAccess() unless $self->canView; $self->getParent->www_deleteStickied(); return undef; } #------------------------------------------------------------------- =head2 www_getAttributes ( ) Gets a listings attributes grouped by category as json. =cut sub www_getAttributes { my $self = shift; my $session = $self->session; my $db = $session->db; return $session->privilege->noAccess() unless $self->canView; $session->response->content_type("application/json"); my @results; my @categories = keys %{$self->getParent->getCategories}; foreach my $category (@categories) { push(@results,{label=>$category,fieldType=>'category'}); my $attributes; my @attribute_loop; $attributes = $db->read("select * from Matrix_attribute as attribute left join MatrixListing_attribute as listing using(attributeId) where listing.matrixListingId = ? and category =? and attribute.assetId = ?", [$self->getId,$category,$self->getParent->getId]); while (my $attribute = $attributes->hashRef) { $attribute->{label} = $attribute->{name}; $attribute->{attributeId} =~ s/-/_____/g; if ($attribute->{fieldType} eq 'MatrixCompare'){ $attribute->{compareColor} = $self->getParent->getCompareColor($attribute->{value}); $attribute->{value} = WebGUI::Form::MatrixCompare->new($self->session,$attribute)->getValueAsHtml; } if($session->scratch->get('stickied_'.$attribute->{attributeId})){ $attribute->{checked} = 'checked'; } else{ $attribute->{checked} = ''; } push(@results,$attribute); } } my $jsonOutput; $jsonOutput->{ResultSet} = {Result=>\@results}; return JSON->new->encode($jsonOutput); } #------------------------------------------------------------------- =head2 www_getScreenshots ( ) Returns the screenshots as xml. =cut sub www_getScreenshots { my $self = shift; return $self->session->privilege->noAccess() unless $self->canView; $self->session->response->content_type('text/xml'); my $xml = qq | |; if ( $self->get('screenshots') ) { my $fileObject = WebGUI::Form::File->new($self->session,{ value=>$self->get('screenshots') }); my $storage = $fileObject->getStorageLocation; my $path = $storage->getPath; my @files; @files = @{ $storage->getFiles } if (defined $storage); foreach my $file (@files) { unless ($file =~ m/^thumb-/){ my ($width, $height) = $storage->getSizeInPixels($file); my $thumb = 'thumb-'.$file; $xml .= " ".$storage->getUrl($file)." 5 ".$storage->getUrl($thumb)." ".$width." ".$height." "; } } } $xml .= qq | |; return $xml; } #------------------------------------------------------------------- =head2 www_getScreenshotsConfig ( ) Returns the xml config file for the ukplayer that displays the screenshots. =cut sub www_getScreenshotsConfig { my $self = shift; my $var = $self->get; return $self->session->privilege->noAccess() unless $self->canView; $self->session->response->content_type('text/xml'); return $self->processTemplate($var,$self->getParent->get("screenshotsConfigTemplateId")); } #------------------------------------------------------------------- =head2 www_rate ( ) Saves a rating of a matrix listing and returns the listing view. =cut sub www_rate { my $self = shift; my $form = $self->session->form; return $self->session->privilege->noAccess() unless $self->canView; my $hasRated = $self->hasRated; my $sameRating = 1; my $first = 1; my $lastRating; foreach my $category (keys %{$self->getParent->getCategories}) { if ($first) { $first=0; } else { if ($lastRating != $form->process($category)) { $sameRating = 0; } } $lastRating = $form->process($category); } # Throw out ratings that are all the same number, or if the user rates twice. unless ($hasRated || $sameRating) { $self->setRatings($self->session->form->paramsHashRef); } $self->prepareView; return $self->view; } #------------------------------------------------------------------- =head2 www_sendEmail ( ) Sends an email to the maintainer of this matrix listing and returns www_view =cut sub www_sendEmail { my $self = shift; my $form = $self->session->form; return $self->session->privilege->noAccess() unless $self->canView; if ($form->process("verify","captcha")) { if ($form->process("body") ne "") { my $user = WebGUI::User->new($self->session, $self->get('maintainerId')); my $mail = WebGUI::Mail::Send->create($self->session,{ to =>$user->get("email"), subject =>$self->get('productName')." - ".$form->process("subject"), from=>$form->process("from") }); $mail->addText($form->process("body")); $mail->addFooter; $mail->queue; } } $self->prepareView; return $self->view(0,1); } #------------------------------------------------------------------- =head2 www_setStickied ( ) Sets the sort scratch variable. =cut sub www_setStickied { my $self = shift; return $self->session->privilege->noAccess() unless $self->canView; $self->getParent->www_setStickied(); return undef; } #------------------------------------------------------------------- =head2 www_view ( ) Web facing method which is the default view page. This method does a 302 redirect to the "showPage" file in the storage location. =cut sub www_view { my $self = shift; return $self->session->privilege->noAccess() unless $self->canView; $self->prepareView; return $self->view; } #------------------------------------------------------------------- =head2 www_viewScreenshots ( ) Returns this listing's screenshots in a ukplayer. =cut sub www_viewScreenshots { my $self = shift; my $var = $self->get; $var->{configUrl} = 'config='.$self->getUrl("func=getScreenshotsConfig"); return $self->session->privilege->noAccess() unless $self->canView; return $self->processTemplate($var,$self->getParent->get("screenshotsTemplateId")); } __PACKAGE__->meta->make_immutable; 1; #vim:ft=perl