MINOR: implementing featured blog posts as a widget

This commit is contained in:
Peter Thaleikis 2019-04-10 20:31:25 +07:00 committed by Robbie Averill
parent ab8325f965
commit fdeb101882
5 changed files with 162 additions and 0 deletions

View File

@ -4,3 +4,12 @@ Name: blogconfig
SilverStripe\Security\Member:
extensions:
- SilverStripe\Blog\Model\BlogMemberExtension
---
Name: featuredpostswidget
Only:
moduleexists: widgets
---
SilverStripe\Blog\Model\BlogPost:
extensions:
- SilverStripe\Blog\Model\BlogPostFeaturedExtension

View File

@ -0,0 +1,34 @@
<?php
namespace SilverStripe\Blog\Model;
use SilverStripe\ORM\DataExtension;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\CheckboxField;
/**
* Adds a checkbox field for featured blog posts widget.
*/
class BlogPostFeaturedExtension extends DataExtension
{
/**
* @var array
*/
private static $db = [
'FeaturedInWidget' => 'Boolean',
];
/**
* {@inheritdoc}
*/
public function updateCMSFields(FieldList $fields)
{
// Add the checkbox in.
$fields->addFieldToTab(
'Root.PostOptions',
new CheckboxField("FeaturedInWidget", _t(__CLASS__ . '.FEATURED', 'Include Post in Feature Widget'))
);
return $fields;
}
}

View File

@ -0,0 +1,93 @@
<?php
namespace SilverStripe\Blog\Widgets;
use SilverStripe\Blog\Model\Blog;
use SilverStripe\Control\Director;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\NumericField;
use SilverStripe\ORM\DataList;
use SilverStripe\Widgets\Model\Widget;
if (!class_exists(Widget::class)) {
return;
}
/**
* @method Blog Blog()
*
* @property int $NumberOfPosts
*/
class BlogFeaturedPostsWidget extends Widget
{
/**
* @var string
*/
private static $title = 'Featured Posts';
/**
* @var string
*/
private static $cmsTitle = 'Featured Posts';
/**
* @var string
*/
private static $description = 'Displays a list of featured blog posts.';
/**
* @var array
*/
private static $db = [
'NumberOfPosts' => 'Int',
];
/**
* @var array
*/
private static $has_one = [
'Blog' => Blog::class,
];
/**
* @var string
*/
private static $table_name = 'BlogFeaturedPostsWidget';
/**
* {@inheritdoc}
*/
public function getCMSFields()
{
$this->beforeUpdateCMSFields(function ($fields) {
/**
* @var FieldList $fields
*/
$fields->merge([
DropdownField::create('BlogID', _t(__CLASS__ . '.Blog', 'Blog'), Blog::get()->map()),
NumericField::create('NumberOfPosts', _t(__CLASS__ . '.NumberOfPosts', 'Number of Posts'))
]);
});
return parent::getCMSFields();
}
/**
* @return array|DataList
*/
public function getPosts()
{
$blog = $this->Blog();
if ($blog) {
return $blog->getBlogPosts()
->filter('ID:not', Director::get_current_page()->ID)
->filter('FeaturedInWidget', true)
->sort('RAND()')
->limit($this->NumberOfPosts);
}
return [];
}
}

View File

@ -0,0 +1,14 @@
<?php
namespace SilverStripe\Blog\Widgets;
use SilverStripe\Widgets\Model\WidgetController;
if (!class_exists(WidgetController::class)) {
return;
}
class BlogFeaturedPostsWidgetController extends WidgetController
{
}

View File

@ -0,0 +1,12 @@
<% if $Posts %>
<ul>
<% loop $Posts %>
<li>
<a href="$Link" title="$Title">
<span class="arrow">&rarr;</span>
<span class="text">$Title</span>
</a>
</li>
<% end_loop %>
</ul>
<% end_if %>