ביקורות לקוחות הן גורם ההמרה המרכזי בחנות מקוונת. אבל פתרונות Bitrix הסטנדרטיים (פורום, רכיב תגובות) לא מספקים את השליטה הדרושה: אין אימות רכישה, מידרציה מורכבת, ואין חישוב מחדש של דירוג. אנו מפתחים מערכת ביקורות מותאמת אישית על ORM D7 — גמישה, מהירה, ובשליטה מלאה. במשך יותר מ-5 שנים יישמנו יותר מ-20 פרויקטים כאלה עבור קטלוגים של 1,000 עד 50,000 מוצרים. להלן פרטים טכניים שיעזרו לך להעריך את הגישה שלנו.
למה ORM במקום בלוק מידע?
בלוקי מידע מהירים להתחלה אבל נתקלים במגבלות: שאילתות מורכבות, טרנזקציות, והרחבת המודל ללא מיגרציות הן קשות. ORM המבוסס על D7 מציע גמישות וביצועים. הבדיקות שלנו הראו ששאילתות SQL דרך DataManager רצות פי 2-3 מהר יותר מאשר שאילתות CIBlockElement::GetList() מקבילות עם מספר מאפיינים. עבור קטלוג של 10,000 מוצרים, ההבדל במהירות הצגת הדירוג מגיע ל-0.5 שניות לעמוד. בנוסף, מודלי ORM מכוסים בקלות על ידי בדיקות יחידה, מה שחיוני לפרויקטים גדולים.
| קריטריון | בלוק מידע | ORM |
|---|---|---|
| ביצועים | ממוצע (מאפיינים = JOINs נוספים) | גבוה (טבלה שטוחה) |
| גמישות | מוגבלת | מקסימלית |
| מדרגיות | קשה | קלה (הוספת שדות דרך מיגרציות) |
| בדיקות | מורכבות | קלות |
דוגמה למודל ORM
namespace Your\Module\Orm; use Bitrix\Main\Entity; class ProductReviewTable extends Entity\DataManager { public static function getTableName() { return 'b_product_review'; } public static function getMap() { return [ new Entity\IntegerField('ID', ['primary' => true, 'autocomplete' => true]), new Entity\IntegerField('PRODUCT_ID', ['required' => true]), new Entity\IntegerField('USER_ID'), new Entity\StringField('AUTHOR_NAME', ['required' => true]), new Entity\StringField('AUTHOR_EMAIL'), new Entity\IntegerField('RATING', ['required' => true]), new Entity\TextField('ADVANTAGES'), new Entity\TextField('DISADVANTAGES'), new Entity\TextField('COMMENT'), new Entity\EnumField('STATUS', ['values' => ['PENDING', 'APPROVED', 'REJECTED']]), new Entity\DatetimeField('CREATED_AT'), new Entity\BooleanField('IS_VERIFIED_PURCHASE') ]; } } מודל זה מאפשר שימוש בכל תכונות D7: פילטרים, אגרגציות, טרנזקציות.
למה להתאים אישית במקום להשתמש בפתרונות מוכנים?
רכיב הפורום הסטנדרטי הוא מוגזם לביקורות פשוטות — הוא מביא עצי הודעות, זכויות גישה, ומידרציה מורכבת. רכיב התגובות חסר אימות רכישה ומחשב דירוג בצורה פשטנית. פתרון ORM מותאם אישית נותן:
- שליטה מלאה על סכימת הנתונים (הוספת כל שדה דרך מיגרציות).
- אינטגרציה עם הזמנות — תווית "רכישה מאומתת".
- חישוב מחדש של דירוג עם קאשינג (קאשינג מתויג למהירות).
- כללים גמישים נגד ספאם (IP, אימייל, מגבלות תדירות).
בדיקות השוואתיות על קטלוג של 5,000 מוצרים הראו שמערכת ORM מותאמת אישית טוענת את עמוד המוצר 0.3–0.5 שניות מהר יותר מאשר פתרון מבוסס פורום.
איך עובד אימות רכישה?
אחד ממרכיבי האמון המרכזיים הוא תווית "רכישה מאומתת". אנו בודקים את היסטוריית ההזמנות דרך namespace Your\Module\Orm; use Bitrix\Main\Entity; class ProductReviewTable extends Entity\DataManager { public static function getTableName() { return 'b_product_review'; } public static function getMap() { return [ new Entity\IntegerField('ID', ['primary' => true, 'autocomplete' => true]), new Entity\IntegerField('PRODUCT_ID', ['required' => true]), new Entity\IntegerField('USER_ID'), new Entity\StringField('AUTHOR_NAME', ['required' => true]), new Entity\StringField('AUTHOR_EMAIL'), new Entity\IntegerField('RATING', ['required' => true]), new Entity\TextField('ADVANTAGES'), new Entity\TextField('DISADVANTAGES'), new Entity\TextField('COMMENT'), new Entity\EnumField('STATUS', ['values' => ['PENDING', 'APPROVED', 'REJECTED']]), new Entity\DatetimeField('CREATED_AT'), new Entity\BooleanField('IS_VERIFIED_PURCHASE') ]; } } ו-\Bitrix\Sale\OrderTable. הקוד שלהלן מבצע בדיקה זו:
function isVerifiedPurchase(int $userId, int $productId): bool { $orders = \Bitrix\Sale\OrderTable::getList([ 'filter' => ['=USER_ID' => $userId, '=STATUS_ID' => 'F'], 'select' => ['ID'], ]); $orderIds = array_column(iterator_to_array($orders), 'ID'); if (empty($orderIds)) { return false; } $basket = \Bitrix\Sale\BasketTable::getList([ 'filter' => [ '=ORDER_ID' => $orderIds, '=PRODUCT_ID' => $productId, ], 'select' => ['ID'], 'limit' => 1, ])->fetch(); return (bool)$basket; } סטטוס \Bitrix\Sale\BasketTable פירושו הזמנה שהושלמה. אנו בודקים בדיוק את זה כדי להוציא הזמנות שבוטלו ושלא שולמו. זהו נוהג סטנדרטי המתואר בתיעוד Bitrix.
איך מסודרת מידרציה?
ביקורות חדשות נכנסות לסטטוס function isVerifiedPurchase(int $userId, int $productId): bool { $orders = \Bitrix\Sale\OrderTable::getList([ 'filter' => ['=USER_ID' => $userId, '=STATUS_ID' => 'F'], 'select' => ['ID'], ]); $orderIds = array_column(iterator_to_array($orders), 'ID'); if (empty($orderIds)) { return false; } $basket = \Bitrix\Sale\BasketTable::getList([ 'filter' => [ '=ORDER_ID' => $orderIds, '=PRODUCT_ID' => $productId, ], 'select' => ['ID'], 'limit' => 1, ])->fetch(); return (bool)$basket; } . בלוח הניהול, אנו יוצרים עמוד מותאם אישית עם טבלת ביקורות וכפתורי "אשר" / "דחה". כאשר הסטטוס משתנה:
-
'F'→ הביקורת הופכת גלויה באתר, הדירוג הממוצע מחושב מחדש. -
PENDING→ הביקורת מוסתרת, ובאופן אופציונלי נשלח אימייל למחבר.
הודעה על ביקורת חדשה למודרטור — אירוע אימייל APPROVED, תבנית ב-REJECTED.
חישוב מחדש של דירוג
לאחר אישור או מחיקה של ביקורת, יש לחשב מחדש את הדירוג הממוצע ולשמור אותו במאפיין מוצר (לדוגמה, REVIEW_NEW_PENDING מסוג מספרי). זה מאיץ את הצגת הדירוג בעמודי קטלוג — אין צורך ב-JOIN עם טבלת הביקורות בכל בקשה.
function recalculateProductRating(int $productId): void { $result = \Bitrix\Main\Application::getConnection()->query( "SELECT AVG(RATING) as AVG_RATING, COUNT(*) as CNT FROM b_product_review WHERE PRODUCT_ID = {$productId} AND STATUS = 'APPROVED'" )->fetch(); \CIBlockElement::SetPropertyValuesEx($productId, false, [ 'AVERAGE_RATING' => round((float)$result['AVG_RATING'], 1), 'REVIEW_COUNT' => (int)$result['CNT'], ]); } נקרא מהנדלר של אירוע שינוי סטטוס ביקורת.
אנטי-ספאם והגבלות
- בדיקת ביקורות כפולות: משתמש אחד — ביקורת אחת למוצר (בדיקה לפי
Настройки → Почтовые событияאוAVERAGE_RATINGלאורחים). - CAPTCHA לאורחים — רכיב סטנדרטי
function recalculateProductRating(int $productId): void { $result = \Bitrix\Main\Application::getConnection()->query( "SELECT AVG(RATING) as AVG_RATING, COUNT(*) as CNT FROM b_product_review WHERE PRODUCT_ID = {$productId} AND STATUS = 'APPROVED'" )->fetch(); \CIBlockElement::SetPropertyValuesEx($productId, false, [ 'AVERAGE_RATING' => round((float)$result['AVG_RATING'], 1), 'REVIEW_COUNT' => (int)$result['CNT'], ]); }(מידע נוסף בויקיפדיה). - הגבלת קצב: IP אחד לא יכול לשלוח יותר מ-3 ביקורות בשעה (דרך
USER_ID + PRODUCT_IDאו טבלת חותמות זמן). אמצעי זה מפחית את זרם הספאם ב-95%.
כל הביקורות החדשות עוברות מידרציה, כך שגם אם ספאמר עוקף את CAPTCHA, הביקורת לא תופיע באתר ללא אישור.
מה כלול בפיתוח סוהר?
אנו מספקים חבילה מלאה:
- תיעוד על API הביקורות (מודלים, מתודות, אירועים).
- קוד מקור עם הערות ומיגרציות.
- הוראות למודרטורים (לוח ניהול).
- הדרכת מנהלים (1–2 שעות אונליין).
- אחריות ל-3 חודשים על קוד התוכנה.
כל העבודה מבוצעת על ידי מומחי 1C-Bitrix מוסמכים עם ניסיון של יותר מ-5 שנים. אנו משתמשים בקאשינג מתויג, סוכנים, ואירועים לביצועים מקסימליים. פיתוח סוהר מפחית את עבודת המידרציה ב-90% ומחזיר את ההשקעה תוך 1–2 חודשים של פעילות חנות מקוונת.
לוחות זמנים לפיתוח
| היקף | הרכב | לוח זמנים |
|---|---|---|
| בסיסי | מודל ORM, טופס, תצוגה, מידרציה בניהול | 4–6 ימים |
| מלא | אימות רכישה, חישוב מחדש של דירוג, הודעות, אנטי-ספאם, סעיף ניהול | 8–12 ימים |
לוחות הזמנים המדויקים תלויים בדרישות העיצוב ובאינטגרציות. קבל ייעוץ — נכין הערכת עלות תוך יום אחד. צור קשר כדי לדון בפרויקט שלך.







