Skip to content

Commit

Permalink
Convert FilePile asset into an AssetHelper.
Browse files Browse the repository at this point in the history
  • Loading branch information
perlDreamer committed Oct 11, 2011
1 parent c6f4222 commit a2a3b2d
Show file tree
Hide file tree
Showing 3 changed files with 260 additions and 1 deletion.
4 changes: 4 additions & 0 deletions lib/WebGUI/Asset.pm
Expand Up @@ -1341,6 +1341,10 @@ sub getHelpers {
label => $i18n->get('delete'),
confirm => $i18n->get('43'),
},
upload_files => {
className => 'WebGUI::AssetHelper::UploadFiles',
label => $i18n->get('upload files'),
},
};

# Merge additional helpers for this class from config
Expand Down
249 changes: 249 additions & 0 deletions lib/WebGUI/AssetHelper/UploadFiles.pm
@@ -0,0 +1,249 @@
package WebGUI::AssetHelper::UploadFiles;

use strict;
use Class::C3;
use base qw/WebGUI::AssetHelper/;
use WebGUI::Form::File;
use WebGUI::TabForm;

=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
-------------------------------------------------------------------
=head1 NAME
Package WebGUI::AssetHelper::UploadFiles
=head1 DESCRIPTION
Creates multiple file assets from form uploads beneath the current asset.
=head1 METHODS
These methods are available from this class:
=cut

#-------------------------------------------------------------------

=head2 process ()
Opens a new tab for displaying the form and the output for editing a branch.
=cut

sub process {
my ($self) = @_;
my $asset = $self->asset;
my $session = $self->session;
my $i18n = WebGUI::International->new($session, "Asset");
if (! $asset->canEdit) {
return {
error => $i18n->get('38', 'WebGUI'),
}
}

return {
openDialog => $self->getUrl( 'uploadFiles' ),
};
}

#-------------------------------------------------------------------

=head2 www_uploadFiles ( )
Creates a tabform to edit the Asset Tree. If canEdit returns False, returns insufficient Privilege page.
=cut

sub www_uploadFiles {
my ($self) = @_;
my $asset = $self->asset;
my $session = $self->session;
my $i18n = WebGUI::International->new($session, 'Asset');
my ( $style, $url ) = $session->quick( qw( style url ) );
$style->setCss( $url->extras('hoverhelp.css'));
$style->setScript( $url->extras('yui/build/yahoo-dom-event/yahoo-dom-event.js') );
$style->setScript( $url->extras('yui/build/container/container-min.js') );
$style->setScript( $url->extras('hoverhelp.js') );
$style->setRawHeadTags( <<'ENDHTML' );
<style type="text/css">
label.formDescription { display: block; margin-top: 1em; font-weight: bold }
</style>
ENDHTML
my $tabform = WebGUI::TabForm->new($session);
$tabform->hidden({name=>"op",value=>"assetHelper"});
$tabform->hidden({name=>"helperId",value=>$self->id});
$tabform->hidden({name=>"method",value=>"uploadFilesSave"});
if ($session->config->get("enableSaveAndCommit")) {
$tabform->submitAppend(WebGUI::Form::submit($session, {
name => "saveAndCommit",
value => WebGUI::International->new($session, 'Asset')->get("save and commit"),
}));
}
my $prop_tab = $tabform->addTab("properties",$i18n->get("properties","Asset"));
my $sec_tab = $tabform->addTab("security",$i18n->get(107,"Asset"),6);
$prop_tab->yesNo(
name => "isHidden",
value => 1,
label => $i18n->get(886, 'Asset'),
hoverHelp => $i18n->get('886 description', 'Asset'),
uiLevel => 6,
);
$prop_tab->yesNo(
name => "newWindow",
value => 0,
label => $i18n->get(940, 'Asset'),
hoverHelp => $i18n->get('940 description', 'Asset'),
uiLevel => 6,
);
$prop_tab->file(
name => 'upload_files',
label => $i18n->get("upload files"),
hoverHelp => $i18n->get("upload files description"),
maxAttachments => 100,
);
my $subtext;
if ($session->user->isAdmin) {
$subtext = $session->icon->manage('op=listUsers');
}
else {
$subtext = "";
}
my $clause;
if ($session->user->isAdmin) {
my $group = WebGUI::Group->new($session,4);
my $contentManagers = $group->getAllUsers();
push (@$contentManagers, $session->user->userId);
$clause = "userId in (".$session->db->quoteAndJoin($contentManagers).")";
}
else {
$clause = "userId=".$session->db->quote($asset->get("ownerUserId"));
}
my $users = $session->db->buildHashRef("select userId,username from users where $clause order by username");
$sec_tab->selectBox(
name => "ownerUserId",
options => $users,
label => $i18n->get(108, 'Asset'),
hoverHelp => $i18n->get('108 description', 'Asset'),
value => [$asset->get("ownerUserId")],
subtext => $subtext,
uiLevel => 6,
);
$sec_tab->group(
name => "groupIdView",
label => $i18n->get(872, 'Asset'),
hoverHelp => $i18n->get('872 description', 'Asset'),
value => [$asset->get("groupIdView")],
uiLevel => 6,
);
$sec_tab->group(
name => "groupIdEdit",
label => $i18n->get(871, 'Asset'),
hoverHelp => $i18n->get('871 description', 'Asset'),
value => [$asset->get("groupIdEdit")],
excludeGroups => [1,7],
uiLevel => 6,
);

return $session->style->process(
'<div class="yui-skin-sam">' . $tabform->print . '</div>',
"PBtmpl0000000000000137"
);
}

