Completed
Push — unit-tests-conditions ( fc6a80...b4e1a6 )
by Romain
02:09
created

AbstractConditionItem::validateConditionConfiguration()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 19
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 19
rs 9.2
c 0
b 0
f 0
cc 4
eloc 12
nc 4
nop 0
1
<?php
2
/*
3
 * 2017 Romain CANON <[email protected]>
4
 *
5
 * This file is part of the TYPO3 Formz project.
6
 * It is free software; you can redistribute it and/or modify it
7
 * under the terms of the GNU General Public License, either
8
 * version 3 of the License, or any later version.
9
 *
10
 * For the full copyright and license information, see:
11
 * http://www.gnu.org/licenses/gpl-3.0.html
12
 */
13
14
namespace Romm\Formz\Condition\Items;
15
16
use Romm\ConfigurationObject\Traits\ConfigurationObject\MagicMethodsTrait;
17
use Romm\Formz\Condition\Exceptions\InvalidConditionException;
18
use Romm\Formz\Condition\Parser\Node\ConditionNode;
19
use Romm\Formz\Configuration\Form\Condition\Activation\ActivationInterface;
20
use Romm\Formz\Configuration\Form\Field\Field;
21
use Romm\Formz\Configuration\Form\Field\Validation\Validation;
22
use Romm\Formz\Form\FormObject;
23
use Romm\Formz\Service\ArrayService;
24
25
/**
26
 * This class must be extended by every registered condition item. When it is
27
 * registered, a condition can then be used in the TypoScript configuration for
28
 * fields/validation activation rules.
29
 *
30
 * When you want to create a new condition item, first register it by using the
31
 * function `ConditionFactory::registerConditionType()` inside your
32
 * `ext_localconf.php`. Then, you have to implement the three abstract functions
33
 * of this class:
34
 * - `getCssResult()`
35
 * - `getJavaScriptResult()`
36
 * - `getPhpResult()`
37
 *
38
 * These functions must translate the "meaning" of this condition to the three
39
 * context: CSS, JavaScript and PHP.
40
 *
41
 * If you need more explanation about how this class works, please refer to the
42
 * documentation.
43
 *
44
 * @see \Romm\Formz\Condition\ConditionFactory
45
 * @see \Romm\Formz\Condition\Items\FieldHasValueCondition
46
 * @see \Romm\Formz\Condition\Items\FieldHasErrorCondition
47
 * @see \Romm\Formz\Condition\Items\FieldIsValidCondition
48
 */
49
abstract class AbstractConditionItem implements ConditionItemInterface
50
{
51
    use MagicMethodsTrait;
52
53
    /**
54
     * Contains a list of JavaScript files which will be included whenever this
55
     * condition is used.
56
     *
57
     * Example:
58
     * protected static $javaScriptFiles = [
59
     *     'EXT:formz/Resources/Public/JavaScript/Conditions/Formz.Condition.FieldHasValue.js'
60
     * ];
61
     *
62
     * @var array
63
     */
64
    protected static $javaScriptFiles = [];
65
66
    /**
67
     * @var FormObject
68
     * @disableMagicMethods
69
     */
70
    protected $formObject;
71
72
    /**
73
     * @var ActivationInterface
74
     * @disableMagicMethods
75
     */
76
    protected $activation;
77
78
    /**
79
     * @var ConditionNode
80
     * @disableMagicMethods
81
     */
82
    protected $conditionNode;
83
84
    /**
85
     * @param FormObject $formObject
86
     */
87
    public function attachFormObject(FormObject $formObject)
88
    {
89
        $this->formObject = $formObject;
90
    }
91
92
    /**
93
     * @param ActivationInterface $activation
94
     */
95
    public function attachActivation(ActivationInterface $activation)
96
    {
97
        $this->activation = $activation;
98
    }
99
100
    /**
101
     * @param ConditionNode $conditionNode
102
     */
103
    public function attachConditionNode(ConditionNode $conditionNode)
104
    {
105
        $this->conditionNode = $conditionNode;
106
    }
107
108
    /**
109
     * Returns a generic JavaScript code which uses Formz API to validate a
110
     * condition which was registered in a single JavaScript file (which is
111
     * filled in the `$javaScriptFiles` attribute of the PHP condition class).
112
     *
113
     * @param array $data
114
     * @return string
115
     */
116
    protected function getDefaultJavaScriptCall(array $data)
117
    {
118
        $conditionName = addslashes(get_class($this));
119
        $data = ArrayService::get()->arrayToJavaScriptJson($data);
120
121
        return <<<JS
122
Formz.Condition.validateCondition('$conditionName', form, $data)
123
JS;
124
    }
125
126
    /**
127
     * @return array
128
     */
129
    public function getJavaScriptFiles()
130
    {
131
        return static::$javaScriptFiles;
132
    }
133
134
    /**
135
     * Will launch the condition validation: the child class should implement
136
     * the function `checkConditionConfiguration()` and check if the condition
137
     * can be considered as valid.
138
     *
139
     * If any syntax/configuration error is found, an exception of type
140
     * `InvalidConditionException` must be thrown.
141
     *
142
     * @throws InvalidConditionException
143
     * @return bool
144
     */
145
    final public function validateConditionConfiguration()
146
    {
147
        try {
148
            $this->checkConditionConfiguration();
149
        } catch (InvalidConditionException $exception) {
150
            /** @var Field|Validation $rootObject */
151
            $rootObject = $this->activation->getRootObject();
152
            $conditionName = $this->conditionNode->getConditionName();
153
            $formClassName = $this->formObject->getClassName();
154
155
            if ($rootObject instanceof Field) {
156
                throw InvalidConditionException::invalidFieldConditionConfiguration($conditionName, $rootObject, $formClassName, $exception);
157
            } elseif ($rootObject instanceof Validation) {
158
                throw InvalidConditionException::invalidValidationConditionConfiguration($conditionName, $rootObject, $formClassName, $exception);
159
            }
160
        }
161
162
        return true;
163
    }
164
165
    /**
166
     * @see validateConditionConfiguration()
167
     * @throws InvalidConditionException
168
     * @return bool
169
     */
170
    abstract protected function checkConditionConfiguration();
171
172
    /**
173
     * @return array
174
     */
175
    public function __sleep()
176
    {
177
        $properties = get_object_vars($this);
178
        unset($properties['formObject']);
179
        unset($properties['activation']);
180
        unset($properties['conditionNode']);
181
182
        return array_keys($properties);
183
    }
184
}
185