package WebGUI::Wobject; =head1 LEGAL ------------------------------------------------------------------- WebGUI is Copyright 2001-2002 Plain Black Software. ------------------------------------------------------------------- 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 CGI::Carp qw(fatalsToBrowser); use DBI; use strict qw(subs vars); use Tie::IxHash; use WebGUI::DateTime; use WebGUI::HTML; use WebGUI::HTMLForm; use WebGUI::Icon; use WebGUI::International; use WebGUI::Macro; use WebGUI::Node; use WebGUI::Session; use WebGUI::SQL; use WebGUI::Template; use WebGUI::URL; use WebGUI::Utility; =head1 NAME Package WebGUI::Wobject =head1 SYNOPSIS use WebGUI::Wobject; our @ISA = qw(WebGUI::Wobject); See the subclasses in lib/WebGUI/Wobjects for details. =head1 DESCRIPTION An abstract class for all other wobjects to extend. =head1 METHODS These methods are available from this class: =cut #------------------------------------------------------------------- sub _reorderWobjects { my ($sth, $i, $wid); $sth = WebGUI::SQL->read("select wobjectId from wobject where pageId=$_[0] order by templatePosition,sequenceNumber"); while (($wid) = $sth->array) { $i++; WebGUI::SQL->write("update wobject set sequenceNumber='$i' where wobjectId=$wid"); } $sth->finish; } #------------------------------------------------------------------- sub _getNextSequenceNumber { my ($sequenceNumber); ($sequenceNumber) = WebGUI::SQL->quickArray("select max(sequenceNumber) from wobject where pageId='$_[0]'"); return ($sequenceNumber+1); } #------------------------------------------------------------------- =head2 description ( ) Returns this instance's description if it exists. =cut sub description { if ($_[0]->get("description")) { return $_[0]->get("description").'

