פיתוח מגה-תפריט מותאם אישית ל-1C-Bitrix עם קאשינג

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

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

שאלות נפוצות

העבודות האחרונות

  • image_website-b2b-advance_0.webp
    פיתוח אתר חברה B2B ADVANCE
    1458
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    פיתוח אתר לחברת FIXPER
    1019
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    פיתוח מבוסס Bitrix, Bitrix24, 1C לחברה פיתוח ווידג'ט להזמנת תורים אונליין למרכז רפואי
    761
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    פיתוח על בסיס 1C Enterprise עבור MIRSANBEL
    882
  • image_crm_dolbimby_434_0.webp
    פיתוח אתר על CRM Bitrix24 עבור DOLBIMBY
    805
  • image_crm_technotorgcomplex_453_0.webp
    פיתוח על בסיס Bitrix24 עבור חברת TECHNOTORGKOMPLEKS
    1163

אנו מפתחים מגה-תפריט מותאם אישית ל-1C-Bitrix עם קאשינג מלא ועיצוב רספונסיבי. מתאים לקטלוגים עם מאות קטגוריות. עלות הפיתוח מתחילה מ-$500 עבור מגה-תפריט דו-שכבתי בסיסי, ועד $2000 עבור גרסה רספונסיבית מלאה עם תמונות וקאשינג. עם חיסכון בעלויות שרת של $150–250 לחודש, ההשקעה מחזירה את עצמה תוך מספר חודשים.

כאשר לקטלוג מסחר אלקטרוני של 1C-Bitrix יש מאות קטגוריות ואלפי תת-קטגוריות, רכיב ה-bitrix:menu הסטנדרטי מפסיק לעמוד בעומס. המבקרים רואים רשימה ארוכה חד-שכבתית—הניווט הופך לגלילה ולחיצות אינסופיות. כל לחיצה על קטגוריה יוצרת שאילתת מסד נתונים חדשה, מה שיוצר עומס יתר בתעבורה גבוהה. אנו מפתחים מגה-תפריט מותאם אישית מפתח-לצרכן: מבנה רב-עמודות עם גישה מהירה לרמה השלישית, קאשינג מתויג, עיצוב רספונסיבי ותמיכה בניווט מקלדת. לפי בדיקות עומס, פתרון כזה מגדיל את ההמרה ב-15–20% בזכות חיפוש מוצרים קל יותר ומפחית את עלויות משאבי השרת.

מדוע התפריט הסטנדרטי אינו מתאים לקטלוגים גדולים?

הרכיב הסטנדרטי מציג רשימה שטוחה של קישורים. עבור קטלוג עם 500+ קטגוריות, זהו אסון חוויית משתמש: המשתמשים הולכים לאיבוד, ההמרה יורדת. בנוסף, כל קריאה ל-bitrix:menu בתבנית יוצרת שאילתת SQL נפרדת—עם מספר תפריטים העמוד מאט. מגה-תפריט מותאם אישית פותר את שתי הבעיות: הוא מקבץ קטגוריות לעמודות ומאחסן קטגוריות עם שאילתה אחת.

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

אילו בעיות פותר קאשינג מתויג?

קאשינג מתויג באמצעות CPHPCache מאפשר לאחסן את עץ הקטגוריות המוכן בזיכרון ולאפס אותו רק כאשר המבנה משתנה (קטגוריה נוספה/נמחקה). זה מניב שיפור ביצועים: זמן רינדור המגה-תפריט המותאם אישית יורד מ-50–100 אלפיות השנייה ל-3–8 אלפיות השנייה. עם 500 קטגוריות בשלוש רמות קינון, השאילתה אורכת 3–8 אלפיות השנייה, בניית העץ ב-PHP עוד 2–5 אלפיות השנייה, והגשה מהקאש פחות מ-1 אלפית השנייה. האינוולידציה מקושרת לאירועי OnBeforeIBlockSectionAdd/Update/Delete, מה שמונע נתונים מיושנים. כפי שנאמר ב-תיעוד רשמי של 1C-Bitrix, קאשינג מתויג הוא חובה לפרויקטים בעלי עומס גבוה. בפרויקטים אמיתיים, גישה זו מפחיתה את עומס השרת ב-30%, מה שחוסך $100 עד $300 לחודש בתעבורה ממוצעת.

