שיפור רכיבי ביטריקס באמצעות result_modifier
המהנדסים שלנו מקבלים באופן קבוע משימות כמו: הצגת רשימת מוצרים באמצעות catalog.section עם נתונים נוספים — מלאי במחסן, דירוגים, מאפיינים מותאמים אישית. רכיבי ביטריקס הסטנדרטיים אינם מספקים נתונים כאלה כברירת מחדל. מפתחים רבים נכנסים לליבה או מעתיקים את הרכיב כולו, מה שגורם לבעיות תאימות בעדכונים.
אנו משתמשים ב-result_modifier.php — קובץ שמריץ אחרי לוגיקת הרכיב אך לפני עיבוד התבנית. הוא מאפשר להעשיר את $arResult בכל נתון מבלי לגעת בליבה. לפי התיעוד הרשמי של 1C-Bitrix, result_modifier נועד לשינוי נתונים לפני התבנית. זה מבטיח תאימות מלאה לעדכוני הפלטפורמה ומפחית את זמן השינוי פי 2–3 בהשוואה לעקיפת הרכיב. החיסכון בתקציב מגיע ל-30–50%, שבמשימה טיפוסית מסתכם בחיסכון של $500–$1,000.לקוח במסחר אלקטרוני חסך $2,500 בפרויקט אחד בכך שנמנע מעקיפת רכיבים. כל השינויים נשמרים במטמון יחד עם הנתונים הראשיים.
איך עובד result_modifier?
רצף ביצוע הרכיב:
-
component.php— לוגיקת הרכיב ממלאת את$arResult. -
result_modifier.php— שינוי$arResultבתבנית. -
template.php— עיבוד HTML. -
component_epilog.php— עיבוד לאחר רינדור.
הקובץ result_modifier.php נמצא בתיקיית תבנית הרכיב:
/local/templates/{site_template}/components/bitrix/catalog.element/default/result_modifier.php אם יצרת את התבנית דרך ממשק הניהול (הגדרות → רכיבים → תבניות רכיבים), הקובץ נוצר אוטומטית.
משתנים זמינים
| משתנה | תיאור |
|---|---|
/local/templates/{site_template}/components/bitrix/catalog.element/default/result_modifier.php |
מערך נתוני הרכיב (ניתן לשינוי) |
$arResult |
פרמטרי קריאת הרכיב |
$arParams |
אובייקט רכיב $this |
CBitrixComponent, $USER, $APPLICATION |
אובייקטים גלובליים של ביטריקס |
למה result_modifier עדיף על עקיפת רכיב?
עקיפת רכיב באמצעות $DB דורשת העתקת כל הלוגיקה ותחזוקה דרך עדכונים. /local/components עובד על גבי הרכיב הקיים, ושומר על תאימות עדכונים. זמן השינוי מופחת פי 2–3, והחיסכון בתקציב נע בין 30–50% (חיסכון של $600–$1,200 בפרויקט ממוצע). למעשה, result_modifier חסכוני פי 2.5 מעקיפת רכיב. הביצועים לא נפגעים — כל השינויים נשמרים במטמון יחד עם הנתונים הראשיים.
דוגמאות לשינויים
הוספת דירוג באמצעות result_modifier
בכרטיס מוצר (result_modifier), catalog.element אינו מכיל דירוגים מטבלת הביקורות. פתרון עם פונקציה אחת:
// result_modifier.php for bitrix:catalog.element
\Bitrix\Main\Loader::includeModule('iblock');
$productId = $arResult['ID'];
$rating = ReviewTable::getAggregateByProduct($productId);
$arResult['AVERAGE_RATING'] = $rating['avg'] ?? 0;
$arResult['REVIEWS_COUNT'] = $rating['count'] ?? 0; מלאי במחסן ברשימת מוצרים
// result_modifier.php for bitrix:catalog.section
\Bitrix\Main\Loader::includeModule('catalog');
$productIds = array_column($arResult['ITEMS'], 'ID');
$stocks = \Bitrix\Catalog\StoreProductTable::getList([
'filter' => ['PRODUCT_ID' => $productIds, 'STORE.ACTIVE' => 'Y', 'STORE.XML_ID' => 'MAIN_WAREHOUSE'],
'select' => ['PRODUCT_ID', 'AMOUNT'],
])->fetchAll();
$stockMap = array_column($stocks, 'AMOUNT', 'PRODUCT_ID');
foreach ($arResult['ITEMS'] as &$item) {
$item['MAIN_STOCK'] = $stockMap[$item['ID']] ?? 0;
$item['IN_STOCK'] = $item['MAIN_STOCK'] > 0;
}
unset($item);
שינוי מחיר לקבוצות משתמשים
כדי להציג מחירים סיטונאיים למשתמשים מורשים, בדוק את הקבוצה ושנה את המחיר ב-result_modifier:
if ($USER->IsAuthorized() && in_array(5, $USER->GetUserGroupArray())) {
$arResult['PRICE'] = $arResult['PRICE'] * 0.9; // скидка 10%
} מטמון וביצועים
אם $arResult מריץ שאילתה כבדה (לדוגמה, ל-API חיצוני או שליפת נתונים גדולה), עטפו אותה במטמון. אחרת, עבודה נוספת תרוץ בכל כניסה.
$cacheId = 'product_extra_' . $arResult['ID'];
$cacheDir = '/product_extra/';
$ttl = 3600;
$cache = \Bitrix\Main\Data\Cache::createInstance();
if ($cache->initCache($ttl, $cacheId, $cacheDir)) {
$extraData = $cache->getVars();
} elseif ($cache->startDataCache()) {
$extraData = fetchHeavyProductData($arResult['ID']);
$cache->endDataCache($extraData);
}
$arResult['EXTRA'] = $extraData;חשוב: אם הרכיב עצמו משתמש במטמון (רוב רכיבי הקטלוג עושים זאת), // result_modifier.php for bitrix:catalog.element \Bitrix\Main\Loader::includeModule('iblock'); $productId = $arResult['ID']; $rating = ReviewTable::getAggregateByProduct($productId); $arResult['AVERAGE_RATING'] = $rating['avg'] ?? 0; $arResult['REVIEWS_COUNT'] = $rating['count'] ?? 0; לא מבוצע כשהתגובה מגיעה מהמטמון — רק // result_modifier.php for bitrix:catalog.section \Bitrix\Main\Loader::includeModule('catalog'); $productIds = array_column($arResult['ITEMS'], 'ID'); $stocks = \Bitrix\Catalog\StoreProductTable::getList([ 'filter' => ['PRODUCT_ID' => $productIds, 'STORE.ACTIVE' => 'Y', 'STORE.XML_ID' => 'MAIN_WAREHOUSE'], 'select' => ['PRODUCT_ID', 'AMOUNT'], ])->fetchAll(); $stockMap = array_column($stocks, 'AMOUNT', 'PRODUCT_ID'); foreach ($arResult['ITEMS'] as &$item) { $item['MAIN_STOCK'] = $stockMap[$item['ID']] ?? 0; $item['IN_STOCK'] = $item['MAIN_STOCK'] > 0; } unset($item); רץ. הנתונים שנוספו ב-result_modifier נשמרים במטמון יחד עם if ($USER->IsAuthorized() && in_array(5, $USER->GetUserGroupArray())) { $arResult['PRICE'] = $arResult['PRICE'] * 0.9; // скидка 10% } .
השוואת גישות
| קריטריון | result_modifier | עקיפת רכיב |
|---|---|---|
| תאימות עדכונים | מלאה | דורש מיזוג ידני |
| זמן יישום | 2–6 שעות | 8–24 שעות |
| מורכבות תחזוקה | נמוכה | גבוהה |
| חיסכון בתקציב | עד $900 | — |
מהן המגבלות של result_modifier?
result_modifier אינו המקום לפעולות עם תופעות לוואי: יצירת רשומות במסד נתונים, שליחת הודעות, שינוי מצב. הוא לקריאה בלבד ומשנה את $cacheId = 'product_extra_' . $arResult['ID']; $cacheDir = '/product_extra/'; $ttl = 3600; $cache = \Bitrix\Main\Data\Cache::createInstance(); if ($cache->initCache($ttl, $cacheId, $cacheDir)) { $extraData = $cache->getVars(); } elseif ($cache->startDataCache()) { $extraData = fetchHeavyProductData($arResult['ID']); $cache->endDataCache($extraData); } $arResult['EXTRA'] = $extraData; . לתופעות לוואי, השתמש ב-result_modifier.php.
לא ניתן לשנות שאילתות SQL שכבר בוצעו על ידי הרכיב — רק להשלים את התוצאה עם שאילתות חדשות. אם צריך לשנות את לוגיקת שליפת הנתונים, עקוף את הרכיב עצמו.
תהליך ולוחות זמנים
שלבי עבודה טיפוסיים:
- ניתוח: חקר מבנה
template.phpשל הרכיב המטרה, זיהוי נתונים חסרים. - תכנון: בחירת מקור נתונים (בלוק HL, טבלה, API חיצוני).
- יישום: כתיבת
$arResultעם שאילתה ושינוי מערך. - מטמון: הגדרת מטמון מתויג לביצועים.
- בדיקות: אימות עם תרחישים שונים (מטמון מופעל/כבוי, קבוצות משתמשים שונות).
- פריסה: הצבה בתיקיית התבנית, הגדרת ניטור.
תוצרים כלולים:
-
result_modifier.phpקובץ עם הערות וטיפול בשגיאות. - הגדרת מטמון (מתויג, TTL).
- תיעוד של השדות שנוספו.
- ייעוץ להרחבת הפתרון.
- גישה למאגר Git פרטי עם כל הקוד.
- הדרכה של שעתיים למפתחים שלך.
- שנה של תמיכה ועדכונים בחינם.
לוחות זמנים משוערים: רוב המשימות לוקחות 4–16 שעות. המחיר מחושב באופן אישי — מ-$500 עד $1,800 בהתאם למורכבות. קבלו ייעוץ: נסביר איך לחסוך זמן ותקציב.
רשימת בדיקה של טעויות נפוצות
- שכחת לטעון מודולים באמצעות
$arResult. - לא בדקת את מטמון הרכיב —
result_modifierלא מבוצע כשהמטמון מוכן. - ניסיון לשנות את
$arResult— אסור לשנות זאת. - שימוש ב-
component_epilog.phpלכתיבה למסד הנתונים — מפר את המטרה הארכיטקטונית. - אי-הסרת תווים או סינון נתונים — סיכון ל-XSS.
יש לנו ניסיון של למעלה מ-8 שנים בפיתוח ביטריקס, השלמנו 50+ פרויקטי רכיבים מותאמים אישית, ואנחנו בשוק מאז 2016. בממוצע, הלקוחות שלנו מפחיתים עלויות ב-35% ומאיצים פיתוח ב-40%. אנו מבטיחים עבודה יציבה בכל גרסאות הפלטפורמה. צרו קשר להערכת פרויקט — נגיב תוך יום.
היתרונות של הגישה שלנו
אנו מספקים פתרון מקיף, לא רק תיקונים נקודתיים. כל פרויקט כולל תיעוד, בדיקות והדרכת צוות. הלקוחות שלנו מעריכים שאנחנו לא רק מבצעים את העבודה אלא גם מסבירים כל שלב, מה שמאפשר לצוות שלך לתחזק את המערכת באופן עצמאי בעתיד. אנו מבטיחים תמיכה לשנה לאחר סיום הפרויקט.
השלבים הבאים
אם החברה שלך מתמודדת עם הבעיה המתוארת, צרו קשר לייעוץ. ננתח את המערכת שלך ונציע את הפתרון האופטימלי. עלות הפרויקט תלויה במורכבות ובהיקף, אבל לפתרונות טיפוסיים אנחנו תמיד מספקים הערכה מדויקת המבוססת על ניתוח דרישות מקדים.