'; } } #------------------------------------------------------------------- =head2 displayTitle ( ) Returns this instance's title if displayTitle is set to yes. =cut sub displayTitle { if ($_[0]->get("displayTitle")) { return "

".$_[0]->get("title")."

"; } else { return ""; } } #------------------------------------------------------------------- =head2 duplicate ( [ pageId ] ) Duplicates this wobject with a new wobject ID. Returns the new wobject Id. NOTE: This method is meant to be extended by all sub-classes. =item pageId If specified the wobject will be duplicated to this pageId, otherwise it will be duplicated to the clipboard. =cut sub duplicate { my ($pageId, $w); $pageId = $_[1] || 2; $w = WebGUI::Wobject->new({ wobjectId => "new", namespace => $_[0]->get("namespace") }); $w->set({ pageId => $pageId, title => $_[0]->get("title"), description => $_[0]->get("description"), displayTitle => $_[0]->get("displayTitle"), processMacros => $_[0]->get("processMacros"), startDate => $_[0]->get("startDate"), endDate => $_[0]->get("endDate"), templatePosition => $_[0]->get("templatePosition") }); return $w->get("wobjectId"); } #------------------------------------------------------------------- =head2 get ( [ propertyName ] ) Returns a hash reference containing all of the properties of this wobject instance. =item propertyName If an individual propertyName is specified, then only that property value is returned as a scalar. =cut sub get { if ($_[1] ne "") { return $_[0]->{_property}{$_[1]}; } else { return $_[0]->{_property}; } } #------------------------------------------------------------------- =head2 inDateRange ( ) Returns a boolean value of whether the wobject should be displayed based upon it's start and end dates. =cut sub inDateRange { if ($_[0]->get("startDate") < time() && $_[0]->get("endDate") > time()) { return 1; } else { return 0; } } #------------------------------------------------------------------- =head2 new ( hashRef ) Constructor. NOTE: This method is meant to be extended by all sub-classes. =item hashRef A hash reference containing at minimum "wobjectId" and "namespace" and wobjectId may be set to "new" if you're creating a new instance. This hash reference should be the one created by WebGUI.pm and passed to the wobject subclass. NOTE: It may seem a little weird that the initial data for the wobject instance is coming from WebGUI.pm, but this was done to lessen database traffic thus increasing the speed of all wobjects. =cut sub new { bless {_property => $_[1] }, $_[0]; } #------------------------------------------------------------------- =head2 processMacros ( output ) Decides whether or not macros should be processed and returns the appropriate output. =item output An HTML blob to be processed for macros. =cut sub processMacros { if ($_[0]->get("processMacros")) { return WebGUI::Macro::process($_[1]); } else { return $_[1]; } } #------------------------------------------------------------------- =head2 purge ( ) Removes this wobject from the database and all it's attachments from the filesystem. NOTE: This method is meant to be extended by all sub-classes. =cut sub purge { my ($node); WebGUI::SQL->write("delete from ".$_[0]->get("namespace")." where wobjectId=".$_[0]->get("wobjectId")); WebGUI::SQL->write("delete from wobject where wobjectId=".$_[0]->get("wobjectId")); $node = WebGUI::Node->new($_[0]->get("wobjectId")); $node->delete; } #------------------------------------------------------------------- =head2 set ( [ hashRef, arrayRef ] ) Stores the values specified in hashRef to the database. NOTE: This method should be extended by all subclasses. =item hashRef A hash reference of the properties of this wobject instance. This method will accept any name/value pair and associate it with this wobject instance in memory, but will only store the following fields to the database: title, displayTitle, description, processMacros, pageId, templatePosition, startDate, endDate, sequenceNumber =item arrayRef An array reference containing a list of properties associated with this Wobject class. The items in the list should marry up to fields in the Wobject extention table for this class. =cut sub set { my ($key, $sql, @update, $i); if ($_[0]->{_property}{wobjectId} eq "new") { $_[0]->{_property}{wobjectId} = getNextId("wobjectId"); $_[0]->{_property}{pageId} = ${$_[1]}{pageId} || $session{page}{pageId}; $_[0]->{_property}{sequenceNumber} = _getNextSequenceNumber($_[0]->{_property}{pageId}); $_[0]->{_property}{addedBy} = $session{user}{userId}; $_[0]->{_property}{dateAdded} = time(); WebGUI::SQL->write("insert into wobject (wobjectId, namespace, dateAdded, addedBy, sequenceNumber, pageId) values ( ".$_[0]->{_property}{wobjectId}.", ".quote($_[0]->{_property}{namespace}).", ".$_[0]->{_property}{dateAdded}.", ".$_[0]->{_property}{addedBy}.", ".$_[0]->{_property}{sequenceNumber}.", ".$_[0]->{_property}{pageId}." )"); WebGUI::SQL->write("insert into ".$_[0]->{_property}{namespace}." (wobjectId) values (".$_[0]->{_property}{wobjectId}.")"); } $_[0]->{_property}{lastEdited} = time(); $_[0]->{_property}{editedBy} = $session{user}{userId}; $sql = "update wobject set"; foreach $key (keys %{$_[1]}) { $_[0]->{_property}{$key} = ${$_[1]}{$key}; if (isIn($key, qw(title displayTitle description processMacros pageId templatePosition startDate endDate sequenceNumber))) { $sql .= " ".$key."=".quote(${$_[1]}{$key}).","; } if (isIn($key, @{$_[2]})) { $update[$i] .= " ".$key."=".quote($_[1]->{$key}); $i++; } } $sql .= " lastEdited=".$_[0]->{_property}{lastEdited}.", editedBy=".$_[0]->{_property}{editedBy}." where wobjectId=".$_[0]->{_property}{wobjectId}; WebGUI::SQL->write($sql); if (@update) { WebGUI::SQL->write("update ".$_[0]->{_property}{namespace}." set ".join(",",@update)." where wobjectId=".$_[0]->{_property}{wobjectId}); } } #------------------------------------------------------------------- =head2 www_cut ( ) Moves this instance to the clipboard. =cut sub www_cut { if (WebGUI::Privilege::canEditPage()) { $_[0]->set({pageId=>2}); _reorderWobjects($session{page}{pageId}); return ""; } else { return WebGUI::Privilege::insufficient(); } } #------------------------------------------------------------------- =head2 www_delete ( ) Prompts a user to confirm whether they wish to delete this instance. =cut sub www_delete { my ($output); if (WebGUI::Privilege::canEditPage()) { $output = helpIcon(14); $output .= '

'.WebGUI::International::get(42).'

'; $output .= WebGUI::International::get(43); $output .= '

'; $output .= '

'; $output .= WebGUI::International::get(44); $output .= ''; $output .= '    '; $output .= WebGUI::International::get(45); $output .= '
'; return $output; } else { return WebGUI::Privilege::insufficient(); } } #------------------------------------------------------------------- =head2 www_deleteConfirm ( ) Moves this instance to the trash. =cut sub www_deleteConfirm { if (WebGUI::Privilege::canEditPage()) { $_[0]->set({pageId=>3}); _reorderWobjects($_[0]->get("pageId")); return ""; } else { return WebGUI::Privilege::insufficient(); } } #------------------------------------------------------------------- =head2 www_edit ( formRows ) Displays the common properties of any/all wobjects. NOTE: This method should be extended by all wobjects. =item formRows The custom form rows from the wobject subclass edit page. =cut sub www_edit { my ($f, $displayTitle, $title, $templatePosition, $endDate); if ($_[0]->get("wobjectId") eq "new") { $displayTitle = 1; } else { $displayTitle = $_[0]->get("displayTitle"); } $title = $_[0]->get("title") || $_[0]->get("namespace"); $templatePosition = $_[0]->get("templatePosition") || '0'; $endDate = $_[0]->get("endDate") || (time()+315360000); $f = WebGUI::HTMLForm->new; $f->hidden("wid",$_[0]->get("wobjectId")); $f->hidden("namespace",$_[0]->get("namespace")) if ($_[0]->get("wobjectId") eq "new"); $f->hidden("func","editSave"); $f->submit if ($_[0]->get("wobjectId") ne "new"); $f->readOnly($_[0]->get("wobjectId"),WebGUI::International::get(499)); $f->text("title",WebGUI::International::get(99),$title); $f->yesNo("displayTitle",WebGUI::International::get(174),$displayTitle); $f->yesNo("processMacros",WebGUI::International::get(175),$_[0]->get("processMacros")); $f->select("templatePosition",WebGUI::Template::getPositions($session{page}{templateId}),WebGUI::International::get(363),[$templatePosition]); $f->date("startDate",WebGUI::International::get(497),$_[0]->get("startDate")); $f->date("endDate",WebGUI::International::get(498),$endDate); $f->HTMLArea("description",WebGUI::International::get(85),$_[0]->get("description")); $f->raw($_[1]); $f->submit; return $f->print; } #------------------------------------------------------------------- =head2 www_editSave ( ) Saves the default properties of any/all wobjects. NOTE: This method should be extended by all subclasses. =cut sub www_editSave { my ($title, $templatePosition, $startDate, $endDate); $title = $session{form}{title} || $_[0]->get("namespace"); $templatePosition = $session{form}{templatePosition} || '0'; $startDate = setToEpoch($session{form}{startDate}) || setToEpoch(time()); $endDate = setToEpoch($session{form}{endDate}) || setToEpoch(time()+315360000); $session{form}{description} = WebGUI::HTML::cleanSegment($session{form}{description}); $_[0]->set({ title=>$title, displayTitle=>$session{form}{displayTitle}, processMacros=>$session{form}{processMacros}, templatePosition=>$templatePosition, startDate=>$startDate, endDate=>$endDate, description=>$session{form}{description} }); return ""; } #------------------------------------------------------------------- =head2 www_moveBottom ( ) Moves this instance to the bottom of the page. =cut sub www_moveBottom { if (WebGUI::Privilege::canEditPage()) { $_[0]->set({sequenceNumber=>99999}); _reorderWobjects($_[0]->get("pageId")); return ""; } else { return WebGUI::Privilege::insufficient(); } } #------------------------------------------------------------------- =head2 www_moveDown ( ) Moves this instance down one spot on the page. =cut sub www_moveDown { my ($wid, $thisSeq); if (WebGUI::Privilege::canEditPage()) { ($thisSeq) = WebGUI::SQL->quickArray("select sequenceNumber from wobject where wobjectId=".$_[0]->get("wobjectId")); ($wid) = WebGUI::SQL->quickArray("select wobjectId from wobject where pageId=".$_[0]->get("pageId") ." and sequenceNumber=".($thisSeq+1)); if ($wid ne "") { WebGUI::SQL->write("update wobject set sequenceNumber=sequenceNumber+1 where wobjectId=".$_[0]->get("wobjectId")); WebGUI::SQL->write("update wobject set sequenceNumber=sequenceNumber-1 where wobjectId=$wid"); _reorderWobjects($_[0]->get("pageId")); } return ""; } else { return WebGUI::Privilege::insufficient(); } } #------------------------------------------------------------------- =head2 www_moveTop ( ) Moves this instance to the top of the page. =cut sub www_moveTop { if (WebGUI::Privilege::canEditPage()) { $_[0]->set({sequenceNumber=>0}); _reorderWobjects($_[0]->get("pageId")); return ""; } else { return WebGUI::Privilege::insufficient(); } } #------------------------------------------------------------------- =head2 www_moveUp ( ) Moves this instance up one spot on the page. =cut sub www_moveUp { my ($wid, $thisSeq); if (WebGUI::Privilege::canEditPage()) { ($thisSeq) = WebGUI::SQL->quickArray("select sequenceNumber from wobject where wobjectId=".$_[0]->get("wobjectId")); ($wid) = WebGUI::SQL->quickArray("select wobjectId from wobject where pageId=".$_[0]->get("pageId") ." and sequenceNumber=".($thisSeq-1)); if ($wid ne "") { WebGUI::SQL->write("update wobject set sequenceNumber=sequenceNumber-1 where wobjectId=".$_[0]->get("wobjectId")); WebGUI::SQL->write("update wobject set sequenceNumber=sequenceNumber+1 where wobjectId=$wid"); _reorderWobjects($_[0]->get("pageId")); } return ""; } else { return WebGUI::Privilege::insufficient(); } } #------------------------------------------------------------------- =head2 www_paste ( ) Moves this instance from the clipboard to the current page. =cut sub www_paste { my ($output, $nextSeq); if (WebGUI::Privilege::canEditPage()) { ($nextSeq) = WebGUI::SQL->quickArray("select max(sequenceNumber) from wobject where pageId=$session{page}{pageId}"); $nextSeq += 1; $_[0]->set({sequenceNumber=>$nextSeq, pageId=>$session{page}{pageId}}); return ""; } else { return WebGUI::Privilege::insufficient(); } } 1;