Bitrix-D7 22.2
Загрузка...
Поиск...
Не найдено
Класс Price
+ Граф наследования:Price:

Открытые члены

 fetch (Main\Text\Converter $converter=null)
 

Открытые статические члены

static getTabletClassName ()
 
static recountPricesFromBase ($id)
 
static clearSettings ()
 
static getEntity ()
 
static getList (array $parameters)
 
static getRow (array $parameters)
 
static clearCache ()
 
static add (array $data)
 
static update ($id, array $data)
 
static delete ($id)
 
static setCacheItem ($id, array $row)
 
static getCacheItem ($id, bool $load=false)
 
static clearCacheItem ($id)
 
static getTabletFieldNames (int $fields=self::FIELDS_MAIN)
 
static getCachedFieldList ()
 
static getCallbackRestEvent ()
 

Поля данных

const PREFIX_OLD = 'OLD_'
 
const EVENT_ON_BUILD_CACHED_FIELD_LIST = 'OnBuildCachedFieldList'
 
const FIELDS_MAIN = 0x0001
 
const FIELDS_UF = 0x0002
 
const FIELDS_ALL = self::FIELDS_MAIN|self::FIELDS_UF
 

Защищенные члены

 getTablet ()
 

Защищенные статические члены

static getDefaultCachedFieldList ()
 
static prepareForAdd (ORM\Data\AddResult $result, $id, array &$data)
 
static prepareForUpdate (ORM\Data\UpdateResult $result, $id, array &$data)
 
static runAddExternalActions ($id, array $data)
 
static runUpdateExternalActions ($id, array $data)
 
static runDeleteExternalActions ($id)
 
static deleteNoDemands ($id)
 
static normalize (array &$data)
 
static prepareFloatValue ($value)
 
static prepareIntValue ($value)
 
static prepareStringValue ($value)
 

Подробное описание

См. определение в файле price.php строка 13

Методы

◆ add()

static add ( array  $data)
staticinherited

Add entity item. Use instead of DataManager method.

Аргументы
array$data
Возвращает
ORM\Data\AddResult

См. определение в файле entity.php строка 150

151 {
152 $result = new ORM\Data\AddResult();
153
154 $entity = static::getEntity();
155
156 static::normalize($data);
157
158 if (Event::existEventHandlers($entity, ORM\Data\DataManager::EVENT_ON_BEFORE_ADD))
159 {
160 $event = new Event(
161 $entity,
162 ORM\Data\DataManager::EVENT_ON_BEFORE_ADD,
163 $data
164 );
165 $event->send();
166
167 $event->mergeData($data);
168 if ($event->getErrors($result))
169 return $result;
170 }
171
172 static::prepareForAdd($result, null, $data);
173 if (!$result->isSuccess())
174 return $result;
175 unset($result);
176
177 if (Event::existEventHandlers($entity, ORM\Data\DataManager::EVENT_ON_ADD))
178 {
179 $event = new Event(
180 $entity,
181 ORM\Data\DataManager::EVENT_ON_ADD,
182 $data
183 );
184 $event->send();
185 unset($event);
186 }
187
188 $result = $entity->getTablet()->add($data['fields']);
189 $success = $result->isSuccess();
190 if ($success)
191 {
192 $data['fields'] = $result->getData();
193 if ($entity->fieldsCount > 0)
194 $entity->setEntityCacheItem((int)$result->getId(), $result->getData(), false);
195 }
196
197 if (Event::existEventHandlers($entity, ORM\Data\DataManager::EVENT_ON_AFTER_ADD))
198 {
199 $event = new Event(
200 $entity,
201 ORM\Data\DataManager::EVENT_ON_AFTER_ADD,
202 [
203 'id' => $result->getId(),
204 'fields' => $data['fields'],
205 'external_fields' => $data['external_fields'],
206 'actions' => $data['actions'],
207 'success' => $success
208 ]
209 );
210 $event->send();
211 unset($event);
212 }
213
214 if ($success && !empty($data['actions']))
215 static::runAddExternalActions($result->getId(), $data);
216
217 unset($success, $entity);
218
219 return $result;
220 }

◆ clearCache()

static clearCache ( )
staticinherited

Clear all cache for entity.

Возвращает
void

См. определение в файле entity.php строка 139

139 : void
140 {
141 static::getEntity()->clearEntityCache();
142 }

◆ clearCacheItem()

static clearCacheItem (   $id)
staticinherited

Clear item cache. Do not use without good reason.

Аргументы
int$id
Возвращает
void @noinspection PhpUnused

См. определение в файле entity.php строка 411

411 : void
412 {
413 $id = (int)$id;
414 if ($id <= 0)
415 return;
416 static::getEntity()->clearEntityCacheItem($id);
417 }

◆ clearSettings()

static clearSettings ( )
static

Переопределяет метод предка Entity.

См. определение в файле price.php строка 746

746 : void
747 {
748 parent::clearSettings();
749
750 self::$separateSkuMode = null;
751 self::$basePriceType = null;
752 self::$priceTypes = null;
753 self::$extraList = null;
754 }

◆ delete()

static delete (   $id)
staticinherited