כיצד אנו בונים את עץ הקטגוריות

מבנה הקטגוריות של Bitrix מאוחסן ב-b_iblock_section. עבור מגה-תפריט מותאם אישית, יש צורך בשתיים או שלוש רמות קינון. שיטת CIBlockSection::GetList הסטנדרטית עם INCLUDE_SUBSECTIONS = 'N' אינה מייצרת עץ—רק רשימה שטוחה. אנו בונים את העץ ידנית:

// /local/lib/Menu/MegaMenuBuilder.php + /local/components/local/megamenu/class.php namespace Local\Menu; use \Bitrix\Main\EventManager; class MegaMenuBuilder { public function build(int $iblockId, int $depth = 3): array { $cache = new \CPHPCache(); $cacheId = 'megamenu_' . $iblockId . '_' . LANGUAGE_ID; if ($cache->InitCache(3600, $cacheId, '/megamenu/')) { return $cache->GetVars()['menu']; } $raw = $this->fetchSections($iblockId, $depth); $tree = $this->buildTree($raw); $cache->StartDataCache(); $cache->EndDataCache(['menu' => $tree]); return $tree; } private function fetchSections(int $iblockId, int $depth): array { $result = []; $res = \CIBlockSection::GetList( ['LEFT_MARGIN' => 'ASC'], [ 'IBLOCK_ID' => $iblockId, 'ACTIVE' => 'Y', 'DEPTH_LEVEL' => [$depth], 'GLOBAL_ACTIVE' => 'Y', ], false, ['ID', 'NAME', 'CODE', 'DEPTH_LEVEL', 'IBLOCK_SECTION_ID', 'SECTION_PAGE_URL', 'PICTURE', 'UF_MENU_ICON', 'LEFT_MARGIN', 'RIGHT_MARGIN'] ); while ($section = $res->GetNext()) { $result[$section['ID']] = $section; } return $result; } private function buildTree(array $flat, int $parentId = 0): array { $tree = []; foreach ($flat as $section) { if ((int)$section['IBLOCK_SECTION_ID'] === $parentId) { $section['children'] = $this->buildTree($flat, (int)$section['ID']); $tree[] = $section; } } return $tree; } public static function clearCache(): void { $cache = new \CPHPCache(); $cache->CleanDir('/megamenu/'); } } class LocalMegaMenuComponent extends \CBitrixComponent { public function onPrepareComponentParams($params): array { $params['IBLOCK_ID'] = (int)($params['IBLOCK_ID'] ?? CATALOG_IBLOCK_ID); $params['DEPTH'] = (int)($params['DEPTH'] ?? 3); return $params; } public function executeComponent(): void { $builder = new \Local\Menu\MegaMenuBuilder(); $this->arResult['MENU'] = $builder->build( $this->arParams['IBLOCK_ID'], $this->arParams['DEPTH'] ); $this->setFrameMode(false); $this->includeComponentTemplate(); } } 

רכיב מגה-תפריט מותאם אישית

הרכיב נרשם ב-// /local/lib/Menu/MegaMenuBuilder.php + /local/components/local/megamenu/class.php namespace Local\Menu; use \Bitrix\Main\EventManager; class MegaMenuBuilder { public function build(int $iblockId, int $depth = 3): array { $cache = new \CPHPCache(); $cacheId = 'megamenu_' . $iblockId . '_' . LANGUAGE_ID; if ($cache->InitCache(3600, $cacheId, '/megamenu/')) { return $cache->GetVars()['menu']; } $raw = $this->fetchSections($iblockId, $depth); $tree = $this->buildTree($raw); $cache->StartDataCache(); $cache->EndDataCache(['menu' => $tree]); return $tree; } private function fetchSections(int $iblockId, int $depth): array { $result = []; $res = \CIBlockSection::GetList( ['LEFT_MARGIN' => 'ASC'], [ 'IBLOCK_ID' => $iblockId, 'ACTIVE' => 'Y', 'DEPTH_LEVEL' => [$depth], 'GLOBAL_ACTIVE' => 'Y', ], false, ['ID', 'NAME', 'CODE', 'DEPTH_LEVEL', 'IBLOCK_SECTION_ID', 'SECTION_PAGE_URL', 'PICTURE', 'UF_MENU_ICON', 'LEFT_MARGIN', 'RIGHT_MARGIN'] ); while ($section = $res->GetNext()) { $result[$section['ID']] = $section; } return $result; } private function buildTree(array $flat, int $parentId = 0): array { $tree = []; foreach ($flat as $section) { if ((int)$section['IBLOCK_SECTION_ID'] === $parentId) { $section['children'] = $this->buildTree($flat, (int)$section['ID']); $tree[] = $section; } } return $tree; } public static function clearCache(): void { $cache = new \CPHPCache(); $cache->CleanDir('/megamenu/'); } } class LocalMegaMenuComponent extends \CBitrixComponent { public function onPrepareComponentParams($params): array { $params['IBLOCK_ID'] = (int)($params['IBLOCK_ID'] ?? CATALOG_IBLOCK_ID); $params['DEPTH'] = (int)($params['DEPTH'] ?? 3); return $params; } public function executeComponent(): void { $builder = new \Local\Menu\MegaMenuBuilder(); $this->arResult['MENU'] = $builder->build( $this->arParams['IBLOCK_ID'], $this->arParams['DEPTH'] ); $this->setFrameMode(false); $this->includeComponentTemplate(); } } . התבנית מקבלת את עץ הקטגוריות ומרנדרת HTML:

