diff --git a/src/Widgets/BlogAuthorsWidget.php b/src/Widgets/BlogAuthorsWidget.php new file mode 100755 index 0000000..7370ec8 --- /dev/null +++ b/src/Widgets/BlogAuthorsWidget.php @@ -0,0 +1,149 @@ + 'Int', + 'Order' => 'Varchar', + 'Direction' => 'Varchar', + ]; + + private static $has_one = [ + 'Blog' => Blog::class + ]; + + public function getCMSFields() + { + $this->beforeUpdateCMSFields(function (FieldList $fields) { + $fields[] = DropdownField::create( + 'BlogID', + _t(__CLASS__ . '.Blog', 'Blog'), + Blog::get()->map() + ); + + $fields[] = NumericField::create( + 'Limit', + _t(__CLASS__ . '.Limit', 'Limit'), + 0 + ) + ->setDescription( + _t( + __CLASS__ . '.Limit_Description', + 'Limit the number of tags shown by this widget (set to 0 to show all tags).' + ) + ) + ->setMaxLength(3); + + $fields[] = DropdownField::create( + 'Order', + _t(__CLASS__ . '.Sort', 'Sort'), + [ + 'FirstName' => 'First Name', + 'Surname' => 'Last Name', + 'LastEdited' => 'Updated', + ], + ) + ->setDescription( + _t(__CLASS__ . '.Sort_Description', 'Change the order of tags shown by this widget.') + ); + + $fields[] = DropdownField::create( + 'Direction', + _t(__CLASS__ . '.Direction', 'Direction'), + ['ASC' => 'Ascending', 'DESC' => 'Descending'] + ) + ->setDescription( + _t( + __CLASS__ . '.Direction_Description', + 'Change the direction of ordering of tags shown by this widget.' + ) + ); + }); + + return parent::getCMSFields(); + } + + /** + * @return DataList + */ + public function getAuthors() + { + $parent = $this->Blog(); + + if (!$parent) { + return []; + } + + $blogID = $parent->ID; + + $posts = BlogPost::get() + ->filter('ParentID', $blogID); + + $authorIDs = []; + foreach ($posts as $post) { + $authorIDs = array_merge( + $authorIDs, + array_keys( + $post->Authors() + ->map() + ->toArray() + ) + ); + } + + $authorIDs = array_unique($authorIDs); + $query = Member::get()->filter(['ID' => $authorIDs]); + + if ($this->Limit) { + $query = $query->limit(Convert::raw2sql($this->Limit)); + } + + if ($this->Order && $this->Direction) { + $query = $query->sort( + Convert::raw2sql($this->Order), + Convert::raw2sql($this->Direction) + ); + } + + // Update all authors + $items = ArrayList::create(); + foreach ($query as $author) { + // Add link for each author + $author = $author->customise([ + 'URL' => $parent->ProfileLink($author->URLSegment), + ]); + $items->push($author); + } + + return $items; + } +} diff --git a/templates/A2nt/CMSNiceties/Widgets/BlogAuthorsWidget.ss b/templates/A2nt/CMSNiceties/Widgets/BlogAuthorsWidget.ss new file mode 100644 index 0000000..d5d38d7 --- /dev/null +++ b/templates/A2nt/CMSNiceties/Widgets/BlogAuthorsWidget.ss @@ -0,0 +1,13 @@ +<% cached 'blogauthorswidget', $List('SilverStripe\Blog\Model\BlogPost').max('LastEdited'), $List('SilverStripe\Blog\Model\BlogPost').count() %> + <% if $Authors %> +
+ <% loop $Authors %> + <% if $URLSegment && not $Up.ProfilesDisabled %> + $Name.XML<% if not $Last %>,<% end_if %> + <% else %> + $Name.XML<% if not $Last %>,<% end_if %> + <% end_if %> + <% end_loop %> +
+ <% end_if %> +<% end_cached %>