Completed
Pull Request — master (#17)
by Jason
11:16
created

BaseElementObject::canCreate()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2.032

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 8
ccs 4
cts 5
cp 0.8
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 2
crap 2.032
1
<?php
2
3
namespace Dynamic\BaseObject\Model;
4
5
use DNADesign\Elemental\Forms\TextCheckboxGroupField;
6
use DNADesign\Elemental\Models\BaseElement;
7
use Sheadawson\Linkable\Forms\LinkField;
8
use Sheadawson\Linkable\Models\Link;
9
use SilverStripe\Assets\Image;
10
use SilverStripe\CMS\Model\SiteTree;
11
use SilverStripe\Control\Director;
12
use SilverStripe\Forms\CheckboxField;
13
use SilverStripe\Forms\FieldList;
14
use SilverStripe\Forms\TextField;
15
use SilverStripe\ORM\DataObject;
16
use SilverStripe\ORM\ValidationResult;
17
use SilverStripe\Security\Permission;
18
use SilverStripe\Versioned\Versioned;
19
20
/**
21
 * Class BaseElementObject.
22
 *
23
 * @property string $Title
24
 * @property boolean $ShowTitle
25
 * @property string $Content
26
 *
27
 * @property int $ImageID
28
 * @property int $ElementLinkID
29
 *
30
 * @method Image Image()
31
 * @method Link ElementLink()
32
 *
33
 * @mixin Versioned
34
 */
35
class BaseElementObject extends DataObject
36
{
37
    /**
38
     * @var array
39
     */
40
    private static $db = array(
41
        'Title' => 'Varchar(255)',
42
        'ShowTitle' => 'Boolean',
43
        'Content' => 'HTMLText',
44
    );
45
46
    /**
47
     * @var array
48
     */
49
    private static $has_one = array(
50
        'Image' => Image::class,
51
        'ElementLink' => Link::class,
52
    );
53
54
    /**
55
     * @var array
56
     */
57
    private static $owns = array(
58
        'Image',
59
    );
60
61
    /**
62
     * @var string
63
     */
64
    private static $default_sort = 'Title ASC';
65
66
    /**
67
     * @var array
68
     */
69
    private static $summary_fields = array(
70
        'Image.CMSThumbnail' => 'Image',
71
        'Title' => 'Title',
72
    );
73
74
    /**
75
     * @var array
76
     */
77
    private static $searchable_fields = array(
78
        'Title' => array(
79
            'title' => 'Headline',
80
        ),
81
        'Content' => array(
82
            'title' => 'Description',
83
        ),
84
    );
85
86
    /**
87
     * @var array
88
     */
89
    private static $extensions = [
90
        Versioned::class,
91
    ];
92
93
    /**
94
     * Adds Publish button.
95
     *
96
     * @var bool
97
     */
98
    private static $versioned_gridfield_extensions = true;
99
100
    /**
101
     * @var string
102
     */
103
    private static $table_name = 'BaseElementObject';
104
105
    /**
106
     * @return FieldList
107
     *
108
     * @throws \Exception
109
     */
110
    public function getCMSFields()
111
    {
112 1
        $this->beforeUpdateCMSFields(function ($fields) {
113
            /** @var FieldList $fields */
114 1
            $fields->replaceField(
115 1
                'ElementLinkID',
116 1
                LinkField::create('ElementLinkID', _t(__CLASS__.'.LinkLabel', 'Link'))
117 1
                    ->setDescription(_t(__CLASS__.'.LinkDescription', 'optional. Add a call to action link.')
118 1
            );
0 ignored issues
show
Bug introduced by
A parse error occurred: Syntax error, unexpected ';', expecting ',' or ')' on line 118 at column 13
Loading history...
119
            $fields->insertBefore($fields->dataFieldByName('ElementLinkID'), 'Content');
120 1
121
            $fields->removeByName(array(
122 1
                'ElementFeaturesID',
123 1
                'Sort',
124
            ));
125
126
            // Add a combined field for "Title" and "Displayed" checkbox in a Bootstrap input group
127
            $fields->removeByName('ShowTitle');
128 1
            $fields->replaceField(
129 1
                'Title',
130 1
                TextCheckboxGroupField::create()
131 1
                    ->setName(_t(__CLASS__.'TitleLabel','Title'))
132 1
            );
133
134
            $image = $fields->dataFieldByName('Image')
135 1
                ->setTitle(_t(__CLASS__.'.ImageLabel', 'Image'))
136 1
                ->setDescription(_t(__CLASS__.'.ImageDescription','optional. Display an image with this feature.'))
137 1
                ->setFolderName('Uploads/Elements/Objects');
138 1
            $fields->insertBefore($image, 'Content');
139
140 1
            $fields->dataFieldByName('Content')
141 1
                ->setTitle(_t(__CLASS__.'.ContentLabel', 'Content'))
142 1
                ->setRows(8);
143 1
        });
144 1
145
        return parent::getCMSFields();
146 1
    }
147
148
    /**
149
     * @return SiteTree|null
150
     */
151
    public function getPage()
152 4
    {
153
        $page = Director::get_current_page();
154 4
        // because $page can be a SiteTree or Controller
155
        return $page instanceof SiteTree ? $page : null;
156 4
    }
157
158
    /**
159
     * Basic permissions, defaults to page perms where possible.
160
     *
161
     * @param \SilverStripe\Security\Member|null $member
162
     * @return boolean
163
     */
164
    public function canView($member = null)
165 1
    {
166
        $extended = $this->extendedCan(__FUNCTION__, $member);
167 1
        if ($extended !== null) {
168 1
            return $extended;
169
        }
170
171
        if ($page = $this->getPage()) {
172 1
            return $page->canView($member);
173
        }
174
175
        return Permission::check('CMS_ACCESS', 'any', $member);
176 1
    }
177
178
    /**
179
     * Basic permissions, defaults to page perms where possible.
180
     *
181
     * @param \SilverStripe\Security\Member|null $member
182
     *
183
     * @return boolean
184
     */
185
    public function canEdit($member = null)
186 1
    {
187
        $extended = $this->extendedCan(__FUNCTION__, $member);
188 1
        if ($extended !== null) {
189 1
            return $extended;
190
        }
191
192
        if ($page = $this->getPage()) {
193 1
            return $page->canEdit($member);
194
        }
195
196
        return Permission::check('CMS_ACCESS', 'any', $member);
197 1
    }
198
199
    /**
200
     * Basic permissions, defaults to page perms where possible.
201
     *
202
     * Uses archive not delete so that current stage is respected i.e if a
203
     * element is not published, then it can be deleted by someone who doesn't
204
     * have publishing permissions.
205
     *
206
     * @param \SilverStripe\Security\Member|null $member
207
     *
208
     * @return boolean
209
     */
210
    public function canDelete($member = null)
211 1
    {
212
        $extended = $this->extendedCan(__FUNCTION__, $member);
213 1
        if ($extended !== null) {
214 1
            return $extended;
215
        }
216
217
        if ($page = $this->getPage()) {
218 1
            return $page->canArchive($member);
219
        }
220
221
        return Permission::check('CMS_ACCESS', 'any', $member);
222 1
    }
223
224
    /**
225
     * Basic permissions, defaults to page perms where possible.
226
     *
227
     * @param \SilverStripe\Security\Member|null $member
228
     * @param array $context
229
     *
230
     * @return boolean
231
     */
232
    public function canCreate($member = null, $context = array())
233 1
    {
234
        $extended = $this->extendedCan(__FUNCTION__, $member);
235 1
        if ($extended !== null) {
236 1
            return $extended;
237
        }
238
239
        return Permission::check('CMS_ACCESS', 'any', $member);
240 1
    }
241
}
242