Delete entity item. Use instead of DataManager method.

Аргументы
int$id
Возвращает
ORM\Data\DeleteResult

Переопределяется в Product.

См. определение в файле entity.php строка 317

317 : ORM\Data\DeleteResult
318 {
319 $result = new ORM\Data\DeleteResult();
320
321 $entity = static::getEntity();
322
323 if (Event::existEventHandlers($entity, ORM\Data\DataManager::EVENT_ON_BEFORE_DELETE))
324 {
325 $event = new Event(
326 $entity,
327 ORM\Data\DataManager::EVENT_ON_BEFORE_DELETE,
328 ['id' => $id]
329 );
330 $event->send();
331
332 if ($event->getErrors($result))
333 return $result;
334 }
335
336 if (Event::existEventHandlers($entity, ORM\Data\DataManager::EVENT_ON_DELETE))
337 {
338 $event = new Event(
339 $entity,
340 ORM\Data\DataManager::EVENT_ON_DELETE,
341 ['id' => $id]
342 );
343 $event->send();
344 unset($event);
345 }
346
347 if ($entity->fieldsCount > 0 && !isset($entity->cache[$id]))
348 $entity->loadEntityCacheItem($id);
349
350 $result = $entity->getTablet()->delete($id);
351 $success = $result->isSuccess();
352 if ($success)
353 $entity->expireEntityCacheItem((int)$id);
354
355 if (Event::existEventHandlers($entity, ORM\Data\DataManager::EVENT_ON_AFTER_DELETE))
356 {
357 $event = new Event(
358 $entity,
359 ORM\Data\DataManager::EVENT_ON_AFTER_DELETE,
360 ['id' => $id, 'success' => $success]
361 );
362 $event->send();
363 unset($event);
364 }
365
366 if ($success)
367 static::runDeleteExternalActions($id);
368
369 unset($success, $entity);
370
371 return $result;
372 }

◆ deleteNoDemands()

static deleteNoDemands (   $id)
staticprotectedinherited

Delete entity item without entity events (tablet events only).

Аргументы
int$id
Возвращает
ORM\Data\DeleteResult
Исключения
Main

ObjectNotFoundException

См. определение в файле entity.php строка 534

534 : ORM\Data\DeleteResult
535 {
536 $entity = static::getEntity();
537
538 if ($entity->fieldsCount > 0 && !isset($entity->cache[$id]))
539 $entity->loadEntityCacheItem($id);
540
541 $result = $entity->getTablet()->delete($id);
542 if ($result->isSuccess())
543 {
544 if ($entity->fieldsCount > 0)
545 $entity->expireEntityCacheItem((int)$id);
546 static::runDeleteExternalActions($id);
547 }
548
549 unset($entity);
550
551 return $result;
552 }

◆ fetch()

fetch ( Main\Text\Converter  $converter = null)
inherited

Entity fetch. Work with entity change cache.

Аргументы
Main\Text\Converter | null$converter
Возвращает
array|false

См. определение в файле entity.php строка 112

113 {
114 if ($this->result === null)
115 return false;
116 $row = $this->result->fetch($converter);
117 if (!$row)
118 {
119 $this->result = null;
120 $this->fetchCutMask = [];
121 return false;
122 }
123 if (empty($this->fields))
124 return $row;
125 if (!isset($row['ID']))
126 return $row;
127
128 $this->setEntityCacheItem((int)$row['ID'], $row, true);
129 if (!empty($this->fetchCutMask))
130 $row = array_diff_key($row, $this->fetchCutMask);
131 return $row;
132 }

◆ getCachedFieldList()

static getCachedFieldList ( )
staticinherited

Returns fields list in cache.

Возвращает
array

См. определение в файле entity.php строка 465

465 : array
466 {
467 $entity = static::getEntity();
468 return $entity->fields;
469 }

◆ getCacheItem()

static getCacheItem (   $id,
bool  $load = false 
)
staticinherited

Returns item cache.

Аргументы
int$id
bool$load
Возвращает
array|null

См. определение в файле entity.php строка 396

396 : ?array
397 {
398 $id = (int)$id;
399 if ($id <= 0)
400 return null;
401 return static::getEntity()->getEntityCacheItem($id, $load);
402 }

◆ getCallbackRestEvent()

static getCallbackRestEvent ( )
staticinherited

См. определение в файле entity.php строка 822

822 : array
823 {
824 return [Main\Rest\Event::class, 'processItemEvent'];
825 }

◆ getDefaultCachedFieldList()

static getDefaultCachedFieldList ( )
staticprotected

Returns product price default fields list for caching.

Возвращает
array

Переопределяет метод предка Entity.

См. определение в файле price.php строка 46

46 : array
47 {
48 return [
49 'ID',
50 'PRODUCT_ID',
51 'CATALOG_GROUP_ID',
52 'PRICE',
53 'CURRENCY'
54 ];
55 }

◆ getEntity()

static getEntity ( )
staticinherited

Returns entity class.

Возвращает
Entity

См. определение в файле entity.php строка 56

