1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
state.php
См. документацию.
1<?php
2
3namespace Bitrix\Sale\Discount\Preset;
4
5use Bitrix\Main\HttpRequest;
6use Bitrix\Main\Security\Sign\Signer;
7use Bitrix\Main\Type\Dictionary;
8use Bitrix\Main\Web\Json;
9
10final class State extends Dictionary
11{
12 private const STATE_NAME_VAR = '__state';
13 private const CHAIN_NAME_VAR = '__chain';
14 private const STATE_SIGNER_SALT = 'discount.preset.state';
15
16 private Signer $signer;
17
22 public function __construct(array $values = null)
23 {
24 parent::__construct($values);
25
26 $this->setDefaultValues();
27 $this->initSigner();
28 }
29
30 private function setDefaultValues(): void
31 {
32 if (empty($this[self::CHAIN_NAME_VAR]))
33 {
34 $this[self::CHAIN_NAME_VAR] = array();
35 }
36 }
37
38 private function initSigner(): void
39 {
40 $this->signer = new Signer();
41 }
42
43 private function sign(string $data): string
44 {
45 return $this->signer->sign($data, self::STATE_SIGNER_SALT);
46 }
47
48 public function unSign(string $data): string
49 {
50 try
51 {
52 $signedData = $this->signer->unsign($data, self::STATE_SIGNER_SALT);
53 }
55 {
56 die('Bad signature.');
57 }
58
59 return $signedData;
60 }
61
62 public function set($name, $value = null)
63 {
64 parent::set($name, $value);
65
66 $this->setDefaultValues();
67
68 return $this;
69 }
70
71 public function append(array $values): State
72 {
73 foreach ($values as $name => $value)
74 {
75 $this[$name] = $value;
76 }
77
78 return $this;
79 }
80
87 public function get($name, $defaultValue = null)
88 {
89 $value = parent::get($name);
90 if ($defaultValue && is_callable($defaultValue))
91 {
92 return $defaultValue($value);
93 }
94
95 return $value !== null ? $value : $defaultValue;
96 }
97
98 public static function createFromEncodedData($data)
99 {
100 $state = new State;
101
102 if (empty($data))
103 {
104 return $state;
105 }
106
107 $data = $state->unSign($data);
108
109 $data = base64_decode($data);
110 if ($data === false)
111 {
112 return $state;
113 }
114 $data = Json::decode($data);
115
116 return $state->set($data ?: []);
117 }
118
120 {
121 $prevState = self::createFromEncodedData($request->getPost(self::STATE_NAME_VAR));
122
123 $postData = [];
124 foreach ($request->getPostList()->toArray() as $name => $data)
125 {
126 if (is_array($data) && count($data) === 1 && ($data[0] !== '0' && empty($data[0])))
127 {
128 //empty array
129 unset($prevState[$name]);
130 continue;
131 }
132
133 if (is_array($data) && ($data[0] !== '0' && empty($data[0])))
134 {
135 unset($data[0]);
136 }
138 }
139
140 return new State(array_merge($prevState->toArray(), $postData));
141 }
142
143 public function addStepChain($step): State
144 {
145 $chain = $this[self::CHAIN_NAME_VAR];
146 $lastStep = end($chain);
147
148 if ($lastStep != $step)
149 {
150 $chain[] = $step;
151 $this[self::CHAIN_NAME_VAR] = $chain;
152 }
153
154 return $this;
155 }
156
157 public function popStepChain()
158 {
159 $chain = $this[self::CHAIN_NAME_VAR];
160 $step = array_pop($chain);
161
162 $this[self::CHAIN_NAME_VAR] = $chain;
163
164 return $step;
165 }
166
167 public function getPrevStep()
168 {
169 $steps = $this->getStepChain();
170
171 return end($steps);
172 }
173
174 private function getStepChain(): array
175 {
176 return $this->get(self::CHAIN_NAME_VAR, []);
177 }
178
179 public function __toString()
180 {
181 $data = $this->toArray();
182 try
183 {
184 $data = Json::encode($data);
185 }
187 {
188 $data = '';
189 }
190 $value = $this->sign(base64_encode($data));
191
192 return '<input type="hidden" name="' . self::STATE_NAME_VAR . '" value="' . $value . '">';
193 }
194
195 public function toString(): string
196 {
197 return $this->__toString();
198 }
199
200 public function toArray()
201 {
202 $toArray = parent::toArray();
203
204 unset(
205 $toArray['sessid'],
206 $toArray['lang'],
207 $toArray['__next_step'],
208 );
209
210 return $toArray;
211 }
212
213 public function getStepNumber(): int
214 {
215 $countPrevSteps = count($this->getStepChain());
216
217 return $countPrevSteps + 1;
218 }
219}
if($_SERVER $defaultValue['REQUEST_METHOD']==="GET" &&!empty($RestoreDefaults) && $bizprocPerms==="W" &&check_bitrix_sessid())
Определения options.php:32
if(!Loader::includeModule('catalog')) if(!AccessController::getCurrent() ->check(ActionDictionary::ACTION_PRICE_EDIT)) if(!check_bitrix_sessid()) $request
Определения catalog_reindex.php:36
static createFromEncodedData($data)
Определения state.php:98
static createFromRequest(HttpRequest $request)
Определения state.php:119
__construct(array $values=null)
Определения state.php:22
addStepChain($step)
Определения state.php:143
append(array $values)
Определения state.php:71
unSign(string $data)
Определения state.php:48
$data['IS_AVAILABLE']
Определения .description.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$name
Определения menu_edit.php:35
die
Определения quickway.php:367
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$postData
Определения index.php:29