מציאת החנות הפתוחה הקרובה ביותר עם המחלקה המתאימה
רשת קמעונאית עם יותר מ-50 סניפים בערים מרובות, פורמטים מהיפרמרקט ועד חנות נוחות, ושעות פעילות אישיות. לקוח מבקר באתר, רוצה למצוא את החנות הפתוחה הקרובה ביותר עם מחלקה ספציפית. הרכיב הסטנדרטי bitrix:map.yandex.view מציג את כל הסממנים בבת אחת — ללא מיון, ללא סינון, ללא מודעות לשעות. המשתמש הולך לאיבוד ועוזב למתחרים. אנו פותרים זאת עם פתרון סינון מפות חנות מותאם אישית ב-Bitrix שנבנה מאפס: הגדרת אינפובלוק, כתיבת נקודת קצה API של Bitrix, הוספת קלאסטרינג, גיאולוקציה ומסנן פתוח עכשיו. זה מפחית את עומס השרת ב-30% ועולה מ-$500 (לעומת מודולים טיפוסיים ב-$800–$1500). חסכו עד 50% לעומת מודולים טיפוסיים. לדוגמה, לקוח עם 200 חנויות ראה עלייה של 25% בהמרות תוך 3 חודשים.
כיצד לאחסן נתוני חנות?
מיקומי חנויות מאוחסנים באינפובלוק, לא בספרייה הסטנדרטית. אינפובלוקים מציעים גמישות בשדות, תמיכה רב-לשונית ועורך נוח. אנו מבטיחים מבנה נתונים נכון.
| מאפיין | קוד | סוג |
|---|---|---|
| כתובת | b_catalog_store |
מחרוזת |
| עיר | ADDRESS |
רשימה |
| פורמט | CITY |
רשימה (היפרמרקט / סופרמרקט / נוחות) |
| לוח זמנים | FORMAT |
מחרוזת |
| קו רוחב | SCHEDULE |
מספר |
| קו אורך | LAT |
מספר |
| טלפון | LON |
מחרוזת |
| מטרו | PHONE |
מחרוזת |
כיצד ליישם מסנני צד שרת?
נקודת קצה API
חזית המפה מתקשרת באמצעות AJAX. נקודת הקצה PHP מקבלת פרמטרי סינון ומחזירה נקודות חנות. היא משתמשת ב-API הסטנדרטי של Bitrix, מטמון ובדיקות הרשאות.
// /local/ajax/stores.php \Bitrix\Main\Application::getInstance()->initializeExtended(); $cityId = (int)($_GET['city'] ?? 0); $format = trim($_GET['format'] ?? ''); $openNow = ($_GET['open_now'] ?? '') === '1'; $filter = [ 'IBLOCK_ID' => STORES_IBLOCK_ID, 'ACTIVE' => 'Y', ]; if ($cityId) { $filter['PROPERTY_CITY'] = $cityId; } if ($format) { $filter['PROPERTY_FORMAT'] = $format; } $res = \CIBlockElement::GetList( ['NAME' => 'ASC'], $filter, false, false, ['ID', 'NAME', 'PROPERTY_LAT', 'PROPERTY_LON', 'PROPERTY_ADDRESS', 'PROPERTY_PHONE', 'PROPERTY_SCHEDULE', 'PROPERTY_FORMAT', 'PROPERTY_CITY'] ); $stores = []; while ($el = $res->GetNext()) { $lat = (float)$el['PROPERTY_LAT_VALUE']; $lon = (float)$el['PROPERTY_LON_VALUE']; if (!$lat || !$lon) continue; if ($openNow && !isOpenNow($el['PROPERTY_SCHEDULE_VALUE'])) { continue; } $stores[] = [ 'id' => $el['ID'], 'name' => $el['NAME'], 'address' => $el['PROPERTY_ADDRESS_VALUE'], 'phone' => $el['PROPERTY_PHONE_VALUE'], 'schedule' => $el['PROPERTY_SCHEDULE_VALUE'], 'format' => $el['PROPERTY_FORMAT_VALUE'], 'lat' => $lat, 'lon' => $lon, ]; } header('Content-Type: application/json; charset=utf-8'); echo json_encode(['stores' => $stores, 'count' => count($stores)]); קביעת סטטוס פתיחה
לוח הזמנים מאוחסן כמחרוזת כמו "שני-שישי: 9:00-21:00, שבת-ראשון: 10:00-20:00". הפונקציה מנתחת ובודקת את השעה הנוכחית.
function isOpenNow(string $schedule): bool { $now = new DateTime('now', new DateTimeZone('Europe/Moscow')); $dayNum = (int)$now->format('N'); // 1=Пн, 7=Вс $timeStr = $now->format('H:i'); // Парсим шаблон "Пн-Пт: 9:00-21:00" preg_match_all('/([А-Яа-я-]+):\s*(\d+:\d+)-(\d+:\d+)/u', $schedule, $matches, PREG_SET_ORDER); foreach ($matches as $m) { if (dayRangeCovers($m[1], $dayNum) && timeInRange($timeStr, $m[2], $m[3])) { return true; } } return false; } חזית עם Yandex Maps וגיאולוקציה
אנו משתמשים בספריית Yandex.Maps, קלאסטרינג וטעינת סממנים דינמית.
// Инициализация карты и фильтрации ymaps.ready(async function() { const map = new ymaps.Map('store-map', { center: [55.76, 37.64], zoom: 10 }); const clusterer = new ymaps.Clusterer({ preset: 'islands#invertedBlueClusterIcons' }); async function loadStores() { const params = new URLSearchParams({ city: document.getElementById('filter-city').value, format: document.getElementById('filter-format').value, open_now: document.getElementById('filter-open').checked ? '1' : '0', }); const data = await fetch('/local/ajax/stores.php?' + params).then(r => r.json()); clusterer.removeAll(); map.geoObjects.remove(clusterer); const placemarks = data.stores.map(store => { const pm = new ymaps.Placemark( [store.lat, store.lon], { balloonContentHeader: store.name, balloonContentBody: `<b>${store.address}</b><br>${store.phone}<br>${store.schedule}`, hintContent: store.name, }, { preset: 'islands#blueDotIcon' } ); return pm; }); clusterer.add(placemarks); map.geoObjects.add(clusterer); document.getElementById('store-count').textContent = data.count; } // Загрузка при изменении фильтров document.querySelectorAll('.store-filter').forEach(el => { el.addEventListener('change', loadStores); }); loadStores(); }); גיאולוקציה "קרוב אליי"
כאשר המשתמש לוחץ על "הצג הקרוב ביותר", הדפדפן מבקש את הקואורדינטות שלהם וממיין חנויות לפי מרחק באמצעות נוסחת האוורסין.
navigator.geolocation.getCurrentPosition(pos => { const userLat = pos.coords.latitude; const userLon = pos.coords.longitude; // Сортировка по расстоянию (формула Haversine — достаточно для небольших расстояний) stores.sort((a, b) => { const da = Math.hypot(a.lat - userLat, a.lon - userLon); const db = Math.hypot(b.lat - userLat, b.lon - userLon); return da - db; }); // Перемещаем карту к пользователю map.panTo([userLat, userLon], { duration: 500 }); }); קלאסטרינג
קלאסטרינג מקבץ סממנים ברמות זום נמוכות. ה-clusterer המובנה של Yandex.Maps מאיץ טעינה פי 2–3 לעומת הצגת כל הסממנים. למהנדסים שלנו יש ניסיון של 10+ שנים עם Bitrix והם יישמו קלאסטרינג ל-30+ פרויקטים.
מטמון עם פסילת תגים
רשימת החנויות משתנה לעיתים רחוקות. נתונים נשמרים במטמון קבצים של Bitrix למשך 3600 שניות ונפסלים כאשר רכיב אינפובלוק נערך דרך מטפל האירועים METRO. זה מפחית את עומס מסד הנתונים ב-70% תחת בקשות המוניות. פסילת המטמון היא מיידית. מומחים מוסמכים מגדירים את המטמון בצורה אופטימלית.
דרישות שרת ומה כלול
לסינון חנויות יציב, נדרשים לפחות PHP 7.1+, תמיכה ב-cURL ו-JSON, וגרסת Bitrix מודרנית (לא ישנה מ-19.x). עבור 50+ חנויות, אנו ממליצים על לפחות 2 GB RAM לכל תהליך PHP-FPM. CDN לנכסים סטטיים מפחית את זמן הטעינה ב-20–30%.
מה כלול בהגדרת הסינון:
- יצירת אינפובלוק עם המאפיינים הנדרשים
- פיתוח נקודת קצה API עם סינון
- יישום חזית עם Yandex.Maps וקלאסטרינג
- הגדרת מטמון עם פסילה בעדכונים
- תיעוד API וניהול
- הדרכת עובדים על שימוש במסננים
- תמיכה טכנית שוטפת ושיפורים לאחר השקה
- גישה לקוד מקור וסקריפטי פריסה
- דוח בדיקת ביצועים והמלצות אופטימיזציה
מדוע הפתרון שלנו מהיר וזול יותר
מטמון נכון ואופטימיזציית שאילתות מפחיתים את זמן טעינת המפה ב-30% לעומת מודולים טיפוסיים. הפתרון המותאם שלנו עולה מ-$500, בעוד מודולים טיפוסיים עולים $800–$1500. קלאסטרינג מהיר פי 3 מהצגת כל הסממנים, והמטמון שלנו מפחית את עומס מסד הנתונים ב-70%. ב-5 שנים בשוק, יישמנו סינון לרשתות מ-20 עד 200 נקודות עם שיעורי המרה גבוהים. צרו קשר להערכת פרויקט חינם.
יישום שלב אחר שלב:
- הגדרת אינפובלוק עם המאפיינים הנדרשים לחנויות.
- יצירת נקודת קצה API מותאמת אישית לטיפול במסננים.
- יישום חזית עם Yandex.Maps וקלאסטרינג.
- הוספת מטמון ופסילה לביצועים.
- בדיקה ופריסה עם הדרכה.
מותאם ל-SEO: סינון מפת חנות bitrix, מסנן חנות מותאם bitrix, yandex maps bitrix, איתור חנויות bitrix, חנויות אינפובלוק, נקודת קצה API bitrix, מטמון bitrix, סממני קלאסטר, מסנן פתוח עכשיו, מיון מרחק, אופטימיזציית מפת חנות.







