silverstripe-elemental-basics/src/Elements/SliderElement.php

187 lines
5.1 KiB
PHP
Raw Normal View History

2021-06-08 10:38:35 +02:00
<?php
/**
* Created by PhpStorm.
* User: tony
* Date: 6/30/18
* Time: 11:54 PM
*/
namespace A2nt\ElementalBasics\Elements;
2022-04-19 13:50:36 +02:00
use Colymba\BulkUpload\BulkUploader;
2021-06-08 10:38:35 +02:00
use Dynamic\Elements\Flexslider\Elements\ElementSlideshow;
use Dynamic\FlexSlider\Model\SlideImage;
use Dynamic\FlexSlider\ORM\FlexSlider;
2022-04-19 13:50:36 +02:00
use SilverStripe\Assets\Image;
2021-06-08 10:38:35 +02:00
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Forms\CheckboxField;
2022-07-12 13:10:46 +02:00
use SilverStripe\Forms\GridField\GridField_ActionMenu;
2021-06-08 10:38:35 +02:00
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\NumericField;
use SilverStripe\Forms\ReadonlyField;
use Symbiote\GridFieldExtensions\GridFieldEditableColumns;
2022-05-10 13:08:53 +02:00
/**
* Class \A2nt\ElementalBasics\Elements\SliderElement
*
* @property string $Animation
* @property boolean $Loop
* @property boolean $Animate
* @property boolean $ThumbnailNav
* @property boolean $SliderControlNav
* @property boolean $SliderDirectionNav
* @property boolean $CarouselControlNav
* @property boolean $CarouselDirectionNav
* @property int $CarouselThumbnailCt
* @property float $FlexSliderSpeed
* @property int $Interval
* @property int $SlidesInRow
* @property boolean $ImageOriginalSize
* @method \SilverStripe\ORM\DataList|\Dynamic\FlexSlider\Model\SlideImage[] Slides()
* @mixin \Dynamic\FlexSlider\ORM\FlexSlider
*/
2021-06-08 10:38:35 +02:00
class SliderElement extends ElementSlideshow
{
private static $singular_name = 'Slider';
private static $plural_name = 'Sliders';
private static $description = 'Displays slide show';
private static $table_name = 'SliderElement';
private static $slide_width = 2140;
private static $slide_height = 700;
private static $db = [
'Interval' => 'Int',
2022-04-19 13:50:36 +02:00
'SlidesInRow' => 'Int',
2022-04-19 16:31:17 +02:00
'ImageOriginalSize' => 'Boolean(0)',
2021-06-08 10:38:35 +02:00
];
private static $extensions = [
FlexSlider::class,
];
private static $owns = [
'Slides',
];
private $items;
public function getType()
{
return self::$singular_name;
}
2022-04-19 16:31:17 +02:00
protected function ratioSize($size)
{
$count = $this->SlidesInRow;
return ($count > 1) ? $size / $count : $size;
}
2021-06-08 10:38:35 +02:00
public function getSlideWidth()
{
2022-07-12 13:05:53 +02:00
if ($this->getField('ImageOriginalSize')) {
2022-04-19 16:31:17 +02:00
return null;
}
return $this->ratioSize(self::config()->get('slide_width'));
2021-06-08 10:38:35 +02:00
}
public function getSlideHeight()
{
2022-07-12 13:05:53 +02:00
if ($this->getField('ImageOriginalSize')) {
2022-04-19 16:31:17 +02:00
return null;
}
return $this->ratioSize(self::config()->get('slide_height'));
2021-06-08 10:38:35 +02:00
}
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', [
2022-04-19 16:31:17 +02:00
CheckboxField::create('ImageOriginalSize', 'Use original image size'),
2022-04-19 13:50:36 +02:00
NumericField::create('Interval', 'Auto-play Interval (sec)'),
NumericField::create('SlidesInRow'),
2021-06-08 10:38:35 +02:00
]);
$grid = $fields->dataFieldByName('Slides');
if ($grid) {
2022-07-12 13:05:53 +02:00
$fields->insertBefore('Slides', LiteralField::create(
'SlidesNote',
'<div class="alert alert-info">Note: to show hidden slide open slide item and uncheck "Hide" checkbox</div>'
));
2021-06-08 10:38:35 +02:00
$config = $grid->getConfig();
2022-07-12 13:10:46 +02:00
$config->removeComponentsByType(GridField_ActionMenu::class);
2021-06-08 10:38:35 +02:00
2022-04-19 15:19:49 +02:00
$bulk = new BulkUploader('Image', SlideImage::class, false);
2022-04-19 13:50:36 +02:00
$bulk
2022-05-27 17:58:46 +02:00
->setUfSetup('setFolderName', 'Uploads/SlideImages');
2022-07-12 13:05:53 +02:00
//->setUfSetup('getValidator.setAllowedExtensions', ['jpg', 'jpeg', 'png', 'gif']);
2022-04-19 15:19:49 +02:00
$config->addComponent($bulk);
2022-05-02 16:31:32 +02:00
$config->addComponent(new \Colymba\BulkManager\BulkManager());
2022-04-19 13:50:36 +02:00
2021-06-08 10:38:35 +02:00
$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);
}
}
}