diff --git a/composer.json b/composer.json index 918edd3..013ea03 100755 --- a/composer.json +++ b/composer.json @@ -15,21 +15,21 @@ "minimum-stability": "dev", "prefer-stable": true, "require": { - "php": ">=8.1", - "silverstripe/cms": "^4@stable", - "silverstripe/vendor-plugin": "^1.0", - "silverstripe/lumberjack": "^2.0", - "micschk/silverstripe-gridfieldsitetreebuttons": "^2.0", - "silverstripe/tagfield": "^2.7", - "unclecheese/display-logic": "^2.0" + "php": "^8.1", + "silverstripe/framework": "^5.0", + "silverstripe/vendor-plugin": "^2.0", + "silverstripe/lumberjack": "^3.0", + "silverstripe/tagfield": "^3.0", + "unclecheese/display-logic": "^3.0", + "wedevelopnl/silverstripe-gridfieldsitetreebuttons": "^1.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.4" + "friendsofphp/php-cs-fixer": "^3.20" }, "extra": { "installer-name": "silverstripe-articles", "branch-alias": { - "dev-main": "4.x-dev" + "dev-main": "5.x-dev" }, "expose": [ "client/dist" diff --git a/src/Pages/ArticlePage.php b/src/Pages/ArticlePage.php index 5bcfd0b..ea12ed6 100755 --- a/src/Pages/ArticlePage.php +++ b/src/Pages/ArticlePage.php @@ -8,60 +8,38 @@ use SilverStripe\Forms\DropdownField; use SilverStripe\Forms\FieldGroup; use SilverStripe\Forms\FieldList; +use SilverStripe\Forms\GridField\GridField; +use SilverStripe\Forms\GridField\GridFieldConfig_RelationEditor; +use SilverStripe\Forms\GridField\GridFieldEditButton; use SilverStripe\Forms\HTMLEditor\HTMLEditorField; use SilverStripe\Forms\TextField; use SilverStripe\ORM\FieldType\DBDatetime; use SilverStripe\TagField\TagField; +use SilverStripe\Versioned\GridFieldArchiveAction; +use Symbiote\GridFieldExtensions\GridFieldOrderableRows; use WeDevelop\Articles\Controllers\ArticlesPageController; use WeDevelop\Articles\Models\Author; use WeDevelop\Articles\Models\Tag; class ArticlePage extends \Page { - /** - * @var string - */ - private static $table_name = 'WeDevelop_ArticlePage'; - - /** - * @var string - */ - private static $singular_name = 'Article page'; - - /** - * @var string - */ - private static $description = 'A page that represents an article'; - - /** - * @var string - */ - private static $plural_name = 'Articles page'; - - /** - * @var string - */ - private static $icon_class = 'font-icon-p-article'; - - /** - * @var bool - */ - private static $show_in_sitetree = false; - - /** - * @var bool - */ - private static $can_be_root = false; - - /** - * @var array - */ - private static $allowed_children = []; - - /** - * @var array - */ - private static $db = [ + private static string $table_name = 'WeDevelop_ArticlePage'; + + private static string $singular_name = 'Article page'; + + private static string $description = 'A page that represents an article'; + + private static string $plural_name = 'Articles page'; + + private static string $icon_class = 'font-icon-p-article'; + + private static bool $show_in_sitetree = false; + + private static bool $can_be_root = false; + + private static array $allowed_children = []; + + private static array $db = [ 'Subtitle' => 'Varchar(255)', 'PublicationDate' => 'Datetime', 'UpdatedDate' => 'Datetime', @@ -71,43 +49,46 @@ class ArticlePage extends \Page 'Highlighted' => 'Boolean', ]; - /** - * @var array - */ - private static $has_one = [ + private static array $has_one = [ 'Thumbnail' => Image::class, 'Type' => ArticleTypePage::class, 'Author' => Author::class, ]; - /** - * @var array - */ - private static $owns = [ + private static array $many_many = [ + 'RelatedArticles' => ArticlePage::class, + ]; + + private static array $owns = [ 'Thumbnail', ]; - /** - * @var array - */ - private static $belongs_many_many = [ + private static array $belongs_many_many = [ 'Tags' => Tag::class, 'Themes' => ArticleThemePage::class, 'HighlightedArticles' => ArticlesPage::class . '.HighlightedArticles', 'PinnedArticles' => ArticlesPage::class . '.PinnedArticles', ]; - /** - * @var string - */ - private static $default_sort = 'PublicationDate DESC'; - + private static string $default_sort = 'PublicationDate DESC'; public function getCMSFields(): FieldList { $this->beforeUpdateCMSFields(function (FieldList $fields) { $fields->removeByName('MenuTitle'); + $fields->addFieldsToTab('Root.RelatedArticles', [ + GridField::create( + 'RelatedArticles', + _t(__CLASS__ . '.RELATED_ARTICLES', 'Related articles'), + $this->owner->RelatedArticles(), + GridFieldConfig_RelationEditor::create() + ->addComponent(new GridFieldOrderableRows()) + ->removeComponentsByType(GridFieldArchiveAction::class) + ->removeComponentsByType(GridFieldEditButton::class) + ), + ]); + $fields->insertAfter( 'URLSegment', TextField::create('Subtitle', _t(__CLASS__ . '.SUBTITLE', 'Subtitle')) @@ -209,7 +190,7 @@ public function getControllerName(): string return ArticlesPageController::class; } - protected function onBeforeWrite() + protected function onBeforeWrite(): void { if (is_null($this->PublicationDate)) { $this->PublicationDate = DBDatetime::now()->getValue(); diff --git a/src/Pages/ArticlesPage.php b/src/Pages/ArticlesPage.php index 08f7abe..5dfb3ee 100755 --- a/src/Pages/ArticlesPage.php +++ b/src/Pages/ArticlesPage.php @@ -2,7 +2,8 @@ namespace WeDevelop\Articles\Pages; -use Restruct\Silverstripe\SiteTreeButtons\GridFieldAddNewSiteTreeItemButton; +use SilverStripe\Forms\TextField; +use WeDevelop\SiteTreeButtons\GridFieldAddNewSiteTreeItemButton; use SilverStripe\Control\Controller; use SilverStripe\Forms\FieldList; use SilverStripe\Forms\GridField\GridField; @@ -14,7 +15,6 @@ use SilverStripe\Forms\GridField\GridFieldEditButton; use SilverStripe\Forms\NumericField; use SilverStripe\Lumberjack\Forms\GridFieldConfig_Lumberjack; -use SilverStripe\Lumberjack\Forms\GridFieldSiteTreeAddNewButton; use SilverStripe\ORM\DataList; use SilverStripe\ORM\DB; use SilverStripe\ORM\HasManyList; @@ -39,74 +39,42 @@ */ class ArticlesPage extends \Page { - /** - * @var string - */ - private static $table_name = 'WeDevelop_ArticlesPage'; + private static string $table_name = 'WeDevelop_ArticlesPage'; - /** - * @var string - */ - private static $singular_name = 'Articles overview page'; + private static string $singular_name = 'Articles overview page'; - /** - * @var string - */ - private static $plural_name = 'Articles overview pages'; + private static string $plural_name = 'Articles overview pages'; - /** - * @var string - */ - private static $icon_class = 'font-icon-p-article'; + private static string $icon_class = 'font-icon-p-article'; - /** - * @var array - */ - private static $allowed_children = [ - '*' . ArticlePage::class, - '*' . ArticleThemePage::class, - '*' . ArticleTypePage::class, + private static array $allowed_children = [ + ArticlePage::class, + ArticleThemePage::class, + ArticleTypePage::class, ]; - /** - * @var string - */ - private static $default_child = ArticlePage::class; + private static string $default_child = ArticlePage::class; - /** - * @var array - */ - private static $db = [ + private static array $db = [ + 'RelatedArticlesTitle' => 'Varchar', 'PageLength' => 'Int', ]; - /** - * @var array - */ - private static $defaults = [ + private static array $defaults = [ 'PageLength' => 10, ]; - /** - * @var array - */ - private static $has_many = [ + private static array $has_many = [ 'Tags' => Tag::class, 'Authors' => Author::class, ]; - /** - * @var array - */ - private static $many_many = [ + private static array $many_many = [ 'HighlightedArticles' => ArticlePage::class, 'PinnedArticles' => ArticlePage::class, ]; - /** - * @var array - */ - private static $many_many_extraFields = [ + private static array $many_many_extraFields = [ 'HighlightedArticles' => [ 'HighlightedSort' => 'Int', ], @@ -118,22 +86,33 @@ class ArticlesPage extends \Page public function getCMSFields(): FieldList { $this->beforeUpdateCMSFields(function (FieldList $fields) { + + $fields->removeByName([ + 'PageLength', + ]); + $fields->addFieldToTab( 'Root.Themes', - $this->createGridField( + GridField::create( 'Themes', _t('WeDevelop\Articles\Pages\ArticleThemePage.PLURALNAME', 'Themes'), - ArticleThemePage::get()->filter('ParentID', $this->ID) - ) + ArticleThemePage::get()->filter('ParentID', $this->ID), + GridFieldConfig_RecordEditor::create() + ->removeComponentsByType(GridFieldAddNewButton::class) + ->addComponent(new GridFieldAddNewSiteTreeItemButton()) + ), ); $fields->addFieldToTab( 'Root.Types', - $this->createGridField( + GridField::create( 'Types', _t('WeDevelop\Articles\Pages\ArticleTypePage.PLURALNAME', 'Types'), - ArticleTypePage::get()->filter('ParentID', $this->ID) - ) + ArticleTypePage::get()->filter('ParentID', $this->ID), + GridFieldConfig_RecordEditor::create() + ->removeComponentsByType(GridFieldAddNewButton::class) + ->addComponent(new GridFieldAddNewSiteTreeItemButton()) + ), ); $fields->addFieldsToTab( @@ -143,7 +122,7 @@ public function getCMSFields(): FieldList 'Authors', _t('WeDevelop\Articles\Models\Author.PLURALNAME', 'Authors'), $this->Authors(), - new GridFieldConfig_RecordEditor() + GridFieldConfig_RecordEditor::create() ), ] ); @@ -155,15 +134,6 @@ public function getCMSFields(): FieldList ] ); - $fields->replaceField( - 'ChildPages', - $this->createGridField( - 'Articles', - _t(__CLASS__ . '.ARTICLES', 'Articles'), - ArticlePage::get()->filter('ParentID', $this->ID) - ) - ); - $fields->addFieldToTab( 'Root.Highlighted', new GridField( @@ -184,12 +154,21 @@ public function getCMSFields(): FieldList ) ); - $fields->insertBefore('Articles', NumericField::create('PageLength')); + $fields->addFieldsToTab( + 'Root.Settings', + [ + TextField::create('RelatedArticlesTitle', 'Title above related articles'), + ] + ); }); $fields = parent::getCMSFields(); - $this->extend('onAfterUpdateCMSFields', $fields); - return $fields; + + $fields->removeByName(['PageLength']); + + $fields->addFieldsToTab('Root.ChildPages', NumericField::create('PageLength'), 'ChildPages'); + + return $fields; } private function getGridConfig(string $sortColumn): GridFieldConfig_RelationEditor @@ -229,11 +208,7 @@ public function getLumberjackTitle(): string private function createGridField(string $type, string $title, DataList $list): GridField { - $config = GridFieldConfig_Lumberjack::create() - ->removeComponentsByType(GridFieldSiteTreeAddNewButton::class) - ->addComponent(new GridFieldAddNewSiteTreeItemButton('buttons-before-left')); - - return GridField::create($type, $title, $list, $config); + return GridField::create($type, $title, $list, GridFieldConfig_Lumberjack::create()); } public function getThemes(): DataList diff --git a/templates/WeDevelop/Articles/Pages/Layout/ArticlePage.ss b/templates/WeDevelop/Articles/Pages/Layout/ArticlePage.ss index 585f3bb..eb50b25 100644 --- a/templates/WeDevelop/Articles/Pages/Layout/ArticlePage.ss +++ b/templates/WeDevelop/Articles/Pages/Layout/ArticlePage.ss @@ -44,3 +44,19 @@ +<% if $RelatedArticles %> +
+
+ + <% if $Parent %> + All articles + <% end_if %> +
+
+<% end_if %>