1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
product.php
См. документацию.
1<?php
2
5
6require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/general/product.php");
7
9{
10 /*
11 * Returns list of products ordered with the specific product
12 *
13 * @param int $ID - product id (sku ID or parent product ID are also supported)
14 * @param int $minCNT - number of times products should have been ordered to be returned in the result
15 * @param int $limit - serialized data saved in the database for the record of this type
16 * @param boolean $getParentOnly - return only parent product ID
17 * @return dbres
18 */
19 public static function GetProductList($ID, $minCNT, $limit, $getParentOnly = false)
20 {
21 global $DB;
22
23 $ID = (int)$ID;
24 if ($ID <= 0)
25 return false;
26 $limit = (int)$limit;
27 if ($limit < 0)
28 $limit = 0;
29 $minCNT = (int)$minCNT;
30 if ($minCNT < 0)
31 $minCNT = 0;
32
33 $getParentOnly = ($getParentOnly === true);
34
35 $elementInclude = array($ID);
36 $elementExclude = array();
37
38 if (Loader::includeModule('catalog'))
39 {
40 $intIBlockID = (int)CIBlockElement::GetIBlockByID($ID);
41 if ($intIBlockID == 0)
42 return false;
43
44 $skuInfo = CCatalogSKU::GetInfoByProductIBlock($intIBlockID);
45 if (!empty($skuInfo))
46 {
47 $itemsIterator = CIBlockElement::GetList(
48 array(),
49 array('IBLOCK_ID' => $skuInfo['IBLOCK_ID'], 'PROPERTY_'.$skuInfo['SKU_PROPERTY_ID'] => $ID),
50 false,
51 false,
52 array('ID', 'IBLOCK_ID', 'PROPERTY_'.$skuInfo['SKU_PROPERTY_ID'])
53 );
54 while ($item = $itemsIterator->Fetch())
55 {
56 $item['ID'] = (int)$item['ID'];
57 $elementInclude[] = $item['ID'];
58 $elementExclude[] = $item['ID'];
59 }
60 }
61 }
62
63 if ($getParentOnly)
64 {
65 $strSql = "select PARENT_PRODUCT_ID from b_sale_product2product where PRODUCT_ID IN (".implode(',', $elementInclude).")";
66 if (!empty($elementExclude))
67 $strSql .= " and PARENT_PRODUCT_ID not in (".implode(',', $elementExclude).")";
68 if ($minCNT > 0)
69 $strSql .= " and CNT >= ".$minCNT;
70 $strSql .= ' group by PARENT_PRODUCT_ID';
71 if ($limit > 0)
72 $strSql .= " limit ".$limit;
73 }
74 else
75 {
76 $strSql = "select * from b_sale_product2product where PRODUCT_ID in (".implode(',', $elementInclude).")";
77 if (!empty($elementExclude))
78 $strSql .= " and PARENT_PRODUCT_ID not in (".implode(',', $elementExclude).")";
79 if ($minCNT > 0)
80 $strSql .= " and CNT >= ".$minCNT;
81 $strSql .= " order by CNT desc, PRODUCT_ID asc";
82 if ($limit > 0)
83 $strSql .= " limit ".$limit;
84 }
85 return $DB->Query($strSql);
86 }
87
88 public static function GetBestSellerList($by = "AMOUNT", $arFilter = Array(), $arOrderFilter = Array(), $limit = 0)
89 {
90 global $DB;
91
93 $helper = $connection->getSqlHelper();
94
95 $byQuantity = false;
96 if($by == "QUANTITY")
97 $byQuantity = true;
98
99 $arJoin = array();
100 $arWhere = array();
101 $orderFilter = "";
102 $i = 1;
103
104 if(is_array($arFilter) && count($arFilter) > 0)
105 {
106 foreach($arFilter as $key => $value)
107 {
108 $arJoin[] = "LEFT JOIN b_sale_basket_props p".$i." ON (b.ID = p".$i.".BASKET_ID)";
110 $arWhere[] = " AND p".$i.".CODE = '".$arFilter["field"]."' AND p".$i.".VALUE ".$arFilter["operation"]." ".$arFilter["value"];
111 $i++;
112 }
113 }
114
116 "ID" => array("FIELD_NAME" => "O.ID", "FIELD_TYPE" => "int"),
117 "LID" => array("FIELD_NAME" => "O.LID", "FIELD_TYPE" => "string"),
118 "PERSON_TYPE_ID" => array("FIELD_NAME" => "O.PERSON_TYPE_ID", "FIELD_TYPE" => "int"),
119 "PAYED" => array("FIELD_NAME" => "O.PAYED", "FIELD_TYPE" => "string"),
120 "DATE_PAYED" => array("FIELD_NAME" => "O.DATE_PAYED", "FIELD_TYPE" => "datetime"),
121 "EMP_PAYED_ID" => array("FIELD_NAME" => "O.EMP_PAYED_ID", "FIELD_TYPE" => "int"),
122 "CANCELED" => array("FIELD_NAME" => "O.CANCELED", "FIELD_TYPE" => "string"),
123 "DATE_CANCELED" => array("FIELD_NAME" => "O.DATE_CANCELED", "FIELD_TYPE" => "datetime"),
124 "EMP_CANCELED_ID" => array("FIELD_NAME" => "O.EMP_CANCELED_ID", "FIELD_TYPE" => "int"),
125 "REASON_CANCELED" => array("FIELD_NAME" => "O.REASON_CANCELED", "FIELD_TYPE" => "string"),
126 "STATUS_ID" => array("FIELD_NAME" => "O.STATUS_ID", "FIELD_TYPE" => "string"),
127 "DATE_STATUS" => array("FIELD_NAME" => "O.DATE_STATUS", "FIELD_TYPE" => "datetime"),
128 "PAY_VOUCHER_NUM" => array("FIELD_NAME" => "O.PAY_VOUCHER_NUM", "FIELD_TYPE" => "string"),
129 "PAY_VOUCHER_DATE" => array("FIELD_NAME" => "O.PAY_VOUCHER_DATE", "FIELD_TYPE" => "date"),
130 "EMP_STATUS_ID" => array("FIELD_NAME" => "O.EMP_STATUS_ID", "FIELD_TYPE" => "int"),
131 "PRICE_DELIVERY" => array("FIELD_NAME" => "O.PRICE_DELIVERY", "FIELD_TYPE" => "double"),
132 "ALLOW_DELIVERY" => array("FIELD_NAME" => "O.ALLOW_DELIVERY", "FIELD_TYPE" => "string"),
133 "DATE_ALLOW_DELIVERY" => array("FIELD_NAME" => "O.DATE_ALLOW_DELIVERY", "FIELD_TYPE" => "datetime"),
134 "EMP_ALLOW_DELIVERY_ID" => array("FIELD_NAME" => "O.EMP_ALLOW_DELIVERY_ID", "FIELD_TYPE" => "int"),
135 "PRICE" => array("FIELD_NAME" => "O.PRICE", "FIELD_TYPE" => "double"),
136 "CURRENCY" => array("FIELD_NAME" => "O.CURRENCY", "FIELD_TYPE" => "string"),
137 "DISCOUNT_VALUE" => array("FIELD_NAME" => "O.DISCOUNT_VALUE", "FIELD_TYPE" => "double"),
138 "SUM_PAID" => array("FIELD_NAME" => "O.SUM_PAID", "FIELD_TYPE" => "double"),
139 "USER_ID" => array("FIELD_NAME" => "O.USER_ID", "FIELD_TYPE" => "int"),
140 "PAY_SYSTEM_ID" => array("FIELD_NAME" => "O.PAY_SYSTEM_ID", "FIELD_TYPE" => "int"),
141 "DELIVERY_ID" => array("FIELD_NAME" => "O.DELIVERY_ID", "FIELD_TYPE" => "string"),
142 "DATE_INSERT" => array("FIELD_NAME" => "O.DATE_INSERT", "FIELD_TYPE" => "datetime"),
143 "DATE_INSERT_FORMAT" => array("FIELD_NAME" => "O.DATE_INSERT", "FIELD_TYPE" => "datetime"),
144 "DATE_UPDATE" => array("FIELD_NAME" => "O.DATE_UPDATE", "FIELD_TYPE" => "datetime"),
145 "USER_DESCRIPTION" => array("FIELD_NAME" => "O.USER_DESCRIPTION", "FIELD_TYPE" => "string"),
146 "ADDITIONAL_INFO" => array("FIELD_NAME" => "O.ADDITIONAL_INFO", "FIELD_TYPE" => "string"),
147 "PS_STATUS" => array("FIELD_NAME" => "O.PS_STATUS", "FIELD_TYPE" => "string"),
148 "PS_STATUS_CODE" => array("FIELD_NAME" => "O.PS_STATUS_CODE", "FIELD_TYPE" => "string"),
149 "PS_STATUS_DESCRIPTION" => array("FIELD_NAME" => "O.PS_STATUS_DESCRIPTION", "FIELD_TYPE" => "string"),
150 "PS_STATUS_MESSAGE" => array("FIELD_NAME" => "O.PS_STATUS_MESSAGE", "FIELD_TYPE" => "string"),
151 "PS_SUM" => array("FIELD_NAME" => "O.PS_SUM", "FIELD_TYPE" => "double"),
152 "PS_CURRENCY" => array("FIELD_NAME" => "O.PS_CURRENCY", "FIELD_TYPE" => "string"),
153 "PS_RESPONSE_DATE" => array("FIELD_NAME" => "O.PS_RESPONSE_DATE", "FIELD_TYPE" => "datetime"),
154 "COMMENTS" => array("FIELD_NAME" => "O.COMMENTS", "FIELD_TYPE" => "string"),
155 "TAX_VALUE" => array("FIELD_NAME" => "O.TAX_VALUE", "FIELD_TYPE" => "double"),
156 "STAT_GID" => array("FIELD_NAME" => "O.STAT_GID", "FIELD_TYPE" => "string"),
157 "RECURRING_ID" => array("FIELD_NAME" => "O.RECURRING_ID", "FIELD_TYPE" => "int"),
158 "RECOUNT_FLAG" => array("FIELD_NAME" => "O.RECOUNT_FLAG", "FIELD_TYPE" => "string"),
159 "AFFILIATE_ID" => array("FIELD_NAME" => "O.AFFILIATE_ID", "FIELD_TYPE" => "int"),
160 "DELIVERY_DOC_NUM" => array("FIELD_NAME" => "O.DELIVERY_DOC_NUM", "FIELD_TYPE" => "string"),
161 "DELIVERY_DOC_DATE" => array("FIELD_NAME" => "O.DELIVERY_DOC_DATE", "FIELD_TYPE" => "date"),
162
163 "DEDUCTED" => array("FIELD_NAME" => "O.DEDUCTED", "FIELD_TYPE" => "string"),
164 "DATE_DEDUCTED" => array("FIELD_NAME" => "O.DATE_DEDUCTED", "FIELD_TYPE" => "datetime"),
165 );
166 if (!empty($arOrderFilter) && is_array($arOrderFilter))
167 {
168 $sqlWhere = new CSQLWhere;
169 $sqlWhere->SetFields($arFields);
170 $arJ = array();
171 $orderFilter = $sqlWhere->GetQueryEx($arOrderFilter, $arJ);
172 }
173
174 $strSql = "
175 SELECT
176 b.PRODUCT_ID,
177 b.NAME,
178 " . $helper->getIsNullFunction('b.CATALOG_XML_ID', "''") . " CATALOG_XML_ID,
179 b.PRODUCT_XML_ID,
180 SUM(b.PRICE*b.QUANTITY) as PRICE,
181 AVG(b.PRICE) as AVG_PRICE,
182 SUM(b.QUANTITY) as QUANTITY,
183 b.CURRENCY
184 "
185 ;
186
187 $strSql .= " FROM b_sale_basket b \n";
188
189 foreach($arJoin as $v)
190 $strSql .= $v."\n";
191 if ($orderFilter != '')
192 $strSql .= "INNER JOIN b_sale_order O ON (b.ORDER_ID = O.ID) \n";
193
194 $strSql .= "WHERE \n".
195 " b.ORDER_ID is not null \n";
196
197 foreach($arWhere as $v)
198 $strSql .= $v."\n";
199
200 if ($orderFilter != '')
201 $strSql .= " AND ".$orderFilter."\n";
202
203 $strSql .= " GROUP BY b.PRODUCT_ID, b.NAME, " . $helper->getIsNullFunction('b.CATALOG_XML_ID', "''") . ", b.PRODUCT_XML_ID, b.CURRENCY \n";
204 if($byQuantity)
205 $strSql .= " ORDER BY QUANTITY DESC\n";
206 else
207 $strSql .= " ORDER BY PRICE DESC\n";
208
209 $limit = (int)$limit;
210 if($limit > 0)
211 $strSql .= "LIMIT ".$limit;
212
213 return $DB->Query($strSql);
214 }
215
216 public static function GetFilterOperation($key, $value)
217 {
218 global $DB;
219 $field = "";
220 $operation = "";
221 $field_val = "";
222
223 if(is_array($value))
224 {
225 $field_val = "(";
226 foreach($value as $val)
227 {
228 if($val <> '')
229 $field_val .= "\"".$DB->ForSQL($val)."\", ";
230 }
231 $field_val = mb_substr($field_val, 0, -2);
232 $field_val .= ")";
233
234 if (mb_substr($key, 0, 1) == "!")
235 {
236 $operation = "NOT IN";
237 $field = $DB->ForSQL(mb_substr($key, 1));
238 }
239 else
240 {
241 $operation = "IN";
242 $field = $key;
243 }
244 }
245 else
246 {
247 $field_val = "\"".$DB->ForSQL($value)."\"";
248
249 if (mb_substr($key, 0, 1) == "!")
250 {
251 $operation = "<>";
252 $field = $DB->ForSQL(mb_substr($key, 1));
253
254 }
255 elseif (mb_substr($key, 0, 1) == "%")
256 {
257 $operation = "LIKE";
258 $field = $DB->ForSQL(mb_substr($key, 1));
259 }
260 elseif (mb_substr($key, 0, 2) == "<=")
261 {
262 $operation = "<=";
263 $field = $DB->ForSQL(mb_substr($key, 2));
264 }
265 elseif (mb_substr($key, 0, 2) == ">=")
266 {
267 $operation = ">=";
268 $field = $DB->ForSQL(mb_substr($key, 2));
269 }
270 elseif (mb_substr($key, 0, 1) == ">")
271 {
272 $operation = ">";
273 $field = $DB->ForSQL(mb_substr($key, 1));
274 }
275 elseif (mb_substr($key, 0, 1) == "<")
276 {
277 $operation = "<";
278 $field = $DB->ForSQL(mb_substr($key, 1));
279 }
280 else
281 {
282 $operation = "=";
283 $field = $DB->ForSQL($key);
284 }
285 }
286 return array("field" => $field, "operation" => $operation, "value" => $field_val);
287 }
288}
289
295{
302 public static function Add($arFields)
303 {
304 global $DB;
305
306 foreach(GetModuleEvents("sale", "OnBeforeViewedAdd", true) as $arEvent)
307 if (ExecuteModuleEventEx($arEvent, array(&$arFields))===false)
308 return false;
309
310 if (isset($arFields["ID"]))
311 unset($arFields["ID"]);
312
313 $arFields["PRODUCT_ID"] = intval($arFields["PRODUCT_ID"]);
314 $arFields["USER_ID"] = intval($arFields["USER_ID"]);
315 $arFields["FUSER_ID"] = intval($arFields["FUSER_ID"]);
316 $arFields["IBLOCK_ID"] = intval($arFields["IBLOCK_ID"]);
317 if ($arFields["CALLBACK_FUNC"] == '')
318 $arFields["CALLBACK_FUNC"] = "CatalogViewedProductCallback";
319 if ($arFields["MODULE"] == '')
320 $arFields["MODULE"] = "catalog";
321 if ($arFields["PRODUCT_PROVIDER_CLASS"] == '' && $arFields["MODULE"] == 'catalog')
322 $arFields["PRODUCT_PROVIDER_CLASS"] = "CCatalogProductProvider";
323 if ($arFields["PRODUCT_ID"] <= 0)
324 return false;
325 if ($arFields["LID"] == '')
326 return false;
327
328 if (\Bitrix\Main\Loader::includeModule('statistic') && isset($_SESSION['SESS_SEARCHER_ID']) && (int)$_SESSION['SESS_SEARCHER_ID'] > 0)
329 return false;
330
331 if ((string)\Bitrix\Main\Config\Option::get('sale', 'viewed_capability') == 'Y')
332 {
333 if (\Bitrix\Main\Loader::includeModule('catalog'))
334 {
335 if ((string)\Bitrix\Main\Config\Option::get('catalog', 'enable_viewed_products') !== 'N')
336 {
338 $arFields["PRODUCT_ID"],
340 $arFields["LID"]
341 );
342 return ($result > 0);
343 }
344 }
345 }
346
347 $arFilter = array();
348 $arFilter["PRODUCT_ID"] = $arFields["PRODUCT_ID"];
349
350 if ($arFields["USER_ID"] > 0)
351 {
352 $arFuserItems = CSaleUser::GetList(array("USER_ID" => $arFields["USER_ID"]));
353 $FUSER_ID = $arFuserItems["ID"];
354 }
355 elseif ((int)$arFields["FUSER_ID"] > 0)
356 $FUSER_ID = $arFields["FUSER_ID"];
357 else
358 $FUSER_ID = CSaleBasket::GetBasketUserID();
359 $FUSER_ID = (int)$FUSER_ID;
360
361 $arFilter["FUSER_ID"] = $FUSER_ID;
362 $arFields["FUSER_ID"] = $FUSER_ID;
363
365 array(),
366 $arFilter,
367 false,
368 false,
369 array('ID', 'DATE_VISIT')
370 );
371 if (!$arItems = $db_res->Fetch())//insert
372 {
373 if (\Bitrix\Main\Loader::includeModule('catalog'))
374 {
376 if ($productProvider = CSaleBasket::GetProductProvider($arFields))
377 {
378 $arResultTmp = $productProvider::ViewProduct(array(
379 "PRODUCT_ID" => $arFields["PRODUCT_ID"],
380 "USER_ID" => $arFields["USER_ID"],
381 "SITE_ID" => $arFields["LID"]
382 ));
383 }
384 else
385 {
387 $arFields["CALLBACK_FUNC"],
388 $arFields["MODULE"],
389 $arFields["PRODUCT_ID"],
390 $arFields["USER_ID"],
391 $arFields["LID"]
392 );
393 }
394 if ($arResultTmp && count($arResultTmp) > 0)
395 $arFields = array_merge($arFields, $arResultTmp);
396
397 if ($arFields["NAME"] == '')
398 return false;
399
400 $arInsert = $DB->PrepareInsert("b_sale_viewed_product", $arFields);
401
402 //chance deleted
403 $rnd = mt_rand(0, 1000);
404 if ($rnd < 100)
405 {
407 array(),
408 array("FUSER_ID" => $FUSER_ID),
409 array("COUNT" => "ID"),
410 false
411 );
412 $arCount = $db_res->Fetch();
413 $viewedCount = COption::GetOptionString("sale", "viewed_count", "100");
414
415 if ($arCount["ID"] > intval($viewedCount))
416 {
417 $limit = ($arCount["ID"] - $viewedCount) + ($viewedCount * 0.2);
418 CSaleViewedProduct::DeleteForUser($FUSER_ID, $limit);
419 }
420 }
421
422
423 $sqlInsertNames = $arInsert[0];
424 if (strval(trim($sqlInsertNames)) != '')
425 {
426 $sqlInsertNames .= ', ';
427 }
428
429 $sqlInsertValues = $arInsert[1];
430 if (strval(trim($sqlInsertValues)) != '')
431 {
432 $sqlInsertValues .= ', ';
433 }
434
435 $strSql = "INSERT INTO b_sale_viewed_product (".$sqlInsertNames." DATE_VISIT) VALUES(".$sqlInsertValues." ".$DB->GetNowFunction().")";
436 $DB->Query($strSql);
437
438 $ID = intval($DB->LastID());
439 }
440 }
441 else//update
442 {
443 $dateVisit = new \Bitrix\Main\Type\DateTime($arItems["DATE_VISIT"]);
444 $offset = $dateVisit->add('1 day')->getTimestamp();
445 if ($offset <= time())
446 {
447 $arFields = ["DATE_VISIT" => $DB->GetNowFunction()];
448 $ID = (int)$arItems["ID"];
450 }
451 }
452
453 foreach(GetModuleEvents("sale", "OnViewedAdd", true) as $arEvent)
455
456 return $ID ?? false;
457 }
458
469 public static function GetList($arOrder = array("ID"=>"DESC"), $arFilter = array(), $arGroupBy = false, $arNavStartParams = false, $arSelectFields = array())
470 {
471 global $DB;
472
473 if (array_key_exists("DATE_FROM", $arFilter))
474 {
475 $arFilter[">=DATE_VISIT"] = trim($arFilter["DATE_FROM"]);
476 unset($arFilter["DATE_FROM"]);
477 }
478 if (array_key_exists("DATE_TO", $arFilter))
479 {
480 $arFilter["<=DATE_VISIT"] = trim($arFilter["DATE_TO"]);
481 unset($arFilter["DATE_TO"]);
482 }
483
484 if (!$arSelectFields || count($arSelectFields) <= 0 || in_array("*", $arSelectFields))
485 $arSelectFields = array("ID", "FUSER_ID", "DATE_VISIT", "PRODUCT_ID", "MODULE", "LID", "NAME", "DETAIL_PAGE_URL", "CURRENCY", "PRICE", "NOTES", "PREVIEW_PICTURE", "DETAIL_PICTURE", "CALLBACK_FUNC", "PRODUCT_PROVIDER_CLASS");
486
487 if ((string)\Bitrix\Main\Config\Option::get('sale', 'viewed_capability') == 'Y')
488 {
489 if(\Bitrix\Main\Loader::includeModule('catalog'))
490 {
491 foreach($arFilter as $key => $value)
492 {
493 if($key == "LID")
494 {
495 $arFilter['SITE_ID']= $value;
496 unset($arFilter['LID']);
497 }
498 }
499
500 $limit = 100;
501 if(is_array($arNavStartParams) && intval($arNavStartParams["nTopCount"]) >= 0)
502 {
503 $limit = intval($arNavStartParams["nTopCount"]);
504 }
505
506 $viewedIterator = \Bitrix\Catalog\CatalogViewedProductTable::getList(
507 array(
508 "filter" => $arFilter,
509 "select" => array(
510 "ID",
511 "PRODUCT_ID",
512 "DATE_VISIT",
513 "LID" => "SITE_ID",
514 "NAME" => "ELEMENT.NAME"
515 ),
516 "order" => array("DATE_VISIT" => "DESC"),
517 "limit" => $limit
518 )
519 );
520
521 $viewed = array();
522 while($row = $viewedIterator->fetch())
523 {
524 $row['MODULE'] = "catalog";
525 $row['DATE_VISIT'] = $row['DATE_VISIT']->toString();
526 $viewed[$row['PRODUCT_ID']] = $row;
527 }
528
529 if(!empty($viewed))
530 {
531 // Map to parent sku
532 $newIds = array();
533 $ids = array_keys($viewed);
534 $catalogIterator = CCatalog::getList();
535 while($catalog = $catalogIterator->fetch())
536 {
537 if ($catalog['IBLOCK_TYPE_ID'] == "offers")
538 {
539 $elementIterator = CIBlockElement::getList(
540 array(),
541 array("ID" => $ids, "IBLOCK_ID" => $catalog['IBLOCK_ID']),
542 false,
543 false,
544 array("ID", "IBLOCK_ID", "PROPERTY_" . $catalog['SKU_PROPERTY_ID'])
545 );
546
547 while ($item = $elementIterator->fetch())
548 {
549 $propertyName = "PROPERTY_" . $catalog['SKU_PROPERTY_ID'] . "_VALUE";
550 $parentId = $item[$propertyName];
551 if (!empty($parentId))
552 {
553 $newIds[$item['ID']] = $parentId;
554 }
555 else
556 {
557 $newIds[$item['ID']] = $item['ID'];
558 }
559 }
560 }
561 }
562
563 // Push missing
564 foreach ($ids as $id)
565 {
566 if (!isset($newIds[$id]))
567 {
568 $newIds[$id] = $id;
569 }
570 }
571
572 $filter = array("ID" => array_values($newIds));
573 if(!count($filter['ID']))
574 $filter = array("ID" => -1);
575
576 $mapped = array();
577 if( in_array("DETAIL_PAGE_URL", $arSelectFields) ||
578 in_array("PREVIEW_PICTURE", $arSelectFields) ||
579 in_array("DETAIL_PICTURE", $arSelectFields))
580 {
581
582 $elementIterator = CIBlockElement::GetList(array(), $filter);
583 while ($elementObj = $elementIterator->GetNextElement())
584 {
585 $fields = $elementObj->GetFields();
586 $mapped[$fields['ID']]['PREVIEW_PICTURE'] = $fields['PREVIEW_PICTURE'];
587 $mapped[$fields['ID']]['DETAIL_PICTURE'] = $fields['DETAIL_PICTURE'];
588 }
589 }
590
591 foreach($newIds as $natural => $tr)
592 {
593 $viewed[$natural]['PREVIEW_PICTURE'] = $mapped[$tr]['DETAIL_PICTURE'];
594 $viewed[$natural]['DETAIL_PICTURE'] = $mapped[$tr]['PREVIEW_PICTURE'];
595 $viewed[$natural]['PRODUCT_ID'] = $tr;
596 }
597
598 if(in_array("CURRENCY", $arSelectFields) || in_array("PRICE", $arSelectFields))
599 {
600 // Prices
601 $priceIterator = CPrice::getList(array(), array("PRODUCT_ID" => $ids), false, false, array("PRODUCT_ID", "PRICE", "CURRENCY"));
602 while($price = $priceIterator->fetch())
603 {
604 if(!isset($viewed[$price['PRODUCT_ID']]['PRICE']))
605 {
606 $viewed[$price['PRODUCT_ID']]['PRICE'] = $price['PRICE'];
607 $viewed[$price['PRODUCT_ID']]['CURRENCY'] = $price['CURRENCY'];
608 }
609 }
610 }
611 }
612
613 // resort
614 $dbresult = new CDBResult();
615 $dbresult->InitFromArray(array_values($viewed));
616
617 return $dbresult;
618 }
619 }
620
622 "ID" => array("FIELD" => "V.ID", "TYPE" => "int"),
623 "FUSER_ID" => array("FIELD" => "V.FUSER_ID", "TYPE" => "int"),
624 "DATE_VISIT" => array("FIELD" => "V.DATE_VISIT", "TYPE" => "datetime"),
625 "PRODUCT_ID" => array("FIELD" => "V.PRODUCT_ID", "TYPE" => "int"),
626 "MODULE" => array("FIELD" => "V.MODULE", "TYPE" => "string"),
627 "LID" => array("FIELD" => "V.LID", "TYPE" => "string"),
628 "NAME" => array("FIELD" => "V.NAME", "TYPE" => "string"),
629 "DETAIL_PAGE_URL" => array("FIELD" => "V.DETAIL_PAGE_URL", "TYPE" => "string"),
630 "CURRENCY" => array("FIELD" => "V.CURRENCY", "TYPE" => "string"),
631 "PRICE" => array("FIELD" => "V.PRICE", "TYPE" => "double"),
632 "NOTES" => array("FIELD" => "V.NOTES", "TYPE" => "string"),
633 "PREVIEW_PICTURE" => array("FIELD" => "V.PREVIEW_PICTURE", "TYPE" => "string"),
634 "DETAIL_PICTURE" => array("FIELD" => "V.DETAIL_PICTURE", "TYPE" => "string"),
635 "CALLBACK_FUNC" => array("FIELD" => "V.CALLBACK_FUNC", "TYPE" => "string"),
636 "PRODUCT_PROVIDER_CLASS" => array("FIELD" => "V.PRODUCT_PROVIDER_CLASS", "TYPE" => "string")
637 );
638
639 $arSqls = CSaleOrder::PrepareSql($arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields);
640
641 $arSqls["SELECT"] = str_replace("%%_DISTINCT_%%", "", $arSqls["SELECT"]);
642
643 $strSql = "SELECT ".$arSqls["SELECT"]." FROM b_sale_viewed_product V ";
644 if ($arSqls["WHERE"] <> '')
645 $strSql .= "WHERE ".$arSqls["WHERE"]." ";
646 if ($arSqls["GROUPBY"] <> '')
647 $strSql .= "GROUP BY ".$arSqls["GROUPBY"]." ";
648 if ($arSqls["ORDERBY"] <> '')
649 $strSql .= "ORDER BY ".$arSqls["ORDERBY"]." ";
650
651 if (is_array($arGroupBy) && count($arGroupBy) == 0)
652 {
653 $dbRes = $DB->Query($strSql);
654 if ($arRes = $dbRes->Fetch())
655 return $arRes["CNT"];
656 else
657 return false;
658 }
659
660 if (is_array($arNavStartParams) && intval($arNavStartParams["nTopCount"]) <= 0 )
661 {
662 $strSql_tmp = "SELECT COUNT('x') as CNT FROM b_sale_viewed_product B ";
663 if ($arSqls["WHERE"] <> '')
664 $strSql_tmp .= "WHERE ".$arSqls["WHERE"]." ";
665 if ($arSqls["GROUPBY"] <> '')
666 $strSql_tmp .= "GROUP BY ".$arSqls["GROUPBY"]." ";
667
668 $dbRes = $DB->Query($strSql_tmp);
669 $cnt = 0;
670 if ($arSqls["GROUPBY"] == '')
671 {
672 if ($arRes = $dbRes->Fetch())
673 $cnt = $arRes["CNT"];
674 }
675 else
676 {
677 $cnt = $dbRes->SelectedRowsCount();
678 }
679 $dbRes = new CDBResult();
680
681 $dbRes->NavQuery($strSql, $cnt, $arNavStartParams);
682 }
683 else
684 {
685 $strSql = $DB->TopSql($strSql, $arNavStartParams["nTopCount"]);
686
687 $dbRes = $DB->Query($strSql);
688 }
689
690 return $dbRes;
691 }
692
699 public static function _ClearViewed()
700 {
702 $helper = $connection->getSqlHelper();
703
704 $viewed_time = COption::GetOptionString("sale", "viewed_time", "90");
705 $viewed_time = intval($viewed_time);
706
707 $strSql =
708 "DELETE ".
709 "FROM b_sale_viewed_product ".
710 "WHERE DATE_VISIT < " . $helper->addDaysToDateTime(-$viewed_time);
711 $connection->query($strSql);
712
713 return true;
714 }
715
723 public static function DeleteForUser($FUSER_ID, $LIMIT = NULL)
724 {
725 global $DB;
726
727 $FUSER_ID = (int)$FUSER_ID;
728 if ($FUSER_ID <= 0)
729 return false;
730
731 foreach(GetModuleEvents("sale", "OnBeforeViewedDelete", true) as $arEvent)
732 if (ExecuteModuleEventEx($arEvent, array($FUSER_ID))===false)
733 return false;
734
735 $strSqlLimit = "";
736 if (!empty($LIMIT) && (int)$LIMIT > 0)
737 $strSqlLimit = " ORDER BY DATE_VISIT DESC LIMIT ".(int)$LIMIT;
738
739 $DB->Query("DELETE FROM b_sale_viewed_product WHERE FUSER_ID = '".$FUSER_ID."' ".$strSqlLimit, true);
740
741 foreach(GetModuleEvents("sale", "OnViewedDelete", true) as $arEvent)
742 if (ExecuteModuleEventEx($arEvent, array($FUSER_ID))===false)
743 return false;
744
745 return true;
746 }
747}
$connection
Определения actionsdefinitions.php:38
$db_res
Определения options_user_settings.php:8
while($arIBlock=$rsIBlocks->Fetch()) $catalogIterator
Определения options.php:1934
$viewedCount
Определения options.php:1609
static refresh($productId, $fuserId, $siteId=SITE_ID, $elementId=0, $recommendationId='')
Определения catalogviewedproduct.php:140
static getConnection($name="")
Определения application.php:638
Определения loader.php:13
static includeModule($moduleName)
Определения loader.php:67
Определения product.php:11
SetFields($arFields)
Определения sqlwhere.php:239
static ExecuteCallbackFunction($callbackFunc="", $module="", $productID=0)
Определения basket.php:1822
static GetBasketUserID($bSkipFUserInit=false)
Определения basket.php:1796
static GetProductProvider($arBasketItem)
Определения basket.php:24
static PrepareSql(&$arFields, $arOrder, &$arFilter, $arGroupBy, $arSelectFields, $obUserFieldsSql=false, $callback=false, $arOptions=array())
Определения order.php:1070
static GetList($arFilter)
Определения basket.php:3823
static Update($ID, $arFields)
Определения product.php:561
Определения dbresult.php:88
Определения sqlwhere.php:1359
Определения product.php:9
static GetFilterOperation($key, $value)
Определения product.php:216
static GetProductList($ID, $minCNT, $limit, $getParentOnly=false)
Определения product.php:19
static GetBestSellerList($by="AMOUNT", $arFilter=Array(), $arOrderFilter=Array(), $limit=0)
Определения product.php:88
Определения product.php:295
static _ClearViewed()
Определения product.php:699
static DeleteForUser($FUSER_ID, $LIMIT=NULL)
Определения product.php:723
static GetList($arOrder=array("ID"=>"DESC"), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения product.php:469
$arFields
Определения dblapprove.php:5
</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($ajaxMode) $ID
Определения get_user.php:27
$catalog
Определения iblock_catalog_edit.php:135
$filter
Определения iblock_catalog_list.php:54
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
$LIMIT
Определения rss.php:28
$i
Определения factura.php:643
</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
$val
Определения options.php:1793
$arRes
Определения options.php:104
$arFilter
Определения user_search.php:106
if(!AccessController::getCurrent() ->check(ActionDictionary::ACTION_CATALOG_EXPORT_EDIT)) if((!isset($_REQUEST['IBLOCK_ID']))||($_REQUEST['IBLOCK_ID']=='')) $intIBlockID
Определения yandex_detail.php:44
$dbRes
Определения yandex_detail.php:168
$fields
Определения yandex_run.php:501