56 : Entity
57 {
58 $className = get_called_class();
59 if (empty(self::$entity[$className]))
60 {
61 $entity = new static;
62 self::$entity[$className] = $entity;
63 }
64
65 return self::$entity[$className];
66 }

◆ getList()

static getList ( array  $parameters)
staticinherited

Entity getList with change cache. Need for use before add/update/delete entity row.

Аргументы
array$parameters
Возвращает
Entity
Исключения
Main

ArgumentException

Исключения
Main

ObjectNotFoundException

Исключения
Main

ObjectPropertyException

Исключения
Main

SystemException

Переопределяется в Shipment, ShipmentItem, BasketPropertyItem, BasketPropertyItemBase, EntityPropertyValue, Payment, Order, OrderBase и ShipmentItemStore.

См. определение в файле entity.php строка 78

78 : Entity
79 {
80 $entity = static::getEntity();
81 $parameters = $entity->prepareTabletQueryParameters($parameters);
82 $entity->result = $entity->getTablet()->getList($parameters);
83
84 return $entity;
85 }

◆ getRow()

static getRow ( array  $parameters)
staticinherited

Entity getRow with change cache. Wrapper for entity getList.

Аргументы
array$parameters
Возвращает
array|null
Исключения
Main

ArgumentException

Исключения
Main

ObjectNotFoundException

Исключения
Main

ObjectPropertyException

Исключения
Main

SystemException

См. определение в файле entity.php строка 97

97 : ?array
98 {
99 $parameters['limit'] = 1;
100 $result = static::getList($parameters);
101 $row = $result->fetch();
102
103 return (is_array($row) ? $row : null);
104 }

◆ getTablet()

getTablet ( )
protectedinherited

Returns entity table object.

Возвращает
ORM\Data\DataManager
Исключения
Main

ObjectNotFoundException

См. определение в файле entity.php строка 477

477 : ORM\Data\DataManager
478 {
479 if (!($this->tablet instanceof ORM\Data\DataManager))
480 throw new Main\ObjectNotFoundException(sprintf(
481 'Tablet not found in entity `%s`',
482 get_class($this)
483 ));
484 return $this->tablet;
485 }

◆ getTabletClassName()

static getTabletClassName ( )
static

Returns price tablet name.

Возвращает
string

Переопределяет метод предка Entity.

См. определение в файле price.php строка 36

36 : string
37 {
38 return '\Bitrix\Catalog\PriceTable';
39 }

◆ getTabletFieldNames()

static getTabletFieldNames ( int  $fields = self::FIELDS_MAIN)
staticinherited

Returns list of tablet field names, include user fields.

Аргументы
int$fields
Возвращает
array

См. определение в файле entity.php строка 435

435 : array
436 {
437 $result = [];
438 $entity = static::getEntity();
439 if ($fields & self::FIELDS_MAIN)
440 {
441 $result = array_keys($entity->tabletFields);
442 }
443 if ($fields & self::FIELDS_UF)
444 {
445 $list = array_keys($entity->tabletUserFields);
446 if (!empty($list))
447 {
448 $result = (empty($result)
449 ? $list
450 : array_merge($result, $list)
451 );
452 }
453 unset($list);
454 }
455
456 unset($entity);
457 return $result;
458 }

◆ normalize()

static normalize ( array &  $data)
staticprotectedinherited

Normalize data before prepare. Convert fields list into complex structure.

Аргументы
array&$data
Возвращает
void

См. определение в файле entity.php строка 560

560 : void
561 {
562 $result = [
563 'fields' => [],
564 'external_fields' => [],
565 'actions' => []
566 ];
567
568 if (isset($data['fields']) && is_array($data['fields']))
569 {
570 $result['fields'] = $data['fields'];
571 if (isset($data['external_fields']) && is_array($data['external_fields']))
572 $result['external_fields'] = $data['external_fields'];
573 if (isset($data['actions']) && is_array($data['actions']))
574 $result['actions'] = $data['actions'];
575 }
576 else
577 {
578 $result['fields'] = $data;
579 }
580
581 $data = $result;
582 unset($result);
583 }

◆ prepareFloatValue()

static prepareFloatValue (   $value)
staticprotectedinherited

См. определение в файле entity.php строка 974

974 : ?float
975 {
976 if ($value === null)
977 {
978 return null;
979 }
980
981 $result = null;
982 if (is_string($value))
983 {
984 if ($value !== '' && is_numeric($value))
985 {
986 $value = (float)$value;
987 if (is_finite($value))
988 {
989 $result = $value;
990 }
991 }
992 }
993 else
994 {
995 if (is_int($value))
996 {
997 $value = (float)$value;
998 }
999 if (
1000 is_float($value) && is_finite($value)
1001 )
1002 {
1003 $result = $value;
1004 }
1005 }
1006
1007 return $result;
1008 }

◆ prepareForAdd()

static prepareForAdd ( ORM\Data\AddResult  $result,
  $id,
array &  $data 
)
staticprotected

Check and modify fields before add product price. Need for entity automation.

Аргументы
ORM\Data\AddResult$result
int | null$id
array&$data
Возвращает
void

Переопределяет метод предка Entity.

См. определение в файле price.php строка 152

