This commit is contained in:
Franco Springveldt 2017-09-17 22:55:11 +00:00 committed by GitHub
commit df57202675
9 changed files with 127 additions and 55 deletions

View File

@ -1,5 +1,3 @@
# See https://github.com/silverstripe/silverstripe-travis-support for setup details
sudo: false
language: php
@ -25,11 +23,10 @@ before_script:
# Install composer dependencies
- composer install --prefer-dist
- composer require --prefer-dist --no-update symfony/config:^3.2 silverstripe/framework:4.0.x-dev silverstripe/cms:4.0.x-dev silverstripe/admin:1.0.x-dev silverstripe/assets:1.0.x-dev silverstripe/versioned:1.0.x-dev
- composer require --prefer-dist --no-update silverstripe/recipe-cms:1.0.x-dev silverstripe-themes/simple:3.2.x-dev
- if [[ $DB == PGSQL ]]; then composer require --prefer-dist --no-update silverstripe/postgresql:2.0.x-dev; fi
- composer update
- if [[ $DB == PGSQL ]]; then composer require silverstripe/postgresql:2.0.x-dev --prefer-dist; fi
script:
- if [[ $PHPUNIT_TEST ]]; then vendor/bin/phpunit tests/; fi
- if [[ $PHPUNIT_COVERAGE_TEST ]]; then phpdbg -qrr vendor/bin/phpunit --coverage-clover=coverage.xml tests/; fi

View File

@ -1,8 +0,0 @@
[main]
host = https://www.transifex.com
[silverstripe-blog.master-v2]
file_filter = lang/<lang>.yml
source_file = lang/en.yml
source_lang = en
type = YML

View File

@ -2,6 +2,7 @@
namespace SilverStripe\Blog\Forms\GridField;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Lumberjack\Forms\GridFieldConfig_Lumberjack;
use SilverStripe\Lumberjack\Forms\GridFieldSiteTreeState;
@ -19,6 +20,6 @@ class GridFieldConfig_BlogPost extends GridFieldConfig_Lumberjack
parent::__construct($itemsPerPage);
$this->removeComponentsByType(GridFieldSiteTreeState::class);
$this->addComponent(GridFieldBlogPostState::create());
$this->addComponent(Injector::inst()->create(GridFieldBlogPostState::class));
}
}

View File

