Skip to content

Commit

Permalink
Created 0.2.1-rc1 release
Browse files Browse the repository at this point in the history
  • Loading branch information
Sam Minnee committed Jul 7, 2009
1 parent fc60f70 commit b729365
Show file tree
Hide file tree
Showing 62 changed files with 2,852 additions and 0 deletions.
42 changes: 42 additions & 0 deletions 0.2.1-rc1/ChangeLog
@@ -0,0 +1,42 @@
ChangeLog

0.2.0

Features
- Blogs can now be configured to use HTML instead of BBCode
- Tags now follow the rel-tag microformat standard
- Blog module is now translatable
- The entries shown on the BlogHolder when not browsing by date/tag can now be restricted to only show entries that are younger than a user specified age
- The RSS feed name can now be changed in the CMS
- Added support for receiving trackback pings
- Added SubscribeRSSWidget for linking directly to the blog RSS feed
- Tag widget title is now editable
- Added empty relationship statics so BlogEntry and BlogHolder can be decorated by a DataObjectDecorator
- Use pagination summary, so a full list of pages isnt generated
- Added Date variable to RSSWidget feed items, so Date can be used in template if wanted
- Cast Title variable on RSSWidget feed items, so Title can have Text functions called in the template if wanted

Bugfixes
- Removed deprecated calls to sapphire, and made other fixes to support sapphire 2.3.0
- Don't use PHP short tags
- Don't display $Content on a BlogHolder, as it isnt editable in the CMS
- Prevent infinite loops when an RSSWidget on a blog points to itself
- Fix URL segment generation
- RSS feed is now sorted by date, newest first
- Fixed pagination
- Fixed summaries on BlogHolder
- Fixed issues with display by month when blog post is on last month of the day
- BlogEntry::Tags() was renamed to TagsCollection() to prevent conflicts with the database fields called Tags
- Fixed invalid use of single quotes in BlogEntryForm HTML
- Fixed extra <p> tags around blog content
- Default parent needs to be a string instead of an array
- Fixed escaping in BlogHolder
- Use themedCSS instead of hardlinking paths
- Fixed rss feed caching
- Fixed archive widget showing months and years for unpublished posts
- SetDate doesn't need to be called, as the date is automatically set


0.1

Initial release
15 changes: 15 additions & 0 deletions 0.2.1-rc1/README
@@ -0,0 +1,15 @@
####################################################
Blog Module
####################################################

# Maintainer Contact
Andrew O'Neil (Nickname: aoneil)
<andrew (at) silverstripe (dot) com>

# Requirements
SilverStripe minimum version 2.3.0

# Documentation
http://doc.silverstripe.com/doku.php?id=modules:blog


3 changes: 3 additions & 0 deletions 0.2.1-rc1/_config.php
@@ -0,0 +1,3 @@
<?php

