From 1b751224263800cea43d52f3742e665db1ceae03 Mon Sep 17 00:00:00 2001 From: Robert van Lienden Date: Fri, 3 Mar 2023 23:54:26 +0100 Subject: [PATCH] Init commit --- .gitignore | 1 + LICENSE | 21 +++++ README.md | 35 ++++++++ _config/app.yml | 12 +++ composer.json | 31 +++++++ .../PortfolioDetailPageController.php | 7 ++ .../PortfolioOverviewPageController.php | 7 ++ src/Extensions/PageControllerExtension.php | 9 ++ src/Extensions/PageExtension.php | 54 ++++++++++++ src/Extensions/SiteConfigExtension.php | 61 ++++++++++++++ src/Models/SlideShowImage.php | 40 +++++++++ src/Pages/ItemDetailPage.php | 75 +++++++++++++++++ src/Pages/ItemOverviewPage.php | 83 +++++++++++++++++++ .../Pages/Layout/ItemDetailPage.ss | 11 +++ .../Pages/Layout/ItemOverviewPage.ss | 72 ++++++++++++++++ 15 files changed, 519 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 _config/app.yml create mode 100755 composer.json create mode 100644 src/Controllers/PortfolioDetailPageController.php create mode 100644 src/Controllers/PortfolioOverviewPageController.php create mode 100644 src/Extensions/PageControllerExtension.php create mode 100644 src/Extensions/PageExtension.php create mode 100644 src/Extensions/SiteConfigExtension.php create mode 100644 src/Models/SlideShowImage.php create mode 100644 src/Pages/ItemDetailPage.php create mode 100644 src/Pages/ItemOverviewPage.php create mode 100644 templates/RobertVanLienden/SilverStripeAddons/Pages/Layout/ItemDetailPage.ss create mode 100644 templates/RobertVanLienden/SilverStripeAddons/Pages/Layout/ItemOverviewPage.ss diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..485dee6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7fe3457 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Robert van Lienden + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..6e7b104 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# Robert van Lienden - SilverStripe Addons +This module adds several features to silverstripe. Suggested and fully compatible with `robertvanlienden/silverstripe-bulma-portfolio-theme`. + +But you can also use this module stand-alone! + +## Requirements +- SilverStripe 4 + +## Installation +`composer require robertvanlienden/silverstripe-addons` + +If you want some example how to implement features in your own template; View `robertvanlienden/silverstripe-bulma-portfolio-theme`. + +## All features +* Upload logo for website header +* Page header (you can disable this for the whole site in the Settings) +* Footer text left/right +* Portfolio overview and detail page + * Slideshow images + +## License +This theme is published under MIT License. + +If you use this theme commercial and make money with this theme, please be kind and do a donation with PayPal (see Donations below). + +## Issue/PR +Feel free to make some issue/PR if you find issues/bugs/improvements. + +If you want to create some new feature or do big changes, please first provide an issue. +T his to avoid that you put lots of work in some feature that will never gets merged. + +## Donations +Do you want to thank me for making this SilverStripe module? + +Please donate to me with PayPal! You can donate on [https://paypal.me/robertvanlienden/](http://paypal.me/robertvanlienden). diff --git a/_config/app.yml b/_config/app.yml new file mode 100644 index 0000000..023ff52 --- /dev/null +++ b/_config/app.yml @@ -0,0 +1,12 @@ +--- +Name: silverstripeaddons +--- +Page: + extensions: + - RobertVanLienden\SilverStripeAddons\Extensions\PageExtension +PageController: + extensions: + - RobertVanLienden\SilverStripeAddons\Extensions\PageControllerExtension +Silverstripe\SiteConfig\SiteConfig: + extensions: + - RobertVanLienden\SilverStripeAddons\Extensions\SiteConfigExtension diff --git a/composer.json b/composer.json new file mode 100755 index 0000000..0c5b137 --- /dev/null +++ b/composer.json @@ -0,0 +1,31 @@ +{ + "name": "robertvanlienden/silverstripe-addons", + "description": "A addon to add ", + "type": "silverstripe-vendormodule", + "keywords": [ + "silverstripe", + "addon" + ], + "license": "MIT", + "authors": [ + { + "name": "Robert van Lienden", + "email": "mail@robertvanlienden.nl" + } + ], + "minimum-stability": "dev", + "prefer-stable": true, + "require": { + "php": ">=8.0", + "silverstripe/admin": "^1.7@stable", + "silverstripe/cms": "^4.8@stable", + "silverstripe/vendor-plugin": "^1.0", + "gorriecoe/silverstripe-linkfield": "^1.0", + "silverstripe/lumberjack": "^2.2" + }, + "autoload": { + "psr-4": { + "RobertVanLienden\\SilverStripeAddons\\": "src/" + } + } +} diff --git a/src/Controllers/PortfolioDetailPageController.php b/src/Controllers/PortfolioDetailPageController.php new file mode 100644 index 0000000..b1c5ece --- /dev/null +++ b/src/Controllers/PortfolioDetailPageController.php @@ -0,0 +1,7 @@ + 'Varchar(225)', + 'HeaderContent' => 'HTMLText', + 'HeaderDisabled' => 'Boolean', + 'DarkContent' => 'Boolean', + ]; + + private static array $has_one = [ + 'HeaderImage' => Image::class, + 'HeaderButtonLink' => Link::class, + ]; + + private static array $owns = [ + 'HeaderImage' + ]; + + + public function updateCMSFields(FieldList $fields) + { + parent::updateCMSFields($fields); + + $siteConfig = SiteConfig::current_site_config(); + + if($siteConfig->AddonsHeaderFeatureFlag) { + $fields->addFieldsToTab('Root.Header', [ + CheckboxField::create('HeaderDisabled', 'Disable the header on this page'), + CheckboxField::create('DarkContent', 'Content in black'), + UploadField::create('HeaderImage') + ->setFolderName('header-images'), + TextField::create('HeaderTitle', 'Header title'), + HTMLEditorField::create('HeaderContent', 'Header content'), + LinkField::create('HeaderButtonLink', 'Header button link', $this->owner) + ->setDescription('The title will be used on the button as content'), + ]); + } + } +} diff --git a/src/Extensions/SiteConfigExtension.php b/src/Extensions/SiteConfigExtension.php new file mode 100644 index 0000000..60744a9 --- /dev/null +++ b/src/Extensions/SiteConfigExtension.php @@ -0,0 +1,61 @@ + 'Boolean', + 'FooterLeft' => 'HTMLText', + 'FooterRight' => 'HTMLText', + ]; + + private static array $has_one = [ + 'HeaderLogo' => Image::class, + ]; + private static array $owns = [ + 'HeaderLogo', + ]; + + private static array $defaults = [ + 'AddonsHeaderFeatureFlag' => true, + ]; + + public function updateCMSFields(FieldList $fields) + { + parent::updateCMSFields($fields); + + $fields->addFieldsToTab('Root.SilverstripeAddonsSettings.Features', [ + LiteralField::create('AddonsDescritpion', ' +

