From cbaa488c84f44695d11fccdb12c8557cb4c0c1ea Mon Sep 17 00:00:00 2001 From: Frank Winkelmann Date: Tue, 20 Jul 2010 03:51:15 +0000 Subject: [PATCH] ENHANCEMENT: made module independed from cmsworkflow module --- code/PagesDueForReviewReport.php | 60 +++++++++++++++++--------------- code/SiteTreeContentReview.php | 33 ++++++++++++------ 2 files changed, 53 insertions(+), 40 deletions(-) diff --git a/code/PagesDueForReviewReport.php b/code/PagesDueForReviewReport.php index 451be74..d3d532a 100644 --- a/code/PagesDueForReviewReport.php +++ b/code/PagesDueForReviewReport.php @@ -10,10 +10,10 @@ class PagesDueForReviewReport extends SS_Report { function title() { return _t('PagesDueForReviewReport.TITLE', 'Pages due for review'); } - + function parameterFields() { $params = new FieldSet(); - + // We need to be a bit fancier when subsites is enabled if(class_exists('Subsite') && $subsites = DataObject::get('Subsite')) { // javascript for subsite specific owner dropdown @@ -21,7 +21,7 @@ class PagesDueForReviewReport extends SS_Report { // Remember current subsite $existingSubsite = Subsite::currentSubsiteID(); - + $map = array(); // Create a map of all potential owners from all applicable sites @@ -35,11 +35,11 @@ class PagesDueForReviewReport extends SS_Report { $map[$k] = $v; } } - + $map = $map + array('' => 'Any', '-1' => '(no owner)'); - + $params->push(new DropdownField("OwnerID", 'Page owner', $map)); - + // Restore current subsite Subsite::changeSubsite($existingSubsite); } else { @@ -49,17 +49,17 @@ class PagesDueForReviewReport extends SS_Report { $map = array('' => 'Any', '-1' => '(no owner)') + $map; $params->push(new DropdownField("OwnerID", 'Page owner', $map)); } - + $params->push($startDate = new CalendarDateField('ReviewDateAfter', 'Review date after or on (DD/MM/YYYY)')); $params->push($endDate = new CalendarDateField('ReviewDateBefore', 'Review date before or on (DD/MM/YYYY)', date('d/m/Y', strtotime('midnight')))); $endDate->mustBeAfter($startDate->Name()); $startDate->mustBeBefore($endDate->Name()); $params->push(new CheckboxField('ShowVirtualPages', 'Show Virtual Pages')); - + return $params; } - + function columns() { $fields = array( 'Title' => array( @@ -79,14 +79,14 @@ class PagesDueForReviewReport extends SS_Report { 'formatting' => '$value " . ($AbsoluteLiveLink ? "(live)" : "") . " (draft)' ) ); - + return $fields; } - + function sourceRecords($params, $sort, $limit) { $wheres = array(); - - + + if(empty($params['ReviewDateBefore']) && empty($params['ReviewDateAfter'])) { // If there's no review dates set, default to all pages due for review now $reviewDate = new Zend_Date(SS_Datetime::now()->getValue()); @@ -100,7 +100,7 @@ class PagesDueForReviewReport extends SS_Report { $reviewDate->add(1, Zend_Date::DAY); $wheres[] = sprintf('"NextReviewDate" < \'%s\'', $reviewDate->toString('YYYY-MM-dd')); } - + // Review date after if(!empty($params['ReviewDateAfter'])) { list($day, $month, $year) = explode('/', $params['ReviewDateAfter']); @@ -108,16 +108,16 @@ class PagesDueForReviewReport extends SS_Report { $wheres[] = sprintf('"NextReviewDate" >= \'%s\'', $reviewDate->toString('YYYY-MM-dd')); } } - + // Show virtual pages? if(empty($params['ShowVirtualPages'])) { $wheres[] = '"SiteTree"."ClassName" != \'VirtualPage\' AND "SiteTree"."ClassName" != \'SubsitesVirtualPage\''; } - + // We use different dropdown depending on the subsite $ownerIdParam = 'OwnerID'; - + // Owner dropdown if(!empty($params[$ownerIdParam])) { $ownerID = (int)$params[$ownerIdParam]; @@ -125,24 +125,26 @@ class PagesDueForReviewReport extends SS_Report { if($ownerID == -1) $ownerID = 0; $wheres[] = '"OwnerID" = ' . $ownerID; } - + $query = singleton("SiteTree")->extendedSQL(join(' AND ', $wheres)); - - $query->select[] = Member::get_title_sql('Owner').' AS OwnerNames'; - $query->from[] = 'LEFT JOIN "Member" AS "Owner" ON "SiteTree"."OwnerID" = "Owner"."ID"'; - + + //$query->select[] = Member::get_title_sql('Owner').' AS OwnerNames'; +//// $query->select[] = '"Owner"."Surname" AS OwnerLastNames'; +//// $query->select[] = '"Owner"."FirstName" AS OwnerNames'; +//// $query->from[] = 'LEFT JOIN "Member" AS "Owner" ON "SiteTree"."OwnerID" = "Owner"."ID"'; + // Turn a query into records if($sort) { $parts = explode(' ', $sort); $field = $parts[0]; $direction = $parts[1]; - + if($field == 'AbsoluteLink') { $sort = '"URLSegment" ' . $direction; } elseif($field == 'Subsite.Title') { $query->from[] = 'LEFT JOIN "Subsite" ON "Subsite"."ID" = "SiteTree"."SubsiteID"'; } - + if($field != "LastEditedByName") { $query->orderby = $sort; } @@ -151,12 +153,12 @@ class PagesDueForReviewReport extends SS_Report { $records = singleton('SiteTree')->buildDataObjectSet($query->execute(), 'DataObjectSet', $query); // var_dump($records); if($records) { - foreach($records as $record) { - $record->LastEditedByName = $record->LastEditedBy() ? $record->LastEditedBy()->Title : null; - } - + ////////foreach($records as $record) { + //////// $record->OwnerNames = $record->OwnerNames .' '. $record->OwnerLastNames; + ////////} + if($sort && $field != "LastEditedByName") $records->sort($sort); - + // Apply limit after that filtering. if($limit) return $records->getRange($limit['start'], $limit['limit']); else return $records; diff --git a/code/SiteTreeContentReview.php b/code/SiteTreeContentReview.php index 981171f..c45fcbc 100644 --- a/code/SiteTreeContentReview.php +++ b/code/SiteTreeContentReview.php @@ -6,36 +6,45 @@ * @package contentreview */ class SiteTreeContentReview extends DataObjectDecorator implements PermissionProvider { - + function extraStatics() { return array( 'db' => array( "ReviewPeriodDays" => "Int", "NextReviewDate" => "Date", - 'ReviewNotes' => 'Text' + 'ReviewNotes' => 'Text', + 'LastEditedByName' => 'Varchar(255)', + 'OwnerNames' => 'Varchar(255)' ), 'has_one' => array( - 'Owner' => 'Member' + 'Owner' => 'Member', ), ); } - + function getOwnerName() { if($this->owner->OwnerID && $this->owner->Owner()) return $this->owner->Owner()->FirstName . ' ' . $this->owner->Owner()->Surname; } - + + function getEditorName() { + if( $member = Member::currentUser() ) { + return $member->FirstName .' '. $member->Surname; + } + return NULL; + } + 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", + 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", + 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", @@ -52,13 +61,15 @@ class SiteTreeContentReview extends DataObjectDecorator implements PermissionPro )); } } - + function onBeforeWrite() { if($this->owner->ReviewPeriodDays && !$this->owner->NextReviewDate) { $this->owner->NextReviewDate = date('Y-m-d', strtotime('+' . $this->owner->ReviewPeriodDays . ' days')); } + $this->owner->LastEditedByName=$this->owner->getEditorName(); + $this->owner->OwnerNames = $this->owner->getOwnerName(); } - + function providePermissions() { return array( "EDIT_CONTENT_REVIEW_FIELDS" => array(