First pass at adding key files
This commit is contained in:
322
site/slowtwitch.com/cgi-bin/articles/admin/Plugins/Widgets.pm
Normal file
322
site/slowtwitch.com/cgi-bin/articles/admin/Plugins/Widgets.pm
Normal file
@ -0,0 +1,322 @@
|
||||
# ==================================================================
|
||||
# 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;
|
Reference in New Issue
Block a user