152 : void
153 {
154 $fields = $data['fields'];
155 parent::prepareForAdd($result, $id, $fields);
156 if (!$result->isSuccess())
157 return;
158
159 if (self::$separateSkuMode === null)
160 {
161 self::loadSettings();
162 }
163
164 static $defaultValues = null,
165 $blackList = null;
166
167 if ($defaultValues === null)
168 {
169 $defaultValues = [
170 'PRODUCT_ID' => 0,
171 'CATALOG_GROUP_ID' => 0,
172 'EXTRA_ID' => null,
173 'PRICE' => null,
174 'CURRENCY' => null,
175 'QUANTITY_FROM' => null,
176 'QUANTITY_TO' => null,
177 'TMP_ID' => null
178 ];
179
180 $blackList = [
181 'ID' => true
182 ];
183 }
184
185 $fields = array_merge($defaultValues, array_diff_key($fields, $blackList));
186
187 $fields['PRODUCT_ID'] = (int)$fields['PRODUCT_ID'];
188 if ($fields['PRODUCT_ID'] <= 0)
189 {
190 $result->addError(new ORM\EntityError(
191 Loc::getMessage('BX_CATALOG_MODEL_PRICE_ERR_WRONG_PRODUCT_ID')
192 ));
193 return;
194 }
195 $fields['CATALOG_GROUP_ID'] = (int)$fields['CATALOG_GROUP_ID'];
196 if (!isset(self::$priceTypes[$fields['CATALOG_GROUP_ID']]))
197 {
198 $result->addError(new ORM\EntityError(
199 Loc::getMessage('BX_CATALOG_MODEL_PRICE_ERR_WRONG_CATALOG_GROUP_ID')
200 ));
201 return;
202 }
203 else
204 {
205 if ($fields['CATALOG_GROUP_ID'] == self::$basePriceType)
206 {
207 $fields['EXTRA_ID'] = null;
208 if (isset($data['actions']['OLD_RECOUNT']))
209 {
210 if ($data['actions']['OLD_RECOUNT'] === true)
211 $data['actions']['PARENT_PRICE'] = true;
212 }
213 }
214 }
215
216 if ($fields['TMP_ID'] !== null)
217 $fields['TMP_ID'] = mb_substr($fields['TMP_ID'], 0, 40);
218
219 static::checkQuantityRange($result, $fields);
220
221 if ($fields['EXTRA_ID'] !== null)
222 {
223 $fields['EXTRA_ID'] = (int)$fields['EXTRA_ID'];
224 if (!isset(self::$extraList[$fields['EXTRA_ID']]))
225 {
226 unset($fields['EXTRA_ID']);
227 }
228 else
229 {
230 if (
231 (!isset($fields['PRICE']) && !isset($fields['CURRENCY']))
232 || (isset($data['actions']['OLD_RECOUNT']) && $data['actions']['OLD_RECOUNT'] === true)
233 )
234 self::calculatePriceFromBase(null, $fields);
235 }
236 }
237
238 if ($fields['PRICE'] === null)
239 {
240 $result->addError(new ORM\EntityError(
241 Loc::getMessage('BX_CATALOG_MODEL_PRICE_ERR_WRONG_PRICE')
242 ));
243 }
244 else
245 {
246 $fields['PRICE'] = self::checkPriceValue($fields['PRICE']);
247 if ($fields['PRICE'] === null || $fields['PRICE'] < 0)
248 {
249 $result->addError(new ORM\EntityError(
250 Loc::getMessage('BX_CATALOG_MODEL_PRICE_ERR_WRONG_PRICE')
251 ));
252 }
253 }
254 $fields['CURRENCY'] = (string)$fields['CURRENCY'];
255 if (!Currency\CurrencyManager::isCurrencyExist($fields['CURRENCY']))
256 {
257 $result->addError(new ORM\EntityError(
258 Loc::getMessage('BX_CATALOG_MODEL_PRICE_ERR_WRONG_CURRENCY')
259 ));
260 }
261
262 if ($result->isSuccess())
263 {
264 $fields['TIMESTAMP_X'] = new Main\Type\DateTime();
265 if (isset($fields['PRICE_SCALE']))
266 $fields['PRICE_SCALE'] = self::checkPriceValue($fields['PRICE_SCALE']);
267 // self::checkPriceValue return float or null
268 if (!isset($fields['PRICE_SCALE']))
269 {
270 //TODO: replace CCurrency::GetByID to d7 cached method
271 $currency = \CCurrency::GetByID($fields['CURRENCY']);
272 $fields['PRICE_SCALE'] = $fields['PRICE']*$currency['CURRENT_BASE_RATE'];
273 unset($currency);
274 }
275
276 if (isset($data['actions']['PARENT_PRICE']))
277 unset($data['actions']['PARENT_PRICE']);
278 if (!self::$separateSkuMode)
279 {
280 $product = Product::getCacheItem($fields['PRODUCT_ID'], true);
281 if (!empty($product) && $product['TYPE'] == Catalog\ProductTable::TYPE_OFFER)
282 $data['actions']['PARENT_PRICE'] = true;
283 unset($product);
284 }
285 if (isset($data['actions']['RECOUNT_PRICES']))
286 {
287 if ($fields['CATALOG_GROUP_ID'] != self::$basePriceType)
288 unset($data['actions']['RECOUNT_PRICES']);
289 else
290 $data['actions']['RECOUNT_PRICES'] = true;
291 }
292
293 $data['fields'] = $fields;
294 }
295
296 unset($fields);
297 }
static getCacheItem($id, bool $load=false)
Definition: entity.php:396
static getMessage($code, $replace=null, $language=null)
Definition: loc.php:29

