Added content review module

This commit is contained in:
Tom Rix 2009-11-02 04:02:57 +00:00
commit 9bc51d9ce9
6 changed files with 222 additions and 0 deletions

0
LICENSE Normal file
View File

20
README.md Normal file
View File

@ -0,0 +1,20 @@
# Content Review module
## Maintainer Contact
* Tom Rix (Nickname: trix)
<tom (at) silverstripe (dot) com>
## Requirements
* SilverStripe 2.3 or newer
## Installation
Drop it into your installation folder, and refresh your database schema
through `http://<your-host>/dev/build`.
## Usage
When you open a page in the CMS, there will now be a Review tab.

3
_config.php Normal file
View File

@ -0,0 +1,3 @@
<?php
Object::add_extension('SiteTree', 'SiteTreeContentReview');

View File

@ -0,0 +1,52 @@
<?php
/**
* Daily task to send emails to the owners of content items
* when the review date rolls around
*
* @package contentreview
*/
class ContentReviewEmails extends DailyTask {
function run($req) { $this->process(); }
function process() {
// Disable subsite filter (if installed)
if (ClassInfo::exists('Subsite')) {
$oldSubsiteState = Subsite::$disable_subsite_filter;
Subsite::$disable_subsite_filter = true;
}
$pages = DataObject::get('Page', "NextReviewDate = '".date('Y-m-d')."' AND OwnerID != 0");
if ($pages && $pages->Count()) {
foreach($pages as $page) {
$owner = $page->Owner();
if ($owner) {
$sender = Security::findAnAdministrator();
$recipient = $owner;
$subject = sprintf(_t('ContentReviewEmails.SUBJECT', 'Page %s due for content review'), $page->Title);
$email = new Email();
$email->setTo($recipient->Email);
$email->setFrom(($sender->Email) ? $sender->Email : Email::getAdminEmail());
$email->setTemplate('ContentReviewEmails');
$email->setSubject($subject);
$email->populateTemplate(array(
"PageCMSLink" => "admin/show/".$page->ID,
"Recipient" => $recipient,
"Sender" => $sender,
"Page" => $page,
"StageSiteLink" => $page->Link()."?stage=stage",
"LiveSiteLink" => $page->Link()."?stage=live",
));
return $email->send();
}
}
}
// Revert subsite filter (if installed)
if (ClassInfo::exists('Subsite')) {
Subsite::$disable_subsite_filter = $oldSubsiteState;
}
}
}

View File

@ -0,0 +1,76 @@
<?php
/**
* Report to show pages that will be due for review soon
*
* @package contentreview
*/
class PagesDueForReviewSideReport extends SideReport {
function title() {
return _t('PagesDueForReviewSideReport.TITLE', 'Pages due for review');
}
function group() {
return "Content reports";
}
function sort() {
return -10;
}
function records() {
$where = array();
if(isset($this->params['ReviewDate']) && $this->params['ReviewDate']) {
$where[] = 'NextReviewDate <= \'' . Convert::raw2sql($this->params['ReviewDate']) . '\'';
} else {
$where[] = 'NextReviewDate <= \'' . SS_Datetime::now()->URLDate() . '\'';
}
if(isset($this->params['OwnerID'])) {
switch($this->params['OwnerID']) {
case 'any-owner':
break;
case 'no-owner':
$where[] = 'OwnerID = 0';
default:
$where[] = 'OwnerID = ' . (int) $this->params['OwnerID'];
break;
}
}
return DataObject::get('SiteTree', $where);
}
function fieldsToShow() {
return array(
"Title" => array(
"source" => array("NestedTitle", array("2")),
"link" => true,
),
"Date" => array(
"prefix" => 'Due for review on ',
"source" => "NextReviewDate",
),
"Owner" => array(
"prefix" => ', owned by ',
"source" => "OwnerName"
)
);
}
function getParameterFields() {
$cmsUsers = Permission::get_members_by_permission(array("CMS_ACCESS_CMSMain", "ADMIN"));
$options = array(
'any-owner' => 'Any owner',
'no-owner' => 'No owner'
);
$options = array_merge($options, $cmsUsers->map('ID', 'Title'));
return new FieldSet(
new DateField('ReviewDate', 'Review date (YYYY-MM-DD)'),
new DropdownField("OwnerID", 'Page owner', $options)
);
}
}
?>

View File

@ -0,0 +1,71 @@
<?php
/**
* Set dates at which content needs to be reviewed and provide
* a report and emails to alert to content needing review
*
* @package contentreview
*/
class SiteTreeCMSWorkflow extends DataObjectDecorator implements PermissionProvider {
function extraStatics() {
return array(
'db' => array(
"ReviewPeriodDays" => "Int",
"NextReviewDate" => "Date",
'ReviewNotes' => 'Text'
),
'has_one' => array(
'Owner' => 'Member'
),
);
}
function getOwnerName() {
if($this->owner->Owner()) return $this->owner->Owner()->FirstName . ' ' . $this->owner->Owner()->Surname;
}
public function updateCMSFields(&$fields) {
if(Permission::check("EDIT_CONTENT_REVIEW_FIELDS")) {
$cmsUsers = Permission::get_members_by_permission(array("CMS_ACCESS_CMSMain", "ADMIN"));
$fields->addFieldsToTab("Root.Review", array(
new HeaderField(_t('SiteTreeCMSWorkflow.REVIEWHEADER', "Content review"), 2),
new DropdownField("OwnerID", _t("SiteTreeCMSWorkflow.PAGEOWNER",
"Page owner (will be responsible for reviews)"), $cmsUsers->map('ID', 'Title', '(no owner)')),
new CalendarDateField("NextReviewDate", _t("SiteTreeCMSWorkflow.NEXTREVIEWDATE",
"Next review date (leave blank for no review)")),
new DropdownField("ReviewPeriodDays", _t("SiteTreeCMSWorkflow.REVIEWFREQUENCY",
"Review frequency (the review date will be set to this far in the future whenever the page is published.)"), array(
0 => "No automatic review date",
1 => "1 day",
7 => "1 week",
30 => "1 month",
60 => "2 months",
91 => "3 months",
121 => "4 months",
152 => "5 months",
183 => "6 months",
365 => "12 months",
)),
new TextareaField('ReviewNotes', 'Review Notes')
));
}
}
function onBeforeWrite() {
if($this->owner->ReviewPeriodDays && !$this->owner->NextReviewDate) {
$this->owner->NextReviewDate = date('Y-m-d', strtotime('+' . $this->owner->ReviewPeriodDays . ' days'));
}
}
function providePermissions() {
return array(
"EDIT_CONTENT_REVIEW_FIELDS" => array(
'name' => "Set content owners and review dates",
'category' => _t('Permissions.CONTENT_CATEGORY', 'Content permissions'),
'sort' => 50
)
);
}
}