Completed
Push — master ( 067f41...e7ef92 )
by Damian
02:10
created

code/model/BlogCategory.php (5 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
/**
4
 * A blog category for generalising blog posts.
5
 *
6
 * @package silverstripe
7
 * @subpackage blog
8
 *
9
 * @method Blog Blog()
10
 *
11
 * @property string $URLSegment
12
 * @property int $BlogID
13
 */
14 View Code Duplication
class BlogCategory extends DataObject implements CategorisationObject
15
{
16
17
    /**
18
     * Use an exception code so that attempted writes can continue on
19
     * duplicate errors.
20
     *
21
     * @const string
22
     * This must be a string because ValidationException has decided we can't use int
23
     */
24
    const DUPLICATE_EXCEPTION = "DUPLICATE";
25
26
    /**
27
     * @var array
28
     */
29
    private static $db = array(
30
        'Title' => 'Varchar(255)',
31
    );
32
33
    /**
34
     * @var array
35
     */
36
    private static $has_one = array(
37
        'Blog' => 'Blog',
38
    );
39
40
    /**
41
     * @var array
42
     */
43
    private static $belongs_many_many = array(
44
        'BlogPosts' => 'BlogPost',
45
    );
46
47
    /**
48
     * @var array
49
     */
50
    private static $extensions = array(
51
        'URLSegmentExtension',
52
    );
53
54
    /**
55
     * @return DataList
56
     */
57
    public function BlogPosts()
58
    {
59
        $blogPosts = parent::BlogPosts();
60
61
        $this->extend("updateGetBlogPosts", $blogPosts);
62
63
        return $blogPosts;
64
    }
65
66
    /**
67
     * {@inheritdoc}
68
     */
69
    public function getCMSFields()
70
    {
71
        $fields = new FieldList(
72
            TextField::create('Title', _t('BlogCategory.Title', 'Title'))
73
        );
74
75
        $this->extend('updateCMSFields', $fields);
76
77
        return $fields;
78
    }
79
80
    /**
81
     * {@inheritdoc}
82
     */
83
    protected function validate()
84
    {
85
        $validation = parent::validate();
86
        if($validation->valid()) {
87
            // Check for duplicate categories
88
            $blog = $this->Blog();
89
            if($blog && $blog->exists()) {
90
                $existing = $blog->Categories()->filter('Title', $this->Title);
0 ignored issues
show
The property Title does not exist on object<BlogCategory>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
91
                if($this->ID) {
92
                    $existing = $existing->exclude('ID', $this->ID);
93
                }
94
                if($existing->count() > 0) {
95
                    $validation->error(_t(
96
                        'BlogCategory.Duplicate',
97
                        'A blog category already exists with that name'
98
                    ), BlogCategory::DUPLICATE_EXCEPTION);
99
                }
100
            }
101
        }
102
        return $validation;
103
    }
104
105
    /**
106
     * Returns a relative link to this category.
107
     *
108
     * @return string
109
     */
110
    public function getLink()
111
    {
112
        return Controller::join_links($this->Blog()->Link(), 'category', $this->URLSegment);
113
    }
114
115
    /**
116
     * Inherits from the parent blog or can be overwritten using a DataExtension.
117
     *
118
     * @param null|Member $member
119
     *
120
     * @return bool
121
     */
122
    public function canView($member = null)
123
    {
124
        $extended = $this->extendedCan(__FUNCTION__, $member);
0 ignored issues
show
It seems like $member defined by parameter $member on line 122 can be null; however, DataObject::extendedCan() does not accept null, maybe add an additional type check?

It seems like you allow that null is being passed for a parameter, however the function which is called does not seem to accept null.

We recommend to add an additional type check (or disallow null for the parameter):

function notNullable(stdClass $x) { }

// Unsafe
function withoutCheck(stdClass $x = null) {
    notNullable($x);
}

// Safe - Alternative 1: Adding Additional Type-Check
function withCheck(stdClass $x = null) {
    if ($x instanceof stdClass) {
        notNullable($x);
    }
}

// Safe - Alternative 2: Changing Parameter
function withNonNullableParam(stdClass $x) {
    notNullable($x);
}
Loading history...
125
126
        if ($extended !== null) {
127
            return $extended;
128
        }
129
130
        return $this->Blog()->canView($member);
131
    }
132
133
    /**
134
     * Inherits from the parent blog or can be overwritten using a DataExtension.
135
     *
136
     * @param null|Member $member
137
     *
138
     * @return bool
139
     */
140
    public function canCreate($member = null)
141
    {
142
        $extended = $this->extendedCan(__FUNCTION__, $member);
0 ignored issues
show
It seems like $member defined by parameter $member on line 140 can be null; however, DataObject::extendedCan() does not accept null, maybe add an additional type check?

It seems like you allow that null is being passed for a parameter, however the function which is called does not seem to accept null.

We recommend to add an additional type check (or disallow null for the parameter):

function notNullable(stdClass $x) { }

// Unsafe
function withoutCheck(stdClass $x = null) {
    notNullable($x);
}

// Safe - Alternative 1: Adding Additional Type-Check
function withCheck(stdClass $x = null) {
    if ($x instanceof stdClass) {
        notNullable($x);
    }
}

// Safe - Alternative 2: Changing Parameter
function withNonNullableParam(stdClass $x) {
    notNullable($x);
}
Loading history...
143
144
        if ($extended !== null) {
145
            return $extended;
146
        }
147
148
        $permission = Blog::config()->grant_user_permission;
149
150
        return Permission::checkMember($member, $permission);
151
    }
152
153
    /**
154
     * Inherits from the parent blog or can be overwritten using a DataExtension.
155
     *
156
     * @param null|Member $member
157
     *
158
     * @return bool
159
     */
160
    public function canDelete($member = null)
161
    {
162
        $extended = $this->extendedCan(__FUNCTION__, $member);
0 ignored issues
show
It seems like $member defined by parameter $member on line 160 can be null; however, DataObject::extendedCan() does not accept null, maybe add an additional type check?

It seems like you allow that null is being passed for a parameter, however the function which is called does not seem to accept null.

We recommend to add an additional type check (or disallow null for the parameter):

function notNullable(stdClass $x) { }

// Unsafe
function withoutCheck(stdClass $x = null) {
    notNullable($x);
}

// Safe - Alternative 1: Adding Additional Type-Check
function withCheck(stdClass $x = null) {
    if ($x instanceof stdClass) {
        notNullable($x);
    }
}

// Safe - Alternative 2: Changing Parameter
function withNonNullableParam(stdClass $x) {
    notNullable($x);
}
Loading history...
163
164
        if ($extended !== null) {
165
            return $extended;
166
        }
167
168
        return $this->Blog()->canEdit($member);
169
    }
170
171
    /**
172
     * Inherits from the parent blog or can be overwritten using a DataExtension.
173
     *
174
     * @param null|Member $member
175
     *
176
     * @return bool
177
     */
178
    public function canEdit($member = null)
179
    {
180
        $extended = $this->extendedCan(__FUNCTION__, $member);
0 ignored issues
show
It seems like $member defined by parameter $member on line 178 can be null; however, DataObject::extendedCan() does not accept null, maybe add an additional type check?

It seems like you allow that null is being passed for a parameter, however the function which is called does not seem to accept null.

We recommend to add an additional type check (or disallow null for the parameter):

function notNullable(stdClass $x) { }

// Unsafe
function withoutCheck(stdClass $x = null) {
    notNullable($x);
}

// Safe - Alternative 1: Adding Additional Type-Check
function withCheck(stdClass $x = null) {
    if ($x instanceof stdClass) {
        notNullable($x);
    }
}

// Safe - Alternative 2: Changing Parameter
function withNonNullableParam(stdClass $x) {
    notNullable($x);
}
Loading history...
181
182
        if ($extended !== null) {
183
            return $extended;
184
        }
185
186
        return $this->Blog()->canEdit($member);
187
    }
188
}
189