Passed
Pull Request — master (#38)
by
unknown
07:45
created

ElementVirtual::getParentPageCMSEditLink()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 4
c 1
b 0
f 0
dl 0
loc 5
rs 10
cc 1
nc 1
nop 0
1
<?php
2
3
namespace DNADesign\ElementalVirtual\Model;
4
5
use TractorCow\AutoComplete\AutoCompleteField;
6
use SilverStripe\ElementalVirtual\Forms\ElementalGridFieldAddExistingAutocompleter;
0 ignored issues
show
Bug introduced by
The type SilverStripe\ElementalVi...ddExistingAutocompleter was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
7
use DNADesign\Elemental\Models\BaseElement;
8
use SilverStripe\Forms\FieldList;
9
use SilverStripe\Forms\LiteralField;
10
use SilverStripe\Forms\Tab;
11
use SilverStripe\Forms\TabSet;
12
use SilverStripe\ORM\FieldType\DBField;
13
use SilverStripe\ORM\FieldType\DBHTMLText;
14
15
/**
16
 * Virtual Linked Element.
17
 *
18
 * As elemental is based on a natural has_one relation to an object,
19
 * this allows the same element to be linked to multiple pages.
20
 *
21
 * {@see ElementalGridFieldAddExistingAutocompleter}
22
 */
23
class ElementVirtual extends BaseElement
24
{
25
    private static $icon = 'font-icon-block-link';
0 ignored issues
show
introduced by
The private property $icon is not used, and could be removed.
Loading history...
26
27
    private static $has_one = [
0 ignored issues
show
introduced by
The private property $has_one is not used, and could be removed.
Loading history...
28
        'LinkedElement' => BaseElement::class
29
    ];
30
31
    /**
32
     * @var string
33
     */
34
    private static $description = 'Reused element';
0 ignored issues
show
introduced by
The private property $description is not used, and could be removed.
Loading history...
35
36
    private static $table_name = 'ElementVirtual';
0 ignored issues
show
introduced by
The private property $table_name is not used, and could be removed.
Loading history...
37
38
    private static $singular_name = 'virtual block';
0 ignored issues
show
introduced by
The private property $singular_name is not used, and could be removed.
Loading history...
39
40
    /**
41
     * @param BaseElement
42
     * @param boolean $isSingleton
43
     * @param DataModel $model
0 ignored issues
show
Bug introduced by
The type DNADesign\ElementalVirtual\Model\DataModel was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
44
     */
45
    public function __construct($record = null, $isSingleton = false, $model = null)
46
    {
47
        parent::__construct($record, $isSingleton, $model);
0 ignored issues
show
Bug introduced by
It seems like $model can also be of type DNADesign\ElementalVirtual\Model\DataModel; however, parameter $queryParams of SilverStripe\ORM\DataObject::__construct() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

47
        parent::__construct($record, $isSingleton, /** @scrutinizer ignore-type */ $model);
Loading history...
48
49
        $this->LinkedElement()->setVirtualOwner($this);
0 ignored issues
show
Bug introduced by
The method LinkedElement() does not exist on DNADesign\ElementalVirtual\Model\ElementVirtual. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

49
        $this->/** @scrutinizer ignore-call */ 
50
               LinkedElement()->setVirtualOwner($this);
Loading history...
50
    }
51
52
    public function getCMSFields()
53
    {
54
        $invalid = $this->isInvalidPublishState();
55
56
        $this->beforeUpdateCMSFields(function (FieldList $fields) use ($invalid) {
57
            $fields->removeByName('Title');
58
59
            $message = sprintf(
60
                '<p>%s</p><p><a href="%2$s" target="_blank">Click here to edit the original</a></p>',
61
                _t(__CLASS__ . '.VirtualDescription', 'This is a virtual copy of an element.'),
62
                $this->LinkedElement()->getEditLink()
63
            );
64
65
            if ($invalid) {
66
                $warning = _t(
67
                    __CLASS__ . '.InvalidPublishStateWarning',
68
                    'Error: The original element is not published. This element will not work on the live site until you click the link below and publish it.'
69
                );
70
71
                $fields->addFieldToTab('Root.Main', LiteralField::create('WarningHeader', '<p class="message error">' . $warning . '</p>'));
72
            }
73
74
            $autocomplete = AutoCompleteField::create(
75
                'LinkedElementID',
76
                _t(__CLASS__ . '.LinkedElement', 'Linked Element'),
77
                '',
78
                BaseElement::class,
79
                'Title'
80
            );
81
82
            $autocomplete->setLabelField('VirtualLinkedSummary');
83
            $autocomplete->setDisplayField('VirtualLinkedSummary');
84
85
            $fields->replaceField(
86
                'LinkedElementID',
87
                $autocomplete
88
            );
89
            $fields->addFieldToTab('Root.Main', LiteralField::create('Existing', $message));
90
        });
91
92
        return parent::getCMSFields();
93
    }
94
95
    /**
96
     * @return string
97
     */
98
    public function getType()
99
    {
100
        return sprintf(
101
            _t(__CLASS__ . '.BlockType', 'Virtual Block')
102
        );
103
    }
104
105
    /**
106
     * Detect when a user has published a linked element but has not published
107
     * the LinkedElement.
108
     *
109
     * @return boolean
110
     */
111
    public function isInvalidPublishState()
112
    {
113
        $element = $this->LinkedElement();
114
115
        return (!$element->isPublished() && $this->isPublished());
0 ignored issues
show
Bug introduced by
The method isPublished() does not exist on DNADesign\ElementalVirtual\Model\ElementVirtual. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

115
        return (!$element->isPublished() && $this->/** @scrutinizer ignore-call */ isPublished());
Loading history...
116
    }
117
118
    /**
119
     * Get a unique anchor name.
120
     *
121
     * @return string
122
     */
123
    public function getAnchor()
124
    {
125
        $linkedElement = $this->LinkedElement();
126
127
        if ($linkedElement && $linkedElement->exists()) {
128
            return $linkedElement->getAnchor();
129
        }
130
131
        return 'e' . $this->ID;
132
    }
133
134
    /**
135
     * @return string
136
     */
137
    public function getSummary()
138
    {
139
        if ($linked = $this->LinkedElement()) {
140
            return $linked->getSummary();
141
        }
142
    }
143
144
    /**
145
     * @return string
146
     */
147
    public function getTitle()
148
    {
149
        if ($linked = $this->LinkedElement()) {
150
            return $linked->Title;
151
        }
152
    }
153
154
    /**
155
     * Override to render template based on LinkedElement
156
     *
157
     * @return string|null HTML
158
     */
159
    public function forTemplate($holder = true)
160
    {
161
        if ($linked = $this->LinkedElement()) {
162
            return $linked->forTemplate($holder);
163
        }
164
        return null;
165
    }
166
167
    /**
168
     *
169
     */
170
    public function inlineEditable()
171
    {
172
        return false;
173
    }
174
175
    protected function provideBlockSchema()
176
    {
177
        $blockSchema = parent::provideBlockSchema();
178
        $blockSchema['content'] = $this->getSummary();
179
        return $blockSchema;
180
    }
181
182
    public function getParentPageCMSEditLink() {
183
        return DBField::create_field('HTMLText', sprintf(
184
            '<a href="%s" target="_blank">%s</a>',
185
            $this->getPage()->CMSEditLink(),
186
            $this->getPage()->Title
187
        ));
188
    }
189
}
190