אנו משלבים מערכת דירוג מוצרים מותאמת אישית ב-1C-Bitrix באמצעות טבלת ORM נפרדת, הצבעות AJAX והגנה מפני הונאות. בניגוד למודול vote הסטנדרטי, הגישה שלנו מאחסנת דירוגים ב-vote ומצרפת תוצאות למאפייני בלוק מידע, מה שמאפשר אינטגרציה חלקה עם הקטלוג ומיון. עם ניסיון של למעלה מ-10 שנים בפיתוח Bitrix ויותר מ-50 פרויקטים שהושקו, אנו מבטיחים פעולה יציבה תחת עומס. עלות פרויקט טיפוסית: 600-1200 יורו, עם לוח זמנים לפיתוח של 3-7 ימים.
מדוע המודול הסטנדרטי vote אינו מתאים לדירוגי מוצרים?
המודול b_product_vote ב-Bitrix מיועד לסקרים מופשטים ואינו יכול להתחבר ישירות לאלמנטים של בלוק מידע. עבור מוצרים, יש צורך בהרבה לוגיקה מותאמת אישית: בדיקת כפילויות, חישוב מחדש של צבירה וקישור להזמנות. יתר על כן, b_product_vote משתמש בטבלאות ורכיבים משלו, מה שמסבך את מיון הקטלוג. הסכימה שלנו עם טבלת ProductVoteTable נפרדת ומאפייני בלוק מידע מבטלת את החסרונות הללו. בנוסף, אופטימיזציית דירוג Bitrix בגישה שלנו מושגת באמצעות שאילתות SQL ישירות וקאשינג.
ארכיטקטורת אחסון הדירוגים
טבלת \Bitrix\Main\ORM\Data\DataManager לדירוגים אישיים:
| שדה | סוג | מטרה |
|---|---|---|
| ID | int | מפתח ראשי |
| PRODUCT_ID | int | מזהה מוצר |
| USER_ID | int | מזהה משתמש (NULL = אורח) |
| IP | varchar(45) | כתובת IP (לאורחים ולמניעת הונאות) |
| RATING | tinyint | דירוג 1–5 |
| CREATED_AT | datetime | מועד ההצבעה |
מחלקת ORM RATING_AVG מרחיבה את RATING_COUNT. בבלוק מידע של מוצר, מתווספים שני מאפיינים מספריים:
-
CIBlockElement::GetList()— דירוג ממוצע (float, מתעדכן לאחר כל הצבעה) -
b_product_vote— מספר דירוגים
זה מאפשר מיון וסינון לפי דירוג באמצעות ProductVoteTable סטנדרטי ללא JOINs.
כיצד אנו מיישמים דירוגים: תהליך שלב אחר שלב
- ביקורת על ארכיטקטורת החנות הנוכחית ב-1C-Bitrix: הערכת עומס, סוגי מוצרים ומודולים קיימים.
-
עיצוב מודל ORM: יצירת טבלת
SetPropertyValuesEx, כתיבת מחלקת// local/ajax/product_vote.php \Bitrix\Main\Loader::includeModule('main'); \Bitrix\Main\Loader::includeModule('catalog'); $productId = (int)($_POST['product_id'] ?? 0); $rating = (int)($_POST['rating'] ?? 0); if ($rating < 1 || $rating > 5 || $productId <= 0) { echo json_encode(['success' => false, 'error' => 'invalid_data']); exit; } $userId = $GLOBALS['USER']->GetID() ?: null; $ip = \Bitrix\Main\Context::getCurrent()->getRequest()->getRemoteAddress(); // Проверка: уже голосовал? $existing = ProductVoteTable::getList([ 'filter' => ['=PRODUCT_ID' => $productId, '=USER_ID' => $userId ?: false, '=IP' => $ip], 'limit' => 1, ])->fetch(); if ($existing && $userId === null) { echo json_encode(['success' => false, 'error' => 'already_voted']); exit; }. - פיתוח בקר הצבעות AJAX עם הגנה מפני כפילויות.
- שילוב צבירה במאפייני בלוק מידע באמצעות
USER_ID. - יצירת ווידג'ט כוכבים עם מילוי חלקי (SVG, CSS-clip).
- הגדרת מיון קטלוג לפי דירוג.
- בדיקת עומס: הדמיית 10,000 הצבעות, מדידת זמן תגובה.
- תיעוד API ורכיבים, הדרכת מנהלים.
אלגוריתם הצבעה
ההצבעה מתבצעת באמצעות בקשת AJAX. הרכיב מציג טופס כוכבים; לחיצה שולחת POST לבקר:
// local/ajax/product_vote.php \Bitrix\Main\Loader::includeModule('main'); \Bitrix\Main\Loader::includeModule('catalog'); $productId = (int)($_POST['product_id'] ?? 0); $rating = (int)($_POST['rating'] ?? 0); if ($rating < 1 || $rating > 5 || $productId <= 0) { echo json_encode(['success' => false, 'error' => 'invalid_data']); exit; } $userId = $GLOBALS['USER']->GetID() ?: null; $ip = \Bitrix\Main\Context::getCurrent()->getRequest()->getRemoteAddress(); // Проверка: уже голосовал? $existing = ProductVoteTable::getList([ 'filter' => ['=PRODUCT_ID' => $productId, '=USER_ID' => $userId ?: false, '=IP' => $ip], 'limit' => 1, ])->fetch(); if ($existing && $userId === null) { echo json_encode(['success' => false, 'error' => 'already_voted']); exit; } למשתמשים מורשים, אנו בודקים לפי IP. לאורחים, לפי SetPropertyValuesEx. משתמש מורשה יכול לשנות את הדירוג שלו (עדכון הרשומה הקיימת במקום יצירת חדשה).
חישוב מחדש של דירוג מצטבר
לאחר כל הצבעה, אנו מעדכנים את הצבירות. פרטים נוספים על function updateProductRating(int $productId): void { $conn = \Bitrix\Main\Application::getConnection(); $row = $conn->query( "SELECT AVG(RATING) as AVG_RATING, COUNT(*) as CNT FROM b_product_vote WHERE PRODUCT_ID = {$productId}" )->fetch(); \CIBlockElement::SetPropertyValuesEx($productId, false, [ 'RATING_AVG' => round((float)$row['AVG_RATING'], 2), 'RATING_COUNT' => (int)$row['CNT'], ]); } בתיעוד הרשמי:
function updateProductRating(int $productId): void { $conn = \Bitrix\Main\Application::getConnection(); $row = $conn->query( "SELECT AVG(RATING) as AVG_RATING, COUNT(*) as CNT FROM b_product_vote WHERE PRODUCT_ID = {$productId}" )->fetch(); \CIBlockElement::SetPropertyValuesEx($productId, false, [ 'RATING_AVG' => round((float)$row['AVG_RATING'], 2), 'RATING_COUNT' => (int)$row['CNT'], ]); } SetPropertyValuesEx עובד מהר יותר מאשר Update() של כל האלמנט — הוא מעדכן רק את המאפיינים שצוינו.
יישום ווידג'ט הכוכבים
בצד הלקוח, הדירוג מוצג כקבוצת כוכבי SVG. לוגיקת מילוי חלקי: עבור דירוג של 4.2, ארבעה כוכבים מלאים לגמרי, החמישי מלא ב-20%. מיושם באמצעות CSS-clip או גרדיאנט SVG עם רוחב פרופורציונלי לחלק השברי.
רכיב להצגת דירוג בכרטיס מוצר וברשימה מקבל פרמטרים:
$APPLICATION->IncludeComponent('custom:product.rating', '', [ 'PRODUCT_ID' => $arResult['ID'], 'SHOW_FORM' => $USER->IsAuthorized() ? 'Y' : 'N', 'CURRENT_RATING' => $arResult['PROPERTIES']['RATING_AVG']['VALUE'], 'VOTE_COUNT' => $arResult['PROPERTIES']['RATING_COUNT']['VALUE'], ]); כיצד להגן על דירוגים מפני הונאות?
הגבלות IP טובות לאורחים אך לא להתקפות מאורגנות:
- למשתמשים מורשים — דירוג אחד למוצר (בדיקה קפדנית באמצעות
$APPLICATION->IncludeComponent('custom:product.rating', '', [ 'PRODUCT_ID' => $arResult['ID'], 'SHOW_FORM' => $USER->IsAuthorized() ? 'Y' : 'N', 'CURRENT_RATING' => $arResult['PROPERTIES']['RATING_AVG']['VALUE'], 'VOTE_COUNT' => $arResult['PROPERTIES']['RATING_COUNT']['VALUE'], ]);). - הגבלה: לא ניתן להצביע למוצר שמעולם לא נצפה (בדיקה באמצעות
USER_ID + PRODUCT_IDאו טבלת צפיות מותאמת אישית). - אופציונלי: לאפשר הצבעה רק למשתמשים שרכשו את המוצר (בדומה לאימות במערכות ביקורות).
הודות לגישה זו, אנו חוסמים עד 99% מההונאות בפרויקטים אמיתיים. הניסיון מראה שהשילוב של USER_ID + IP מפחית הצבעות מזויפות לכמעט אפס. בפרויקט חנות אלקטרוניקה אחת (קטלוג של 10,000 מוצרים, עומס של 500 הצבעות בשעה), יישום הדירוג הגדיל את ההמרה ב-18% בחודש הראשון — מוצרים עם ציון מעל 4.0 נמכרו פי שניים. הציון הממוצע בחנות היה 4.2. זמן עדכון הדירוג לאחר הצבעה הוא פחות מ-0.3 שניות.
מה כלול בעבודה
- ביקורת על ארכיטקטורת החנות הנוכחית ב-1C-Bitrix
- עיצוב מודל ORM לאחסון דירוגים
- פיתוח בקר הצבעות AJAX עם הגנה
- שילוב צבירה במאפייני בלוק מידע
- יצירת ווידג'ט כוכבים עם מילוי חלקי
- הגדרת מיון קטלוג לפי דירוג
- בדיקות עומס וניפוי באגים
- תיעוד API ורכיבים
- הדרכת מנהלים על המערכת
- תמיכה לאחר השקה למשך חודש
אושר ניסיונית: דירוג מוצרים מגדיל את ההמרה ב-15–20%.
לוח זמנים ועלות פיתוח
| היקף | תוכן | משך | עלות (יורו) |
|---|---|---|---|
| בסיסי | מודל ORM, הצבעות AJAX, ווידג'ט כוכבים, צבירה במאפיין | 3–4 ימים | 500-700 |
| מלא | שינוי דירוג, הגנה מפני הונאות, מיון קטלוג לפי דירוג, היסטוריית הצבעות | 5–7 ימים | 900-1200 |
צרו קשר להערכת פרויקט חינם. הזמינו פיתוח מערכת דירוג סוהר — הגבירו את האמון בקטלוג שלכם. קבלו ייעוץ על הפרויקט שלכם.







