Issues (2)

src/Extensions/PageExtension.php (1 issue)

1
<?php
2
3
namespace Sunnysideup\SunnysideupThemeBackend\Extensions;
4
5
use SilverStripe\Forms\FieldList;
6
use SilverStripe\Forms\DropdownField;
7
use SilverStripe\Forms\CheckboxField;
8
use SilverStripe\CMS\Model\SiteTree;
9
use SilverStripe\Forms\TextField;
10
use SilverStripe\CMS\Model\SiteTreeExtension;
11
12
use Psr\SimpleCache\CacheInterface;
13
use SilverStripe\Core\Injector\Injector;
14
use SilverStripe\Core\Manifest\ResourceURLGenerator;
15
use SilverStripe\Core\Config\Config;
16
use SilverStripe\Core\Flushable;
17
use SilverStripe\Control\Director;
18
use SilverStripe\Control\Controller;
19
use Sminnee\VerboseFields\VerboseOptionsetField;
20
21
22
class PageExtension extends SiteTreeExtension implements Flushable
23
{
24
25
    public static function flush()
26
    {
27
        $cache = Injector::inst()->get(CacheInterface::class . '.randomImageCache');
28
        $cache->clear();
29
    }
30
31
    private static $image_dir = 'vendor/sunnysideup/sunnysideup-theme-backend/images';
32
33
    protected static $_random_images = null;
34
35
    private static $db = [
36
        'Quote' => 'Varchar',
37
        'VimeoVideoID' => 'Int',
38
        'RandomImage' => 'Varchar(255)',
39
        'DefaultTheme' => 'Enum("sun,moon,rocket", "sun")',
40
        'ShadowOverLogo' => 'Enum("none,light,dark", "none")',
41
        'TitleColour' => 'Enum("natural,yellow,blue", "natural")',
42
    ];
43
44
    public function updateCMSFields(FieldList $fields)
45
    {
46
        $owner = $this->owner;
0 ignored issues
show
The assignment to $owner is dead and can be removed.
Loading history...
47
48
        $fields->addFieldsToTab(
49
            'Root.Theme',
50
            [
51
                DropdownField::create('DefaultTheme', 'Default Theme', $this->getOwner()->dbObject('DefaultTheme')->enumValues())
52
                    ->setEmptyString('--- no specific theme ---'),
53
                DropdownField::create('ShadowOverLogo', 'Shadow over logo', $this->getOwner()->dbObject('ShadowOverLogo')->enumValues()),
54
                DropdownField::create('TitleColour', 'Title Colour', $this->getOwner()->dbObject('TitleColour')->enumValues()),
55
            ]
56
        );
57
58
        $fields->addFieldsToTab(
59
            'Root.Quote',
60
            [
61
                CheckboxField::create('TypeModeForQuote', 'Type it out'),
62
                TextField::create('Quote', 'Quote'),
63
            ]
64
        );
65
66
        $fields->addFieldToTab(
67
            'Root.Video',
68
            TextField::create('VimeoVideoID', 'Vimeo Video ID')
69
        );
70
71
        $fields->addFieldToTab(
72
            'Root.RandomImage',
73
            $this->getSelectRandomImageField()
74
        );
75
76
        return $fields;
77
    }
78
79
    protected function getSelectRandomImageField() : VerboseOptionsetField
80
    {
81
82
        $descriptions = [];
83
        $list = $this->getRandomImages();
84
        $source = array_combine($list, $list);
85
        foreach($list as $image) {
86
            $descriptions[$image] = '<img src="'.$this->getRandomImagesFrontEndFolder() .'/' . $image.'" style="max-width: 300px; max-height: 300px" />';
87
        }
88
89
        return (new VerboseOptionsetField ('RandomImage', 'Random Image (optional)'))
90
            ->setSource($source)
91
            ->setSourceDescriptions($descriptions);
92
    }
93
94
95
    public function getRandomImages() :array
96
    {
97
        if (self::$_random_images === null) {
98
            $cache = Injector::inst()->get(CacheInterface::class . '.randomImageCache');
99
            $files = $cache->get('images');
100
            if ($files) {
101
                $files = explode(',', $files);
102
            }
103
            if (is_array($files) && count($files)) {
104
                //do nothing
105
            } else {
106
                $files = scandir( $this->getRandomImagesFolderAbsolute()) ?? [];
107
                foreach ($files as $key => $file) {
108
                    $ext = pathinfo($file, PATHINFO_EXTENSION);
109
                    if ($ext !== 'jpg') {
110
                        unset($files[$key]);
111
                    }
112
                }
113
                $cache->set('images', implode(',', $files));
114
            }
115
            self::$_random_images = $files;
116
        }
117
        return self::$_random_images;
118
    }
119
120
    public function getRandomImagesFolderAbsolute(): string
121
    {
122
        return Controller::join_links( Director::baseFolder(),  $this->getRandomImageFolder());
123
    }
124
125
    public function getRandomImagesFrontEndFolder() : string
126
    {
127
        return Injector::inst()->get(ResourceURLGenerator::class)->urlForResource($this->getRandomImageFolder());
128
    }
129
130
    public function getRandomImageFolder(): string
131
    {
132
        return Config::inst()->get(PageExtension::class, 'image_dir');
133
    }
134
135
}
136