mirror of
https://github.com/silverstripe/silverstripe-versionfeed
synced 2024-10-22 11:05:31 +02:00
API Ability to globally enable / disable RSS feeds via config / siteconfig
This commit is contained in:
parent
a3c4c52faf
commit
094e3190df
@ -10,6 +10,9 @@ Injector:
|
|||||||
SiteTree:
|
SiteTree:
|
||||||
extensions:
|
extensions:
|
||||||
- VersionFeed
|
- VersionFeed
|
||||||
|
SiteConfig:
|
||||||
|
extensions:
|
||||||
|
- VersionFeedSiteConfig
|
||||||
ContentController:
|
ContentController:
|
||||||
extensions:
|
extensions:
|
||||||
- VersionFeed_Controller
|
- VersionFeed_Controller
|
||||||
|
@ -13,6 +13,22 @@ class VersionFeed extends SiteTreeExtension {
|
|||||||
public function updateFieldLabels(&$labels) {
|
public function updateFieldLabels(&$labels) {
|
||||||
$labels['PublicHistory'] = _t('RSSHistory.LABEL', 'Make history public');
|
$labels['PublicHistory'] = _t('RSSHistory.LABEL', 'Make history public');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable the allchanges feed
|
||||||
|
*
|
||||||
|
* @config
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
private static $allchanges_enabled = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables RSS feed for page-specific changes
|
||||||
|
*
|
||||||
|
* @config
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
private static $changes_enabled = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compile a list of changes to the current page, excluding non-published and explicitly secured versions.
|
* Compile a list of changes to the current page, excluding non-published and explicitly secured versions.
|
||||||
@ -84,6 +100,8 @@ class VersionFeed extends SiteTreeExtension {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function updateSettingsFields(FieldList $fields) {
|
public function updateSettingsFields(FieldList $fields) {
|
||||||
|
if(!Config::inst()->get(get_class(), 'changes_enabled')) return;
|
||||||
|
|
||||||
// Add public history field.
|
// Add public history field.
|
||||||
$fields->addFieldToTab('Root.Settings', $publicHistory = new FieldGroup(
|
$fields->addFieldToTab('Root.Settings', $publicHistory = new FieldGroup(
|
||||||
new CheckboxField('PublicHistory', $this->owner->fieldLabel('PublicHistory')
|
new CheckboxField('PublicHistory', $this->owner->fieldLabel('PublicHistory')
|
||||||
@ -111,10 +129,16 @@ class VersionFeed extends SiteTreeExtension {
|
|||||||
|
|
||||||
public function getSiteRSSLink() {
|
public function getSiteRSSLink() {
|
||||||
// TODO: This link should be from the homepage, not this page.
|
// TODO: This link should be from the homepage, not this page.
|
||||||
return $this->owner->Link('allchanges');
|
if(Config::inst()->get(get_class(), 'allchanges_enabled')
|
||||||
|
&& SiteConfig::current_site_config()->AllChangesEnabled
|
||||||
|
) {
|
||||||
|
return $this->owner->Link('allchanges');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getDefaultRSSLink() {
|
public function getDefaultRSSLink() {
|
||||||
if ($this->owner->PublicHistory) return $this->owner->Link('changes');
|
if(Config::inst()->get(get_class(), 'changes_enabled') && $this->owner->PublicHistory) {
|
||||||
|
return $this->owner->Link('changes');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
33
code/VersionFeedSiteConfig.php
Normal file
33
code/VersionFeedSiteConfig.php
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows global configuration of all changes
|
||||||
|
*/
|
||||||
|
class VersionFeedSiteConfig extends DataExtension {
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
|
'AllChangesEnabled' => 'Boolean(true)'
|
||||||
|
);
|
||||||
|
|
||||||
|
private static $defaults = array(
|
||||||
|
'AllChangesEnabled' => true
|
||||||
|
);
|
||||||
|
|
||||||
|
public function updateFieldLabels(&$labels) {
|
||||||
|
$labels['AllChangesEnabled'] = _t('VersionFeedSiteConfig.ALLCHANGESLABEL', 'Make global changes feed public');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateCMSFields(\FieldList $fields) {
|
||||||
|
if(!Config::inst()->get('VersionFeed', 'allchanges_enabled')) return;
|
||||||
|
|
||||||
|
$fields->addFieldToTab('Root.Access',
|
||||||
|
FieldGroup::create(new CheckboxField('AllChangesEnabled', $this->owner->fieldLabel('AllChangesEnabled')))
|
||||||
|
->setTitle(_t('VersionFeedSiteConfig.ALLCHANGES', 'All page changes'))
|
||||||
|
->setDescription(_t(
|
||||||
|
'VersionFeed.Warning',
|
||||||
|
"Publicising the history will also disclose the changes that have at the time been protected " .
|
||||||
|
"from the public view."
|
||||||
|
))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -39,26 +39,18 @@ class VersionFeed_Controller extends Extension {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function onAfterInit() {
|
public function onAfterInit() {
|
||||||
// RSS feed for per-page changes.
|
$this->linkToPageRSSFeed();
|
||||||
if ($this->owner->PublicHistory) {
|
|
||||||
RSSFeed::linkToFeed($this->owner->Link() . 'changes',
|
|
||||||
sprintf(
|
|
||||||
_t('RSSHistory.SINGLEPAGEFEEDTITLE', 'Updates to %s page'),
|
|
||||||
$this->owner->Title
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->linkToAllSiteRSSFeed();
|
$this->linkToAllSiteRSSFeed();
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get page-specific changes in a RSS feed.
|
* Get page-specific changes in a RSS feed.
|
||||||
*/
|
*/
|
||||||
public function changes() {
|
public function changes() {
|
||||||
if(!$this->owner->PublicHistory) throw new SS_HTTPResponse_Exception('Page history not viewable', 404);
|
// Check viewability of changes
|
||||||
|
if(!Config::inst()->get('VersionFeed', 'changes_enabled') || !$this->owner->PublicHistory) {
|
||||||
|
return $this->owner->httpError(404, 'Page history not viewable');
|
||||||
|
}
|
||||||
|
|
||||||
// Cache the diffs to remove DOS possibility.
|
// Cache the diffs to remove DOS possibility.
|
||||||
$target = $this->owner;
|
$target = $this->owner;
|
||||||
@ -78,6 +70,12 @@ class VersionFeed_Controller extends Extension {
|
|||||||
* Get all changes from the site in a RSS feed.
|
* Get all changes from the site in a RSS feed.
|
||||||
*/
|
*/
|
||||||
public function allchanges() {
|
public function allchanges() {
|
||||||
|
// Check viewability of allchanges
|
||||||
|
if(!Config::inst()->get('VersionFeed', 'allchanges_enabled')
|
||||||
|
|| !SiteConfig::current_site_config()->AllChangesEnabled
|
||||||
|
) {
|
||||||
|
return $this->owner->httpError(404, 'Global history not viewable');
|
||||||
|
}
|
||||||
|
|
||||||
$latestChanges = DB::query('
|
$latestChanges = DB::query('
|
||||||
SELECT * FROM "SiteTree_versions"
|
SELECT * FROM "SiteTree_versions"
|
||||||
@ -127,8 +125,34 @@ class VersionFeed_Controller extends Extension {
|
|||||||
$rss->setTemplate('Page_allchanges_rss');
|
$rss->setTemplate('Page_allchanges_rss');
|
||||||
return $rss->outputToBrowser();
|
return $rss->outputToBrowser();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates and embeds the RSS header link for the page-specific version rss feed
|
||||||
|
*/
|
||||||
|
public function linkToPageRSSFeed() {
|
||||||
|
if (!Config::inst()->get('VersionFeed', 'changes_enabled') || !$this->owner->PublicHistory) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
RSSFeed::linkToFeed(
|
||||||
|
$this->owner->Link('changes'),
|
||||||
|
sprintf(
|
||||||
|
_t('RSSHistory.SINGLEPAGEFEEDTITLE', 'Updates to %s page'),
|
||||||
|
$this->owner->Title
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function linkToAllSiteRSSFeed() {
|
/**
|
||||||
|
* Generates and embeds the RSS header link for the global version rss feed
|
||||||
|
*/
|
||||||
|
public function linkToAllSiteRSSFeed() {
|
||||||
|
if(!Config::inst()->get('VersionFeed', 'allchanges_enabled')
|
||||||
|
|| !SiteConfig::current_site_config()->AllChangesEnabled
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// RSS feed to all-site changes.
|
// RSS feed to all-site changes.
|
||||||
$title = Convert::raw2xml($this->linkToAllSitesRSSFeedTitle());
|
$title = Convert::raw2xml($this->linkToAllSitesRSSFeedTitle());
|
||||||
$url = $this->owner->getSiteRSSLink();
|
$url = $this->owner->getSiteRSSLink();
|
||||||
@ -138,7 +162,7 @@ class VersionFeed_Controller extends Extension {
|
|||||||
'" href="' . $url . '" />');
|
'" href="' . $url . '" />');
|
||||||
}
|
}
|
||||||
|
|
||||||
function linkToAllSitesRSSFeedTitle() {
|
public function linkToAllSitesRSSFeedTitle() {
|
||||||
return sprintf(_t('RSSHistory.SITEFEEDTITLE', 'Updates to %s'), SiteConfig::current_site_config()->Title);
|
return sprintf(_t('RSSHistory.SITEFEEDTITLE', 'Updates to %s'), SiteConfig::current_site_config()->Title);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,15 @@
|
|||||||
Creating functions called `changes` or `allchanges` on any of your page types or controllers will cause confusion with
|
Creating functions called `changes` or `allchanges` on any of your page types or controllers will cause confusion with
|
||||||
the extensions defined on the extension.
|
the extensions defined on the extension.
|
||||||
|
|
||||||
|
### Enabling / Disabling
|
||||||
|
|
||||||
|
The `allchanges` feed can be disabled by setting the `VersionFeed.allchanges_enabled` config to false.
|
||||||
|
|
||||||
|
Likewise, the `changes` feed for each page can be globally disabled by setting the `VersionFeed.changes_enabled`
|
||||||
|
config to false. If this left true, then each page can still be individually disabled by unchecking the
|
||||||
|
'Make History Public' checkbox in the CMS under page settings.
|
||||||
|
See [user documentation on enabling / disabling](user.md#enabling--disabling).
|
||||||
|
|
||||||
### Default RSS action
|
### Default RSS action
|
||||||
|
|
||||||
Templates can offer a "Subscribe" link with a link to the most relevant RSS feed. This will default to the changes feed
|
Templates can offer a "Subscribe" link with a link to the most relevant RSS feed. This will default to the changes feed
|
||||||
|
@ -17,6 +17,9 @@ You can enable or disable the feed on a per-page basis by checking or unchecking
|
|||||||
Settings tab of each page. If a page has the Public History option, unchecked, it will not appear in the allchanges
|
Settings tab of each page. If a page has the Public History option, unchecked, it will not appear in the allchanges
|
||||||
feed.
|
feed.
|
||||||
|
|
||||||
|
The allchanges feed can also be disabled by unchecking the "All page changes" checkbox in the "Settings"
|
||||||
|
section in the cms.
|
||||||
|
|
||||||
#### Privacy
|
#### Privacy
|
||||||
|
|
||||||
A page's history will be completely visible when it has public history enabled, even if some updates were made when it
|
A page's history will be completely visible when it has public history enabled, even if some updates were made when it
|
||||||
|
@ -7,3 +7,6 @@ en:
|
|||||||
VersionFeed:
|
VersionFeed:
|
||||||
Warning: 'Publicising the history will also disclose the changes that have at the time been protected from the public view.'
|
Warning: 'Publicising the history will also disclose the changes that have at the time been protected from the public view.'
|
||||||
Warning2: 'Changing access settings in such a way that this page or pages under it become publicly<br>accessible may result in publicising all historical changes on these pages too. Please review<br>this section''s "Public history" settings to ascertain only intended information is disclosed.'
|
Warning2: 'Changing access settings in such a way that this page or pages under it become publicly<br>accessible may result in publicising all historical changes on these pages too. Please review<br>this section''s "Public history" settings to ascertain only intended information is disclosed.'
|
||||||
|
VersionFeedSiteConfig:
|
||||||
|
ALLCHANGES: 'All page changes'
|
||||||
|
ALLCHANGESLABEL: 'Make global changes feed public'
|
||||||
|
@ -178,5 +178,38 @@ class VersionFeedFunctionalTest extends FunctionalTest {
|
|||||||
|
|
||||||
return $page;
|
return $page;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests response code for globally disabled feedss
|
||||||
|
*/
|
||||||
|
public function testFeedViewability() {
|
||||||
|
$siteConfig = SiteConfig::current_site_config();
|
||||||
|
|
||||||
|
// Nested loop through each configuration
|
||||||
|
foreach(array(true, false) as $publicHistory_Page) {
|
||||||
|
$page = $this->createPageWithChanges(array('PublicHistory' => $publicHistory_Page, 'Title' => 'Page'));
|
||||||
|
|
||||||
|
// Test requests to 'changes' action
|
||||||
|
foreach(array(true, false) as $publicHistory_Config) {
|
||||||
|
Config::inst()->update('VersionFeed', 'changes_enabled', $publicHistory_Config);
|
||||||
|
$expectedResponse = $publicHistory_Page && $publicHistory_Config ? 200 : 404;
|
||||||
|
$response = $this->get($page->RelativeLink('changes'));
|
||||||
|
$this->assertEquals($expectedResponse, $response->getStatusCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test requests to 'allchanges' action on each page
|
||||||
|
foreach(array(true, false) as $allChanges_Config) {
|
||||||
|
foreach(array(true, false) as $allChanges_SiteConfig) {
|
||||||
|
Config::inst()->update('VersionFeed', 'allchanges_enabled', $allChanges_Config);
|
||||||
|
$siteConfig->AllChangesEnabled = $allChanges_SiteConfig;
|
||||||
|
$siteConfig->write();
|
||||||
|
|
||||||
|
$expectedResponse = $allChanges_Config && $allChanges_SiteConfig ? 200 : 404;
|
||||||
|
$response = $this->get($page->RelativeLink('allchanges'));
|
||||||
|
$this->assertEquals($expectedResponse, $response->getStatusCode());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user