1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
productdataprovider.php
См. документацию.
1<?php
2
3namespace Bitrix\Catalog\Filter\DataProvider;
4
5use Bitrix\Catalog\Filter\DataProvider\Currency\CurrencyListItems;
6use Bitrix\Catalog\Filter\DataProvider\Measure\MeasureListItems;
7use Bitrix\Catalog\Filter\DataProvider\Settings\ProductSettings;
8use Bitrix\Catalog\Filter\PrefixableDataProviderTrait;
9use Bitrix\Catalog\ProductTable;
10use Bitrix\Iblock\Filter\DataProvider\Element\ElementFilterFields;
11use Bitrix\Iblock\Filter\DataProvider\ElementDataProvider;
12use Bitrix\Main\Filter\Field;
13use Bitrix\Main\Loader;
14use Bitrix\Main\Localization\Loc;
15use Bitrix\Main\UI\Filter\Type;
16
17Loader::requireModule('iblock');
18
23{
24 use MeasureListItems;
25 use CurrencyListItems;
26 use PrefixableDataProviderTrait;
27
28 private const VARIATION_PREFIX = 'VARIATION_';
29
30 private ?ElementFilterFields $variationFields;
31
32 public function __construct(ProductSettings $settings)
33 {
34 parent::__construct($settings);
35
36 $variationIblockId = $settings->getVariationIblockId();
37 if ($variationIblockId > 0)
38 {
39 $this->variationFields = new ElementFilterFields($variationIblockId, false, false);
40 }
41 }
42
43 private function isWithVariations(): bool
44 {
45 return isset($this->variationFields);
46 }
47
48 public function prepareFields()
49 {
50 $result = parent::prepareFields();
51
52 $result['TYPE'] = $this->createField('TYPE', [
53 'type' => 'list',
54 'default' => false,
55 'partial' => true,
56 ]);
57 $result['AVAILABLE'] = $this->createField('AVAILABLE', [
58 'type' => 'checkbox',
59 'default' => false,
60 ]);
61 $result['QUANTITY'] = $this->createField('QUANTITY', [
62 'type' => 'number',
63 'default' => false,
64 ]);
65 $result['QUANTITY_RESERVED'] = $this->createField('QUANTITY_RESERVED', [
66 'type' => 'number',
67 'default' => false,
68 ]);
69 $result['PURCHASING_PRICE'] = $this->createField('PURCHASING_PRICE', [
70 'type' => 'number',
71 'default' => false,
72 ]);
73 $result['PURCHASING_CURRENCY'] = $this->createField('PURCHASING_CURRENCY', [
74 'type' => 'list',
75 'default' => false,
76 'partial' => true,
77 ]);
78 $result['WEIGHT'] = $this->createField('WEIGHT', [
79 'type' => 'number',
80 'default' => false,
81 ]);
82 $result['WIDTH'] = $this->createField('WIDTH', [
83 'type' => 'number',
84 'default' => false,
85 ]);
86 $result['LENGTH'] = $this->createField('LENGTH', [
87 'type' => 'number',
88 'default' => false,
89 ]);
90 $result['HEIGHT'] = $this->createField('HEIGHT', [
91 'type' => 'number',
92 'default' => false,
93 ]);
94 $result['MEASURE'] = $this->createField('MEASURE', [
95 'type' => 'list',
96 'default' => false,
97 'partial' => true,
98 ]);
99
100 if ($this->isWithVariations())
101 {
102 $result += $this->prepareVariationElementFields();
103 }
104
105 return $result;
106 }
107
113 private function prepareVariationElementFields(): array
114 {
115 $result = [];
116
117 /*
118 $fields = $this->variationFields->getElementFieldsParams();
119 foreach ($fields as $id => $params)
120 {
121 $result[$id] = $this->createField($id, $params);
122 }
123 */
124
125 $properties = $this->variationFields->getElementPropertiesParams();
126 foreach ($properties as $id => $params)
127 {
128 $result[$id] = $this->createField($id, $params);
129 }
130
131 $nameWithPrefixTemplate = Loc::getMessage('CATALOG_FILTER_PRODUCT_DATAPROVIDER_NAME_WITH_PREFIX');
132
133 return $this->prepareFieldsByPrefix(self::VARIATION_PREFIX, $result, $nameWithPrefixTemplate);
134 }
135
139 public function prepareFieldData($fieldID)
140 {
141 if ($fieldID === 'PURCHASING_CURRENCY')
142 {
143 return [
144 'items' => $this->getCurrencyListItems(),
145 ];
146 }
147 elseif ($fieldID === 'MEASURE')
148 {
149 return [
150 'items' => $this->getMeasureListItems(),
151 ];
152 }
153 elseif ($fieldID === 'TYPE')
154 {
155 return [
156 'items' => ProductTable::getProductTypes(true),
157 'params' => [
158 'multiple' => true,
159 ],
160 ];
161 }
162
163 $result = parent::prepareFieldData($fieldID);
164 if (isset($result))
165 {
166 return $result;
167 }
168
169 if ($this->isWithVariations())
170 {
171 return $this->prepareVariationFieldData($fieldID);
172 }
173
174 return null;
175 }
176
177 private function prepareVariationFieldData(string $fieldIdWithPrefix): ?array
178 {
179 $fieldID = $this->removePrefix(self::VARIATION_PREFIX, $fieldIdWithPrefix);
180
181 return $this->variationFields->getPropertyDescription($fieldID);
182 }
183
187 protected function getFieldName($fieldID)
188 {
189 return Loc::getMessage('CATALOG_FILTER_PRODUCT_DATAPROVIDER_FIELD_' . $fieldID) ?? parent::getFieldName($fieldID);
190 }
191
195 public function prepareFilterValue(array $rawFilterValue): array
196 {
197 $rawFilterValue = parent::prepareFilterValue($rawFilterValue);
198
199 if (!$this->isWithVariations() || empty($rawFilterValue))
200 {
201 return $rawFilterValue;
202 }
203
204 [$variationFilterValue, $rawFilterValue] = $this->splitPrefixFilterValues(self::VARIATION_PREFIX, $rawFilterValue);
205
206 if (!empty($variationFilterValue))
207 {
208 $variationFilterValue = $this->variationFields->prepareFilterValue($variationFilterValue);
209
210 $settings = $this->getSettings();
211 $variationFilterValue['IBLOCK_ID'] = $settings->getVariationIblockId();
212 $rawFilterValue['SUBQUERY'] = [
213 'FIELD' => 'PROPERTY_' . $settings->getLinkPropertyId(),
214 'FILTER' => $variationFilterValue,
215 ];
216 unset($settings);
217 }
218
219 return $rawFilterValue;
220 }
221}
static getProductTypes($descr=false)
Определения product.php:824
createField($fieldID, array $params=null)
Определения entitydataprovider.php:26
static requireModule($moduleName)
Определения loader.php:174
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799