SilverStripe Addons Features

+

Here you can turn on/off features for SilverStripe addons

+'), + CompositeField::create([ + CheckboxField::create('AddonsHeaderFeatureFlag', 'Turn on header visual images with content on all pages') + ->setDescription('This feature flag adds a header visual to all pages. +The header needs to get configured in the SilverStripe template. +You can also use +robertvanlienden/silverstripe-bulma-portfolio-theme.') + ]) + ]); + + $fields->addFieldsToTab('Root.SilverstripeAddonsSettings.Header', [ + UploadField::create('HeaderLogo', 'Header logo') + ->setFolderName('header-logo') + ]); + + $fields->addFieldsToTab('Root.SilverstripeAddonsSettings.Footer', [ + HTMLEditorField::create('FooterLeft', 'Footer left'), + HTMLEditorField::create('FooterRight', 'Footer right'), + ]); + } +} diff --git a/src/Models/SlideShowImage.php b/src/Models/SlideShowImage.php new file mode 100644 index 0000000..2c6365c --- /dev/null +++ b/src/Models/SlideShowImage.php @@ -0,0 +1,40 @@ + 'Varchar', + ]; + + private static array $has_one = [ + 'Image' => Image::class, + 'Page' => Page::class, + ]; + + private static array $owns = [ + 'Image' + ]; + + public function getCMSFields() + { + $fields = parent::getCMSFields(); + + $fields->removeByName(['PageID', 'Image']); + + $fields->addFieldsToTab('Root.Main', [ + UploadField::create('Image', 'Image') + ->setFolderName('slideshow-images') + ]); + + return $fields; + } +} diff --git a/src/Pages/ItemDetailPage.php b/src/Pages/ItemDetailPage.php new file mode 100644 index 0000000..eae0151 --- /dev/null +++ b/src/Pages/ItemDetailPage.php @@ -0,0 +1,75 @@ + 'HTMLText', + 'ButtonText' => 'Varchar(225)', + ]; + + private static array $has_one = [ + 'OverviewImage' => Image::class, + ]; + + private static array $has_many = [ + 'SlideShowImages' => SlideShowImage::class, + ]; + + private static array $owns = [ + 'OverviewImage', + 'SlideShowImages' + ]; + + public function getCMSFields() + { + $fields = parent::getCMSFields(); + + $fields->addFieldsToTab('Root.Project', [ + UploadField::create('OverviewImage') + ->setFolderName('portfolio'), + HTMLEditorField::create('ProjectSummary') + ->setDescription('A summary for the portfolio detail page. + Without summary the first 50 characters of the content will get used.'), + TextField::create('ButtonText') + ->setDescription('The text that will get shown on the link on the project summary'), + ]); + + $slideShowImagesConfig = GridFieldConfig_RecordEditor::create(); + + $fields->addFieldsToTab('Root.SlideShowImages', [ + GridField::create('Images', + 'Slideshow images', + $this->SlideShowImages(), + $slideShowImagesConfig) + ]); + + return $fields; + } + + public function getShortContent(string $content = null): string + { + if (!$content) { + $content = ''; + } + + $content = strip_tags($content); + + return substr($content, 0, 500) . ' ...'; + } +} diff --git a/src/Pages/ItemOverviewPage.php b/src/Pages/ItemOverviewPage.php new file mode 100644 index 0000000..93bf6cf --- /dev/null +++ b/src/Pages/ItemOverviewPage.php @@ -0,0 +1,83 @@ + 'Boolean', + ]; + + private static array $defaults = [ + 'AllItemDetailPages' => false, + ]; + + public function getCMSFields() + { + $fields = parent::getCMSFields(); + + $fields->addFieldsToTab('Root.Main', [ + CheckboxField::create('AllItemDetailPages', 'Display all item detail pages on this page') + ->setDescription('By default a overview page only shows pages under THIS overview page. '), + ], 'Title'); + + $itemGridConfig = GridFieldConfig_RecordEditor::create(); + + if ($this->AllItemDetailPages === 0) { + $fields->addFieldsToTab('Root.Items', [ + GridField::create('ItemPages', + 'Item detail pages', + ItemDetailPage::get()->where(['ParentID' => $this->ID]), + $itemGridConfig) + ]); + } else { + $fields->addFieldsToTab('Root.Items', [ + GridField::create('ItemPages', + 'Item pages', + ItemDetailPage::get(), + $itemGridConfig) + ]); + } + + + return $fields; + } + + private static array $allowed_children = [ + ItemDetailPage::class + ]; + + public function getItemPages(?string $limit = null, ?string $all = null): DataList + { + if ($all == '1' && !$limit) { + return ItemDetailPage::get(); + } + + if ($all && $limit) { + return ItemDetailPage::get()->limit($limit); + } + + $result = ItemDetailPage::get() + ->where(['ParentID' => $this->ID]); + + if ($limit) { + return $result->limit($limit); + } + + return $result; + } +} diff --git a/templates/RobertVanLienden/SilverStripeAddons/Pages/Layout/ItemDetailPage.ss b/templates/RobertVanLienden/SilverStripeAddons/Pages/Layout/ItemDetailPage.ss new file mode 100644 index 0000000..9f7a6ab --- /dev/null +++ b/templates/RobertVanLienden/SilverStripeAddons/Pages/Layout/ItemDetailPage.ss @@ -0,0 +1,11 @@ +

