From 00ae5dd0958fca702d85d917a484ae99cf83b59d Mon Sep 17 00:00:00 2001 From: Tony Air Date: Mon, 22 Apr 2024 13:55:28 +0200 Subject: [PATCH 1/7] UPD: composer --- composer.json | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 5300942..369ff6a 100644 --- a/composer.json +++ b/composer.json @@ -13,15 +13,13 @@ }], "minimum-stability": "dev", "require": { - "silverstripe/cms": "*", + "silverstripe/cms": "*", "dnadesign/silverstripe-elemental": "*", "dnadesign/silverstripe-elemental-list": "*", - "betterbrief/silverstripe-googlemapfield": "*", "symbiote/silverstripe-gridfieldextensions": "*", "dynamic/silverstripe-elemental-image": "*", "gorriecoe/silverstripe-linkfield": "*", - "a2nt/silverstripe-mapboxfield": "dev-master", - "lekoala/silverstripe-filepond": "*" + "lekoala/silverstripe-filepond": "*" }, "autoload": { "psr-4": { From 309d7b42fbf9b1edb5893e267bdfd78247362363 Mon Sep 17 00:00:00 2001 From: Tony Air Date: Mon, 22 Apr 2024 14:08:36 +0200 Subject: [PATCH 2/7] FIX: getType() function compatibility --- src/Elements/AccordionElement.php | 30 +++++++++++++-------------- src/Elements/CustomSnippetElement.php | 4 ++-- src/Elements/InstagramElement.php | 6 +++--- src/Elements/MapElement.php | 2 +- src/Elements/SidebarElement.php | 2 +- src/Elements/SliderElement.php | 4 ++-- src/Elements/TeamMembersElement.php | 4 ++-- 7 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/Elements/AccordionElement.php b/src/Elements/AccordionElement.php index 95fdaba..6da4783 100755 --- a/src/Elements/AccordionElement.php +++ b/src/Elements/AccordionElement.php @@ -28,14 +28,14 @@ class AccordionElement extends ElementList private static $table_name = 'AccordionElement'; - private static $db = [ - 'OpenFirst' => 'Boolean(0)', - 'KeepOpenned' => 'Boolean(0)', - ]; + private static $db = [ + 'OpenFirst' => 'Boolean(0)', + 'KeepOpenned' => 'Boolean(0)', + ]; - public function getType() + public function getType(): string { - return self::$singular_name; + return _t(__CLASS__ . '.BlockType', self::$singular_name); } public function Accordion() @@ -43,15 +43,15 @@ class AccordionElement extends ElementList return $this->Elements()->renderWith(static::class.'_AccordionArea'); } - public function getCMSFields() - { - $fields = parent::getCMSFields(); + public function getCMSFields() + { + $fields = parent::getCMSFields(); - $fields->addFieldsToTab('Root.Main', [ - CheckboxField::create('OpenFirst', 'Open first accordion element on page load'), - CheckboxField::create('KeepOpenned', 'Keep elements open'), - ]); + $fields->addFieldsToTab('Root.Main', [ + CheckboxField::create('OpenFirst', 'Open first accordion element on page load'), + CheckboxField::create('KeepOpenned', 'Keep elements open'), + ]); - return $fields; - } + return $fields; + } } diff --git a/src/Elements/CustomSnippetElement.php b/src/Elements/CustomSnippetElement.php index 5ec85f2..856936e 100755 --- a/src/Elements/CustomSnippetElement.php +++ b/src/Elements/CustomSnippetElement.php @@ -28,9 +28,9 @@ class CustomSnippetElement extends ElementContent private static $table_name = 'CustomSnippetElement'; - public function getType() + public function getType(): string { - return self::$singular_name; + return _t(__CLASS__ . '.BlockType', self::$singular_name); } public function getCMSFields() diff --git a/src/Elements/InstagramElement.php b/src/Elements/InstagramElement.php index b45998b..e1bf98a 100755 --- a/src/Elements/InstagramElement.php +++ b/src/Elements/InstagramElement.php @@ -45,9 +45,9 @@ class InstagramElement extends BaseElement 'DisplayGallery' => true, ]; - public function getType() + public function getType(): string { - return self::$singular_name; + return _t(__CLASS__ . '.BlockType', self::$singular_name); } /** @@ -89,7 +89,7 @@ class InstagramElement extends BaseElement foreach ($attributes as $name => $value) { if ($value === true) { $value = $name; - } else if (is_scalar($value)) { + } elseif (is_scalar($value)) { $value = (string) $value; } else { $value = json_encode($value); diff --git a/src/Elements/MapElement.php b/src/Elements/MapElement.php index b3c9d2a..04389cb 100755 --- a/src/Elements/MapElement.php +++ b/src/Elements/MapElement.php @@ -50,7 +50,7 @@ class MapElement extends ElementContent public function getType(): string { - return self::$singular_name; + return _t(__CLASS__ . '.BlockType', self::$singular_name); } public function getCMSFields(): FieldList diff --git a/src/Elements/SidebarElement.php b/src/Elements/SidebarElement.php index a216ef9..c780c66 100755 --- a/src/Elements/SidebarElement.php +++ b/src/Elements/SidebarElement.php @@ -29,6 +29,6 @@ class SidebarElement extends BaseElement public function getType(): string { - return self::$singular_name; + return _t(__CLASS__ . '.BlockType', self::$singular_name); } } diff --git a/src/Elements/SliderElement.php b/src/Elements/SliderElement.php index 032c26c..ef17abb 100755 --- a/src/Elements/SliderElement.php +++ b/src/Elements/SliderElement.php @@ -69,9 +69,9 @@ class SliderElement extends ElementSlideshow private $items; - public function getType() + public function getType(): string { - return self::$singular_name; + return _t(__CLASS__ . '.BlockType', self::$singular_name); } protected function ratioSize($size) diff --git a/src/Elements/TeamMembersElement.php b/src/Elements/TeamMembersElement.php index 3ba2f6b..f9f73b8 100755 --- a/src/Elements/TeamMembersElement.php +++ b/src/Elements/TeamMembersElement.php @@ -25,9 +25,9 @@ class TeamMembersElement extends BaseElement private static $description = 'Displays random Team Members'; - public function getType() + public function getType(): string { - return self::$singular_name; + return _t(__CLASS__ . '.BlockType', self::$singular_name); } public function Members() From 01071730da59b470443e25c1821db29b97ed6bab Mon Sep 17 00:00:00 2001 From: Tony Air Date: Mon, 22 Apr 2024 14:09:24 +0200 Subject: [PATCH 3/7] FIX: composer.json --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 369ff6a..a46d004 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ }], "minimum-stability": "dev", "require": { - "silverstripe/cms": "*", + "silverstripe/cms": "^5", "dnadesign/silverstripe-elemental": "*", "dnadesign/silverstripe-elemental-list": "*", "symbiote/silverstripe-gridfieldextensions": "*", From 32d8fa88c3f5a4c3bd796c634a66073a3a3d5bac Mon Sep 17 00:00:00 2001 From: Tony Air Date: Mon, 22 Apr 2024 14:14:10 +0200 Subject: [PATCH 4/7] UPD: remove incompatibles --- src/Elements/MapElement.php | 105 ------------------- src/Elements/SliderElement.php | 186 --------------------------------- src/Models/MapPin.php | 172 ------------------------------ 3 files changed, 463 deletions(-) delete mode 100755 src/Elements/MapElement.php delete mode 100755 src/Elements/SliderElement.php delete mode 100755 src/Models/MapPin.php diff --git a/src/Elements/MapElement.php b/src/Elements/MapElement.php deleted file mode 100755 index 04389cb..0000000 --- a/src/Elements/MapElement.php +++ /dev/null @@ -1,105 +0,0 @@ -remove('HTML'); - - $tab = $fields->findOrMakeTab('Root.MapPins'); - $tab->setTitle('Description'); - $tab->push(HTMLEditorField::create('HTML', 'Content')); - - $fields->addFieldsToTab('Root.Main', [ - NumericField::create('MapZoom', 'Initial Map Zoom (enter a number from 0 to 24)'), - GridField::create( - 'Locations', - 'Locations', - $this->Locations(), - $cfg = GridFieldConfig_RelationEditor::create(100) - ) - ]); - - $cfg->getComponentByType(GridFieldDataColumns::class)->setFieldFormatting([ - 'ShowAtMap' => static function ($v, $obj) { - return $v ? 'YES' : 'NO'; - } - ]); - $cfg->addComponent(new BulkManager()); - - return $fields; - } - - public static function MapAPIKey(): string - { - $type = self::config()->get('map_type'); - - switch ($type) { - case 'mapbox': - $key = MapboxField::getAccessToken(); - break; - case 'google-maps': - $cfg = Config::inst()->get(GoogleMapField::class, 'default_options'); - $key = $cfg['api_key']; - break; - default: - $key = ''; - break; - } - - return $key; - } -} diff --git a/src/Elements/SliderElement.php b/src/Elements/SliderElement.php deleted file mode 100755 index ef17abb..0000000 --- a/src/Elements/SliderElement.php +++ /dev/null @@ -1,186 +0,0 @@ - 'Int', - 'SlidesInRow' => 'Int', - 'ImageOriginalSize' => 'Boolean(0)', - ]; - - private static $extensions = [ - FlexSlider::class, - ]; - - private static $owns = [ - 'Slides', - ]; - - private $items; - - public function getType(): string - { - return _t(__CLASS__ . '.BlockType', self::$singular_name); - } - - protected function ratioSize($size) - { - $count = $this->SlidesInRow; - return ($count > 1) ? $size / $count : $size; - } - - public function getSlideWidth() - { - if ($this->getField('ImageOriginalSize')) { - return null; - } - - return $this->ratioSize(self::config()->get('slide_width')); - } - - public function getSlideHeight() - { - if ($this->getField('ImageOriginalSize')) { - return null; - } - - return $this->ratioSize(self::config()->get('slide_height')); - } - - public function getCMSFields() - { - $fields = parent::getCMSFields(); - - // remove in case you don't need to provide this functionality - $fields->removeByName([ - 'ConfigHD', - 'Animation', - 'Loop', - 'Animate', - 'ThumbnailNav', - 'SliderControlNav', - 'SliderDirectionNav', - 'CarouselControlNav', - 'CarouselDirectionNav', - 'CarouselThumbnailCt', - ]); - - $fields->addFieldsToTab('Root.Settings', [ - CheckboxField::create('ImageOriginalSize', 'Use original image size'), - NumericField::create('Interval', 'Auto-play Interval (sec)'), - NumericField::create('SlidesInRow'), - ]); - - $grid = $fields->dataFieldByName('Slides'); - if ($grid) { - $fields->insertBefore('Slides', LiteralField::create( - 'SlidesNote', - '
Note: to show hidden slide open slide item and uncheck "Hide" checkbox
' - )); - - $config = $grid->getConfig(); - $config->removeComponentsByType(GridField_ActionMenu::class); - - $bulk = new BulkUploader('Image', SlideImage::class, false); - $bulk - ->setUfSetup('setFolderName', 'Uploads/SlideImages'); - //->setUfSetup('getValidator.setAllowedExtensions', ['jpg', 'jpeg', 'png', 'gif']); - $config->addComponent($bulk); - $config->addComponent(new \Colymba\BulkManager\BulkManager()); - - $columns = new GridFieldEditableColumns(); - $columns->setDisplayFields([ - 'Hide' => [ - 'title' => 'Hide it?', - 'field' => CheckboxField::class, - ], - ]); - - $config->addComponent($columns); - } - - return $fields; - } - - /** - * @return mixed - */ - public function getSlideShow() - { - if ($this->items) { - return $this->items; - } - - $date = date('Y-m-d H:i:s'); - $this->items = $this->Slides()->filter([ - 'Hide' => '0', - ])->filterByCallback(static function ($item, $list) use ($date) { - $on = $item->getField('DateOn'); - $off = $item->getField('DateOff'); - - return ($on <= $date) && (!$off || $off > $date); - })->sort('SortOrder'); - - return $this->items; - } - - public function onBeforeWrite() - { - parent::onBeforeWrite(); - - if (!$this->getField('Interval')) { - $this->setField('Interval', 5000); - } - } -} diff --git a/src/Models/MapPin.php b/src/Models/MapPin.php deleted file mode 100755 index d0c560d..0000000 --- a/src/Models/MapPin.php +++ /dev/null @@ -1,172 +0,0 @@ - 'Varchar(255)', - 'ShowAtMap' => 'Boolean(1)', - ]; - - private static $has_one = [ - 'PhoneNumber' => Link::class, - 'Fax' => Link::class, - ]; - - private static $extensions = [ - Addressable::class, - MarkerExtension::class, - Versioned::class, - ]; - - private static $belongs_many_many = [ - 'MapElements' => MapElement::class, - ]; - - private static $default_sort = 'Title ASC, ID DESC'; - - private static $summary_fields = [ - 'Title', - 'Address', - 'ShowAtMap', - ]; - - private static $defaults = [ - 'ShowAtMap' => '1', - 'Suburb' => 'Syracuse', - 'State' => 'NY', - 'Postcode' => '13210', - 'Country' => 'US', - ]; - - public function getCMSFields() - { - $fields = parent::getCMSFields(); - - $fields->removeByName('MapElements'); - - $fields->replaceField( - 'PhoneNumberID', - LinkField::create('PhoneNumber', 'Phone Number', $this, [ - 'types' => ['Phone'] - ]) - ); - - $fields->replaceField( - 'Fax', - LinkField::create('Fax', 'FAX', $this, [ - 'types' => ['Phone'] - ]) - ); - $fields->removeByName(['Map', 'LatLngOverride', 'Lng','Lat']); - - $fields->addFieldsToTab('Root.Main', [ - CheckboxField::create('ShowAtMap', 'Show at the map?'), - CheckboxField::create('LatLngOverride', 'Override Latitude and Longitude?') - ->setDescription('Check this box and save to be able to edit the latitude and longitude manually.'), - MapboxField::create('Map', 'Choose a location', 'Lat', 'Lng'), - ]); - - $this->extend('updateMapPinFields', $fields); - - return $fields; - } - - public function onBeforeWrite() - { - parent::onBeforeWrite(); - - $lng = $this->getField('Lng'); - $lat = $this->getField('Lat'); - - - if (!$this->getField('Country')) { - $this->setField('Country', 'us'); - } - - // geocode - try { - // reverse geocoding get address - if (!$this->hasAddress() && $lng && $lat) { - require_once BASE_PATH . '/app/thirdparty/geocoding-example/php/Mapbox.php'; - $mapbox = new \Mapbox(MapboxField::getAccessToken()); - - // GET Address - $res = $mapbox->reverseGeocode($lng, $lat); - if ($res->success() && $res->getCount()) { - $res = $res->getData(); - if (count($res) && isset($res[0]['place_name'])) { - $details = explode(',', $res[0]['place_name']); - $fields = [ - 'Address', - 'City', - 'State', - //'Country', - ]; - - $n = count($fields); - for ($i = 0; $i < $n; $i++) { - if (!isset($details[$i])) { - continue; - } - - $name = $fields[$i]; - $val = $details[$i]; - - // get postal code - if ($name === 'State') { - $this->setField('PostalCode', substr($val, strrpos($val, ' ')+1)); - } - - $this->setField($name, $val); - } - } - } - } - } catch (\Exception $e) { - } - } -} From 6ed295156f58c68a02d686869d069e6b54f16703 Mon Sep 17 00:00:00 2001 From: Tony Air Date: Mon, 22 Apr 2024 15:39:51 +0200 Subject: [PATCH 5/7] FIX: SS5 API --- src/Extensions/BaseElementEx.php | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/Extensions/BaseElementEx.php b/src/Extensions/BaseElementEx.php index e0977f1..ca5e80e 100755 --- a/src/Extensions/BaseElementEx.php +++ b/src/Extensions/BaseElementEx.php @@ -31,12 +31,15 @@ class BaseElementEx extends DataExtension parent::updateCMSFields($fields); if ($obj->ID) { - $fields->insertBefore(LiteralField::create( - 'AnchorName', - '
' - .'Element Anchor name: #e'.$obj->ID.'' - .'
' - ), 'Title'); + $fields->insertBefore( + 'Title', + LiteralField::create( + 'AnchorName', + '
' + .'Element Anchor name: #e'.$obj->ID.'' + .'
' + ) + ); } $tab = $fields->findOrMakeTab('Root.Settings'); @@ -74,7 +77,7 @@ class BaseElementEx extends DataExtension public function updateCMSEditLink(&$link): void { - if(!method_exists($this->owner, 'inlineEditable')) { + if (!method_exists($this->owner, 'inlineEditable')) { return; } From 31b4f3f367bef391921a6bceafc0f815cfcb9e2f Mon Sep 17 00:00:00 2001 From: Tony Air Date: Mon, 22 Apr 2024 16:29:02 +0200 Subject: [PATCH 6/7] IMPR: Add SliderElement --- src/Elements/SliderElement.php | 186 +++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100755 src/Elements/SliderElement.php diff --git a/src/Elements/SliderElement.php b/src/Elements/SliderElement.php new file mode 100755 index 0000000..032c26c --- /dev/null +++ b/src/Elements/SliderElement.php @@ -0,0 +1,186 @@ + 'Int', + 'SlidesInRow' => 'Int', + 'ImageOriginalSize' => 'Boolean(0)', + ]; + + private static $extensions = [ + FlexSlider::class, + ]; + + private static $owns = [ + 'Slides', + ]; + + private $items; + + public function getType() + { + return self::$singular_name; + } + + protected function ratioSize($size) + { + $count = $this->SlidesInRow; + return ($count > 1) ? $size / $count : $size; + } + + public function getSlideWidth() + { + if ($this->getField('ImageOriginalSize')) { + return null; + } + + return $this->ratioSize(self::config()->get('slide_width')); + } + + public function getSlideHeight() + { + if ($this->getField('ImageOriginalSize')) { + return null; + } + + return $this->ratioSize(self::config()->get('slide_height')); + } + + public function getCMSFields() + { + $fields = parent::getCMSFields(); + + // remove in case you don't need to provide this functionality + $fields->removeByName([ + 'ConfigHD', + 'Animation', + 'Loop', + 'Animate', + 'ThumbnailNav', + 'SliderControlNav', + 'SliderDirectionNav', + 'CarouselControlNav', + 'CarouselDirectionNav', + 'CarouselThumbnailCt', + ]); + + $fields->addFieldsToTab('Root.Settings', [ + CheckboxField::create('ImageOriginalSize', 'Use original image size'), + NumericField::create('Interval', 'Auto-play Interval (sec)'), + NumericField::create('SlidesInRow'), + ]); + + $grid = $fields->dataFieldByName('Slides'); + if ($grid) { + $fields->insertBefore('Slides', LiteralField::create( + 'SlidesNote', + '
Note: to show hidden slide open slide item and uncheck "Hide" checkbox
' + )); + + $config = $grid->getConfig(); + $config->removeComponentsByType(GridField_ActionMenu::class); + + $bulk = new BulkUploader('Image', SlideImage::class, false); + $bulk + ->setUfSetup('setFolderName', 'Uploads/SlideImages'); + //->setUfSetup('getValidator.setAllowedExtensions', ['jpg', 'jpeg', 'png', 'gif']); + $config->addComponent($bulk); + $config->addComponent(new \Colymba\BulkManager\BulkManager()); + + $columns = new GridFieldEditableColumns(); + $columns->setDisplayFields([ + 'Hide' => [ + 'title' => 'Hide it?', + 'field' => CheckboxField::class, + ], + ]); + + $config->addComponent($columns); + } + + return $fields; + } + + /** + * @return mixed + */ + public function getSlideShow() + { + if ($this->items) { + return $this->items; + } + + $date = date('Y-m-d H:i:s'); + $this->items = $this->Slides()->filter([ + 'Hide' => '0', + ])->filterByCallback(static function ($item, $list) use ($date) { + $on = $item->getField('DateOn'); + $off = $item->getField('DateOff'); + + return ($on <= $date) && (!$off || $off > $date); + })->sort('SortOrder'); + + return $this->items; + } + + public function onBeforeWrite() + { + parent::onBeforeWrite(); + + if (!$this->getField('Interval')) { + $this->setField('Interval', 5000); + } + } +} From d08aa69f14f92f3f5b3e146cd61b8623db4d6fa5 Mon Sep 17 00:00:00 2001 From: Tony Air Date: Thu, 25 Apr 2024 17:10:51 +0200 Subject: [PATCH 7/7] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e7c48fb..5fc9e3e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ # silverstripe-elemental-basics + +[![Silverstripe Version](https://img.shields.io/badge/Silverstripe-5.1-005ae1.svg?labelColor=white&logoColor=ffffff&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDEuMDkxIDU4LjU1NSIgZmlsbD0iIzAwNWFlMSIgeG1sbnM6dj0iaHR0cHM6Ly92ZWN0YS5pby9uYW5vIj48cGF0aCBkPSJNNTAuMDE1IDUuODU4bC0yMS4yODMgMTQuOWE2LjUgNi41IDAgMCAwIDcuNDQ4IDEwLjY1NGwyMS4yODMtMTQuOWM4LjgxMy02LjE3IDIwLjk2LTQuMDI4IDI3LjEzIDQuNzg2czQuMDI4IDIwLjk2LTQuNzg1IDI3LjEzbC02LjY5MSA0LjY3NmM1LjU0MiA5LjQxOCAxOC4wNzggNS40NTUgMjMuNzczLTQuNjU0QTMyLjQ3IDMyLjQ3IDAgMCAwIDUwLjAxNSA1Ljg2MnptMS4wNTggNDYuODI3bDIxLjI4NC0xNC45YTYuNSA2LjUgMCAxIDAtNy40NDktMTAuNjUzTDQzLjYyMyA0Mi4wMjhjLTguODEzIDYuMTctMjAuOTU5IDQuMDI5LTI3LjEyOS00Ljc4NHMtNC4wMjktMjAuOTU5IDQuNzg0LTI3LjEyOWw2LjY5MS00LjY3NkMyMi40My0zLjk3NiA5Ljg5NC0uMDEzIDQuMTk4IDEwLjA5NmEzMi40NyAzMi40NyAwIDAgMCA0Ni44NzUgNDIuNTkyeiIvPjwvc3ZnPg==)](https://packagist.org/packages/goldfinch/google-maps) + Some useful elemental blocks ## Usefull UNIX console utilities @@ -20,4 +23,4 @@ https://github.com/ogham/exa ### git diff tool with bat code hightlighting (git show) -https://github.com/dandavison/delta \ No newline at end of file +https://github.com/dandavison/delta