◆ prepareForUpdate()

static prepareForUpdate ( ORM\Data\UpdateResult  $result,
  $id,
array &  $data 
)
staticprotected

Check and modify fields before update product price. Need for entity automation.

Аргументы
ORM\Data\UpdateResult$result
int$id
array&$data
Возвращает
void

Переопределяет метод предка Entity.

См. определение в файле price.php строка 307

307 : void
308 {
309 $id = (int)$id;
310 if ($id <= 0)
311 {
312 $result->addError(new ORM\EntityError(
313 Loc::getMessage('BX_CATALOG_MODEL_PRICE_ERR_WRONG_PRICE_ID')
314 ));
315 return;
316 }
317
318 if (self::$separateSkuMode === null)
319 {
320 self::loadSettings();
321 }
322
323 $fields = $data['fields'];
324 parent::prepareForUpdate($result, $id, $fields);
325 if (!$result->isSuccess())
326 return;
327
328 $blackList = [
329 'ID' => true
330 ];
331
332 $fields = array_diff_key($fields, $blackList);
333
334 if (array_key_exists('PRODUCT_ID', $fields))
335 {
336 $fields['PRODUCT_ID'] = (int)$fields['PRODUCT_ID'];
337 if ($fields['PRODUCT_ID'] <= 0)
338 $result->addError(new ORM\EntityError(
339 Loc::getMessage('BX_CATALOG_MODEL_PRICE_ERR_WRONG_PRODUCT_ID')
340 ));
341 }
342
343 if (array_key_exists('CATALOG_GROUP_ID', $fields))
344 {
345 $fields['CATALOG_GROUP_ID'] = (int)$fields['CATALOG_GROUP_ID'];
346 if (!isset(self::$priceTypes[$fields['CATALOG_GROUP_ID']]))
347 {
348 $result->addError(new ORM\EntityError(
349 Loc::getMessage('BX_CATALOG_MODEL_PRICE_ERR_WRONG_CATALOG_GROUP_ID')
350 ));
351 }
352 else
353 {
354 if ($fields['CATALOG_GROUP_ID'] == self::$basePriceType)
355 {
356 $fields['EXTRA_ID'] = null;
357 if (isset($data['actions']['OLD_RECOUNT']))
358 {
359 if ($data['actions']['OLD_RECOUNT'] === true)
360 $data['actions']['PARENT_PRICE'] = true;
361 }
362 }
363 }
364 }
365
366 if (isset($fields['TMP_ID']))
367 $fields['TMP_ID'] = mb_substr($fields['TMP_ID'], 0, 40);
368
369 $existQuantityFrom = array_key_exists('QUANTITY_FROM', $fields);
370 $existQuantityTo = array_key_exists('QUANTITY_TO', $fields);
371 if ($existQuantityFrom != $existQuantityTo)
372 {
373 if ($existQuantityFrom)
374 $result->addError(new ORM\EntityError(
375 Loc::getMessage('BX_CATALOG_MODEL_PRICE_ERR_QUANTITY_RANGE_LEFT_BORDER_ONLY')
376 ));
377 else
378 $result->addError(new ORM\EntityError(
379 Loc::getMessage('BX_CATALOG_MODEL_PRICE_ERR_QUANTITY_RANGE_RIGHT_BORDER_ONLY')
380 ));
381 }
382 else
383 {
384 if ($existQuantityFrom)
385 static::checkQuantityRange($result, $fields);
386 }
387 unset($existQuantityTo, $existQuantityFrom);
388
389 if (isset($fields['EXTRA_ID']))
390 {
391 $fields['EXTRA_ID'] = (int)$fields['EXTRA_ID'];
392 if (!isset(self::$extraList[$fields['EXTRA_ID']]))
393 {
394 $result->addError(new ORM\EntityError(
395 Loc::getMessage('BX_CATALOG_MODEL_PRICE_ERR_WRONG_EXTRA_ID')
396 ));
397 }
398 else
399 {
400 if (
401 (!isset($fields['PRICE']) && !isset($fields['CURRENCY']))
402 || (isset($data['actions']['OLD_RECOUNT']) && $data['actions']['OLD_RECOUNT'] === true)
403 )
404 self::calculatePriceFromBase($id, $fields);
405 }
406 }
407
408 if (array_key_exists('PRICE', $fields))
409 {
410 $fields['PRICE'] = self::checkPriceValue($fields['PRICE']);
411 if ($fields['PRICE'] === null || $fields['PRICE'] < 0)
412 {
413 $result->addError(new ORM\EntityError(
414 Loc::getMessage('BX_CATALOG_MODEL_PRICE_ERR_WRONG_PRICE')
415 ));
416 }
417 }
418
419 if (array_key_exists('CURRENCY', $fields))
420 {
421 $fields['CURRENCY'] = (string)$fields['CURRENCY'];
422 if (!Currency\CurrencyManager::isCurrencyExist($fields['CURRENCY']))
423 {
424 $result->addError(new ORM\EntityError(
425 Loc::getMessage('BX_CATALOG_MODEL_PRICE_ERR_WRONG_CURRENCY')
426 ));
427 }
428 }
429
430 if ($result->isSuccess())
431 {
432 if (isset($data['actions']['PARENT_PRICE']))
433 unset($data['actions']['PARENT_PRICE']);
434
435 $priceScale = !isset($fields['PRICE_SCALE']) && (isset($fields['PRICE']) || isset($fields['CURRENCY']));
436 $needCalculatePrice = (
437 !self::$separateSkuMode
438 && (
439 isset($fields['PRODUCT_ID'])
440 || isset($fields['CATALOG_GROUP_ID'])
441 || isset($fields['PRICE'])
442 || isset($fields['CURRENCY'])
443 )
444 );
445 $recountPrices = isset($data['actions']['RECOUNT_PRICES']);
446
447 $copyFields = [];
448 if ($priceScale || $needCalculatePrice || $recountPrices)
449 $copyFields = array_merge(static::getCacheItem($id, true), $fields);
450
451 if (isset($fields['PRICE_SCALE']))
452 {
453 $fields['PRICE_SCALE'] = self::checkPriceValue($fields['PRICE_SCALE']);
454 if ($fields['PRICE_SCALE'] === null || $fields['PRICE_SCALE'] < 0)
455 unset($fields['PRICE_SCALE']);
456 }
457 if (!isset($fields['PRICE_SCALE']))
458 {
459 if (isset($fields['PRICE']) || isset($fields['CURRENCY']))
460 {
461 //TODO: replace CCurrency::GetByID to d7 cached method
462 $currency = \CCurrency::GetByID($copyFields['CURRENCY']);
463 $fields['PRICE_SCALE'] = $copyFields['PRICE']*$currency['CURRENT_BASE_RATE'];
464 unset($currency);
465 }
466 }
467 if ($needCalculatePrice)
468 {
469 $product = Product::getCacheItem($copyFields['PRODUCT_ID'], true);
470 if (!empty($product) && $product['TYPE'] == Catalog\ProductTable::TYPE_OFFER)
471 $data['actions']['PARENT_PRICE'] = true;
472 unset($product);
473 }
474 if (isset($data['actions']['RECOUNT_PRICES']))
475 {
476 if ($copyFields['CATALOG_GROUP_ID'] != self::$basePriceType)
477 unset($data['actions']['RECOUNT_PRICES']);
478 else
479 $data['actions']['RECOUNT_PRICES'] = true;
480 }
481
482 unset($copyFields);
483
484 $data['fields'] = $fields;
485 }
486 unset($fields);
487 }

