בניית דירוג מוצר מותאם אישית ב-1C-Bitrix עם ORM ו-AJAX

מודול ההצבעות הסטנדרטי ב-1C-Bitrix אינו מתאים לדירוג מוצרים: הוא מיותר, משתלב בצורה גרועה עם הקטלוג ואינו מגן מפני מניפולציות בהצבעות. אנו מפתחים מערכת דירוג משלנו המבוססת על אחסון ORM עם הצבעות AJAX והגנה מפני רמאות, המשולבת בקלות בחנות המקוונת שלך. הצוות שלנו מספק פרויקט סוהר—מביקורת ועד תמיכה—ומבטיח פתרון אמין ובר-הרחבה.
השירותים שאנו מציעים
מציג 1 מתוך 1כל 1626 השירותים
בניית דירוג מוצר מותאם אישית ב-1C-Bitrix עם ORM ו-AJAX
בינוני
~1-2 שבועות

הכישורים שלנו:

שאלות נפוצות

אנו משלבים מערכת דירוג מוצרים מותאמת אישית ב-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.

כיצד אנו מיישמים דירוגים: תהליך שלב אחר שלב

  1. ביקורת על ארכיטקטורת החנות הנוכחית ב-1C-Bitrix: הערכת עומס, סוגי מוצרים ומודולים קיימים.
  2. עיצוב מודל 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; } .
  3. פיתוח בקר הצבעות AJAX עם הגנה מפני כפילויות.
  4. שילוב צבירה במאפייני בלוק מידע באמצעות USER_ID.
  5. יצירת ווידג'ט כוכבים עם מילוי חלקי (SVG, CSS-clip).
  6. הגדרת מיון קטלוג לפי דירוג.
  7. בדיקת עומס: הדמיית 10,000 הצבעות, מדידת זמן תגובה.
  8. תיעוד 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

צרו קשר להערכת פרויקט. הזמינו פיתוח מערכת דירוג סוהר — הגבירו את האמון בקטלוג שלכם. קבלו ייעוץ על הפרויקט שלכם.