// /local/components/local/megamenu/templates/.default/template.php /** @var array $arResult */ ?> <nav class="megamenu" aria-label="Навигация по каталогу"> <ul class="megamenu__list"> <?php foreach ($arResult['MENU'] as $category): ?> <li class="megamenu__item" data-id="<?= $category['ID'] ?>"> <a href="<?= htmlspecialchars($category['SECTION_PAGE_URL']) ?>" class="megamenu__link"> <?php if ($category['UF_MENU_ICON']): ?> <img src="<?= \CFile::GetPath($category['UF_MENU_ICON']) ?>" alt="" class="megamenu__icon" loading="lazy"> <?php endif ?> <span><?= htmlspecialchars($category['NAME']) ?></span> </a> <?php if (!empty($category['children'])): ?> <div class="megamenu__dropdown"> <div class="megamenu__columns"> <?php foreach (array_chunk($category['children'], 8) as $col): ?> <div class="megamenu__col"> <?php foreach ($col as $sub): ?> <a href="<?= htmlspecialchars($sub['SECTION_PAGE_URL']) ?>" class="megamenu__sublink"> <?= htmlspecialchars($sub['NAME']) ?> </a> <?php if (!empty($sub['children'])): ?> <ul class="megamenu__tertiary"> <?php foreach (array_slice($sub['children'], 0, 5) as $third): ?> <li> <a href="<?= htmlspecialchars($third['SECTION_PAGE_URL']) ?>"> <?= htmlspecialchars($third['NAME']) ?> </a> </li> <?php endforeach ?> </ul> <?php endif ?> <?php endforeach ?> </div> <?php endforeach ?> </div> </div> <?php endif ?> </li> <?php endforeach ?> </ul> </nav> 

השוואה: תפריט סטנדרטי מול מגה-תפריט מותאם אישית

פרמטר תפריט סטנדרטי מגה-תפריט מותאם אישית
מספר רמות 1 (NESTING מפחית ביצועים) עד 3
שאילתות מסד נתונים N + 1 (עם קאשינג) 1
זמן רינדור (500 קטגוריות) 50–100 אלפיות השנייה 3–8 אלפיות השנייה
רספונסיבי לא כן
תמיכה בתמונות לא כן

מגה-תפריט מותאם אישית עובד פי 10 מהר יותר מתפריט סטנדרטי בעומס של 500 קטגוריות—אושר בבדיקות עומס. חיסכון ממוצע במשאבי שרת הוא כ-$150–250 לחודש עבור 1000 קטגוריות.

מה כלול בפיתוח מפתח-לצרכן

  • תיעוד: מפרט טכני עם סכמת קאשינג ואינטגרציית רכיבים.
  • גישה: קוד מקור מלא של הרכיב והתבנית, כולל הוראות פריסה.
  • הדרכה: מפגש של שעה למפתחים שלך על שימוש ברכיב ואינוולידציית קאש.
  • תמיכה: 30 ימי תמיכה לאחר ההשקה (תיקוני באגים, התאמות).

תהליך העבודה

  1. אנליטיקה—ייצוא מבנה הקטלוג, קביעת רמות קינון, איסוף דרישות עיצוב.
  2. עיצוב—פיתוח סכמת נתונים, הגדרת שדות משתמש לאייקונים ותמונות.
  3. יישום—כתיבת רכיב ה-MegaMenu (PHP), תבנית (HTML+CSS+JS), אינטגרציה עם קאשינג.
  4. בדיקות—בדיקות עומס עד 1000 קטגוריות, בדיקות דפדפנים, רספונסיביות.
  5. פריסה—פריסה על שרת חי, הגדרת אינוולידציית קאש.

טעויות אופייניות ביישום מגה-תפריט מותאם אישית

  • התעלמות מעומק הקינון. אם הרמה אינה מוגבלת, העץ הופך למסורבל. האופטימלי הוא שלוש רמות: קטגוריה, תת-קטגוריה, קבוצת מוצרים.
  • חוסר עיכוב סגירה. ללא טיימאאוט של 200 אלפיות השנייה, התפריט מרצד כשהעכבר עובר מקטגוריה לתת-קטגוריה.
  • תמיכת מקלדת לקויה. ללא מאפייני ARIA ומטפלי /local/components/local/megamenu/, משתמשים עם מוגבלויות אינם יכולים להשתמש בתפריט.

כיצד מובטחת אינוולידציית קאש?

אינוולידציית הקאש מקושרת לאירועים // /local/components/local/megamenu/templates/.default/template.php /** @var array $arResult */ ?> <nav class="megamenu" aria-label="Навигация по каталогу"> <ul class="megamenu__list"> <?php foreach ($arResult['MENU'] as $category): ?> <li class="megamenu__item" data-id="<?= $category['ID'] ?>"> <a href="<?= htmlspecialchars($category['SECTION_PAGE_URL']) ?>" class="megamenu__link"> <?php if ($category['UF_MENU_ICON']): ?> <img src="<?= \CFile::GetPath($category['UF_MENU_ICON']) ?>" alt="" class="megamenu__icon" loading="lazy"> <?php endif ?> <span><?= htmlspecialchars($category['NAME']) ?></span> </a> <?php if (!empty($category['children'])): ?> <div class="megamenu__dropdown"> <div class="megamenu__columns"> <?php foreach (array_chunk($category['children'], 8) as $col): ?> <div class="megamenu__col"> <?php foreach ($col as $sub): ?> <a href="<?= htmlspecialchars($sub['SECTION_PAGE_URL']) ?>" class="megamenu__sublink"> <?= htmlspecialchars($sub['NAME']) ?> </a> <?php if (!empty($sub['children'])): ?> <ul class="megamenu__tertiary"> <?php foreach (array_slice($sub['children'], 0, 5) as $third): ?> <li> <a href="<?= htmlspecialchars($third['SECTION_PAGE_URL']) ?>"> <?= htmlspecialchars($third['NAME']) ?> </a> </li> <?php endforeach ?> </ul> <?php endif ?> <?php endforeach ?> </div> <?php endforeach ?> </div> </div> <?php endif ?> </li> <?php endforeach ?> </ul> </nav> , keydown, OnBeforeIBlockSectionAdd. כל שינוי במבנה הקטגוריות מנקה את הקאש באמצעות OnBeforeIBlockSectionUpdate. לרכיב OnBeforeIBlockSectionDelete יש מתודה סטטית CPHPCache::CleanDir הנקראת על ידי מטפלי אירועים ב-MegaMenuBuilder. זה מבטיח שהתפריט תמיד מעודכן ללא איפוס ידני.

לוחות זמנים ליישום

תצורה לוח זמנים עלות
מגה-תפריט בסיסי (2 רמות, ריחוף) 3–4 ימים מ-$500
עם רמה שלישית, קאשינג, אינוולידציה 5–7 ימים מ-$800
גרסה רספונסיבית עם מגירת מובייל +3–4 ימים +$400
עם תמונות, באנרים, מבצעים +2–3 ימים +$300

מומחים מוסמכים עם 10 שנות ניסיון. ביצענו מעל 50 פרויקטים בניווט וקטלוגים. הזמינו מגה-תפריט מותאם אישית מפתח-לצרכן—נעריך את הפרויקט שלכם בחינם תוך 24 שעות. כתבו לנו כדי לקבל הצעה מסחרית מפורטת עם לוחות זמנים ועלויות מדויקים.