◆ prepareIntValue()

static prepareIntValue (   $value)
staticprotectedinherited

См. определение в файле entity.php строка 1010

1010 : ?int
1011 {
1012 if ($value === null)
1013 {
1014 return null;
1015 }
1016
1017 $result = null;
1018 if (is_string($value))
1019 {
1020 if ($value !== '' && is_numeric($value))
1021 {
1022 $result = (int)$value;
1023 }
1024 }
1025 elseif (is_int($value))
1026 {
1027 $result = $value;
1028 }
1029
1030 return $result;
1031 }

◆ prepareStringValue()

static prepareStringValue (   $value)
staticprotectedinherited

См. определение в файле entity.php строка 1033

1033 : ?string
1034 {
1035 if (is_string($value))
1036 {
1037 return trim($value) ?: null;
1038 }
1039
1040 return null;
1041 }

◆ recountPricesFromBase()

static recountPricesFromBase (   $id)
static

См. определение в файле price.php строка 57

57 : bool
58 {
59 $id = (int)$id;
60 if ($id <= 0)
61 return false;
62
63 if (self::$separateSkuMode === null)
64 {
65 self::loadSettings();
66 }
67
68 if (empty(self::$extraList) || self::$basePriceType == 0)
69 {
70 return false;
71 }
72
73 $iterator = Catalog\PriceTable::getList([
74 'select' => ['ID', 'PRODUCT_ID', 'CATALOG_GROUP_ID', 'PRICE', 'CURRENCY', 'QUANTITY_FROM', 'QUANTITY_TO'],
75 'filter' => ['=ID' => $id]
76 ]);
77 $price = $iterator->fetch();
78 unset($iterator);
79 if (empty($price))
80 return false;
81
82 $price['CATALOG_GROUP_ID'] = (int)$price['CATALOG_GROUP_ID'];
83 if ($price['CATALOG_GROUP_ID'] != self::$basePriceType)
84 return false;
85
86 $productId = (int)$price['PRODUCT_ID'];
87 $product = Product::getCacheItem($productId, true);
88 if (empty($product))
89 return false;
90
91 if (
92 !self::$separateSkuMode
93 && ($product['TYPE'] == Catalog\ProductTable::TYPE_SKU || $product['TYPE'] == Catalog\ProductTable::TYPE_EMPTY_SKU)
94 )
95 return false;
96
97 //TODO: replace CCurrency::GetByID to d7 cached method
98 $currency = \CCurrency::GetByID($price['CURRENCY']);
99 if (empty($currency))
100 return false;
101
102 $filter = ORM\Query\Query::filter();
103 $filter->where('PRODUCT_ID', '=', $productId);
104 $filter->where('CATALOG_GROUP_ID', '!=', self::$basePriceType);
105 $filter->whereIn('EXTRA_ID', array_keys(self::$extraList));
106 if ($price['QUANTITY_FROM'] === null)
107 $filter->whereNull('QUANTITY_FROM');
108 else
109 $filter->where('QUANTITY_FROM', '=', (int)$price['QUANTITY_FROM']);
110
111 if ($price['QUANTITY_TO'] === null)
112 $filter->whereNull('QUANTITY_TO');
113 else
114 $filter->where('QUANTITY_TO', '=', (int)$price['QUANTITY_TO']);
115
116 $datetime = new Main\Type\DateTime();
117 $updatePriceTypes = [];
118 $iterator = Catalog\PriceTable::getList([
119 'select' => ['ID', 'EXTRA_ID', 'CATALOG_GROUP_ID', 'QUANTITY_FROM', 'QUANTITY_TO'],
120 'filter' => $filter
121 ]);
122 while ($row = $iterator->fetch())
123 {
124 $fields = [
125 'PRICE' => $price['PRICE']*self::$extraList[$row['EXTRA_ID']],
126 'CURRENCY' => $price['CURRENCY'],
127 'TIMESTAMP_X' => $datetime
128 ];
129 $fields['PRICE_SCALE'] = $fields['PRICE']*$currency['CURRENT_BASE_RATE'];
130
131 $result = Catalog\PriceTable::update($row['ID'], $fields);
132 if ($result->isSuccess())
133 $updatePriceTypes[$row['CATALOG_TYPE_ID']] = $row['CATALOG_TYPE_ID'];
134 }
135 unset($result, $fields, $currency, $index);
136 unset($row, $iterator);
137
138 if (!empty($updatePriceTypes) && $product['TYPE'] == Catalog\ProductTable::TYPE_OFFER)
139 Catalog\Product\Sku::calculatePrice($productId, null, Catalog\ProductTable::TYPE_OFFER, $updatePriceTypes);
140
141 return true;
142 }

