package WebGUI::Asset::MapPoint; =head1 LEGAL ------------------------------------------------------------------- WebGUI is Copyright 2001-2009 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 base 'WebGUI::Asset'; use WebGUI::Utility; use Geo::Coder::Googlev3; use Data::Dumper; # To get an installer for your wobject, add the Installable AssetAspect # See WebGUI::AssetAspect::Installable and sbin/installClass.pl for more # details =head1 NAME Package WebGUI::Asset::MapPoint =head1 DESCRIPTION Describe your New Asset's functionality and features here. =head1 SYNOPSIS use WebGUI::Asset::MapPoint; =head1 METHODS These methods are available from this class: =cut #------------------------------------------------------------------- =head2 definition ( session, definition ) defines asset properties for New Asset instances. You absolutely need this method in your new Assets. =head3 session =head3 definition A hash reference passed in from a subclass definition. =cut sub definition { my $class = shift; my $session = shift; my $definition = shift; my $i18n = WebGUI::International->new( $session, "Asset_MapPoint" ); tie my %properties, 'Tie::IxHash', ( latitude => { tab => "properties", fieldType => "float", label => $i18n->get("latitude label"), hoverHelp => $i18n->get("latitude description"), }, longitude => { tab => "properties", fieldType => "float", label => $i18n->get("longitude label"), hoverHelp => $i18n->get("longitude description"), }, website => { tab => "properties", fieldType => "text", label => $i18n->get("website label"), hoverHelp => $i18n->get("website description"), }, address1 => { tab => "properties", fieldType => "text", label => $i18n->get("address1 label"), hoverHelp => $i18n->get("address1 description"), }, address2 => { tab => "properties", fieldType => "text", label => $i18n->get("address2 label"), hoverHelp => $i18n->get("address2 description"), }, city => { tab => "properties", fieldType => "text", label => $i18n->get("city label"), hoverHelp => $i18n->get("city description"), }, region => { tab => "properties", fieldType => "text", label => $i18n->get("state label"), hoverHelp => $i18n->get("state description"), }, zipCode => { tab => "properties", fieldType => "text", label => $i18n->get("zipCode label"), hoverHelp => $i18n->get("zipCode description"), }, country => { tab => "properties", fieldType => "country", label => $i18n->get("country label"), hoverHelp => $i18n->get("country description"), }, phone => { tab => "properties", fieldType => "phone", label => $i18n->get("phone label"), hoverHelp => $i18n->get("phone description"), }, fax => { tab => "properties", fieldType => "phone", label => $i18n->get("fax label"), hoverHelp => $i18n->get("fax description"), }, email => { tab => "properties", fieldType => "email", label => $i18n->get("email label"), hoverHelp => $i18n->get("email description"), }, storageIdPhoto => { tab => "properties", fieldType => "image", forceImageOnly => 1, label => $i18n->get("storageIdPhoto label"), hoverHelp => $i18n->get("storageIdPhoto description"), noFormPost => 1, }, isGeocoded => { fieldType => "yesNo", tab => "properties", label => $i18n->get("isGeocoded label"), hoverHelp => $i18n->get("isGeocoded description"), }, userDefined1 => { fieldType => "hidden", }, userDefined2 => { fieldType => "hidden", }, userDefined3 => { fieldType => "hidden", }, userDefined4 => { fieldType => "hidden", }, userDefined5 => { fieldType => "hidden", }, ); push @{$definition}, { assetName => $i18n->get('assetName'), icon => 'mappoint.png', autoGenerateForms => 1, tableName => 'MapPoint', className => 'WebGUI::Asset::MapPoint', properties => \%properties, }; return $class->SUPER::definition( $session, $definition ); } ## end sub definition #------------------------------------------------------------------- =head2 canEdit ( [userId] ) Returns true if the user can edit this MapPoint. Only the owner or the group to edit the parent Map are allowed to edit MapPoint. =cut sub canEdit { my $self = shift; my $userId = shift || $self->session->user->userId; return 1 if $userId eq $self->get('ownerUserId'); return $self->SUPER::canEdit( $userId ); } #------------------------------------------------------------------- =head2 getAutoCommitWorkflowId ( ) Get the workflowId to commit this MapPoint =cut sub getAutoCommitWorkflowId { my ( $self ) = @_; return $self->getParent->get('workflowIdPoint'); } #------------------------------------------------------------------- =head2 getMapInfo ( ) Get a hash of info to be put into the parent Map. Must include AT LEAST the following keys: assetId - The ID of the MapPoint latitude - The latitude of the point longitude - The longitude of the point title - The title of the point content - HTML content to show details about the point url - The URL of the point userDefined1-5 - The userDefined fields The following keys are optional canEdit - If true, the user is allowed to edit the MapPoint =cut sub getMapInfo { my $self = shift; my $var = {}; # Get asset properties $var->{ url } = $self->getUrl; $var->{ assetId } = $self->getId; my @keys = qw( latitude longitude title userDefined1 userDefined2 userDefined3 userDefined4 userDefined5 isGeocoded ); for my $key ( @keys ) { $var->{ $key } = $self->get( $key ); } # Get permissions $var->{ canEdit } = $self->canEdit; # Process the template to get the content my $template = $self->getParent->getViewPointTemplate; $var->{ content } = $template->process( $self->getTemplateVars ); WebGUI::Macro::process( $self->session, \$var->{content} ); return $var; } #------------------------------------------------------------------- =head2 getTemplateVars ( ) Get common template vars for this MapPoint =cut sub getTemplateVars { my $self = shift; my $var = $self->get; # Add gateway to URL $var->{ url } = $self->getUrl; return $var; } #------------------------------------------------------------------- =head2 getTemplateVarsEditForm ( ) Get the template vars for the MapPoint edit form =cut sub getTemplateVarsEditForm { my $self = shift; my $session = $self->session; my $var = $self->getTemplateVars; my $parent = $self->getParent; #If it's a new point, we have to get the parent from the url unless ($parent) { my $url = $session->url->page; $parent = WebGUI::Asset->newByUrl($session,$url); } $var->{'can_edit_map'} = $parent->canEdit; $var->{ form_header } = WebGUI::Form::formHeader( $session ) . WebGUI::Form::hidden( $session, { name => 'func', value => 'ajaxEditPointSave', } ) . WebGUI::Form::hidden( $session, { name => 'assetId', value => $self->getId, defaultValue => 'new', } ) . WebGUI::Form::hidden( $session, { name => 'latitude', value => $self->get('latitude'), } ) . WebGUI::Form::hidden( $session, { name => 'longitude', value => $self->get('longitude'), } ) ; $var->{ form_footer } = WebGUI::Form::formFooter( $session ); $var->{ form_save } = WebGUI::Form::submit( $session, { name => "save", } ); # Stuff from this class's definition my $definition = __PACKAGE__->definition($session)->[0]->{properties}; for my $key ( keys %{$definition} ) { next if $definition->{$key}->{noFormPost}; next if $key eq 'latitude' || $key eq 'longitude'; $definition->{$key}->{name} = $key; $definition->{$key}->{value} = $self->getValue($key); $var->{ "form_$key" } = WebGUI::Form::dynamicField( $session, %{$definition->{$key}} ); } # Stuff from Asset $var->{ "form_title" } = WebGUI::Form::text( $session, { name => "title", value => $self->get("title"), } ); $var->{ "form_synopsis" } = WebGUI::Form::textarea( $session, { name => "synopsis", value => $self->get("synopsis"), resizable => 0, } ); #Only allow people who can edit the parent to change isHidden if($var->{'can_edit_map'}) { my $isHidden = (defined $self->get("isHidden")) ? $self->get("isHidden") : 1; $var->{ "form_isHidden" } = WebGUI::Form::yesNo( $session, { name => "isHidden", value => $isHidden, } ); } my $isGeocoded = ( $self->getId ) ? $self->get("isGeocoded") : 1; $var->{"form_isGeocoded"} = WebGUI::Form::checkbox( $session, { name => "isGeocoded", value => 1, checked => $isGeocoded } ); # Fix storageIdPhoto because scripts do not get executed in ajax requests $var->{ "form_storageIdPhoto" } = ''; if ( $self->get('storageIdPhoto') ) { my $storage = WebGUI::Storage->get( $self->session, $self->get('storageIdPhoto') ); $var->{ "currentPhoto" } = sprintf '', $storage->getUrl($storage->getFiles->[0]); } return $var; } #------------------------------------------------------------------- =head2 indexContent ( ) Indexing the content of attachments and user defined fields. See WebGUI::Asset::indexContent() for additonal details. =cut sub indexContent { my $self = shift; my $indexer = $self->SUPER::indexContent; $indexer->addKeywords($self->get("website")); $indexer->addKeywords($self->get("address1")); $indexer->addKeywords($self->get("address2")); $indexer->addKeywords($self->get("city")); $indexer->addKeywords($self->get("region")); $indexer->addKeywords($self->get("zipCode")); $indexer->addKeywords($self->get("country")); $indexer->addKeywords($self->get("phone")); $indexer->addKeywords($self->get("fax")); $indexer->addKeywords($self->get("email")); $indexer->addKeywords($self->get("userDefined1")); $indexer->addKeywords($self->get("userDefined2")); $indexer->addKeywords($self->get("userDefined3")); $indexer->addKeywords($self->get("userDefined4")); $indexer->addKeywords($self->get("userDefined5")); return $indexer; } #------------------------------------------------------------------- =head2 processAjaxEditForm ( ) Process the Ajax Edit Form from the Map. If any errors occur, return an array reference of error messages. =cut sub processAjaxEditForm { my $self = shift; my $session = $self->session; my $form = $self->session->form; my $prop = {}; # Stuff from this class's definition my $definition = __PACKAGE__->definition($session)->[0]->{properties}; for my $key ( keys %{$definition} ) { my $field = $definition->{$key}; next if $field->{noFormPost}; $prop->{$key} = $form->get($key,$field->{fieldType},$field->{defaultValue},$field); } # Stuff from Asset $prop->{ title } = $form->get('title'); $prop->{ menuTitle } = $form->get('title'); $prop->{ synopsis } = $form->get('synopsis'); $prop->{ url } = $session->url->urlize( $self->getParent->getUrl . '/' . $prop->{title} ); $prop->{ ownerUserId } = $form->get('ownerUserId') || $session->user->userId; #Only users who can edit the map can set this property if($self->getParent->canEdit) { $prop->{ isHidden } = $form->get('isHidden'); } $prop->{isGeocoded } = $form->get('isGeocoded') || 0; if($prop->{isGeocoded} && ( ( $form->get("address1") ne $self->get("address1") ) || ( $form->get("address2") ne $self->get("address2") ) || ( $form->get("city") ne $self->get("city") ) || ( $form->get("region") ne $self->get("region") ) || ( $form->get("zipCode") ne $self->get("zipCode") ) || ( $form->get("country") ne $self->get("country") ) ) ) { my $geocoder = Geo::Coder::Googlev3->new; my $address_str = $form->get("address1"); $address_str .= " ".$form->get("address2") if($form->get("address2")); $address_str .= ", ".$form->get("city").", ".$form->get("region").", ".$form->get("zipCode").", ".$form->get("country"); my $location = $geocoder->geocode( location => $address_str ); $prop->{latitude } = $location->{geometry}->{location}->{lat}; $prop->{longitude} = $location->{geometry}->{location}->{lng}; } $self->update( $prop ); # Photo magic if ( $form->get('storageIdPhoto') ) { my $storage; if ( $self->get('storageIdPhoto') ) { $storage = WebGUI::Storage->get( $session, $self->get('storageIdPhoto') ); $storage->deleteFile( $storage->getFiles->[0] ); } else { $storage = WebGUI::Storage->create( $session ); $self->update({ storageIdPhoto => $storage->getId }); } $storage->addFileFromFormPost( 'storageIdPhoto', 1 ); } return; } #------------------------------------------------------------------- =head2 view ( ) Get the content to show in the map text box. This will not be called by www_view, but we may want to call it elsewhere for some reason. =cut sub view { my $self = shift; return "TODO"; } #------------------------------------------------------------------- =head2 www_view ( ) Redirect the user to the correct Map with the appropriate focus point so that this point is automatically shown. =cut sub www_view { my $self = shift; $self->session->http->setRedirect( $self->getParent->getUrl('focusOn=' . $self->getId ) ); return "redirect"; } 1; #vim:ft=perl