פיתוח מסנן דירוג וביקורות עבור 1C-Bitrix
אתה מנהל קטלוג עם עשרות אלפי מוצרים וביקורות. לקוחות רוצים לסנן מוצרים עם דירוג של 4.5 כוכבים ומעלה, או רק כאלה שיש להם ביקורות. המסנן החכם הסטנדרטי של 1C-Bitrix לא יכול להתמודד עם זה — הוא עובד רק עם מאפייני בלוק מידע ומחיר, בעוד שדירוג הוא ערך מחושב המאוחסן בטבלאות צד שלישי (בלוג, הצבעה, מותאם אישית). ללא יישום נכון, כל שאילתה עם JOIN מוסיפה 0.5–1.5 שניות לזמן טעינת העמוד. אנחנו צוות עם למעלה מ-5 שנות ניסיון בפיתוח מסחרי, שיישמנו יותר מ-50 פרויקטים, כולל קטלוגים עם אלפי מוצרים. שדות UF הם שיטה מוכחת המספקת סינון ללא JOINs וללא שכתוב של הרכיב הסטנדרטי. בואו נראה איך זה עובד בפועל.
למה המסנן החכם לא רואה את הדירוג?
כי הוא לא יודע על השדות UF_RATING ו-UF_REVIEW_COUNT. מערכת הסינון עובדת רק עם מאפייני בלוק מידע, בעוד ששדות UF הם מאפיינים של ישויות אחרות. עם זאת, אם תוסיף את שדות ה-UF האלה לרכיב בלוק המידע (באמצעות ENTITY_ID='IBLOCK_ELEMENT'), המסנן החכם יתחיל לראות ולהשתמש בהם. זה מבטל את הצורך לעקוף את הרכיב או לכתוב שאילתות מותאמות אישית.
איך להוסיף שדות UF לסינון דירוג?
אנחנו משתמשים בשילוב של שדות UF בתוספת מטפל אירועים או סוכן. זה מספק ביצועים גבוהים (סינון ללא JOINs) וגמישות (סינון לפי כל טווח).
מבנה שדות UF לדירוג
// Создание UF-полей при установке
$userTypeManager = \Bitrix\Main\EventManager::getInstance();
// UF_RATING - средний рейтинг
\CUserTypeEntity::Add([
'ENTITY_ID' => 'IBLOCK_' . CATALOG_IBLOCK_ID . '_SECTION',
'FIELD_NAME' => 'UF_RATING',
'USER_TYPE_ID' => 'double',
'MANDATORY' => 'N',
'SHOW_FILTER' => 'S',
'SETTINGS' => ['PRECISION' => 1, 'MIN' => 0, 'MAX' => 5],
]);
// UF_REVIEW_COUNT - количество отзывов
\CUserTypeEntity::Add([
'ENTITY_ID' => 'IBLOCK_' . CATALOG_IBLOCK_ID . '_SECTION',
'FIELD_NAME' => 'UF_REVIEW_COUNT',
'USER_TYPE_ID' => 'integer',
'MANDATORY' => 'N',
'SHOW_FILTER' => 'S',
]);
עדכון דירוג בעת הוספת ביקורת
AddEventHandler('blog', 'OnAfterPostAdd', 'updateProductRating');
AddEventHandler('blog', 'OnAfterPostUpdate', 'updateProductRating');
function updateProductRating($id, $fields) {
// Получение ID товара из связи с отзывом
$productId = getProductIdFromPost($id);
if (!$productId) return;
// Пересчёт рейтинга
$reviews = getProductReviews($productId);
$count = count($reviews);
$avg = $count > 0 ? array_sum(array_column($reviews, 'rating')) / $count : 0;
// Обновление UF-полей элемента
CIBlockElement::SetPropertyValues($productId, CATALOG_IBLOCK_ID, [
'UF_RATING' => round($avg, 1),
'UF_REVIEW_COUNT' => $count,
]);
} סינון לפי דירוג מינימלי
// Применение фильтра рейтинга
if (!empty($_GET['min_rating'])) {
$minRating = floatval($_GET['min_rating']);
if ($minRating >= 1 && $minRating <= 5) {
$arFilter['>=UF_RATING'] = $minRating;
}
}
// Фильтр "только с отзывами"
if (!empty($_GET['has_reviews'])) {
$arFilter['>UF_REVIEW_COUNT'] = 0;
} ממשק משתמש: מסנן דירוג כוכבים
$currentMinRating = floatval($_GET['min_rating'] ?? 0); ?>
<div class="filter-block filter-block--rating">
<h3 class="filter-block__title">Рейтинг</h3>
<div class="rating-filter">
<?php for ($stars = 5; $stars >= 1; $stars--): ?>
<label class="rating-option <?= $currentMinRating == $stars ? 'is-active' : '' ?>">
<input type="radio" name="min_rating" value="<?= $stars ?>" <?= $currentMinRating == $stars ? 'checked' : '' ?>>
<span class="stars">
<?php for ($i = 1; $i <= 5; $i++): ?>
<svg class="star <?= $i <= $stars ? 'star--filled' : 'star--empty' ?>" viewBox="0 0 24 24" width="16" height="16">
<polygon points="12,2 15.09,8.26 22,9.27 17,14.14 18.18,21.02 12,17.77 5.82,21.02 7,14.14 2,9.27 8.91,8.26"/>
</svg>
<?php endfor; ?>
<span class="stars-label">от <?= $stars ?></span>
</span>
</label>
<?php endfor; ?>
</div>
<label class="filter-toggle">
<input type="checkbox" name="has_reviews" value="1" <?= !empty($_GET['has_reviews']) ? 'checked' : '' ?>>
<span>Только с отзывами</span>
</label>
</div>
<?php מיון לפי דירוג
סינון דירוג משתלב באופן טבעי עם מיון:
$sortField = htmlspecialchars($_GET['sort'] ?? 'SORT');
$sortOrder = in_array(strtoupper($_GET['order'] ?? 'ASC'), ['ASC', 'DESC']) ? strtoupper($_GET['order']) : 'ASC';
$arSort = match ($sortField) {
'rating' => ['UF_RATING' => 'DESC'],
'reviews' => ['UF_REVIEW_COUNT' => 'DESC'],
'price' => ['CATALOG_PRICE_1' => $sortOrder],
default => ['SORT' => 'ASC'],
}; למה שדות UF מהירים יותר מ-JOIN?
שדות UF מאוחסנים בטבלאות נפרדות עם אינדקסים ואינם דורשים פעולות חישוביות לסינון. בניגוד ל-JOINs, שבהם כל שאילתה ממזגת טבלאות, סינון לפי שדות UF מתבצע בזמן קבוע. השווה:
| גישה | זמן סינון (15,000 מוצרים) | מורכבות יישום | גמישות תצורה |
|---|---|---|---|
| שדות UF עם אינדקס | 0.2 שניות | בינונית | גבוהה (כל טווח) |
| JOIN לטבלה מותאמת אישית | 1.5 שניות | גבוהה | בינונית (התאמה מדויקת בלבד) |
| מסנן חכם סטנדרטי | לא אפשרי | – | – |
לפי המדריך הרשמי של 1C-Bitrix לשדות משתמש, שדות UF יכולים להשתתף בסינון כאשר SHOW_FILTER = 'S' מוגדר. ראה גם את מאמר ויקיפדיה על 1C-Bitrix למידע כללי על הפלטפורמה.
יישום שלב-אחר-שלב של סינון דירוג
- צור שדות UF. הוסף UF_RATING (מספר עשרוני) ו-UF_REVIEW_COUNT (מספר שלם) עם SHOW_FILTER='S'.
- פתח מטפל אירועים. במטפל OnAfterPostAdd, חשב מחדש את הדירוג הממוצע ומספר הביקורות.
- הגדר את המסנן ברכיב. ציין את פרמטר FILTER_NAME והשתמש בשדות UF במסנן.
- בנה את מסנן ממשק המשתמש. צור ממשק כוכבים עם לחצני רדיו לדירוג מינימלי.
- הוסף מיון. כלול אפשרויות מיון לפי UF_RATING ו-UF_REVIEW_COUNT.
השוואת שיטות עדכון דירוג
| שיטה | ביצועים | מורכבות | מתי להשתמש |
|---|---|---|---|
| מטפל אירועים (OnAfterPostAdd) | גבוהים (מיידי) | בינונית | ביקורות מתפרסמות מיד |
| סוכן תקופתי (כל 30 דקות) | בינוניים (דחויים) | נמוכה | ביקורות עוברות מידרציה |
| חישוב מחדש ידני | נמוכים (לפי דרישה) | נמוכה | מעט ביקורות, בדיקות |
מקרה בוחן: שוק אלקטרוניקה
אחד הלקוחות שלנו הוא חנות מקוונת לאלקטרוניקה עם 15,000 מוצרים. יישמנו מסנן דירוג כוכבים ומיון לפי דירוג. שדות UF מתעדכנים באמצעות סוכן כל 30 דקות (לא באמצעות אירוע, כי ביקורות עוברות מידרציה). לאחר המידרציה, חישוב מחדש ידני באמצעות כפתור בלוח הניהול. תוצאה: מוצרים ללא ביקורות (פריטים חדשים) מוסתרים כברירת מחדל במסנן, ומוצגים כאשר תיבת הסימון "רק עם ביקורות" אינה מסומנת. שיעור ההמרה מהקטלוג המסונן (דירוג 4+) גבוה ב-23% מהממוצע. הפרויקט נמסר בזמן, הלקוח מרוצה — אנחנו מבטיחים אמינות ותמיכה לאחר ההשקה.
טעויות נפוצות ביישום
- שכחת להגדיר SHOW_FILTER='S' — ללא זה, שדות UF לא משתתפים בסינון.
- אי יצירת אינדקס לשדות UF — ביצועים יורדים בקטלוגים גדולים.
- שימוש בהתאמה מדויקת במקום טווח — דירוג הוא רק לעתים רחוקות מספר שלם.
- אי עדכון הדירוג בעת מחיקת ביקורת — הנתונים הופכים למיושנים.
מה כלול בעבודה
- יצירת שדות UF והגדרת אינדקס.
- פיתוח מטפל אירועים או סוכן לחישוב מחדש של דירוג.
- פרונטאנד של מסנן כוכבים עם רספונסיביות.
- מיון לפי דירוג וביקורות.
- אופטימיזציית מטמון לעומס גבוה.
- תיעוד והדרכה קצרה למנהלים.
- גישה למאגר הקוד והוראות פריסה.
- תמיכה לאחר השקה למשך חודש.
לוח זמנים ועלות
מסנן המבוסס על שדות UF עם ממשק משתמש פשוט — מיום עסקים אחד (החל מ-$200). יישום מלא עם חישוב מחדש של דירוג, ממשק כוכבים, מיון וסוכן — 2–3 ימי עסקים (בדרך כלל $500–$800). העלות מחושבת באופן אישי לאחר ניתוח הפרויקט שלך.
צור קשר להערכה חינמית של הפרויקט שלך. בקש פיתוח — קבל ייעוץ לפתרון האופטימלי לקטלוג שלך.
למד עוד על היכולות של שדות UF בתיעוד הרשמי של 1C-Bitrix. ומידע כללי על הפלטפורמה בויקיפדיה.