◆ runAddExternalActions()

static runAddExternalActions (   $id,
array  $data 
)
staticprotected

Run core automation after add product price.

Аргументы
int$id
array$data
Возвращает
void

Переопределяет метод предка Entity.

См. определение в файле price.php строка 496

496 : void
497 {
498 if (isset($data['actions']['RECOUNT_PRICES']))
499 {
500 self::recountPricesFromBase($id);
501 }
502 if (isset($data['actions']['PARENT_PRICE']))
503 {
504 Catalog\Product\Sku::calculatePrice(
505 $data['fields']['PRODUCT_ID'],
506 null,
508 [0 => $data['fields']['CATALOG_GROUP_ID']]
509 );
510 }
511 self::updateProductModificationTime($data['fields']['PRODUCT_ID']);
512 }

◆ runDeleteExternalActions()

static runDeleteExternalActions (   $id)
staticprotected

Run core automation after delete product price.

Аргументы
int$id
Возвращает
void

Переопределяет метод предка Entity.

См. определение в файле price.php строка 562

562 : void
563 {
564 $price = self::getCacheItem($id);
565 $product = Product::getCacheItem($price[self::PREFIX_OLD.'PRODUCT_ID']);
566 if (!empty($product) && $product['TYPE'] == Catalog\ProductTable::TYPE_OFFER)
567 {
568 Catalog\Product\Sku::calculatePrice(
569 $price[self::PREFIX_OLD.'PRODUCT_ID'],
570 null,
572 [0 => $price[self::PREFIX_OLD.'CATALOG_GROUP_ID']]
573 );
574 }
575 if (!empty($product))
576 {
577 self::updateProductModificationTime($price[self::PREFIX_OLD.'PRODUCT_ID']);
578 }
579 unset($product, $price);
580 }

◆ runUpdateExternalActions()

static runUpdateExternalActions (   $id,
array  $data 
)
staticprotected

Run core automation after update product price.

Аргументы
int$id
array$data
Возвращает
void

Переопределяет метод предка Entity.

См. определение в файле price.php строка 521

