323 lines
11 KiB
Perl
323 lines
11 KiB
Perl
# ==================================================================
|
|
# Plugins::Widgets - Auto Generated Program Module
|
|
#
|
|
# Plugins::Widgets
|
|
# Author : Bao Phan
|
|
# Version : 1.0
|
|
# Updated : Mon Mar 21 11:08:31 2016
|
|
#
|
|
# ==================================================================
|
|
#
|
|
|
|
package Plugins::Widgets;
|
|
# ==================================================================
|
|
|
|
use strict;
|
|
use GT::Base;
|
|
use GT::Plugins qw/STOP CONTINUE/;
|
|
use Links qw/:objects/;
|
|
|
|
# Inherit from base class for debug and error methods
|
|
@Plugins::Widgets::ISA = qw(GT::Base);
|
|
|
|
# Your code begins here.
|
|
|
|
|
|
# ADMIN MENU OPTIONS
|
|
# ===================================================================
|
|
|
|
sub widgets {
|
|
# -------------------------------------------------------------------
|
|
# This subroutine will be called whenever the user clicks on 'Widgets' in the
|
|
# admin menu. Remember, you need to print your own HTTP header; to do so you
|
|
# can use:
|
|
my $args = shift || {};
|
|
|
|
print $IN->header;
|
|
Links::admin_page('widgets.html', { widgets => fetch_widgets($IN->param('page')), %$args });
|
|
}
|
|
|
|
sub assign {
|
|
my $cgi = $IN->get_hash();
|
|
|
|
my $msg;
|
|
if ($cgi->{page} and $cgi->{id} and $cgi->{pos}) {
|
|
my $widget = $DB->table('Widgets')->get($cgi->{id});
|
|
my $page = $cgi->{page};
|
|
|
|
my $tab_pgwidgets = $DB->table('PageWidgets');
|
|
my $pg_widget = $tab_pgwidgets->select({ WidgetID => $widget->{ID}, Page => $page })->fetchrow_hashref;
|
|
|
|
my ($msg, $category);
|
|
|
|
$category = $DB->table('Category')->get($page) if $page =~ /^\d+$/;
|
|
if (!$pg_widget and $cgi->{pos} =~ /^\d+$/) {
|
|
$tab_pgwidgets->insert({ WidgetID => $widget->{ID}, Page => $page, Sort_Pos => $cgi->{pos} || 0 }) or die $GT::SQL::error;
|
|
$msg = "The widget was added to page: " . ($category ? $category->{Full_Name} : $page);
|
|
}
|
|
elsif ($cgi->{pos} =~ /^\d+$/) {
|
|
$tab_pgwidgets->update({ Sort_Pos => $cgi->{pos} }, { ID => $pg_widget->{ID} });
|
|
$msg = "The widget's position was updated on page: " . ($category ? $category->{Full_Name} : $page);
|
|
}
|
|
else {
|
|
$tab_pgwidgets->delete({ ID => $pg_widget->{ID} });
|
|
$msg = "The widget was removed from: " . ($category ? $category->{Full_Name} : $page);
|
|
}
|
|
}
|
|
return widgets({ msg => $msg });
|
|
}
|
|
|
|
sub add {
|
|
my $cgi = $IN->get_hash();
|
|
|
|
my $error;
|
|
if ($cgi->{submit}) {
|
|
# automated widget
|
|
my @fields = ('ID', 'Type', 'Widget', 'Title', 'Subtitle', 'TitleStyle', 'Image', 'URL', 'Button');
|
|
if ($cgi->{Type}) {
|
|
return form('Widget and Title cannot be null') unless $cgi->{Widget} and $cgi->{Title};
|
|
|
|
if ($cgi->{Widget} eq 'category_list') {
|
|
return form('Select a category') unless $cgi->{Category};
|
|
|
|
push @fields, 'Category';
|
|
}
|
|
elsif ($cgi->{Widget} eq 'poll') {
|
|
return form('Select a forum') unless $cgi->{Forum};
|
|
|
|
push @fields, 'Forum';
|
|
}
|
|
elsif ($cgi->{Widget} =~ /^(:?feature_article|editors_pick|feature_threads)$/) {
|
|
return form('Enter Article IDs, comma separated') unless $cgi->{Articles};
|
|
push @fields, 'Articles';
|
|
}
|
|
elsif ($cgi->{Widget} eq 'newsletter') {
|
|
return form('Enter List ID') unless $cgi->{ListID};
|
|
push @fields, 'ListID';
|
|
}
|
|
elsif ($cgi->{Widget} eq 'external') {
|
|
return form('Enter widget title') unless $cgi->{Title};
|
|
}
|
|
}
|
|
|
|
|
|
my $rec;
|
|
if ($cgi->{Widget} eq 'external') {
|
|
$rec = $DB->table('Widgets')->add({
|
|
Title => $cgi->{Title},
|
|
TitleStyle => $cgi->{TitleStyle},
|
|
Widget => 'external',
|
|
Type => 1
|
|
});
|
|
return form($GT::SQL::error) unless $rec;
|
|
|
|
my $num_links = $cgi->{NumLinks} || 5;
|
|
my $tab_links = $DB->table("WidgetLinks");
|
|
for my $i (1 .. $num_links) {
|
|
next unless $cgi->{"Title-$i"} and $cgi->{"Abstract-$i"} and $cgi->{"URL-$i"} and $cgi->{"URL-$i"} =~ /^http/;
|
|
$tab_links->insert({
|
|
WidgetID => $rec,
|
|
Title => $cgi->{"Title-$i"},
|
|
Abstract => $cgi->{"Abstract-$i"},
|
|
URL => $cgi->{"URL-$i"},
|
|
});
|
|
}
|
|
}
|
|
else {
|
|
my %hash = map { $_ => $cgi->{$_} } @fields;
|
|
$rec = $DB->table('Widgets')->add(\%hash);
|
|
return form($GT::SQL::error) unless $rec;
|
|
}
|
|
|
|
|
|
if ($cgi->{page}) {
|
|
my $tab_pgwidgets = $DB->table('PageWidgets');
|
|
my $max_pos = $tab_pgwidgets->select('MAX(Sort_Pos)', { Page => $cgi->{page} })->fetchrow || 0;
|
|
$tab_pgwidgets->insert({ WidgetID => $rec, Page => $cgi->{page}, Sort_Pos => $max_pos + 1 });
|
|
}
|
|
return widgets({ success => "The widget was added" });
|
|
}
|
|
|
|
form();
|
|
}
|
|
|
|
sub modify {
|
|
my $cgi = $IN->get_hash();
|
|
my $widget = $DB->table('Widgets')->get($cgi->{ID});
|
|
return form("Widget not found") unless $widget;
|
|
|
|
if ($cgi->{submit}) {
|
|
# automated widget
|
|
my @fields = ('ID', 'Type', 'Widget', 'Title', 'Subtitle', 'TitleStyle', 'Image', 'URL', 'Button');
|
|
if ($cgi->{Type}) {
|
|
return form('Widget and Title cannot be null') unless $cgi->{Widget} and $cgi->{Title};
|
|
|
|
if ($cgi->{Widget} eq 'category_list') {
|
|
return form('Select a category') unless $cgi->{Category};
|
|
push @fields, 'Category';
|
|
}
|
|
elsif ($cgi->{Widget} eq 'poll') {
|
|
return form('Select a forum') unless $cgi->{Forum};
|
|
push @fields, 'Forum';
|
|
}
|
|
elsif ($cgi->{Widget} =~ /^(:?feature_article|editors_pick|feature_threads)$/) {
|
|
return form('Enter Article IDs, comma separated') unless $cgi->{Articles};
|
|
push @fields, 'Articles';
|
|
}
|
|
elsif ($cgi->{Widget} eq 'newsletter') {
|
|
return form('Enter List ID') unless $cgi->{ListID};
|
|
push @fields, 'ListID';
|
|
}
|
|
elsif ($cgi->{Widget} eq 'external') {
|
|
return form('Enter widget title') unless $cgi->{Title};
|
|
}
|
|
}
|
|
|
|
my %hash = map { $_ => $cgi->{$_} } @fields;
|
|
if ($cgi->{Widget} eq 'external') {
|
|
$DB->table('Widgets')->update({
|
|
Title => $cgi->{Title},
|
|
TitleStyle => $cgi->{TitleStyle},
|
|
}, { ID => $cgi->{ID} });
|
|
|
|
my $num_links = $cgi->{NumLinks} || 5;
|
|
my $tab_links = $DB->table("WidgetLinks");
|
|
for my $i (1 .. $num_links) {
|
|
my $id = $cgi->{"ID-$i"};
|
|
|
|
unless ($cgi->{"Title-$i"} and $cgi->{"URL-$i"} and $cgi->{"URL-$i"} =~ /^http/) {
|
|
$tab_links->delete({ ID => $id }) if $id;
|
|
}
|
|
elsif ($id) {
|
|
$tab_links->update({
|
|
Title => $cgi->{"Title-$i"},
|
|
Abstract => $cgi->{"Abstract-$i"},
|
|
URL => $cgi->{"URL-$i"},
|
|
}, { ID => $id });
|
|
}
|
|
else {
|
|
$tab_links->insert({
|
|
WidgetID => $cgi->{ID},
|
|
Title => $cgi->{"Title-$i"},
|
|
Abstract => $cgi->{"Abstract-$i"},
|
|
URL => $cgi->{"URL-$i"},
|
|
});
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
my $rec = $DB->table('Widgets')->modify(\%hash);
|
|
}
|
|
return widgets({ success => "The widget was updated" });
|
|
}
|
|
else {
|
|
$IN->param($_, $widget->{$_}) for keys %$widget;
|
|
if ($widget->{Widget} eq 'external') {
|
|
my $links = $DB->table('WidgetLinks')->select({ WidgetID => $widget->{ID} })->fetchall_hashref;
|
|
my $i = 1;
|
|
foreach my $l (@$links) {
|
|
$IN->param("$_-$i", $l->{$_}) foreach (qw/ID Title Abstract URL/);
|
|
$i++;
|
|
}
|
|
}
|
|
return form();
|
|
}
|
|
}
|
|
|
|
sub retrieve_ntag {
|
|
my ($name, $index) = @_;
|
|
return unless $name and $index;
|
|
my $vars = GT::Template->vars;
|
|
|
|
return $vars->{"$name-$index"};
|
|
}
|
|
|
|
sub delete {
|
|
my $tab = $DB->table('Widgets');
|
|
my $widget = $tab->get($IN->param('ID'));
|
|
return widgets({ error => "Widget not found" }) unless $widget;
|
|
|
|
$tab->delete({ ID => $widget->{ID} });
|
|
$DB->table('PageWidgets')->delete({ WidgetID => $widget->{ID} });
|
|
$DB->table('WidgetLinks')->delete({ WidgetID => $widget->{ID} });
|
|
widgets({ success => "The widget was deleted" });
|
|
}
|
|
|
|
sub form {
|
|
print $IN->header;
|
|
my $widget = $IN->param('Widget') || '';
|
|
|
|
Links::admin_page($widget eq 'external' ? 'widgetlink_add.html' : 'widget_add.html', { error => shift });
|
|
}
|
|
|
|
sub fetch_widgets {
|
|
my $page = shift;
|
|
|
|
my $tab = $DB->table('Widgets');
|
|
my $tab_pgwidgets = $DB->table('PageWidgets');
|
|
my $tab_category = $DB->table('Category');
|
|
|
|
$tab->select_options('ORDER BY Title');
|
|
my $widgets = $tab->select()->fetchall_hashref;
|
|
|
|
my (%selected, %widgets);
|
|
if ($page) {
|
|
%selected = map { $_->{WidgetID} => $_->{Sort_Pos} } @{$tab_pgwidgets->select({ Page => $page })->fetchall_hashref};
|
|
}
|
|
|
|
my (@selected, @noselected);
|
|
foreach my $w (@$widgets) {
|
|
if ($w->{Image}) {
|
|
my $fh = $tab->file_info('Image', $w->{ID});
|
|
$w->{Image_URL} = '/images/widgets/' . $fh->File_RelativeURL;
|
|
}
|
|
|
|
$w->{pages} = $tab_pgwidgets->select({ WidgetID => $w->{ID} })->fetchall_hashref;
|
|
if ($selected{$w->{ID}}) {
|
|
$w->{selected} = $selected{$w->{ID}};
|
|
push @selected, $w;
|
|
}
|
|
else {
|
|
push @noselected, $w;
|
|
}
|
|
}
|
|
|
|
@selected = @{qsort(\@selected, 'selected', 'asc')} if scalar @selected;
|
|
return { selected => \@selected, available => \@noselected };
|
|
}
|
|
|
|
sub fetch_categories {
|
|
my $tab = $DB->table('Category');
|
|
|
|
$tab->select_options('ORDER BY Full_Name');
|
|
my $categories = $tab->select()->fetchall_hashref;
|
|
return $categories;
|
|
}
|
|
|
|
sub qsort {
|
|
my ($list, $sb, $so) = @_;
|
|
my $sorted;
|
|
@$sorted =
|
|
sort {
|
|
my $da = lc $a->{$sb}; #lower case
|
|
my $db = lc $b->{$sb};
|
|
my $res;
|
|
if ($sb eq 'selected') {
|
|
$res = $db <=> $da;
|
|
}
|
|
else {
|
|
$res = $db cmp $da;
|
|
}
|
|
if ($res == 0 and $sb ne 'name') {
|
|
lc $b->{name} cmp lc $a->{name};
|
|
}
|
|
else {
|
|
$res;
|
|
}
|
|
} @$list;
|
|
|
|
($so) and @$sorted = reverse @$sorted;
|
|
return $sorted;
|
|
}
|
|
1;
|