שיפור רכיבי ביטריקס באמצעות result_modifier

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

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

שאלות נפוצות

שיפור רכיבי ביטריקס באמצעות result_modifier

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

אנו משתמשים ב-result_modifier.php — קובץ שמריץ אחרי לוגיקת הרכיב אך לפני עיבוד התבנית. הוא מאפשר להעשיר את $arResult בכל נתון מבלי לגעת בליבה. לפי התיעוד הרשמי של 1C-Bitrix, result_modifier נועד לשינוי נתונים לפני התבנית. זה מבטיח תאימות מלאה לעדכוני הפלטפורמה ומפחית את זמן השינוי פי 2–3 בהשוואה לעקיפת הרכיב. החיסכון בתקציב מגיע ל-30–50%, שבמשימה טיפוסית מסתכם בחיסכון של $500–$1,000.לקוח במסחר אלקטרוני חסך $2,500 בפרויקט אחד בכך שנמנע מעקיפת רכיבים. כל השינויים נשמרים במטמון יחד עם הנתונים הראשיים.

איך עובד result_modifier?

רצף ביצוע הרכיב:

  1. component.php — לוגיקת הרכיב ממלאת את $arResult.
  2. result_modifier.php — שינוי $arResult בתבנית.
  3. template.php — עיבוד HTML.
  4. 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 שכבר בוצעו על ידי הרכיב — רק להשלים את התוצאה עם שאילתות חדשות. אם צריך לשנות את לוגיקת שליפת הנתונים, עקוף את הרכיב עצמו.

תהליך ולוחות זמנים

שלבי עבודה טיפוסיים:

  1. ניתוח: חקר מבנה template.php של הרכיב המטרה, זיהוי נתונים חסרים.
  2. תכנון: בחירת מקור נתונים (בלוק HL, טבלה, API חיצוני).
  3. יישום: כתיבת $arResult עם שאילתה ושינוי מערך.
  4. מטמון: הגדרת מטמון מתויג לביצועים.
  5. בדיקות: אימות עם תרחישים שונים (מטמון מופעל/כבוי, קבוצות משתמשים שונות).
  6. פריסה: הצבה בתיקיית התבנית, הגדרת ניטור.

תוצרים כלולים:

  • result_modifier.php קובץ עם הערות וטיפול בשגיאות.
  • הגדרת מטמון (מתויג, TTL).
  • תיעוד של השדות שנוספו.
  • ייעוץ להרחבת הפתרון.
  • גישה למאגר Git פרטי עם כל הקוד.
  • הדרכה של שעתיים למפתחים שלך.
  • שנה של תמיכה ועדכונים בחינם.

לוחות זמנים משוערים: רוב המשימות לוקחות 4–16 שעות. המחיר מחושב באופן אישי — מ-$500 עד $1,800 בהתאם למורכבות. קבלו ייעוץ: נסביר איך לחסוך זמן ותקציב.

רשימת בדיקה של טעויות נפוצות
  • שכחת לטעון מודולים באמצעות $arResult.
  • לא בדקת את מטמון הרכיב — result_modifier לא מבוצע כשהמטמון מוכן.
  • ניסיון לשנות את $arResult — אסור לשנות זאת.
  • שימוש ב-component_epilog.php לכתיבה למסד הנתונים — מפר את המטרה הארכיטקטונית.
  • אי-הסרת תווים או סינון נתונים — סיכון ל-XSS.

יש לנו ניסיון של למעלה מ-8 שנים בפיתוח ביטריקס, השלמנו 50+ פרויקטי רכיבים מותאמים אישית, ואנחנו בשוק מאז 2016. בממוצע, הלקוחות שלנו מפחיתים עלויות ב-35% ומאיצים פיתוח ב-40%. אנו מבטיחים עבודה יציבה בכל גרסאות הפלטפורמה. צרו קשר להערכת פרויקט — נגיב תוך יום.

היתרונות של הגישה שלנו

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

השלבים הבאים

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