521 : void
522 {
523 $price = self::getCacheItem($id);
524 if (isset($data['actions']['RECOUNT_PRICES']))
525 {
526 self::recountPricesFromBase($id);
527 }
528 if (isset($data['actions']['PARENT_PRICE']))
529 {
530 $priceTypes = [0 => $price['CATALOG_GROUP_ID']];
531 if (
532 isset($price[self::PREFIX_OLD.'CATALOG_GROUP_ID'])
533 && $price[self::PREFIX_OLD.'CATALOG_GROUP_ID'] != $price['CATALOG_GROUP_ID']
534 )
535 $priceTypes[] = $price[self::PREFIX_OLD.'CATALOG_GROUP_ID'];
536 Catalog\Product\Sku::calculatePrice(
537 $price['PRODUCT_ID'], null, Catalog\ProductTable::TYPE_OFFER, $priceTypes);
538 if (
539 isset($price[self::PREFIX_OLD.'PRODUCT_ID'])
540 && $price[self::PREFIX_OLD.'PRODUCT_ID'] != $price['PRODUCT_ID']
541 )
542 Catalog\Product\Sku::calculatePrice($price[self::PREFIX_OLD.'PRODUCT_ID'], null, null, $priceTypes);
543 unset($priceTypes);
544 }
545 self::updateProductModificationTime($price['PRODUCT_ID']);
546 if (
547 isset($price[self::PREFIX_OLD.'PRODUCT_ID'])
548 && $price[self::PREFIX_OLD.'PRODUCT_ID'] != $price['PRODUCT_ID']
549 )
550 {
551 self::updateProductModificationTime($price[self::PREFIX_OLD.'PRODUCT_ID']);
552 }
553 unset($price);
554 }

◆ setCacheItem()

static setCacheItem (   $id,
array  $row 
)
staticinherited

Fill item cache data. Do not use without good reason.

Аргументы
int$id
array$row
Возвращает
void

См. определение в файле entity.php строка 381

381 : void
382 {
383 $id = (int)$id;
384 if ($id <= 0 || empty($row))
385 return;
386 static::getEntity()->setEntityCacheItem($id, $row, false);
387 }

◆ update()

static update (   $id,
array  $data 
)
staticinherited

Update entity item. Use instead of DataManager method.

Аргументы
int$id
array$data
Возвращает
ORM\Data\UpdateResult

См. определение в файле entity.php строка 229

230 {
231 $result = new ORM\Data\UpdateResult();
232
233 $entity = static::getEntity();
234
235 static::normalize($data);
236
237 if (Event::existEventHandlers($entity, ORM\Data\DataManager::EVENT_ON_BEFORE_UPDATE))
238 {
239 $event = new Event(
240 $entity,
241 ORM\Data\DataManager::EVENT_ON_BEFORE_UPDATE,
242 [
243 'id' => $id,
244 'fields' => $data['fields'],
245 'external_fields' => $data['external_fields'],
246 'actions' => $data['actions']
247 ]
248 );
249 $event->send();
250
251 $event->mergeData($data);
252 if ($event->getErrors($result))
253 return $result;
254 }
255
256 static::prepareForUpdate($result, $id, $data);
257 if (!$result->isSuccess())
258 return $result;
259 unset($result);
260
261 if (Event::existEventHandlers($entity, ORM\Data\DataManager::EVENT_ON_UPDATE))
262 {
263 $event = new Event(
264 $entity,
265 ORM\Data\DataManager::EVENT_ON_UPDATE,
266 [
267 'id' => $id,
268 'fields' => $data['fields'],
269 'external_fields' => $data['external_fields'],
270 'actions' => $data['actions']
271 ]
272 );
273 $event->send();
274 unset($event);
275 }
276
277 $result = $entity->getTablet()->update($id, $data['fields']);
278 $success = $result->isSuccess();
279 if ($success)
280 {
281 $data['fields'] = $result->getData();
282 if ($entity->fieldsCount > 0)
283 $entity->modifyEntityCacheItem($id, $data['fields']);
284 }
285
286 if (Event::existEventHandlers($entity, ORM\Data\DataManager::EVENT_ON_AFTER_UPDATE))
287 {
288 $event = new Event(
289 $entity,
290 ORM\Data\DataManager::EVENT_ON_AFTER_UPDATE,
291 [
292 'id' => $id,
293 'fields' => $data['fields'],
294 'external_fields' => $data['external_fields'],
295 'actions' => $data['actions'],
296 'success' => $success
297 ]
298 );
299 $event->send();
300 unset($event);
301 }
302
303 if ($success && !empty($data['actions']))
304 static::runUpdateExternalActions($id, $data);
305
306 unset($success, $entity);
307
308 return $result;
309 }

Поля

◆ EVENT_ON_BUILD_CACHED_FIELD_LIST

const EVENT_ON_BUILD_CACHED_FIELD_LIST = 'OnBuildCachedFieldList'
inherited

См. определение в файле entity.php строка 15

◆ FIELDS_ALL

const FIELDS_ALL = self::FIELDS_MAIN|self::FIELDS_UF
inherited

См. определение в файле entity.php строка 19

◆ FIELDS_MAIN

const FIELDS_MAIN = 0x0001
inherited

См. определение в файле entity.php строка 17

◆ FIELDS_UF

const FIELDS_UF = 0x0002
inherited

См. определение в файле entity.php строка 18

◆ PREFIX_OLD

const PREFIX_OLD = 'OLD_'
inherited

См. определение в файле entity.php строка 13


Объявления и описания членов класса находятся в файле: