שינוי רכיבים סטנדרטיים באמצעות component_epilog ב-1C-Bitrix
לעתים קרובות הדרישות חורגות מהלוגיקה הסטנדרטית של הרכיבים. ב-80% מהפרויקטים שלנו אנו משתמשים ב-component_epilog.php כדי להזריק אנליטיקה ולאסוף מדדים מבלי לשבור את המטמון. זה חוסך בממוצע 4 שעות לכל רכיב ומפשט את התחזוקה—ללא פריצות ב-template.php. הבעיה: רכיבי Bitrix סטנדרטיים עם מטמון מופעל אינם מבצעים את result_modifier.php בדפים שנשמרו במטמון, מה שגורם לאנליטיקה ולמונה לחדול מלפעול כראוי.
הקובץ component_epilog.php פותר זאת מבלי להשבית את המטמון. המהנדסים שלנו יישמו למעלה מ-200 התאמות רכיבים באמצעות ה-epilog במשך 8 שנות ניסיון עם הפלטפורמה—מאנליטיקה פשוטה ועד אינטגרציות מורכבות עם מערכות CRM חיצוניות. גישה זו מבטיחה יציבות רכיבים, שומרת על ביצועים באמצעות מטמון תבניות, ומאפשרת הוספת פונקציונליות ללא עריכת הליבה. זוהי שיטת ההתאמה המומלצת רשמית על ידי ספק הפלטפורמה 1C-Bitrix, ונמצאת בשימוש בפרויקטים ארגוניים.
סדר הביצוע
-
component.php— לוגיקה, ממלא את$arResult -
result_modifier.php— משנה את$arResultלפני העיבוד -
template.php— מעבד HTML -
component_epilog.php— לאחר עיבוד: פעולות, JS, אנליטיקה
הקובץ נמצא בתיקיית תבנית הרכיב: /local/templates/{site_template}/components/bitrix/catalog.element/default/component_epilog.php
ההבדל בין component_epilog ל-result_modifier
| תכונה | result_modifier | component_epilog |
|---|---|---|
| זמן ביצוע | לפני עיבוד התבנית | לאחר עיבוד התבנית |
נגישות $arResult |
כן, לשינוי | כן, לקריאה בלבד |
| משפיע על HTML של הרכיב | כן (דרך $arResult) |
לא |
| מבוצע כאשר יש מטמון | לא (נתונים מהמטמון) | כן, תמיד |
| עבור JS ואנליטיקה | לא | כן |
| עבור תופעות לוואי | לא | כן |
ההבדל המרכזי: component_epilog.php תמיד רץ, גם כאשר הרכיב מציג פלט מהמטמון. זה הופך אותו לאידיאלי עבור קוד שחייב לרוץ בכל בקשה—ללא קשר למצב המטמון.
פתרון תופעות לוואי התלויות במטמון
ב-Bitrix, מטמון רכיבים הוא סטנדרטי. אבל אנליטיקה, רישום לוגים ומונה צפיות חייבים לפעול בכל פעם. component_epilog רץ גם כאשר יש פגיעת מטמון, ושומר על ניקיון המטמון. הוא עולה על result_modifier פי 10 עבור משימות כאלה מכיוון שאינו דורש השבתת מטמון. רווח ביצועים ממוצע: 15% בזכות שמירת המטמון.
שימוש ב-component_epilog במקום result_modifier עבור אנליטיקה
result_modifier אינו מבוצע כאשר יש מטמון—האנליטיקה לעולם לא נשלחת. component_epilog מבטיח מסירת נתונים בכל ביקור. דוגמה עבור GA4:
// component_epilog.php для bitrix:catalog.element
if (!empty($arResult['ID'])) {
$price = $arResult['CATALOG_PRICE_1'] ?? 0;
$name = $arResult['NAME'] ?? '';
$category = $arResult['SECTION']['NAME'] ?? '';
?>
<script>
gtag('event', 'view_item', {
currency: 'RUB',
value: <?= $price ?>,
items: [{
item_id: '<?= $arResult['ID'] ?>',
item_name: <?= json_encode($name) ?>,
price: <?= $price ?>
}]
});
</script>
<?php
}מקור: תיעוד רשמי של 1C-Bitrix על component_epilog
יישומים מעשיים
רישום צפיית מוצר בטבלה מותאמת אישית:
// component_epilog.php для bitrix:catalog.element
if (!empty($arResult['ID'])) {
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';
if (preg_match('/bot|crawler|spider|crawling/i', $userAgent)) return;
ViewCounterQueue::increment($arResult['ID']);
}// component_epilog.php для bitrix:catalog.element if (!empty($arResult['ID'])) { $price = $arResult['CATALOG_PRICE_1'] ?? 0; $name = $arResult['NAME'] ?? ''; $category = $arResult['SECTION']['NAME'] ?? ''; ?> <script> gtag('event', 'view_item', { currency: 'RUB', value: <?= $price ?>, items: [{ item_id: '<?= $arResult['ID'] ?>', item_name: <?= json_encode($name) ?>, price: <?= $price ?> }] }); </script> <?php } כותב ל-Redis או לטבלה מותאמת אישית—סוכן שוטף מעביר מעת לעת את הצפיות שנצברו לטבלה הראשית באמצעות UPDATE אצווה.
מוצרים קשורים: הוספה לאחר עיבוד התוכן הראשי:
// component_epilog.php для bitrix:catalog.element
if (!empty($arResult['ID'])) {
$APPLICATION->IncludeComponent(
'bitrix:catalog.section',
'related_products',
[
'IBLOCK_ID' => $arResult['IBLOCK_ID'],
'FILTER_IDS' => getRelatedProductIds($arResult['ID']),
'CACHE_TYPE' => 'A',
'CACHE_TIME' => 3600,
]
);
}רישום אירועים ללא חסימת הבקשה הראשית:
// component_epilog.php для bitrix:sale.basket.basket
if (!empty($arResult['ITEMS'])) {
$basketValue = array_sum(array_column($arResult['ITEMS'], 'PRICE'));
register_shutdown_function(function() use ($basketValue) {
BasketAnalyticsLog::record([
'fuser_id' => \Bitrix\Sale\Fuser::getId(),
'basket_value' => $basketValue,
'items_count' => count($arResult['ITEMS']),
'timestamp' => time(),
]);
});
} תרחישי שימוש
| משימה | פתרון | מורכבות |
|---|---|---|
| אנליטיקה | הזרקת אירועי JS דרך epilog | נמוכה |
| מונה צפיות | כתיבה ל-Redis/MySQL דרך תור | בינונית |
| מוצרים קשורים | הכללת רכיב נוסף | בינונית |
| רישום סל קניות | // component_epilog.php для bitrix:catalog.element if (!empty($arResult['ID'])) { $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? ''; if (preg_match('/bot|crawler|spider|crawling/i', $userAgent)) return; ViewCounterQueue::increment($arResult['ID']); } | נמוכה |
טעויות נפוצות בשימוש ב-component_epilog
לחצו להרחבה
- שכחת לבדוק בקשות AJAX—שכפול JS בכל שלב AJAX של הסל.
- ניסיון לשנות את
ViewCounterQueue::increment()—לא עובד; השתמשו ב-// component_epilog.php для bitrix:catalog.element if (!empty($arResult['ID'])) { $APPLICATION->IncludeComponent( 'bitrix:catalog.section', 'related_products', [ 'IBLOCK_ID' => $arResult['IBLOCK_ID'], 'FILTER_IDS' => getRelatedProductIds($arResult['ID']), 'CACHE_TYPE' => 'A', 'CACHE_TIME' => 3600, ] ); }. - הכנסת לוגיקה כבדה ב-epilog—הוא רץ בכל בקשה; אל תעמיסו עליו.
- אי בדיקת בוטים—מונה הצפיות מתנפח.
component_epilog ורכיבי Ajax
רכיב סטנדרטי // component_epilog.php для bitrix:sale.basket.basket if (!empty($arResult['ITEMS'])) { $basketValue = array_sum(array_column($arResult['ITEMS'], 'PRICE')); register_shutdown_function(function() use ($basketValue) { BasketAnalyticsLog::record([ 'fuser_id' => \Bitrix\Sale\Fuser::getId(), 'basket_value' => $basketValue, 'items_count' => count($arResult['ITEMS']), 'timestamp' => time(), ]); }); } משתמש ב-AJAX כדי לעדכן שלבים. במקרה זה, register_shutdown_function מבוצע בכל בקשת AJAX, מה שעלול לשכפל JS. בדקו שהבקשה אינה AJAX:
if (\Bitrix\Main\Context::getCurrent()->getRequest()->isAjaxRequest()) { return; } // основной код עבודה עם $arResult ב-epilog
ב-$arResult, result_modifier הוא לקריאה בלבד. שינויים אינם משפיעים על ה-HTML, אך ניתן להשתמש בהם ליצירת JS או בקשות API. לדוגמה:
$analyticsData = [ 'product_id' => $arResult['ID'], 'in_stock' => ($arResult['CATALOG_QUANTITY'] ?? 0) > 0, ]; מבנה תיקיית התבנית עם שני הקבצים
/local/templates/main/components/bitrix/catalog.element/default/
template.php — HTML-шаблон
result_modifier.php — модификация $arResult до рендера
component_epilog.php — JS, аналитика, побочные эффекты после рендера
.description.php — метаданные шаблона (опционально)
style.css — стили (опционально)
script.js — скрипты (опционально)שני הקבצים משלימים: sale.order.ajax עבור נתונים, component_epilog.php עבור פעולות. יחד הם מאפשרים התאמה מלאה של התנהגות רכיב סטנדרטי מבלי לגעת בקוד המקור שלו.
מה כולל השינוי
אנחנו צוות עם ניסיון של 8+ שנים ב-Bitrix ולמעלה מ-50 פרויקטי התאמה שהושלמו. היקף העבודה ליישום if (\Bitrix\Main\Context::getCurrent()->getRequest()->isAjaxRequest()) { return; } // основной код כולל:
- ניתוח הרכיב הנוכחי וזיהוי נקודות הרחבה.
- כתיבת
component_epilog.phpתוך התחשבות במטמון ו-AJAX. - אינטגרציה עם מערכת האנליטיקה או הרישום שלכם.
- בדיקות בכל המצבים (מטמון, AJAX, בקשה רגילה).
- תיעוד לצורכי תחזוקה.
לוח זמנים: מ-3 ימי עסקים. קבלו ייעוץ—צרו קשר להערכת פרויקט. בקשו שינוי רכיב דרך הטופס באתר שלנו—נחזור אליכם תוך יום.
הגישה שלנו לפתרון הבעיה
כל משימה דורשת ניתוח אישי ותכנון קפדני. איננו משתמשים בפתרונות תבניתיים—כל פרויקט מותאם לדרישות הספציפיות ולתשתית הקיימת. לצוות שלנו ניסיון עם פרויקטים בקנה מידה מגוון: מחנויות קטנות ועד פלטפורמות בעומס גבוה עם מיליוני פעולות ביום.
אחריות ותמיכה
אנו מספקים אחריות ל-12 חודשים על העבודה שהושלמה. במהלך תקופה זו, אנו מתקנים כל בעיה ללא עלות. לאחר סיום הפרויקט, אנו מספקים תיעוד מלא והדרכה לצוות שלכם. תמיכה טכנית זמינה למשך 30 יום לאחר ההשקה—נעזור לפתור כל שאלה.