@ -8,6 +8,7 @@ use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\ORM\PaginatedList;
use SilverStripe\Security\Member;
use SilverStripe\View\Parsers\URLSegmentFilter;
class BlogController extends PageController
{
@ -90,8 +91,10 @@ class BlogController extends PageController
$urlSegment = $this->request->param('URLSegment');
if ($urlSegment) {
$filter = URLSegmentFilter::create();
return Member::get()
->filter('URLSegment', $urlSegment)
->filter('URLSegment', $filter->filter($urlSegment))
->first();
}
@ -242,8 +245,10 @@ class BlogController extends PageController
$dataRecord = $this->dataRecord;
$tag = $this->request->param('Tag');
if ($tag) {
$filter = URLSegmentFilter::create();
return $dataRecord->Tags()
->filter('URLSegment', [$tag, rawurlencode($tag)])
->filter('URLSegment', [$tag, $filter->filter($tag)])
->first();
}
return null;
@ -286,8 +291,10 @@ class BlogController extends PageController
$dataRecord = $this->dataRecord;
$category = $this->request->param('Category');
if ($category) {
$filter = URLSegmentFilter::create();
return $dataRecord->Categories()
->filter('URLSegment', [$category, rawurlencode($category)])
->filter('URLSegment', [$category, $filter->filter($category)])
->first();
}
return null;

View File

@ -24,7 +24,7 @@ class BlogMemberExtension extends DataExtension
* @var array
*/
private static $db = [
'URLSegment' => 'Varchar',
'URLSegment' => 'Varchar(255)',
'BlogProfileSummary' => 'Text'
];

View File

@ -736,6 +736,9 @@ class BlogPost extends Page
*/
public function getDate()
{
if ($this->hasDatabaseField('Date')) {
return $this->getField('Date');
}
return !empty($this->PublishDate) ? $this->PublishDate : null;
}

View File

@ -10,6 +10,13 @@ use SilverStripe\Blog\Model\Blog;
use SilverStripe\Control\Controller;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\NumericField;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DB;
use SilverStripe\ORM\FieldType\DBDate;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\ORM\Queries\SQLSelect;
use SilverStripe\Versioned\Versioned;
use SilverStripe\View\ArrayData;
use SilverStripe\Widgets\Model\Widget;
/**
@ -94,51 +101,46 @@ class BlogArchiveWidget extends Widget
/**
* Returns a list of months where blog posts are present.
*
* @return DataList
* @return ArrayList
*/
public function getArchive()
{
$query = $this->Blog()->getBlogPosts()->dataQuery();
$format = ($this->ArchiveType == 'Yearly') ? '%Y' : '%Y-%m';
$publishDate = DB::get_conn()->formattedDatetimeClause('"PublishDate"', $format);
$fields = [
'PublishDate' => $publishDate,
'Total' => "Count('PublishDate')"
];
if ($this->ArchiveType == 'Yearly') {
$query->groupBy('DATE_FORMAT("PublishDate", \'%Y\')');
} else {
$query->groupBy('DATE_FORMAT("PublishDate", \'%Y-%M\')');
}
$stage = Versioned::get_stage();
$suffix = ($stage == 'Stage') ? '' : "_{$stage}";
$query = SQLSelect::create($fields, "BlogPost{$suffix}")
->addGroupBy($publishDate)
->addOrderBy('PublishDate Desc')
->addWhere(['PublishDate < ?' => DBDatetime::now()->Format('Y-m-d')]);
$posts = $this->Blog()->getBlogPosts()->setDataQuery($query);
$posts = $query->execute();
$result = ArrayList::create();
while ($next = $posts->next()) {
$date = DBDate::create();
$date->setValue(strtotime($next['PublishDate']));
$year = $date->Format('Y');
if ($this->NumberToDisplay > 0) {
$posts = $posts->limit($this->NumberToDisplay);
}
$archive = ArrayList::create();
if ($posts->count() > 0) {
foreach ($posts as $post) {
/**
* @var BlogPost $post
*/
$date = Date::create();
$date->setValue($post->PublishDate);
if ($this->ArchiveType == 'Yearly') {
$year = $date->Format("Y");
$month = null;
$title = $year;
} else {
$year = $date->Format("Y");
$month = $date->Format("m");
$title = $date->FormatI18N("%B %Y");
}
$archive->push(ArrayData::create([
'Title' => $title,
'Link' => Controller::join_links($this->Blog()->Link('archive'), $year, $month)
]));
if ($this->ArchiveType == 'Yearly') {
$month = null;
$title = $year;
} else {
$month = $date->Format('m');
$title = $date->FormatI18N('%B %Y');
}
$result->push(ArrayData::create([
'Title' => $title,
'Link' => Controller::join_links($this->Blog()->Link('archive'), $year, $month)
]));
}
return $archive;
$this->extend('updateGetArchive', $result);
return $result;
}
}

View File

@ -0,0 +1,46 @@
<?php
namespace SilverStripe\Blog\Tests;
use SilverStripe\Core\Config\Config;
use SilverStripe\Dev\FunctionalTest;
use SilverStripe\i18n\i18n;
use SilverStripe\View\Parsers\URLSegmentFilter;
class BlogFunctionalTest extends FunctionalTest
{
protected static $fixture_file = 'BlogFunctionalTest.yml';
protected static $use_draft_site = true;
protected function setUp()
{
Config::modify()->set(URLSegmentFilter::class, 'default_allow_multibyte', true);
i18n::set_locale('fa_IR');
parent::setUp();
}
public function testBlogWithMultibyteUrl()
{
$result = $this->get('آبید');
$this->assertEquals(200, $result->getStatusCode());
}
public function testMemberProfileWithMultibyteUrlAndName()
{
$result = $this->get('آبید/profile/عبّاس-آبان');
$this->assertEquals(200, $result->getStatusCode());
$this->assertContains('My Blog Post', $result->getBody());
}
public function testMemberProfileWithMultibyteUrlAndEnglishName()
{
$result = $this->get('آبید/profile/bob-jones');
$this->assertEquals(200, $result->getStatusCode());
$this->assertContains('My Blog Post', $result->getBody());
}
}

View File

@ -0,0 +1,24 @@
SilverStripe\Security\Member:
member_a:
FirstName: عبّاس
Surname: آبان
Email: foo@example.com
member_b:
FirstName: Bob
Surname: Jones
Email: bobjones@example.com
SilverStripe\Blog\Model\Blog:
blog_a:
URLSegment: آبید
Title: My Blog
SilverStripe\Blog\Model\BlogPost:
blogpost_a:
Title: My Blog Post
URLSegment: آبیدآبید
PublishDate: 2017-08-01 00:00:00
Parent: =>SilverStripe\Blog\Model\Blog.blog_a
Authors:
- =>SilverStripe\Security\Member.member_a
- =>SilverStripe\Security\Member.member_b