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

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

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

שאלות נפוצות

העבודות האחרונות

  • image_website-b2b-advance_0.webp
    פיתוח אתר חברה B2B ADVANCE
    1455
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    פיתוח אתר לחברת FIXPER
    1018
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    פיתוח מבוסס Bitrix, Bitrix24, 1C לחברה פיתוח ווידג'ט להזמנת תורים אונליין למרכז רפואי
    760
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    פיתוח על בסיס 1C Enterprise עבור MIRSANBEL
    879
  • image_crm_dolbimby_434_0.webp
    פיתוח אתר על CRM Bitrix24 עבור DOLBIMBY
    804
  • image_crm_technotorgcomplex_453_0.webp
    פיתוח על בסיס Bitrix24 עבור חברת TECHNOTORGKOMPLEKS
    1162

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

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