From 84a4ee477c3c34d695812c01b59421d773c545e0 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Tue, 10 Jul 2012 18:36:05 +0200 Subject: [PATCH 1/5] NEW 3.0 compatibility --- code/SiteTreeContentReview.php | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/code/SiteTreeContentReview.php b/code/SiteTreeContentReview.php index c45fcbc..6ec1b0d 100644 --- a/code/SiteTreeContentReview.php +++ b/code/SiteTreeContentReview.php @@ -5,22 +5,19 @@ * * @package contentreview */ -class SiteTreeContentReview extends DataObjectDecorator implements PermissionProvider { +class SiteTreeContentReview extends DataExtension implements PermissionProvider { - function extraStatics() { - return array( - 'db' => array( - "ReviewPeriodDays" => "Int", - "NextReviewDate" => "Date", - 'ReviewNotes' => 'Text', - 'LastEditedByName' => 'Varchar(255)', - 'OwnerNames' => 'Varchar(255)' - ), - 'has_one' => array( - 'Owner' => 'Member', - ), - ); - } + static $db = array( + "ReviewPeriodDays" => "Int", + "NextReviewDate" => "Date", + 'ReviewNotes' => 'Text', + 'LastEditedByName' => 'Varchar(255)', + 'OwnerNames' => 'Varchar(255)' + ); + + static $has_one = array( + 'Owner' => 'Member', + ); function getOwnerName() { if($this->owner->OwnerID && $this->owner->Owner()) return $this->owner->Owner()->FirstName . ' ' . $this->owner->Owner()->Surname; @@ -33,7 +30,7 @@ class SiteTreeContentReview extends DataObjectDecorator implements PermissionPro return NULL; } - public function updateCMSFields(&$fields) { + public function updateCMSFields(FieldList $fields) { if(Permission::check("EDIT_CONTENT_REVIEW_FIELDS")) { $cmsUsers = Permission::get_members_by_permission(array("CMS_ACCESS_CMSMain", "ADMIN")); From a95e90e6f055db0c0a0ca53641ac0f3d665d1875 Mon Sep 17 00:00:00 2001 From: Andrew O'Neil Date: Thu, 12 Jul 2012 16:01:43 +1200 Subject: [PATCH 2/5] MINOR: Fixes for unit tests --- code/PagesDueForReviewReport.php | 4 ++-- code/SiteTreeContentReview.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/PagesDueForReviewReport.php b/code/PagesDueForReviewReport.php index 3dc628c..c122f68 100644 --- a/code/PagesDueForReviewReport.php +++ b/code/PagesDueForReviewReport.php @@ -50,8 +50,8 @@ class PagesDueForReviewReport extends SS_Report { $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')))); + $params->push($startDate = new DateField('ReviewDateAfter', 'Review date after or on (DD/MM/YYYY)')); + $params->push($endDate = new DateField('ReviewDateBefore', 'Review date before or on (DD/MM/YYYY)', date('d/m/Y', strtotime('midnight')))); $endDate->mustBeAfter($startDate->Name()); $startDate->mustBeBefore($endDate->Name()); diff --git a/code/SiteTreeContentReview.php b/code/SiteTreeContentReview.php index 6ec1b0d..02deebd 100644 --- a/code/SiteTreeContentReview.php +++ b/code/SiteTreeContentReview.php @@ -39,7 +39,7 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider 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", + new DateField("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( From 8a5e8d9ba7ccfb57d0cda5f534a71ade6f8a3d25 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Thu, 12 Jul 2012 11:31:52 +0200 Subject: [PATCH 3/5] 3.0 compatibility --- code/PagesDueForReviewReport.php | 85 +++++++++++++++++--------------- code/SiteTreeContentReview.php | 6 ++- 2 files changed, 49 insertions(+), 42 deletions(-) diff --git a/code/PagesDueForReviewReport.php b/code/PagesDueForReviewReport.php index c122f68..e716f70 100644 --- a/code/PagesDueForReviewReport.php +++ b/code/PagesDueForReviewReport.php @@ -12,12 +12,14 @@ class PagesDueForReviewReport extends SS_Report { } function parameterFields() { - $params = new FieldSet(); + $params = new FieldList(); // 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 - Requirements::javascript('contentreview/javascript/PagesDueForReviewReport.js'); + Requirements::javascript(THIRDPARTY_DIR . '/jquery-livequery/jquery.livequery.js'); + Requirements::javascript('contentreview/javascript/PagesDueForReview.js'); // Remember current subsite $existingSubsite = Subsite::currentSubsiteID(); @@ -31,7 +33,7 @@ class PagesDueForReviewReport extends SS_Report { $cmsUsers = Permission::get_members_by_permission(array("CMS_ACCESS_CMSMain", "ADMIN")); // Key-preserving merge - foreach($cmsUsers->toDropdownMap('ID', 'Title') as $k => $v) { + foreach($cmsUsers->map('ID', 'Title') as $k => $v) { $map[$k] = $v; } } @@ -44,16 +46,20 @@ class PagesDueForReviewReport extends SS_Report { Subsite::changeSubsite($existingSubsite); } else { $cmsUsers = Permission::get_members_by_permission(array("CMS_ACCESS_CMSMain", "ADMIN")); - $map = $cmsUsers->map('ID', 'Title', '(no owner)'); + $map = $cmsUsers->map('ID', 'Title', '(no owner)')->toArray(); unset($map['']); $map = array('' => 'Any', '-1' => '(no owner)') + $map; $params->push(new DropdownField("OwnerID", 'Page owner', $map)); } - $params->push($startDate = new DateField('ReviewDateAfter', 'Review date after or on (DD/MM/YYYY)')); - $params->push($endDate = new DateField('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( + DateField::create('ReviewDateAfter', 'Review date after or on') + ->setConfig('showcalendar', true) + ); + $params->push( + DateField::create('ReviewDateBefore', 'Review date before or on', date('d/m/Y', strtotime('midnight'))) + ->setConfig('showcalendar', true) + ); $params->push(new CheckboxField('ShowVirtualPages', 'Show Virtual Pages')); @@ -61,10 +67,11 @@ class PagesDueForReviewReport extends SS_Report { } function columns() { + $linkBase = singleton('CMSPageEditController')->Link('show') . '/'; $fields = array( 'Title' => array( 'title' => 'Page name', - 'formatting' => '$value' + 'formatting' => '$value' ), 'NextReviewDate' => array( 'title' => 'Review Date', @@ -76,7 +83,15 @@ class PagesDueForReviewReport extends SS_Report { 'LastEditedByName' => 'Last edited by', 'AbsoluteLink' => array( 'title' => 'URL', - 'formatting' => '$value " . ($AbsoluteLiveLink ? "(live)" : "") . " (draft)' + 'formatting' => function($value, $item) { + $liveLink = $item->AbsoluteLiveLink; + $stageLink = $item->AbsoluteLink(); + return sprintf('%s %s', + $stageLink, + $liveLink ? $liveLink : $stageLink . '?stage=Stage', + $liveLink ? '(live)' : '(draft)' + ); + } ) ); @@ -84,52 +99,49 @@ class PagesDueForReviewReport extends SS_Report { } function sourceRecords($params, $sort, $limit) { + $records = SiteTree::get(); + $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()); + $reviewDate = new Zend_Date(SS_Datetime::now()->Format('U')); $reviewDate->add(1, Zend_Date::DAY); - $wheres[] = sprintf('"NextReviewDate" < \'%s\'', $reviewDate->toString('YYYY-MM-dd')); + $records->where(sprintf('"NextReviewDate" < \'%s\'', $reviewDate->toString('YYYY-MM-dd'))); } else { // Review date before if(!empty($params['ReviewDateBefore'])) { - list($day, $month, $year) = explode('/', $params['ReviewDateBefore']); - $reviewDate = new Zend_Date("$year-$month-$day"); + // TODO Get value from DateField->dataValue() once we have access to form elements here + $reviewDate = new Zend_Date($params['ReviewDateBefore'], i18n::get_date_format()); $reviewDate->add(1, Zend_Date::DAY); - $wheres[] = sprintf('"NextReviewDate" < \'%s\'', $reviewDate->toString('YYYY-MM-dd')); + $records->where(sprintf('"NextReviewDate" < \'%s\'', $reviewDate->toString('YYYY-MM-dd'))); } // Review date after if(!empty($params['ReviewDateAfter'])) { - list($day, $month, $year) = explode('/', $params['ReviewDateAfter']); - $reviewDate = new Zend_Date("$year-$month-$day"); - $wheres[] = sprintf('"NextReviewDate" >= \'%s\'', $reviewDate->toString('YYYY-MM-dd')); + // TODO Get value from DateField->dataValue() once we have access to form elements here + $reviewDate = new Zend_Date($params['ReviewDateAfter'], i18n::get_date_format()); + $records->where(sprintf('"NextReviewDate" >= \'%s\'', $reviewDate->toString('YYYY-MM-dd'))); } } // Show virtual pages? if(empty($params['ShowVirtualPages'])) { $virtualPageClasses = ClassInfo::subclassesFor('VirtualPage'); - $wheres[] = sprintf( + $records->where(sprintf( '"SiteTree"."ClassName" NOT IN (\'%s\')', implode("','", array_values($virtualPageClasses)) - ); + )); } - // We use different dropdown depending on the subsite - $ownerIdParam = 'OwnerID'; - // Owner dropdown - if(!empty($params[$ownerIdParam])) { - $ownerID = (int)$params[$ownerIdParam]; + if(!empty($params['OwnerID'])) { + $ownerID = (int)$params['OwnerID']; // We use -1 here to distinguish between No Owner and Any if($ownerID == -1) $ownerID = 0; - $wheres[] = '"OwnerID" = ' . $ownerID; + $records->addFilter(array('OwnerID' => $ownerID)); } - $query = singleton("SiteTree")->extendedSQL(join(' AND ', $wheres)); - // Turn a query into records if($sort) { $parts = explode(' ', $sort); @@ -139,23 +151,16 @@ class PagesDueForReviewReport extends SS_Report { if($field == 'AbsoluteLink') { $sort = '"URLSegment" ' . $direction; } elseif($field == 'Subsite.Title') { - $query->from[] = 'LEFT JOIN "Subsite" ON "Subsite"."ID" = "SiteTree"."SubsiteID"'; + $records->leftJoin("Subsite", '"Subsite"."ID" = "SiteTree"."SubsiteID"'); } if($field != "LastEditedByName") { - $query->orderby = $sort; + $records->sort($sort); } + + if($limit) $records->limit($limit['start'], $limit['limit']); } - $records = singleton('SiteTree')->buildDataObjectSet($query->execute(), 'DataObjectSet', $query); - - if($records) { - - if($sort && $field != "LastEditedByName") $records->sort($sort); - - // Apply limit after that filtering. - if($limit) return $records->getRange($limit['start'], $limit['limit']); - else return $records; - } + return $records; } } \ No newline at end of file diff --git a/code/SiteTreeContentReview.php b/code/SiteTreeContentReview.php index 02deebd..eb1663e 100644 --- a/code/SiteTreeContentReview.php +++ b/code/SiteTreeContentReview.php @@ -39,8 +39,10 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider 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 DateField("NextReviewDate", _t("SiteTreeCMSWorkflow.NEXTREVIEWDATE", - "Next review date (leave blank for no review)")), + DateField::create( + "NextReviewDate", + _t("SiteTreeCMSWorkflow.NEXTREVIEWDATE", "Next review date (leave blank for no review)") + )->setConfig('showcalendar', true), 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", From 4c09ba132af544cc1026e569a5af3a737e24aabe Mon Sep 17 00:00:00 2001 From: Normann Lou Date: Mon, 16 Jul 2012 17:50:50 +1200 Subject: [PATCH 4/5] BUGFIX: the page cms link updated for SS3 --- code/ContentReviewEmails.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ContentReviewEmails.php b/code/ContentReviewEmails.php index 534df1f..86fd790 100644 --- a/code/ContentReviewEmails.php +++ b/code/ContentReviewEmails.php @@ -31,7 +31,7 @@ class ContentReviewEmails extends DailyTask { $email->setTemplate('ContentReviewEmails'); $email->setSubject($subject); $email->populateTemplate(array( - "PageCMSLink" => "admin/show/".$page->ID, + "PageCMSLink" => "admin/pages/edit/show/".$page->ID, "Recipient" => $recipient, "Sender" => $sender, "Page" => $page, From 1240467033525f21aaabf69bf4f8a8dec1fc91f5 Mon Sep 17 00:00:00 2001 From: Normann Lou Date: Tue, 17 Jul 2012 13:27:24 +1200 Subject: [PATCH 5/5] BUGFIX: when use 'showcalendar', both 'dateformat' and 'datavalueformat' need to be set to the right format as well so that DateField save the right value into DB --- code/SiteTreeContentReview.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/SiteTreeContentReview.php b/code/SiteTreeContentReview.php index eb1663e..528ef02 100644 --- a/code/SiteTreeContentReview.php +++ b/code/SiteTreeContentReview.php @@ -42,7 +42,7 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider DateField::create( "NextReviewDate", _t("SiteTreeCMSWorkflow.NEXTREVIEWDATE", "Next review date (leave blank for no review)") - )->setConfig('showcalendar', true), + )->setConfig('showcalendar', true)->setConfig('dateformat', 'yyyy-MM-dd')->setConfig('datavalueformat', 'yyyy-MM-dd'), 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",