$Title

+ +<% if $SlideShowImages %> + <% loop $SlideShowImages %> + $Title + $Image + <% end_loop %> +<% end_if %> + +$Content +$Form diff --git a/templates/RobertVanLienden/SilverStripeAddons/Pages/Layout/ItemOverviewPage.ss b/templates/RobertVanLienden/SilverStripeAddons/Pages/Layout/ItemOverviewPage.ss new file mode 100644 index 0000000..81ac6b7 --- /dev/null +++ b/templates/RobertVanLienden/SilverStripeAddons/Pages/Layout/ItemOverviewPage.ss @@ -0,0 +1,72 @@ +

$Title

+$ElementalArea +$Content +$Form +<% if not $getItemPages('' , $AllItemDetailPages) %> +No items here! +<% end_if %> +<% loop $getItemPages('' , $AllItemDetailPages) %> + <% if $Odd %> +
+
+

$Title

+

+ <% if $ProjectSummary %> + $ProjectSummary + <% else %> + $getShortContent($Content) + <% end_if %> +

+ + <% if $ButtonText %>$ButtonText<% else %>$Title<% end_if %> + +
+
+ <% if $OverviewImage %> + $OverviewImage.Title + <% end_if %> +
+
+ <% else %> +
+
+ <% if $OverviewImage %> + $OverviewImage.Title + <% end_if %> +
+
+

$Title

+

+ <% if $ProjectSummary %> + $ProjectSummary + <% else %> + $Content + <% end_if %> +

+ + <% if $ButtonText %>$ButtonText<% else %>$Title<% end_if %> + +
+
+
+
+

$Title

+

+ <% if $ProjectSummary %> + $ProjectSummary + <% else %> + $getShortContent($Content) + <% end_if %> +

+ + <% if $ButtonText %>$ButtonText<% else %>$Title<% end_if %> + +
+
+ <% if $OverviewImage %> + $OverviewImage.Title + <% end_if %> +
+
+ <% end_if %> +<% end_loop %>