?>
92 changes: 92 additions & 0 deletions 0.2.1-rc1/code/ArchiveWidget.php
@@ -0,0 +1,92 @@
<?php
/**
* Shows a widget with viewing blog entries
* by months or years.
*
* @package blog
*/
class ArchiveWidget extends Widget {
static $db = array(
'DisplayMode' => 'Varchar'
);

static $defaults = array(
'DisplayMode' => 'month'
);

static $title = 'Browse by Date';

static $cmsTitle = 'Blog Archive';

static $description = 'Show a list of months or years in which there are blog posts, and provide links to them.';

function getBlogHolder() {
$page = Director::currentPage();

if($page instanceof BlogHolder) {
return $page;
} elseif(($page instanceof BlogEntry) && ($page->getParent() instanceof BlogHolder)) {
return $page->getParent();
} else {
return DataObject::get_one('BlogHolder');
}
}

function getCMSFields() {
return new FieldSet(
new OptionsetField(
'DisplayMode',
_t('ArchiveWidget.DispBY', 'Display by'),
array(
'month' => _t('ArchiveWidget.MONTH', 'month'),
'year' => _t('ArchiveWidget.YEAR', 'year')
)
)
);
}

function Dates() {
Requirements::themedCSS('archivewidget');

$results = new DataObjectSet();
$blogHolder = $this->getBlogHolder();
$id = $blogHolder->ID;

$stage = Versioned::current_stage();
$suffix = (!$stage || $stage == 'Stage') ? "" : "_$stage";


if($this->DisplayMode == 'month') {
$sqlResults = DB::query("SELECT DISTINCT MONTH(`Date`) AS `Month`, YEAR(`Date`) AS `Year` FROM `SiteTree$suffix` NATURAL JOIN `BlogEntry$suffix` WHERE `ParentID` = $id ORDER BY `Date` DESC");
} else {
$sqlResults = DB::query("SELECT DISTINCT YEAR(`Date`) AS `Year` FROM `SiteTree$suffix` NATURAL JOIN `BlogEntry$suffix` WHERE `ParentID` = $id ORDER BY `Date` DESC");
}

if(!$sqlResults) return new DataObjectSet();

foreach($sqlResults as $sqlResult) {
$date = new Date('Date');
$month = ($this->DisplayMode == 'month') ? (int)$sqlResult['Month'] : 1;

$date->setValue(array(
'Day' => 1,
'Month' => $month,
'Year' => (int) $sqlResult['Year']
));

if($this->DisplayMode == 'month') {
$link = $blogHolder->Link() . $sqlResult['Year']. '/' . sprintf("%'02d", $sqlResult['Month']);
} else {
$link = $blogHolder->Link() . $sqlResult['Year'];
}

$results->push(new ArrayData(array(
'Date' => $date,
'Link' => $link
)));
}

return $results;
}
}
?>
216 changes: 216 additions & 0 deletions 0.2.1-rc1/code/BlogEntry.php
@@ -0,0 +1,216 @@
<?php
/**
* An individual blog entry page type.
*
* @package blog
*/
class BlogEntry extends Page {

static $default_parent = 'BlogHolder';

static $can_be_root = false;

static $icon = "blog/images/blogpage";

static $db = array(
"Date" => "SSDatetime",
"Author" => "Text",
"Tags" => "Text"
);

static $has_one = array(
);

static $has_many = array(
);

static $many_many = array(
);

static $defaults = array(
"ProvideComments" => true,
'ShowInMenus' => false
);

static $extensions = array(
'Hierarchy',
'TrackBackDecorator',
"Versioned('Stage', 'Live')"
);

/**
* Is WYSIWYG editing allowed?
* @var boolean
*/
static $allow_wysiwyg_editing = false;

/**
* Is WYSIWYG editing enabled?
* Used in templates.
*
* @return boolean
*/
public function IsWYSIWYGEnabled() {
return self::$allow_wysiwyg_editing;
}

/**
* Overload so that the default date is today.
*/
public function populateDefaults(){
parent::populateDefaults();

$this->setField('Date', date('Y-m-d H:i:s', strtotime('now')));
}

function getCMSFields() {
Requirements::javascript('blog/javascript/bbcodehelp.js');
Requirements::themedCSS('bbcodehelp');

$firstName = Member::currentUser() ? Member::currentUser()->FirstName : '';
$codeparser = new BBCodeParser();

$fields = parent::getCMSFields();

if(!self::$allow_wysiwyg_editing) {
$fields->removeFieldFromTab("Root.Content.Main","Content");
$fields->addFieldToTab("Root.Content.Main", new TextareaField("Content", _t("BlogEntry.CN", "Content"), 20));
}

$fields->addFieldToTab("Root.Content.Main", new PopupDateTimeField("Date", _t("BlogEntry.DT", "Date")),"Content");
$fields->addFieldToTab("Root.Content.Main", new TextField("Author", _t("BlogEntry.AU", "Author"), $firstName),"Content");

if(!self::$allow_wysiwyg_editing) {
$fields->addFieldToTab("Root.Content.Main", new LiteralField("BBCodeHelper", "<div id='BBCode' class='field'>" .
"<a id=\"BBCodeHint\" target='new'>" . _t("BlogEntry.BBH", "BBCode help") . "</a>" .
"<div id='BBTagsHolder' style='display:none;'>".$codeparser->useable_tagsHTML()."</div></div>"));
}

$fields->addFieldToTab("Root.Content.Main", new TextField("Tags", _t("BlogEntry.TS", "Tags (comma sep.)")),"Content");
return $fields;
}

/**
* Returns the tags added to this blog entry
*/
function TagsCollection() {
$tags = split(" *, *", trim($this->Tags));
$output = new DataObjectSet();

foreach($tags as $tag) {
$output->push(new ArrayData(array(
'Tag' => $tag,
'Link' => $this->getParent()->Link() . 'tag/' . urlencode($tag)
)));
}

if($this->Tags) {
return $output;
}
}

/**
* Get the sidebar from the BlogHolder.
*/
function SideBar() {
return $this->getParent()->SideBar();
}

/**
* Get a bbcode parsed summary of the blog entry
*/
function ParagraphSummary(){
if(self::$allow_wysiwyg_editing) {
return $this->obj('Content')->FirstParagraph('html');
} else {
$parser = new BBCodeParser($this->Content);
$html = new HTMLText('Content');
$html->setValue($parser->parse());
return $html->FirstParagraph('html');
}
}

/**
* Get the bbcode parsed content
*/
function ParsedContent() {
if(self::$allow_wysiwyg_editing) {
return $this->obj('Content');
} else {
$parser = new BBCodeParser($this->Content);
$content = new Text('Content');
$content->value = $parser->parse();

return $content;
}
}

/**
* Link for editing this blog entry
*/
function EditURL() {
return $this->getParent()->Link('post') . '/' . $this->ID . '/';
}

/**
* Check to see if trackbacks are enabled.
*/
function TrackBacksEnabled() {
return $this->getParent()->TrackBacksEnabled;
}

function trackbackping() {
if($this->TrackBacksEnabled()) {
return $this->extInstance('TrackBackDecorator')->trackbackping();
} else {
Director::redirect($this->Link());
}
}

/**
* Call this to enable WYSIWYG editing on your blog entries.
* By default the blog uses BBCode
*/
static function allow_wysiwyg_editing() {
self::$allow_wysiwyg_editing = true;
}
}

class BlogEntry_Controller extends Page_Controller {
static $allowed_actions = array(
'trackbackping',
'unpublishPost',
'PageComments'
);

function init() {
parent::init();

Requirements::themedCSS('blog');
}

/**
* Gets a link to unpublish the blog entry
*/
function unpublishPost() {
if(!Permission::check('ADMIN')) {
Security::permissionFailure(
$this,
'Unpublishing blogs is an administrator task. Please log in.'
);
} else {
$SQL_id = (int) $this->ID;

$page = DataObject::get_by_id('SiteTree', $SQL_id);
$page->deleteFromStage('Live');
$page->flushCache();

$page = DataObject::get_by_id('SiteTree', $SQL_id);
$page->Status = 'Unpublished';

Director::redirect($this->getParent()->Link());
}
}

}
?>

0 comments on commit b729365

Please sign in to comment.