Completed
Push — master ( 68c466...5f6c38 )
by dotzero
01:53
created

AbstractModel::offsetUnset()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 6
ccs 5
cts 5
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 3
nc 2
nop 1
crap 2
1
<?php
2
3
namespace AmoCRM\Models;
4
5
use AmoCRM\Exception;
6
use AmoCRM\Request\Request;
7
8
/**
9
 * Class AbstractModel
10
 *
11
 * Абстрактный класс для всех моделей
12
 *
13
 * @package AmoCRM\Models
14
 * @author dotzero <[email protected]>
15
 * @link http://www.dotzero.ru/
16
 * @link https://github.com/dotzero/amocrm-php
17
 *
18
 * For the full copyright and license information, please view the LICENSE
19
 * file that was distributed with this source code.
20
 */
21
abstract class AbstractModel extends Request implements \ArrayAccess
22
{
23
    /**
24
     * @var array Список доступный полей для модели (исключая кастомные поля)
25
     */
26
    protected $fields = [];
27
28
    /**
29
     * @var array Список значений полей для модели
30
     */
31
    protected $values = [];
32
33
    /**
34
     * Возвращает называние Модели
35
     *
36
     * @return mixed
37
     */
38 12
    public function __toString()
39
    {
40 12
        return static::class;
41
    }
42
43
    /**
44
     * Определяет, существует ли заданное поле модели
45
     *
46
     * @link http://php.net/manual/en/arrayaccess.offsetexists.php
47
     * @param mixed $offset Название поля для проверки
48
     * @return boolean Возвращает true или false
49
     */
50 1
    public function offsetExists($offset)
51
    {
52 1
        return isset($this->values[$offset]);
53
    }
54
55
    /**
56
     * Возвращает заданное поле модели
57
     *
58
     * @link http://php.net/manual/en/arrayaccess.offsetget.php
59
     * @param mixed $offset Название поля для возврата
60
     * @return mixed Значение поля
61
     */
62 81
    public function offsetGet($offset)
63
    {
64 81
        if (isset($this->values[$offset])) {
65 80
            return $this->values[$offset];
66
        }
67
68 3
        return null;
69
    }
70
71
    /**
72
     * Устанавливает заданное поле модели
73
     *
74
     * Если есть сеттер модели, то будет использовать сеттер
75
     *
76
     * @link http://php.net/manual/en/arrayaccess.offsetset.php
77
     * @param mixed $offset Название поля, которому будет присваиваться значение
78
     * @param mixed $value Значение для присвоения
79
     */
80 98
    public function offsetSet($offset, $value)
81
    {
82 98
        $setter = 'set' . $this->toCamelCase($offset);
83
84 98
        if (method_exists($this, $setter)) {
85 35
            return $this->$setter($value);
86 67
        } elseif (in_array($offset, $this->fields)) {
87 67
            $this->values[$offset] = $value;
88 67
        }
89 67
    }
90
91
    /**
92
     * Удаляет поле модели
93
     *
94
     * @link http://php.net/manual/en/arrayaccess.offsetunset.php
95
     * @param mixed $offset Название поля для удаления
96
     */
97 1
    public function offsetUnset($offset)
98
    {
99 1
        if (isset($this->values[$offset])) {
100 1
            unset($this->values[$offset]);
101 1
        }
102 1
    }
103
104
    /**
105
     * Получение списока значений полей модели
106
     *
107
     * @return array Список значений полей модели
108
     */
109 24
    public function getValues()
110
    {
111 24
        return $this->values;
112
    }
113
114
    /**
115
     * Добавление кастомного поля модели
116
     *
117
     * @param int $id Уникальный идентификатор заполняемого дополнительного поля
118
     * @param mixed $value Значение заполняемого дополнительного поля
119
     * @param mixed $enum Тип дополнительного поля
120
     * @param mixed $subtype Тип подтипа поля
121
     * @return $this
122
     */
123 3
    public function addCustomField($id, $value, $enum = false, $subtype = false)
124
    {
125
        $field = [
126 3
            'id' => $id,
127 3
            'values' => [],
128 3
        ];
129
130 3
        if (!is_array($value)) {
131 3
            $values = [[$value, $enum]];
132 3
        } else {
133 3
            $values = $value;
134
        }
135
136 3
        foreach ($values as $val) {
137 3
            list($value, $enum) = $val;
138
139
            $fieldValue = [
140 3
                'value' => $value,
141 3
            ];
142
143 3
            if ($enum !== false) {
144 3
                $fieldValue['enum'] = $enum;
145 3
            }
146
            
147 3
            if ($subtype !== false) {
148
                $fieldValue['subtype'] = $subtype;
149
            }
150
151 3
            $field['values'][] = $fieldValue;
152 3
        }
153
154 3
        $this->values['custom_fields'][] = $field;
155
156 3
        return $this;
157
    }
158
159
    /**
160
     * Добавление кастомного поля типа мультиселект модели
161
     *
162
     * @param int $id Уникальный идентификатор заполняемого дополнительного поля
163
     * @param mixed $values Значения заполняемого дополнительного поля типа мультиселект
164
     * @return $this
165
     */
166 1
    public function addCustomMultiField($id, $values)
167
    {
168
        $field = [
169 1
            'id' => $id,
170 1
            'values' => [],
171 1
        ];
172
173 1
        if (!is_array($values)) {
174 1
            $values = [$values];
175 1
        }
176
177 1
        $field['values'] = $values;
178
179 1
        $this->values['custom_fields'][] = $field;
180
181 1
        return $this;
182
    }
183
184
    /**
185
     * Проверяет ID на валидность
186
     *
187
     * @param mixed $id ID
188
     * @return bool
189
     * @throws Exception
190
     */
191 13
    protected function checkId($id)
192
    {
193 13
        if (intval($id) != $id || $id < 1) {
194 2
            throw new Exception('Id must be integer and positive');
195
        }
196
197 11
        return true;
198
    }
199
200
    /**
201
     * Приведение under_score к CamelCase
202
     *
203
     * @param string $string Строка
204
     * @return string Строка
205
     */
206 98
    private function toCamelCase($string)
207
    {
208 98
        return str_replace(' ', '', ucwords(str_replace('_', ' ', $string)));
209
    }
210
}
211