Completed
Pull Request — master (#12)
by Simon
06:43
created

PartialUserFormController::setData()   B

Complexity

Conditions 8
Paths 4

Size

Total Lines 33

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 72

Importance

Changes 0
Metric Value
dl 0
loc 33
ccs 0
cts 0
cp 0
rs 8.1475
c 0
b 0
f 0
cc 8
nc 4
nop 1
crap 72
1
<?php
2
3
namespace Firesphere\PartialUserforms\Controllers;
4
5
use Exception;
6
use Firesphere\PartialUserforms\Models\PartialFormSubmission;
7
use Page;
8
use SilverStripe\Control\HTTPRequest;
9
use Firesphere\PartialUserforms\Forms\PasswordForm;
10
use SilverStripe\Control\HTTPResponse;
11
use SilverStripe\Control\HTTPResponse_Exception;
12
use SilverStripe\Control\Middleware\HTTPCacheControlMiddleware;
13
use SilverStripe\Forms\Form;
14
use SilverStripe\ORM\DataObject;
15
use SilverStripe\ORM\FieldType\DBField;
16
use SilverStripe\ORM\FieldType\DBHTMLText;
17
use SilverStripe\UserForms\Control\UserDefinedFormController;
18
use SilverStripe\UserForms\Model\UserDefinedForm;
19
20
/**
21
 * Class PartialUserFormController
22
 *
23
 * @package Firesphere\PartialUserforms\Controllers
24
 */
25
class PartialUserFormController extends UserDefinedFormController
26
{
27
    /**
28
     * @var array
29
     */
30
    private static $url_handlers = [
0 ignored issues
show
Comprehensibility introduced by
Consider using a different property name as you override a private property of the parent class.
Loading history...
31
        '$Key/$Token' => 'partial',
32
    ];
33
    /**
34
     * @var array
35
     */
36
    private static $allowed_actions = [
0 ignored issues
show
Comprehensibility introduced by
Consider using a different property name as you override a private property of the parent class.
Loading history...
37
        'partial',
38
    ];
39
    /**
40
     * @var PartialFormSubmission
41
     */
42
    protected $partialFormSubmission;
43
44
    /**
45 3
     * Partial form
46
     *
47
     * @param HTTPRequest $request
48 3
     * @return HTTPResponse|DBHTMLText|void
49
     * @throws HTTPResponse_Exception
50 3
     * @throws Exception
51 3
     */
52 3
    public function partial(HTTPRequest $request)
53 1
    {
54
        /** @var PartialFormSubmission $partial */
55
        $partial = $this->setData($request);
56
        if ($this->dataRecord->PasswordProtected &&
57 2
            $request->getSession()->get(PasswordForm::PASSWORD_SESSION_KEY) !== $partial->ID
58 2
        ) {
59
            return $this->redirect('verify');
60 2
        }
61
        $record = DataObject::get_by_id($partial->UserDefinedFormClass, $partial->UserDefinedFormID);
0 ignored issues
show
Documentation introduced by
The property UserDefinedFormClass does not exist on object<Firesphere\Partia...\PartialFormSubmission>. 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...
62 2
        /** @var self $controller */
63
        $controller = self::create($record);
64
        $controller->doInit();
65
66
        /** @var Form $form */
67
        $form = $controller->Form();
68
        $fields = $partial->PartialFields()->map('Name', 'Value')->toArray();
69
        $form->loadDataFrom($fields);
70
71
        // Copied from {@link UserDefinedFormController}
72
        if ($controller->Content && $form && !$controller->config()->disable_form_content_shortcode) {
0 ignored issues
show
Documentation introduced by
The property Content does not exist on object<Firesphere\Partia...tialUserFormController>. 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...
73
            $hasLocation = stristr($controller->Content, '$UserDefinedForm');
0 ignored issues
show
Documentation introduced by
The property Content does not exist on object<Firesphere\Partia...tialUserFormController>. 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...
74
            if ($hasLocation) {
75
                /** @see Requirements_Backend::escapeReplacement */
76
                $formEscapedForRegex = addcslashes($form->forTemplate(), '\\$');
77
                $content = preg_replace(
78
                    '/(<p[^>]*>)?\\$UserDefinedForm(<\\/p>)?/i',
79
                    $formEscapedForRegex,
80
                    $controller->Content
0 ignored issues
show
Documentation introduced by
The property Content does not exist on object<Firesphere\Partia...tialUserFormController>. 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...
81
                );
82
83
                return $controller->customise([
84
                    'Content'     => DBField::create_field('HTMLText', $content),
85
                    'Form'        => '',
86
                    'PartialLink' => $partial->getPartialLink()
87
                ])->renderWith([static::class, Page::class]);
88
            }
89
        }
90
91
        return $controller->customise([
92
            'Content'     => DBField::create_field('HTMLText', $controller->Content),
0 ignored issues
show
Documentation introduced by
The property Content does not exist on object<Firesphere\Partia...tialUserFormController>. 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...
93
            'Form'        => $form,
94
            'PartialLink' => $partial->getPartialLink()
95
        ])->renderWith([static::class, Page::class]);
96
    }
97
98
    /**
99
     * A little abstraction to be more readable
100
     *
101
     * @param HTTPRequest $request
102
     * @return PartialFormSubmission|void
103
     * @throws HTTPResponse_Exception
104
     */
105
    public function setData($request)
106
    {
107
        // Ensure this URL doesn't get picked up by HTTP caches
108
        HTTPCacheControlMiddleware::singleton()->disableCache();
109
110
        $key = $request->param('Key');
111
        $token = $request->param('Token');
112
        if (!$key || !$token) {
113
            return $this->httpError(404);
114
        }
115
116
        /** @var PartialFormSubmission $partial */
117
        $partial = PartialFormSubmission::get()->find('Token', $token);
118
        if (!$token ||
119
            !$partial ||
120
            !$partial->UserDefinedFormID ||
121
            !hash_equals($partial->generateKey($token), $key)
122
        ) {
123
            return $this->httpError(404);
124
        }
125
        /** @var UserDefinedForm $dataRecord */
126
        $dataRecord = DataObject::get_by_id($partial->UserDefinedFormClass, $partial->UserDefinedFormID);
0 ignored issues
show
Documentation introduced by
The property UserDefinedFormClass does not exist on object<Firesphere\Partia...\PartialFormSubmission>. 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...
127
        // @todo look at to solve this. Also breaks on CircleCI
128
//        $this->setFailover($dataRecord);
129
        $this->dataRecord = $dataRecord;
130
131
        // Set the session if the last session has expired
132
        if (!$request->getSession()->get(PartialSubmissionController::SESSION_KEY)) {
133
            $request->getSession()->set(PartialSubmissionController::SESSION_KEY, $partial->ID);
134
        }
135
136
        return $partial;
137
    }
138
139
    /**
140
     * @return PartialFormSubmission
141
     */
142
    public function getPartialFormSubmission(): PartialFormSubmission
143
    {
144
        return $this->partialFormSubmission;
145
    }
146
147
    /**
148
     * @param PartialFormSubmission $partialFormSubmission
149
     */
150
    public function setPartialFormSubmission(PartialFormSubmission $partialFormSubmission): void
151
    {
152
        $this->partialFormSubmission = $partialFormSubmission;
153
    }
154
}
155