#-------------------------------------------------------------------

=head2 www_uploadFilesSave ( )
Process form output and create child File/Image assets as approriate.
=cut

sub www_uploadFilesSave {
my ($self) = @_;
my $asset = $self->asset;
my $session = $self->session;
return $session->privilege->insufficient() unless ($asset->canEdit && $session->user->isInGroup('4'));
if ($session->config("maximumAssets")) {
my ($count) = $session->db->quickArray("select count(*) from asset");
my $i18n = WebGUI::International->new($session, "Asset");
return $session->style->userStyle($i18n->get("over max assets")) if ($session->config("maximumAssets") <= $count);
}

my $overrides = $session->config->get( "assets/" . $asset->get("className") . "/fields" );
my $form = $session->form;

##Process the form data that is the same for every uploaded file.
my %asset_defaults = ();
foreach my $property_name ( $asset->getProperties ) {
my $property = $asset->meta->find_attribute_by_name($property_name);
next if $property->noFormPost;

my $fieldType = $property->fieldType;
my $fieldOverrides = $overrides->{$property_name} || {};
my $fieldHash = {
tab => "properties",
%{ $asset->getFormProperties($property_name) },
%{$overrides},
name => $property_name,
value => $asset->$property_name,
};


# process the form element
my $defaultValue = $overrides->{defaultValue} // $asset->$property;
$asset_defaults{$property_name} = $form->process( $property_name, $fieldType, $defaultValue, $fieldHash );
} ## end foreach my $property ( $asset...)

##This is a hack. File uploads should go through the WebGUI::Form::File API
my $tempFileStorageId = WebGUI::Form::File->new($session,{name => 'upload_files'})->getValue;
my $tempStorage = WebGUI::Storage->get($session, $tempFileStorageId);

foreach my $filename (@{$tempStorage->getFiles}) {
my $selfName = $tempStorage->isImage($filename)
? "WebGUI::Asset::File::Image"
:'WebGUI::Asset::File';

my %data = %asset_defaults;

$data{className} = $selfName;
$data{filename} = $data{title} = $data{menuTitle} = $filename;
$data{templateId} = 'PBtmpl0000000000000024';
if ($selfName eq "WebGUI::Asset::File::Image") {
$data{templateId} = 'PBtmpl0000000000000088';
}
$data{url} = $asset->get('url').'/'.$filename;

#Create the new asset
my $newAsset = $asset->addChild(\%data);

#Get the current storage location
my $storage = $newAsset->getStorageLocation();
$storage->addFileFromFilesystem($tempStorage->getPath($filename));
$newAsset->applyConstraints;

#Now remove the reference to the storeage location to prevent problems with different revisions.
delete $newAsset->{_storageLocation};
}
$tempStorage->delete;

if (WebGUI::VersionTag->autoCommitWorkingIfEnabled($session, {
override => scalar $session->form->process("saveAndCommit"),
allowComments => 1,
returnUrl => $asset->getUrl,
}) eq 'redirect') {
return undef;
};

}

1;
8 changes: 7 additions & 1 deletion lib/WebGUI/i18n/English/Asset.pm
Expand Up @@ -1501,7 +1501,13 @@ Couldn't open %-s because %-s <br />
'Allowed Classes hoverHelp' => {
message => 'Which assets use this metadata?',
lastUpdated => 1295986062,
}
},

'upload files' => {
message => q|Upload Files|,
context => q|Name of the asset helper.|,
lastUpdated => 1107387247,
},
};

1;

0 comments on commit a2a3b2d

Please sign in to comment.