<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://onpiterpalms.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin+Gorod</id>
	<title>Город на ладошках - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://onpiterpalms.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin+Gorod"/>
	<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Admin_Gorod"/>
	<updated>2026-07-24T02:58:18Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%9A%D0%9E%D0%A0%D0%9F%D0%A3%D0%A1&amp;diff=960</id>
		<title>КОРПУС</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%9A%D0%9E%D0%A0%D0%9F%D0%A3%D0%A1&amp;diff=960"/>
		<updated>2026-07-09T00:26:32Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Объект_en&lt;br /&gt;
|name=Корпоративный университет Администрации Санкт‑Петербурга&lt;br /&gt;
|address=Чернорецкий переулок, д.4-6&lt;br /&gt;
|lat=59.923265&lt;br /&gt;
|lon=30.383727&lt;br /&gt;
|type=Университет&lt;br /&gt;
|image=&lt;br /&gt;
|description=Корпоративный университет Администрации Санкт‑Петербурга – центр развития компетенций государственных и муниципальных служащих. Подведомственное учреждение Администрации Губернатора Санкт‑Петербурга и основная образовательная площадка Смольного.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%9A%D0%9E%D0%A0%D0%9F%D0%A3%D0%A1&amp;diff=959</id>
		<title>КОРПУС</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%9A%D0%9E%D0%A0%D0%9F%D0%A3%D0%A1&amp;diff=959"/>
		<updated>2026-07-09T00:16:54Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Объект_en&lt;br /&gt;
|name=Корпоративный университет Администрации Санкт‑Петербурга&lt;br /&gt;
|address=Чернорецкий переулок, д.4-6&lt;br /&gt;
|lat=59.923265&lt;br /&gt;
|lon=30.383727&lt;br /&gt;
|type=Университет&lt;br /&gt;
|image=https://yandex.ru/maps/org/korporativny_universitet_sankt_peterburga/88355516879/gallery/?ll=30.383727%2C59.923266&amp;amp;photos%5Bbusiness%5D=88355516879&amp;amp;photos%5Bid%5D=urn%3Ayandex%3Asprav%3Aphoto%3A2a000001863b804a3b406bb1fb1690d5e8dd&amp;amp;z=16&lt;br /&gt;
|description=«Корпоративный университет Администрации Санкт‑Петербурга – центр развития компетенций государственных и муниципальных служащих» - подведомственное учреждение Администрации Губернатора Санкт‑Петербурга и основная образовательная площадка Смольного.&lt;br /&gt;
&lt;br /&gt;
Корпоративный университет занимается профессиональным развитием, оценкой и подбором кадров для Администрации города, а также аккумулирует вокруг себя масштабные образовательные проекты, направленные на укрепление человеческого и управленческого потенциала региона.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=958</id>
		<title>Widget:KidsMap</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=958"/>
		<updated>2026-07-09T00:11:32Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;text-align: right; margin-bottom: 8px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;button id=&amp;quot;refreshMapBtn&amp;quot; style=&amp;quot;background: #1565c0; color: white; border: none; padding: 6px 16px; border-radius: 20px; font-size: 14px; cursor: pointer; display: inline-flex; align-items: center; gap: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
    🔄 Обновить карту&lt;br /&gt;
  &amp;lt;/button&amp;gt;&lt;br /&gt;
  &amp;lt;span id=&amp;quot;refreshStatus&amp;quot; style=&amp;quot;font-size: 12px; color: #888; margin-left: 10px;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 100%; height: 500px; margin: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 6px rgba(0,0,0,0.1); background: #d9e6d9;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;loading-message&amp;quot; style=&amp;quot;display: none; text-align: center; margin-top: 4px; font-size: 0.9em;&amp;quot;&amp;gt;Загрузка маркеров...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.emoji-marker {&lt;br /&gt;
    background: white;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 2px solid #2e7d32;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 28px;&lt;br /&gt;
    width: 28px !important;&lt;br /&gt;
    height: 28px !important;&lt;br /&gt;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);&lt;br /&gt;
}&lt;br /&gt;
#refreshStatus {&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    color: #888;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var map = L.map(&#039;map&#039;).setView([59.9343, 30.3351], 12);&lt;br /&gt;
L.tileLayer(&#039;https://tile.openstreetmap.org/{z}/{x}/{y}.png&#039;, {&lt;br /&gt;
    maxZoom: 19,&lt;br /&gt;
    attribution: &#039;© OpenStreetMap&#039;&lt;br /&gt;
}).addTo(map);&lt;br /&gt;
&lt;br /&gt;
function getIconByType(type) {&lt;br /&gt;
    const icons = {&lt;br /&gt;
        &#039;Парк&#039;: &#039;🌳&#039;, &#039;Памятник&#039;: &#039;🗿&#039;, &#039;Музей&#039;: &#039;🏛️&#039;, &#039;Церковь&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Школа&#039;: &#039;🏫&#039;, &#039;Кафе&#039;: &#039;☕&#039;, &#039;Мост&#039;: &#039;🌉&#039;, &#039;Фонтан&#039;: &#039;⛲&#039;,&lt;br /&gt;
        &#039;Театр&#039;: &#039;🎭&#039;, &#039;Библиотека&#039;: &#039;📚&#039;, &#039;Стадион&#039;: &#039;⚽&#039;, &#039;Аквапарк&#039;: &#039;💦&#039;,&lt;br /&gt;
        &#039;Зоопарк&#039;: &#039;🐘&#039;, &#039;Кинотеатр&#039;: &#039;🎬&#039;, &#039;Торговый центр&#039;: &#039;🛍️&#039;,&lt;br /&gt;
        &#039;Вокзал&#039;: &#039;🚂&#039;, &#039;Гостиница&#039;: &#039;🏨&#039;, &#039;Ресторан&#039;: &#039;🍽️&#039;, &#039;Набережная&#039;: &#039;🌊&#039;,&lt;br /&gt;
        &#039;Сад&#039;: &#039;🌿&#039;, &#039;Сквер&#039;: &#039;🌳&#039;, &#039;Дворец&#039;: &#039;🏰&#039;, &#039;Собор&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Часовня&#039;: &#039;🕯️&#039;, &#039;Монастырь&#039;: &#039;🏯&#039;, &#039;Улица&#039;: &#039;🛤️&#039;, &#039;Переулок&#039;: &#039;🏘️&#039;,&lt;br /&gt;
        &#039;Река&#039;: &#039;🌊&#039;, &#039;Канал&#039;: &#039;🌊&#039;, &#039;Остров&#039;: &#039;🏝️&#039;, &#039;Метро&#039;: &#039;🚇&#039;,&lt;br /&gt;
        &#039;Скульптура&#039;: &#039;🗿&#039;, &#039;Галерея&#039;: &#039;🖼️&#039;, &#039;Выставка&#039;: &#039;🎨&#039;,&lt;br /&gt;
        &#039;Концертный зал&#039;: &#039;🎵&#039;, &#039;Спорткомплекс&#039;: &#039;🏟️&#039;, &#039;Клуб&#039;: &#039;🎶&#039;,&lt;br /&gt;
        &#039;Рынок&#039;: &#039;🏪&#039;, &#039;Аптека&#039;: &#039;💊&#039;, &#039;Больница&#039;: &#039;🏥&#039;, &#039;Университет&#039;: &#039;🎓&#039;,&lt;br /&gt;
        &#039;Архив&#039;: &#039;📜&#039;, &#039;Детский центр&#039;: &#039;🧸&#039;, &#039;Парк аттракционов&#039;: &#039;🎡&#039;,&lt;br /&gt;
        &#039;Океанариум&#039;: &#039;🐠&#039;, &#039;Дельфинарий&#039;: &#039;🐬&#039;, &#039;Планетарий&#039;: &#039;🌌&#039;,&lt;br /&gt;
        &#039;Причал&#039;: &#039;⚓&#039;, &#039;Смотровая площадка&#039;: &#039;🌅&#039;, &#039;Арка&#039;: &#039;🚪&#039;,&lt;br /&gt;
        &#039;Детская площадка&#039;: &#039;🧒&#039;, &#039;Спортплощадка&#039;: &#039;⚽&#039;, &#039;Беговая дорожка&#039;: &#039;🏃&#039;,&lt;br /&gt;
        &#039;Велодорожка&#039;: &#039;🚴&#039;, &#039;Скейт-парк&#039;: &#039;🛹&#039;, &#039;Пляж&#039;: &#039;🏖️&#039;,&lt;br /&gt;
        &#039;Пруд&#039;: &#039;🦆&#039;, &#039;Озеро&#039;: &#039;🏞️&#039;, &#039;Лес&#039;: &#039;🌲&#039;, &#039;Карьер&#039;: &#039;⛏️&#039;,&lt;br /&gt;
        &#039;Крепость&#039;: &#039;🏯&#039;, &#039;Форт&#039;: &#039;🛡️&#039;, &#039;Подземелье&#039;: &#039;🕳️&#039;, &#039;Тоннель&#039;: &#039;🚇&#039;,&lt;br /&gt;
        &#039;Бизнес-центр&#039;: &#039;🏢&#039;, &#039;Хостел&#039;: &#039;🏨&#039;, &#039;Дом&#039;: &#039;🏠&#039;, &#039;Завод&#039;: &#039;🏭&#039;,&lt;br /&gt;
        &#039;Фабрика&#039;: &#039;🏭&#039;, &#039;Маяк&#039;: &#039;🗼&#039;, &#039;Башня&#039;: &#039;🗼&#039;, &#039;Стенд&#039;: &#039;📋&#039;,&lt;br /&gt;
        &#039;Скамейка&#039;: &#039;🪑&#039;, &#039;Другое&#039;: &#039;📍&#039;&lt;br /&gt;
    };&lt;br /&gt;
    return L.divIcon({&lt;br /&gt;
        html: icons[type] || &#039;📍&#039;,&lt;br /&gt;
        iconSize: [28, 28],&lt;br /&gt;
        className: &#039;emoji-marker&#039;,&lt;br /&gt;
        popupAnchor: [0, -14]&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function drawMarkers() {&lt;br /&gt;
    document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
    document.getElementById(&#039;refreshStatus&#039;).textContent = &#039;Загрузка...&#039;;&lt;br /&gt;
    &lt;br /&gt;
    fetch(&#039;/data.php?_=&#039; + Date.now())&lt;br /&gt;
        .then(response =&amp;gt; {&lt;br /&gt;
            if (!response.ok) throw new Error(&#039;HTTP &#039; + response.status);&lt;br /&gt;
            return response.json();&lt;br /&gt;
        })&lt;br /&gt;
        .then(data =&amp;gt; {&lt;br /&gt;
            console.log(&#039;Данные загружены, объектов:&#039;, data.length);&lt;br /&gt;
            map.eachLayer(layer =&amp;gt; {&lt;br /&gt;
                if (layer instanceof L.Marker) map.removeLayer(layer);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            data.forEach(obj =&amp;gt; {&lt;br /&gt;
                var lat = parseFloat(obj.lat);&lt;br /&gt;
                var lon = parseFloat(obj.lon);&lt;br /&gt;
                if (isNaN(lat) || isNaN(lon)) return;&lt;br /&gt;
                &lt;br /&gt;
                var icon = getIconByType(obj.type);&lt;br /&gt;
                var popupHtml = &#039;&amp;lt;b&amp;gt;&#039; + obj.name + &#039;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;b&amp;gt;Тип:&amp;lt;/b&amp;gt; &#039; + obj.type + &#039;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                obj.address + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.quest) popupHtml += &#039;&amp;lt;b&amp;gt;🎯 Квест:&amp;lt;/b&amp;gt; &#039; + obj.quest + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.image) popupHtml += &#039;&amp;lt;img src=&amp;quot;&#039; + obj.image + &#039;&amp;quot; style=&amp;quot;max-width:150px; max-height:100px; margin-top:8px; border-radius:8px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.description) popupHtml += &#039;&amp;lt;b&amp;gt;Описание:&amp;lt;/b&amp;gt; &#039; + obj.description + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.page) popupHtml += &#039;&amp;lt;a href=&amp;quot;/index.php/&#039; + encodeURIComponent(obj.page) + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;📖 Читать подробнее&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
                L.marker([lat, lon], {icon: icon}).addTo(map).bindPopup(popupHtml);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
            document.getElementById(&#039;refreshStatus&#039;).textContent = &#039;✅ Обновлено (&#039; + data.length + &#039; мест)&#039;;&lt;br /&gt;
            &lt;br /&gt;
            if (data.length === 0) {&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;😕 Нет мест. Добавь первое!&#039;;&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка загрузки данных:&#039;, error);&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;⚠️ Не удалось загрузить данные. Попробуйте позже.&#039;;&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            document.getElementById(&#039;refreshStatus&#039;).textContent = &#039;❌ Ошибка&#039;;&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function recreateCargoTable() {&lt;br /&gt;
    return fetch(&#039;/index.php/Шаблон:Объект_en?action=recreatedata&#039;)&lt;br /&gt;
        .then(response =&amp;gt; {&lt;br /&gt;
            if (!response.ok) throw new Error(&#039;HTTP &#039; + response.status);&lt;br /&gt;
            return response.text();&lt;br /&gt;
        })&lt;br /&gt;
        .then(() =&amp;gt; {&lt;br /&gt;
            console.log(&#039;Таблица Cargo пересоздана&#039;);&lt;br /&gt;
            // Ждём 1 секунду, чтобы Cargo успел обновиться&lt;br /&gt;
            return new Promise(resolve =&amp;gt; setTimeout(resolve, 1000));&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function refreshMap() {&lt;br /&gt;
    var status = document.getElementById(&#039;refreshStatus&#039;);&lt;br /&gt;
    status.textContent = &#039;⏳ Пересоздание таблицы...&#039;;&lt;br /&gt;
    &lt;br /&gt;
    recreateCargoTable()&lt;br /&gt;
        .then(() =&amp;gt; {&lt;br /&gt;
            status.textContent = &#039;⏳ Загрузка данных...&#039;;&lt;br /&gt;
            return drawMarkers();&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка пересоздания таблицы:&#039;, error);&lt;br /&gt;
            status.textContent = &#039;⚠️ Ошибка, попробуйте позже&#039;;&lt;br /&gt;
            // Даже если пересоздание не сработало, пробуем загрузить данные&lt;br /&gt;
            drawMarkers();&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Инициализация&lt;br /&gt;
drawMarkers();&lt;br /&gt;
&lt;br /&gt;
// Обработчик кнопки&lt;br /&gt;
document.getElementById(&#039;refreshMapBtn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
    refreshMap();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var attributionControl = map.attributionControl;&lt;br /&gt;
if (attributionControl) {&lt;br /&gt;
    attributionControl.setPrefix(&#039;&#039;);&lt;br /&gt;
    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.innerHTML = &#039;.leaflet-attribution-flag { display: none !important; }&#039;;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%9A%D0%9E%D0%A0%D0%9F%D0%A3%D0%A1&amp;diff=957</id>
		<title>КОРПУС</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%9A%D0%9E%D0%A0%D0%9F%D0%A3%D0%A1&amp;diff=957"/>
		<updated>2026-07-08T23:55:45Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: Новая страница: «{{Объект en |name=Корпоративный университет Администрации Санкт‑Петербурга |address=Чернорецкий переулок, д.4-6 |lat=59.923265 |lon=30.383727 |type=Университет |image=https://yandex.ru/maps/org/korporativny_universitet_sankt_peterburga/88355516879/gallery/?ll=30.383727%2C59.923266&amp;amp;photos%5Bbusiness%5D=88355516879&amp;amp;photos%5Bid%5D=urn%3Ayandex%3Asprav%3Aphoto%3A2a00000186...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Объект en&lt;br /&gt;
|name=Корпоративный университет Администрации Санкт‑Петербурга&lt;br /&gt;
|address=Чернорецкий переулок, д.4-6&lt;br /&gt;
|lat=59.923265&lt;br /&gt;
|lon=30.383727&lt;br /&gt;
|type=Университет&lt;br /&gt;
|image=https://yandex.ru/maps/org/korporativny_universitet_sankt_peterburga/88355516879/gallery/?ll=30.383727%2C59.923266&amp;amp;photos%5Bbusiness%5D=88355516879&amp;amp;photos%5Bid%5D=urn%3Ayandex%3Asprav%3Aphoto%3A2a000001863b804a3b406bb1fb1690d5e8dd&amp;amp;z=16&lt;br /&gt;
|description=«Корпоративный университет Администрации Санкт‑Петербурга – центр развития компетенций государственных и муниципальных служащих» - подведомственное учреждение Администрации Губернатора Санкт‑Петербурга и основная образовательная площадка Смольного.&lt;br /&gt;
&lt;br /&gt;
Корпоративный университет занимается профессиональным развитием, оценкой и подбором кадров для Администрации города, а также аккумулирует вокруг себя масштабные образовательные проекты, направленные на укрепление человеческого и управленческого потенциала региона.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%A0%D0%B5%D1%87%D0%BD%D0%BE%D0%B9_%D0%B2%D0%BE%D0%BA%D0%B7%D0%B0%D0%BB&amp;diff=956</id>
		<title>Речной вокзал</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%A0%D0%B5%D1%87%D0%BD%D0%BE%D0%B9_%D0%B2%D0%BE%D0%BA%D0%B7%D0%B0%D0%BB&amp;diff=956"/>
		<updated>2026-07-08T23:18:15Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: Новая страница: «{{Объект en |name=Пассажирский порт |address=Октябрьская набережная, 31, Санкт-Петербург |lat=59.857915 |lon=30.499592 |type=Причал |image=https://yandex.ru/maps/org/passazhirskiy_port/1004386017/gallery/?ll=30.499106%2C59.856980&amp;amp;photos%5Bbusiness%5D=1004386017&amp;amp;photos%5Bid%5D=urn%3Ayandex%3Asprav%3Aphoto%3AaKy9uyklTGom5c1hGuWPo5xiTf4qAIE&amp;amp;z=16.78 |description=Пассажирский порт —...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Объект en&lt;br /&gt;
|name=Пассажирский порт&lt;br /&gt;
|address=Октябрьская набережная, 31, Санкт-Петербург&lt;br /&gt;
|lat=59.857915&lt;br /&gt;
|lon=30.499592&lt;br /&gt;
|type=Причал&lt;br /&gt;
|image=https://yandex.ru/maps/org/passazhirskiy_port/1004386017/gallery/?ll=30.499106%2C59.856980&amp;amp;photos%5Bbusiness%5D=1004386017&amp;amp;photos%5Bid%5D=urn%3Ayandex%3Asprav%3Aphoto%3AaKy9uyklTGom5c1hGuWPo5xiTf4qAIE&amp;amp;z=16.78&lt;br /&gt;
|description=Пассажирский порт — это место, где швартуются теплоходы, и откуда можно отправиться в круиз.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=955</id>
		<title>Widget:KidsMap</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=955"/>
		<updated>2026-07-08T22:20:45Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;text-align: right; margin-bottom: 8px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;button id=&amp;quot;refreshMapBtn&amp;quot; style=&amp;quot;background: #1565c0; color: white; border: none; padding: 6px 16px; border-radius: 20px; font-size: 14px; cursor: pointer; display: inline-flex; align-items: center; gap: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
    🔄 Обновить карту&lt;br /&gt;
  &amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 100%; height: 500px; margin: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 6px rgba(0,0,0,0.1); background: #d9e6d9;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;loading-message&amp;quot; style=&amp;quot;display: none; text-align: center; margin-top: 4px; font-size: 0.9em;&amp;quot;&amp;gt;Загрузка маркеров...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.emoji-marker {&lt;br /&gt;
    background: white;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 2px solid #2e7d32;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 28px;&lt;br /&gt;
    width: 28px !important;&lt;br /&gt;
    height: 28px !important;&lt;br /&gt;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var map = L.map(&#039;map&#039;).setView([59.9343, 30.3351], 12);&lt;br /&gt;
L.tileLayer(&#039;https://tile.openstreetmap.org/{z}/{x}/{y}.png&#039;, {&lt;br /&gt;
    maxZoom: 19,&lt;br /&gt;
    attribution: &#039;© OpenStreetMap&#039;&lt;br /&gt;
}).addTo(map);&lt;br /&gt;
&lt;br /&gt;
function getIconByType(type) {&lt;br /&gt;
    const icons = {&lt;br /&gt;
        &#039;Парк&#039;: &#039;🌳&#039;,&lt;br /&gt;
        &#039;Памятник&#039;: &#039;🗿&#039;,&lt;br /&gt;
        &#039;Музей&#039;: &#039;🏛️&#039;,&lt;br /&gt;
        &#039;Церковь&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Школа&#039;: &#039;🏫&#039;,&lt;br /&gt;
        &#039;Кафе&#039;: &#039;☕&#039;,&lt;br /&gt;
        &#039;Мост&#039;: &#039;🌉&#039;,&lt;br /&gt;
        &#039;Фонтан&#039;: &#039;⛲&#039;,&lt;br /&gt;
        &#039;Театр&#039;: &#039;🎭&#039;,&lt;br /&gt;
        &#039;Библиотека&#039;: &#039;📚&#039;,&lt;br /&gt;
        &#039;Стадион&#039;: &#039;⚽&#039;,&lt;br /&gt;
        &#039;Аквапарк&#039;: &#039;💦&#039;,&lt;br /&gt;
        &#039;Зоопарк&#039;: &#039;🐘&#039;,&lt;br /&gt;
        &#039;Кинотеатр&#039;: &#039;🎬&#039;,&lt;br /&gt;
        &#039;Торговый центр&#039;: &#039;🛍️&#039;,&lt;br /&gt;
        &#039;Вокзал&#039;: &#039;🚂&#039;,&lt;br /&gt;
        &#039;Гостиница&#039;: &#039;🏨&#039;,&lt;br /&gt;
        &#039;Ресторан&#039;: &#039;🍽️&#039;,&lt;br /&gt;
        &#039;Набережная&#039;: &#039;🌊&#039;,&lt;br /&gt;
        &#039;Сад&#039;: &#039;🌿&#039;,&lt;br /&gt;
        &#039;Сквер&#039;: &#039;🌳&#039;,&lt;br /&gt;
        &#039;Дворец&#039;: &#039;🏰&#039;,&lt;br /&gt;
        &#039;Собор&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Часовня&#039;: &#039;🕯️&#039;,&lt;br /&gt;
        &#039;Монастырь&#039;: &#039;🏯&#039;,&lt;br /&gt;
        &#039;Улица&#039;: &#039;🛤️&#039;,&lt;br /&gt;
        &#039;Переулок&#039;: &#039;🏘️&#039;,&lt;br /&gt;
        &#039;Река&#039;: &#039;🌊&#039;,&lt;br /&gt;
        &#039;Канал&#039;: &#039;🌊&#039;,&lt;br /&gt;
        &#039;Остров&#039;: &#039;🏝️&#039;,&lt;br /&gt;
        &#039;Метро&#039;: &#039;🚇&#039;,&lt;br /&gt;
        &#039;Скульптура&#039;: &#039;🗿&#039;,&lt;br /&gt;
        &#039;Галерея&#039;: &#039;🖼️&#039;,&lt;br /&gt;
        &#039;Выставка&#039;: &#039;🎨&#039;,&lt;br /&gt;
        &#039;Концертный зал&#039;: &#039;🎵&#039;,&lt;br /&gt;
        &#039;Спорткомплекс&#039;: &#039;🏟️&#039;,&lt;br /&gt;
        &#039;Клуб&#039;: &#039;🎶&#039;,&lt;br /&gt;
        &#039;Рынок&#039;: &#039;🏪&#039;,&lt;br /&gt;
        &#039;Аптека&#039;: &#039;💊&#039;,&lt;br /&gt;
        &#039;Больница&#039;: &#039;🏥&#039;,&lt;br /&gt;
        &#039;Университет&#039;: &#039;🎓&#039;,&lt;br /&gt;
        &#039;Архив&#039;: &#039;📜&#039;,&lt;br /&gt;
        &#039;Детский центр&#039;: &#039;🧸&#039;,&lt;br /&gt;
        &#039;Парк аттракционов&#039;: &#039;🎡&#039;,&lt;br /&gt;
        &#039;Океанариум&#039;: &#039;🐠&#039;,&lt;br /&gt;
        &#039;Дельфинарий&#039;: &#039;🐬&#039;,&lt;br /&gt;
        &#039;Планетарий&#039;: &#039;🌌&#039;,&lt;br /&gt;
        &#039;Причал&#039;: &#039;⚓&#039;,&lt;br /&gt;
        &#039;Смотровая площадка&#039;: &#039;🌅&#039;,&lt;br /&gt;
        &#039;Арка&#039;: &#039;🚪&#039;,&lt;br /&gt;
        &#039;Детская площадка&#039;: &#039;🧒&#039;,&lt;br /&gt;
        &#039;Спортплощадка&#039;: &#039;⚽&#039;,&lt;br /&gt;
        &#039;Беговая дорожка&#039;: &#039;🏃&#039;,&lt;br /&gt;
        &#039;Велодорожка&#039;: &#039;🚴&#039;,&lt;br /&gt;
        &#039;Скейт-парк&#039;: &#039;🛹&#039;,&lt;br /&gt;
        &#039;Пляж&#039;: &#039;🏖️&#039;,&lt;br /&gt;
        &#039;Пруд&#039;: &#039;🦆&#039;,&lt;br /&gt;
        &#039;Озеро&#039;: &#039;🏞️&#039;,&lt;br /&gt;
        &#039;Лес&#039;: &#039;🌲&#039;,&lt;br /&gt;
        &#039;Карьер&#039;: &#039;⛏️&#039;,&lt;br /&gt;
        &#039;Крепость&#039;: &#039;🏯&#039;,&lt;br /&gt;
        &#039;Форт&#039;: &#039;🛡️&#039;,&lt;br /&gt;
        &#039;Подземелье&#039;: &#039;🕳️&#039;,&lt;br /&gt;
        &#039;Тоннель&#039;: &#039;🚇&#039;,&lt;br /&gt;
        &#039;Бизнес-центр&#039;: &#039;🏢&#039;,&lt;br /&gt;
        &#039;Хостел&#039;: &#039;🏨&#039;,&lt;br /&gt;
        &#039;Дом&#039;: &#039;🏠&#039;,&lt;br /&gt;
        &#039;Завод&#039;: &#039;🏭&#039;,&lt;br /&gt;
        &#039;Фабрика&#039;: &#039;🏭&#039;,&lt;br /&gt;
        &#039;Маяк&#039;: &#039;🗼&#039;,&lt;br /&gt;
        &#039;Башня&#039;: &#039;🗼&#039;,&lt;br /&gt;
        &#039;Стенд&#039;: &#039;📋&#039;,&lt;br /&gt;
        &#039;Скамейка&#039;: &#039;🪑&#039;,&lt;br /&gt;
        &#039;Другое&#039;: &#039;📍&#039;&lt;br /&gt;
    };&lt;br /&gt;
    return L.divIcon({&lt;br /&gt;
        html: icons[type] || &#039;📍&#039;,&lt;br /&gt;
        iconSize: [28, 28],&lt;br /&gt;
        className: &#039;emoji-marker&#039;,&lt;br /&gt;
        popupAnchor: [0, -14]&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function drawMarkers() {&lt;br /&gt;
    document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
    &lt;br /&gt;
    fetch(&#039;/data.php?_=&#039; + Date.now())&lt;br /&gt;
        .then(response =&amp;gt; {&lt;br /&gt;
            if (!response.ok) throw new Error(&#039;HTTP &#039; + response.status);&lt;br /&gt;
            return response.json();&lt;br /&gt;
        })&lt;br /&gt;
        .then(data =&amp;gt; {&lt;br /&gt;
            console.log(&#039;Данные загружены, объектов:&#039;, data.length);&lt;br /&gt;
            &lt;br /&gt;
            // Проверяем каждый объект&lt;br /&gt;
            data.forEach((obj, index) =&amp;gt; {&lt;br /&gt;
                console.log(index + &#039;:&#039;, obj.name, &#039;lat:&#039;, obj.lat, &#039;lon:&#039;, obj.lon);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            map.eachLayer(layer =&amp;gt; {&lt;br /&gt;
                if (layer instanceof L.Marker) map.removeLayer(layer);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            data.forEach(obj =&amp;gt; {&lt;br /&gt;
                var lat = parseFloat(obj.lat);&lt;br /&gt;
                var lon = parseFloat(obj.lon);&lt;br /&gt;
                if (isNaN(lat) || isNaN(lon)) {&lt;br /&gt;
                    console.log(&#039;Пропущен:&#039;, obj.name, &#039;— координаты некорректны&#039;);&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                var icon = getIconByType(obj.type);&lt;br /&gt;
                var popupHtml = &#039;&amp;lt;b&amp;gt;&#039; + obj.name + &#039;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;b&amp;gt;Тип:&amp;lt;/b&amp;gt; &#039; + obj.type + &#039;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                obj.address + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.quest) popupHtml += &#039;&amp;lt;b&amp;gt;🎯 Квест:&amp;lt;/b&amp;gt; &#039; + obj.quest + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.image) popupHtml += &#039;&amp;lt;img src=&amp;quot;&#039; + obj.image + &#039;&amp;quot; style=&amp;quot;max-width:150px; max-height:100px; margin-top:8px; border-radius:8px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.description) popupHtml += &#039;&amp;lt;b&amp;gt;Описание:&amp;lt;/b&amp;gt; &#039; + obj.description + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.page) popupHtml += &#039;&amp;lt;a href=&amp;quot;/index.php/&#039; + encodeURIComponent(obj.page) + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;📖 Читать подробнее&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
                L.marker([lat, lon], {icon: icon}).addTo(map).bindPopup(popupHtml);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
            &lt;br /&gt;
            if (data.length === 0) {&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;😕 Нет мест. Добавь первое!&#039;;&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка загрузки данных:&#039;, error);&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;⚠️ Не удалось загрузить данные. Попробуйте позже.&#039;;&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
drawMarkers();&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&#039;refreshMapBtn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
    drawMarkers();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var attributionControl = map.attributionControl;&lt;br /&gt;
if (attributionControl) {&lt;br /&gt;
    attributionControl.setPrefix(&#039;&#039;);&lt;br /&gt;
    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.innerHTML = &#039;.leaflet-attribution-flag { display: none !important; }&#039;;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%90%D0%B2%D1%80%D0%BE%D1%80%D0%B0&amp;diff=954</id>
		<title>Аврора</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%90%D0%B2%D1%80%D0%BE%D1%80%D0%B0&amp;diff=954"/>
		<updated>2026-07-08T22:09:08Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Объект en&lt;br /&gt;
|name=Крейсер Аврора&lt;br /&gt;
|address=Петроградская набережеая, 2-4&lt;br /&gt;
|lat=59.955579&lt;br /&gt;
|lon=30.336242&lt;br /&gt;
|type=Причал&lt;br /&gt;
|image=https://onpiterpalms.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A6%D0%B2%D0%B5%D1%82%D1%8B_%D0%BD%D0%B0_%D0%9C%D0%BE%D1%81%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D0%BF%D0%BB%D0%BE%D1%89%D0%B0%D0%B4%D0%B8.jpg&lt;br /&gt;
|description=Крейсер Аврора&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=953</id>
		<title>Widget:KidsMap</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=953"/>
		<updated>2026-07-08T22:05:11Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;text-align: right; margin-bottom: 8px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;button id=&amp;quot;refreshMapBtn&amp;quot; style=&amp;quot;background: #1565c0; color: white; border: none; padding: 6px 16px; border-radius: 20px; font-size: 14px; cursor: pointer; display: inline-flex; align-items: center; gap: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
    🔄 Обновить карту&lt;br /&gt;
  &amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 100%; height: 500px; margin: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 6px rgba(0,0,0,0.1); background: #d9e6d9;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;loading-message&amp;quot; style=&amp;quot;display: none; text-align: center; margin-top: 4px; font-size: 0.9em;&amp;quot;&amp;gt;Загрузка маркеров...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.emoji-marker {&lt;br /&gt;
    background: white;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 2px solid #2e7d32;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 28px;&lt;br /&gt;
    width: 28px !important;&lt;br /&gt;
    height: 28px !important;&lt;br /&gt;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var map = L.map(&#039;map&#039;).setView([59.9343, 30.3351], 12);&lt;br /&gt;
L.tileLayer(&#039;https://tile.openstreetmap.org/{z}/{x}/{y}.png&#039;, {&lt;br /&gt;
    maxZoom: 19,&lt;br /&gt;
    attribution: &#039;© OpenStreetMap&#039;&lt;br /&gt;
}).addTo(map);&lt;br /&gt;
&lt;br /&gt;
function getIconByType(type) {&lt;br /&gt;
    const icons = {&lt;br /&gt;
        &#039;Парк&#039;: &#039;🌳&#039;,&lt;br /&gt;
        &#039;Памятник&#039;: &#039;🗿&#039;,&lt;br /&gt;
        &#039;Музей&#039;: &#039;🏛️&#039;,&lt;br /&gt;
        &#039;Церковь&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Школа&#039;: &#039;🏫&#039;,&lt;br /&gt;
        &#039;Кафе&#039;: &#039;☕&#039;,&lt;br /&gt;
        &#039;Мост&#039;: &#039;🌉&#039;,&lt;br /&gt;
        &#039;Фонтан&#039;: &#039;⛲&#039;,&lt;br /&gt;
        &#039;Театр&#039;: &#039;🎭&#039;,&lt;br /&gt;
        &#039;Библиотека&#039;: &#039;📚&#039;,&lt;br /&gt;
        &#039;Стадион&#039;: &#039;⚽&#039;,&lt;br /&gt;
        &#039;Аквапарк&#039;: &#039;💦&#039;,&lt;br /&gt;
        &#039;Зоопарк&#039;: &#039;🐘&#039;,&lt;br /&gt;
        &#039;Кинотеатр&#039;: &#039;🎬&#039;,&lt;br /&gt;
        &#039;Торговый центр&#039;: &#039;🛍️&#039;,&lt;br /&gt;
        &#039;Вокзал&#039;: &#039;🚂&#039;,&lt;br /&gt;
        &#039;Гостиница&#039;: &#039;🏨&#039;,&lt;br /&gt;
        &#039;Ресторан&#039;: &#039;🍽️&#039;,&lt;br /&gt;
        &#039;Набережная&#039;: &#039;🌊&#039;,&lt;br /&gt;
        &#039;Сад&#039;: &#039;🌿&#039;,&lt;br /&gt;
        &#039;Сквер&#039;: &#039;🌳&#039;,&lt;br /&gt;
        &#039;Дворец&#039;: &#039;🏰&#039;,&lt;br /&gt;
        &#039;Собор&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Часовня&#039;: &#039;🕯️&#039;,&lt;br /&gt;
        &#039;Монастырь&#039;: &#039;🏯&#039;,&lt;br /&gt;
        &#039;Улица&#039;: &#039;🛤️&#039;,&lt;br /&gt;
        &#039;Переулок&#039;: &#039;🏘️&#039;,&lt;br /&gt;
        &#039;Река&#039;: &#039;🌊&#039;,&lt;br /&gt;
        &#039;Канал&#039;: &#039;🌊&#039;,&lt;br /&gt;
        &#039;Остров&#039;: &#039;🏝️&#039;,&lt;br /&gt;
        &#039;Метро&#039;: &#039;🚇&#039;,&lt;br /&gt;
        &#039;Скульптура&#039;: &#039;🗿&#039;,&lt;br /&gt;
        &#039;Галерея&#039;: &#039;🖼️&#039;,&lt;br /&gt;
        &#039;Выставка&#039;: &#039;🎨&#039;,&lt;br /&gt;
        &#039;Концертный зал&#039;: &#039;🎵&#039;,&lt;br /&gt;
        &#039;Спорткомплекс&#039;: &#039;🏟️&#039;,&lt;br /&gt;
        &#039;Клуб&#039;: &#039;🎶&#039;,&lt;br /&gt;
        &#039;Рынок&#039;: &#039;🏪&#039;,&lt;br /&gt;
        &#039;Аптека&#039;: &#039;💊&#039;,&lt;br /&gt;
        &#039;Больница&#039;: &#039;🏥&#039;,&lt;br /&gt;
        &#039;Университет&#039;: &#039;🎓&#039;,&lt;br /&gt;
        &#039;Архив&#039;: &#039;📜&#039;,&lt;br /&gt;
        &#039;Детский центр&#039;: &#039;🧸&#039;,&lt;br /&gt;
        &#039;Парк аттракционов&#039;: &#039;🎡&#039;,&lt;br /&gt;
        &#039;Океанариум&#039;: &#039;🐠&#039;,&lt;br /&gt;
        &#039;Дельфинарий&#039;: &#039;🐬&#039;,&lt;br /&gt;
        &#039;Планетарий&#039;: &#039;🌌&#039;,&lt;br /&gt;
        &#039;Причал&#039;: &#039;⚓&#039;,&lt;br /&gt;
        &#039;Смотровая площадка&#039;: &#039;🌅&#039;,&lt;br /&gt;
        &#039;Арка&#039;: &#039;🚪&#039;,&lt;br /&gt;
        &#039;Детская площадка&#039;: &#039;🧒&#039;,&lt;br /&gt;
        &#039;Спортплощадка&#039;: &#039;⚽&#039;,&lt;br /&gt;
        &#039;Беговая дорожка&#039;: &#039;🏃&#039;,&lt;br /&gt;
        &#039;Велодорожка&#039;: &#039;🚴&#039;,&lt;br /&gt;
        &#039;Скейт-парк&#039;: &#039;🛹&#039;,&lt;br /&gt;
        &#039;Пляж&#039;: &#039;🏖️&#039;,&lt;br /&gt;
        &#039;Пруд&#039;: &#039;🦆&#039;,&lt;br /&gt;
        &#039;Озеро&#039;: &#039;🏞️&#039;,&lt;br /&gt;
        &#039;Лес&#039;: &#039;🌲&#039;,&lt;br /&gt;
        &#039;Карьер&#039;: &#039;⛏️&#039;,&lt;br /&gt;
        &#039;Крепость&#039;: &#039;🏯&#039;,&lt;br /&gt;
        &#039;Форт&#039;: &#039;🛡️&#039;,&lt;br /&gt;
        &#039;Подземелье&#039;: &#039;🕳️&#039;,&lt;br /&gt;
        &#039;Тоннель&#039;: &#039;🚇&#039;,&lt;br /&gt;
        &#039;Бизнес-центр&#039;: &#039;🏢&#039;,&lt;br /&gt;
        &#039;Хостел&#039;: &#039;🏨&#039;,&lt;br /&gt;
        &#039;Дом&#039;: &#039;🏠&#039;,&lt;br /&gt;
        &#039;Завод&#039;: &#039;🏭&#039;,&lt;br /&gt;
        &#039;Фабрика&#039;: &#039;🏭&#039;,&lt;br /&gt;
        &#039;Маяк&#039;: &#039;🗼&#039;,&lt;br /&gt;
        &#039;Башня&#039;: &#039;🗼&#039;,&lt;br /&gt;
        &#039;Стенд&#039;: &#039;📋&#039;,&lt;br /&gt;
        &#039;Скамейка&#039;: &#039;🪑&#039;,&lt;br /&gt;
        &#039;Другое&#039;: &#039;📍&#039;&lt;br /&gt;
    };&lt;br /&gt;
    return L.divIcon({&lt;br /&gt;
        html: icons[type] || &#039;📍&#039;,&lt;br /&gt;
        iconSize: [28, 28],&lt;br /&gt;
        className: &#039;emoji-marker&#039;,&lt;br /&gt;
        popupAnchor: [0, -14]&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function drawMarkers() {&lt;br /&gt;
    document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
    &lt;br /&gt;
    fetch(&#039;/data.php?_=&#039; + Date.now())&lt;br /&gt;
        .then(response =&amp;gt; {&lt;br /&gt;
            if (!response.ok) throw new Error(&#039;HTTP &#039; + response.status);&lt;br /&gt;
            return response.json();&lt;br /&gt;
        })&lt;br /&gt;
        .then(data =&amp;gt; {&lt;br /&gt;
            console.log(&#039;Данные загружены, объектов:&#039;, data.length);&lt;br /&gt;
            map.eachLayer(layer =&amp;gt; {&lt;br /&gt;
                if (layer instanceof L.Marker) map.removeLayer(layer);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            data.forEach(obj =&amp;gt; {&lt;br /&gt;
                var lat = parseFloat(obj.lat);&lt;br /&gt;
                var lon = parseFloat(obj.lon);&lt;br /&gt;
                if (isNaN(lat) || isNaN(lon)) return;&lt;br /&gt;
                &lt;br /&gt;
                var icon = getIconByType(obj.type);&lt;br /&gt;
                var popupHtml = &#039;&amp;lt;b&amp;gt;&#039; + obj.name + &#039;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;b&amp;gt;Тип:&amp;lt;/b&amp;gt; &#039; + obj.type + &#039;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                obj.address + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.quest) popupHtml += &#039;&amp;lt;b&amp;gt;🎯 Квест:&amp;lt;/b&amp;gt; &#039; + obj.quest + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.image) popupHtml += &#039;&amp;lt;img src=&amp;quot;&#039; + obj.image + &#039;&amp;quot; style=&amp;quot;max-width:150px; max-height:100px; margin-top:8px; border-radius:8px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.description) popupHtml += &#039;&amp;lt;b&amp;gt;Описание:&amp;lt;/b&amp;gt; &#039; + obj.description + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.page) popupHtml += &#039;&amp;lt;a href=&amp;quot;/index.php/&#039; + encodeURIComponent(obj.page) + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;📖 Читать подробнее&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
                L.marker([lat, lon], {icon: icon}).addTo(map).bindPopup(popupHtml);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
            &lt;br /&gt;
            if (data.length === 0) {&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;😕 Нет мест. Добавь первое!&#039;;&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка загрузки данных:&#039;, error);&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;⚠️ Не удалось загрузить данные. Попробуйте позже.&#039;;&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
drawMarkers();&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&#039;refreshMapBtn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
    drawMarkers();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var attributionControl = map.attributionControl;&lt;br /&gt;
if (attributionControl) {&lt;br /&gt;
    attributionControl.setPrefix(&#039;&#039;);&lt;br /&gt;
    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.innerHTML = &#039;.leaflet-attribution-flag { display: none !important; }&#039;;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%BE-%D0%9D%D0%B5%D0%B2%D1%81%D0%BA%D0%B0%D1%8F_%D0%BB%D0%B0%D0%B2%D1%80%D0%B0&amp;diff=952</id>
		<title>Александро-Невская лавра</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%BE-%D0%9D%D0%B5%D0%B2%D1%81%D0%BA%D0%B0%D1%8F_%D0%BB%D0%B0%D0%B2%D1%80%D0%B0&amp;diff=952"/>
		<updated>2026-07-08T20:56:12Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Объект en&lt;br /&gt;
|name=Александро-Невская лавра&lt;br /&gt;
|address=Наб. Реки Монастырем,1&lt;br /&gt;
|lat=59.921101&lt;br /&gt;
|lon=30.388533&lt;br /&gt;
|type=Церковь&lt;br /&gt;
|image=https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%BE-%D0%9D%D0%B5%D0%B2%D1%81%D0%BA%D0%B0%D1%8F_%D0%BB%D0%B0%D0%B2%D1%80%D0%B0#/media/%D0%A4%D0%B0%D0%B9%D0%BB:RUS-2016-Aerial-SPB-Alexander_Nevsky_Lavra.jpg&lt;br /&gt;
|description=Свя́то-Тро́ицкая Алекса́ндро-Не́вская ла́вра — мужской православный монастырь на восточной оконечности Невского проспекта в Санкт-Петербурге. Первый и наиболее крупный монастырь города. С 1797 года имеет статус лавры.&lt;br /&gt;
&lt;br /&gt;
В состав архитектурного комплекса входит несколько знаменитых некрополей, где покоятся многие выдающиеся деятели XVIII—XIX веков.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%9C%D0%BE%D1%81%D1%82&amp;diff=936</id>
		<title>Мост</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%9C%D0%BE%D1%81%D1%82&amp;diff=936"/>
		<updated>2026-07-07T15:00:44Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: Admin Gorod переименовал страницу Мост в Большеохтинский мост&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Большеохтинский мост]]&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%D0%BE%D1%85%D1%82%D0%B8%D0%BD%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%BE%D1%81%D1%82&amp;diff=935</id>
		<title>Большеохтинский мост</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%D0%BE%D1%85%D1%82%D0%B8%D0%BD%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%BE%D1%81%D1%82&amp;diff=935"/>
		<updated>2026-07-07T15:00:44Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: Admin Gorod переименовал страницу Мост в Большеохтинский мост&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Объект en&lt;br /&gt;
|name=Большеохтинский мост&lt;br /&gt;
|address=Большеохтинский мост&lt;br /&gt;
|lat=59.942597&lt;br /&gt;
|lon=30.401603&lt;br /&gt;
|type=Мост&lt;br /&gt;
|image=https://onpiterpalms.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:IMG_20260707_135234.jpg&lt;br /&gt;
|description=Легенда о золотом гвозде.&lt;br /&gt;
По слухам, при строительстве моста одна из более чем миллиона стальных заклёпок была сделана из золота. Строители якобы покрыли её металлической плёнкой, чтобы спрятать, и сделали это «на удачу» - нашедший заклёпку должен был обрести богатство и счастливую жизнь.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D0%B0:%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C_%D0%BC%D0%B5%D1%81%D1%82%D0%BE_(%D1%80%D0%B5%D0%B1%D1%91%D0%BD%D0%BE%D0%BA)_v2&amp;diff=934</id>
		<title>Форма:Добавить место (ребёнок) v2</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D0%B0:%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C_%D0%BC%D0%B5%D1%81%D1%82%D0%BE_(%D1%80%D0%B5%D0%B1%D1%91%D0%BD%D0%BE%D0%BA)_v2&amp;diff=934"/>
		<updated>2026-07-07T14:49:59Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{#forminput:form=Добавить место (ребёнок) v2}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
{{{for template|Объект_en}}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-bottom: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;🏷️ Название места:&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{{field|name|mandatory|size=60}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-bottom: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;📍 Адрес (улица, дом):&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{{field|address|mandatory|size=60|placeholder=например: Невский пр., д. 1}}}&lt;br /&gt;
{{#widget:GeocodeButton}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-bottom: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;🌐 Широта:&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{{field|lat|size=20}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-bottom: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;🌐 Долгота:&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{{field|lon|size=20}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-bottom: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;🏷️ Тип места:&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{{field|type|input type=dropdown|values=Парк,Памятник,Музей,Церковь,Школа,Кафе,Мост,Фонтан,Театр,Библиотека,Стадион,Аквапарк,Зоопарк,Кинотеатр,Торговый центр,Вокзал,Гостиница,Ресторан,Набережная,Сад,Сквер,Дворец,Собор,Часовня,Монастырь,Улица,Переулок,Река,Канал,Остров,Метро,Скульптура,Галерея,Выставка,Концертный зал,Спорткомплекс,Клуб,Рынок,Аптека,Больница,Университет,Архив,Детский центр,Парк аттракционов,Океанариум,Дельфинарий,Планетарий,Причал,Смотровая площадка,Арка,Детская площадка,Спортплощадка,Беговая дорожка,Велодорожка,Скейт-парк,Пляж,Пруд,Озеро,Лес,Карьер,Крепость,Форт,Подземелье,Тоннель,Бизнес-центр,Хостел,Дом,Завод,Фабрика,Маяк,Башня,Стенд,Скамейка,Другое}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-bottom: 15px; background: #f9f9f9; padding: 15px; border-radius: 15px; border-left: 4px solid #ff9800;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;strong&amp;gt;🖼️ Фото места:&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  {{{field|image|size=60|placeholder=Вставь прямую ссылку на фото (например, https://onpiterpalms.ru/images/...jpg)}}}&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-size: 0.85em; color: #555; margin-top: 8px; background: #fff3e0; padding: 10px; border-radius: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;📸 Как добавить фото:&amp;lt;/div&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;div style=&amp;quot;margin-top: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;strong&amp;gt;Вариант 1 (легче всего):&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
      Загрузи фото на &amp;lt;a href=&amp;quot;https://postimages.org/&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;PostImages&amp;lt;/a&amp;gt; или &amp;lt;a href=&amp;quot;https://imgbb.com/&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;ImgBB&amp;lt;/a&amp;gt; → скопируй ссылку «Прямая ссылка» → вставь в поле выше.&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;div style=&amp;quot;margin-top: 8px; padding-top: 8px; border-top: 1px dashed #ddd;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;strong&amp;gt;Вариант 2 (через сайт):&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
      {{#widget:UploadLink}}&lt;br /&gt;
      &amp;lt;span style=&amp;quot;color: #888; font-size: 0.9em;&amp;quot;&amp;gt;(откроется в новой вкладке)&amp;lt;/span&amp;gt;&lt;br /&gt;
      &amp;lt;br&amp;gt;&lt;br /&gt;
      После загрузки:&lt;br /&gt;
      &amp;lt;ol style=&amp;quot;margin: 5px 0 0 20px; font-size: 0.95em;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;На странице файла &amp;lt;strong&amp;gt;нажми на изображение&amp;lt;/strong&amp;gt;, чтобы открыть его в полном размере.&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;Скопируй &amp;lt;strong&amp;gt;ссылку из адресной строки&amp;lt;/strong&amp;gt; (она начинается с &amp;lt;code&amp;gt;https://onpiterpalms.ru/images/...&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;Вставь эту ссылку в поле выше.&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;div style=&amp;quot;margin-top: 8px; font-size: 0.9em; color: #888; background: #f0f7ff; padding: 6px 10px; border-radius: 8px;&amp;quot;&amp;gt;&lt;br /&gt;
      💡 &amp;lt;strong&amp;gt;Совет:&amp;lt;/strong&amp;gt; Если фото не отображается — проверь, что ссылка ведёт на сам файл (заканчивается на &amp;lt;code&amp;gt;.jpg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.png&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;.gif&amp;lt;/code&amp;gt;).&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-bottom: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;🎯 Квест:&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{{field|quest|input type=dropdown|values=,Львиный глаз,Петербург цветёт,Белые ночи,Другое}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-bottom: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;📝 Описание:&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{{{field|description|input type=textarea|rows=5|cols=60}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{{end template}}}&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
{{{standard input|save|label=Сохранить место}}} &lt;br /&gt;
{{{standard input|cancel|label=Отмена}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=933</id>
		<title>Widget:KidsMap</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=933"/>
		<updated>2026-07-07T14:48:07Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;text-align: right; margin-bottom: 8px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;button id=&amp;quot;refreshMapBtn&amp;quot; style=&amp;quot;background: #1565c0; color: white; border: none; padding: 6px 16px; border-radius: 20px; font-size: 14px; cursor: pointer; display: inline-flex; align-items: center; gap: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
    🔄 Обновить карту&lt;br /&gt;
  &amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 100%; height: 500px; margin: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 6px rgba(0,0,0,0.1); background: #d9e6d9;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;loading-message&amp;quot; style=&amp;quot;display: none; text-align: center; margin-top: 4px; font-size: 0.9em;&amp;quot;&amp;gt;Загрузка маркеров...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.emoji-marker {&lt;br /&gt;
    background: white;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 2px solid #2e7d32;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 28px;&lt;br /&gt;
    width: 28px !important;&lt;br /&gt;
    height: 28px !important;&lt;br /&gt;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var map = L.map(&#039;map&#039;).setView([59.9343, 30.3351], 12);&lt;br /&gt;
L.tileLayer(&#039;https://tile.openstreetmap.org/{z}/{x}/{y}.png&#039;, {&lt;br /&gt;
    maxZoom: 19,&lt;br /&gt;
    attribution: &#039;© OpenStreetMap&#039;&lt;br /&gt;
}).addTo(map);&lt;br /&gt;
&lt;br /&gt;
function getIconByType(type) {&lt;br /&gt;
    const icons = {&lt;br /&gt;
        &#039;Парк&#039;: &#039;🌳&#039;,&lt;br /&gt;
        &#039;Памятник&#039;: &#039;🗿&#039;,&lt;br /&gt;
        &#039;Музей&#039;: &#039;🏛️&#039;,&lt;br /&gt;
        &#039;Церковь&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Школа&#039;: &#039;🏫&#039;,&lt;br /&gt;
        &#039;Кафе&#039;: &#039;☕&#039;,&lt;br /&gt;
        &#039;Мост&#039;: &#039;🌉&#039;,&lt;br /&gt;
        &#039;Фонтан&#039;: &#039;⛲&#039;,&lt;br /&gt;
        &#039;Театр&#039;: &#039;🎭&#039;,&lt;br /&gt;
        &#039;Библиотека&#039;: &#039;📚&#039;,&lt;br /&gt;
        &#039;Стадион&#039;: &#039;⚽&#039;,&lt;br /&gt;
        &#039;Аквапарк&#039;: &#039;💦&#039;,&lt;br /&gt;
        &#039;Зоопарк&#039;: &#039;🐘&#039;,&lt;br /&gt;
        &#039;Кинотеатр&#039;: &#039;🎬&#039;,&lt;br /&gt;
        &#039;Торговый центр&#039;: &#039;🛍️&#039;,&lt;br /&gt;
        &#039;Вокзал&#039;: &#039;🚂&#039;,&lt;br /&gt;
        &#039;Гостиница&#039;: &#039;🏨&#039;,&lt;br /&gt;
        &#039;Ресторан&#039;: &#039;🍽️&#039;,&lt;br /&gt;
        &#039;Набережная&#039;: &#039;🌊&#039;,&lt;br /&gt;
        &#039;Сад&#039;: &#039;🌿&#039;,&lt;br /&gt;
        &#039;Сквер&#039;: &#039;🌳&#039;,&lt;br /&gt;
        &#039;Дворец&#039;: &#039;🏰&#039;,&lt;br /&gt;
        &#039;Собор&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Часовня&#039;: &#039;🕯️&#039;,&lt;br /&gt;
        &#039;Монастырь&#039;: &#039;🏯&#039;,&lt;br /&gt;
        &#039;Улица&#039;: &#039;🛤️&#039;,&lt;br /&gt;
        &#039;Переулок&#039;: &#039;🏘️&#039;,&lt;br /&gt;
        &#039;Река&#039;: &#039;🌊&#039;,&lt;br /&gt;
        &#039;Канал&#039;: &#039;🌊&#039;,&lt;br /&gt;
        &#039;Остров&#039;: &#039;🏝️&#039;,&lt;br /&gt;
        &#039;Метро&#039;: &#039;🚇&#039;,&lt;br /&gt;
        &#039;Скульптура&#039;: &#039;🗿&#039;,&lt;br /&gt;
        &#039;Галерея&#039;: &#039;🖼️&#039;,&lt;br /&gt;
        &#039;Выставка&#039;: &#039;🎨&#039;,&lt;br /&gt;
        &#039;Концертный зал&#039;: &#039;🎵&#039;,&lt;br /&gt;
        &#039;Спорткомплекс&#039;: &#039;🏟️&#039;,&lt;br /&gt;
        &#039;Клуб&#039;: &#039;🎶&#039;,&lt;br /&gt;
        &#039;Рынок&#039;: &#039;🏪&#039;,&lt;br /&gt;
        &#039;Аптека&#039;: &#039;💊&#039;,&lt;br /&gt;
        &#039;Больница&#039;: &#039;🏥&#039;,&lt;br /&gt;
        &#039;Университет&#039;: &#039;🎓&#039;,&lt;br /&gt;
        &#039;Архив&#039;: &#039;📜&#039;,&lt;br /&gt;
        &#039;Детский центр&#039;: &#039;🧸&#039;,&lt;br /&gt;
        &#039;Парк аттракционов&#039;: &#039;🎡&#039;,&lt;br /&gt;
        &#039;Океанариум&#039;: &#039;🐠&#039;,&lt;br /&gt;
        &#039;Дельфинарий&#039;: &#039;🐬&#039;,&lt;br /&gt;
        &#039;Планетарий&#039;: &#039;🌌&#039;,&lt;br /&gt;
        &#039;Причал&#039;: &#039;⚓&#039;,&lt;br /&gt;
        &#039;Смотровая площадка&#039;: &#039;🌅&#039;,&lt;br /&gt;
        &#039;Арка&#039;: &#039;🚪&#039;,&lt;br /&gt;
        &#039;Детская площадка&#039;: &#039;🧒&#039;,&lt;br /&gt;
        &#039;Спортплощадка&#039;: &#039;⚽&#039;,&lt;br /&gt;
        &#039;Беговая дорожка&#039;: &#039;🏃&#039;,&lt;br /&gt;
        &#039;Велодорожка&#039;: &#039;🚴&#039;,&lt;br /&gt;
        &#039;Скейт-парк&#039;: &#039;🛹&#039;,&lt;br /&gt;
        &#039;Пляж&#039;: &#039;🏖️&#039;,&lt;br /&gt;
        &#039;Пруд&#039;: &#039;🦆&#039;,&lt;br /&gt;
        &#039;Озеро&#039;: &#039;🏞️&#039;,&lt;br /&gt;
        &#039;Лес&#039;: &#039;🌲&#039;,&lt;br /&gt;
        &#039;Карьер&#039;: &#039;⛏️&#039;,&lt;br /&gt;
        &#039;Крепость&#039;: &#039;🏯&#039;,&lt;br /&gt;
        &#039;Форт&#039;: &#039;🛡️&#039;,&lt;br /&gt;
        &#039;Подземелье&#039;: &#039;🕳️&#039;,&lt;br /&gt;
        &#039;Тоннель&#039;: &#039;🚇&#039;,&lt;br /&gt;
        &#039;Бизнес-центр&#039;: &#039;🏢&#039;,&lt;br /&gt;
        &#039;Хостел&#039;: &#039;🏨&#039;,&lt;br /&gt;
        &#039;Дом&#039;: &#039;🏠&#039;,&lt;br /&gt;
        &#039;Завод&#039;: &#039;🏭&#039;,&lt;br /&gt;
        &#039;Фабрика&#039;: &#039;🏭&#039;,&lt;br /&gt;
        &#039;Маяк&#039;: &#039;🗼&#039;,&lt;br /&gt;
        &#039;Башня&#039;: &#039;🗼&#039;,&lt;br /&gt;
        &#039;Стенд&#039;: &#039;📋&#039;,&lt;br /&gt;
        &#039;Скамейка&#039;: &#039;🪑&#039;,&lt;br /&gt;
        &#039;Другое&#039;: &#039;📍&#039;&lt;br /&gt;
    };&lt;br /&gt;
    return L.divIcon({&lt;br /&gt;
        html: icons[type] || &#039;📍&#039;,&lt;br /&gt;
        iconSize: [28, 28],&lt;br /&gt;
        className: &#039;emoji-marker&#039;,&lt;br /&gt;
        popupAnchor: [0, -14]&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function drawMarkers() {&lt;br /&gt;
    document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
    &lt;br /&gt;
    fetch(&#039;/data.php&#039;)&lt;br /&gt;
        .then(response =&amp;gt; {&lt;br /&gt;
            if (!response.ok) throw new Error(&#039;HTTP &#039; + response.status);&lt;br /&gt;
            return response.json();&lt;br /&gt;
        })&lt;br /&gt;
        .then(data =&amp;gt; {&lt;br /&gt;
            console.log(&#039;Данные загружены, объектов:&#039;, data.length);&lt;br /&gt;
            map.eachLayer(layer =&amp;gt; {&lt;br /&gt;
                if (layer instanceof L.Marker) map.removeLayer(layer);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            data.forEach(obj =&amp;gt; {&lt;br /&gt;
                var lat = parseFloat(obj.lat);&lt;br /&gt;
                var lon = parseFloat(obj.lon);&lt;br /&gt;
                if (isNaN(lat) || isNaN(lon)) return;&lt;br /&gt;
                &lt;br /&gt;
                var icon = getIconByType(obj.type);&lt;br /&gt;
                var popupHtml = &#039;&amp;lt;b&amp;gt;&#039; + obj.name + &#039;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;b&amp;gt;Тип:&amp;lt;/b&amp;gt; &#039; + obj.type + &#039;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                obj.address + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.quest) popupHtml += &#039;&amp;lt;b&amp;gt;🎯 Квест:&amp;lt;/b&amp;gt; &#039; + obj.quest + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.image) popupHtml += &#039;&amp;lt;img src=&amp;quot;&#039; + obj.image + &#039;&amp;quot; style=&amp;quot;max-width:150px; max-height:100px; margin-top:8px; border-radius:8px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.description) popupHtml += &#039;&amp;lt;b&amp;gt;Описание:&amp;lt;/b&amp;gt; &#039; + obj.description + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.page) popupHtml += &#039;&amp;lt;a href=&amp;quot;/index.php/&#039; + encodeURIComponent(obj.page) + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;📖 Читать подробнее&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
                L.marker([lat, lon], {icon: icon}).addTo(map).bindPopup(popupHtml);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
            &lt;br /&gt;
            if (data.length === 0) {&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;😕 Нет мест. Добавь первое!&#039;;&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка загрузки данных:&#039;, error);&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;⚠️ Не удалось загрузить данные. Попробуйте позже.&#039;;&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
drawMarkers();&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&#039;refreshMapBtn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
    drawMarkers();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var attributionControl = map.attributionControl;&lt;br /&gt;
if (attributionControl) {&lt;br /&gt;
    attributionControl.setPrefix(&#039;&#039;);&lt;br /&gt;
    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.innerHTML = &#039;.leaflet-attribution-flag { display: none !important; }&#039;;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%94%D0%B0%D1%88%D0%B1%D0%BE%D1%80%D0%B4_%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0&amp;diff=932</id>
		<title>Дашборд администратора</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%94%D0%B0%D1%88%D0%B1%D0%BE%D1%80%D0%B4_%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0&amp;diff=932"/>
		<updated>2026-07-07T14:08:43Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background: #f0f7ff; border-radius: 20px; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 🖥️ Дашборд администратора =&lt;br /&gt;
&lt;br /&gt;
Добро пожаловать! Здесь вы видите последние добавленные места. &lt;br /&gt;
🟢 &#039;&#039;&#039;Зелёный&#039;&#039;&#039; — место уникально.&lt;br /&gt;
🔴 &#039;&#039;&#039;Красный&#039;&#039;&#039; — возможно, дубликат.&lt;br /&gt;
&lt;br /&gt;
== 🗺️ Новые места (последние 20) ==&lt;br /&gt;
&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
tables=Objects&lt;br /&gt;
|fields=_pageName, name, address, lat, lon, type, quest&lt;br /&gt;
|order by=_pageID DESC&lt;br /&gt;
|limit=20&lt;br /&gt;
|format=table&lt;br /&gt;
|default=Новых мест пока нет.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 📝 Новые статьи (последние 20) ==&lt;br /&gt;
&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
tables=Objects&lt;br /&gt;
|fields=_pageName, name, address, type&lt;br /&gt;
|order by=_pageID DESC&lt;br /&gt;
|limit=20&lt;br /&gt;
|format=table&lt;br /&gt;
|default=Новых статей пока нет.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 📌 Быстрые ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [[Служебная:Новые_страницы|Все новые страницы]]&lt;br /&gt;
* [[Служебная:Свежие_правки|Свежие правки]]&lt;br /&gt;
* [[Карта города|Посмотреть карту]]&lt;br /&gt;
* [[Связь с нами|Написать нам]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%A1%D1%82%D1%80%D0%BE%D0%BA%D0%B0_%D1%81%D1%82%D0%B0%D1%82%D1%8C%D0%B8&amp;diff=931</id>
		<title>Шаблон Строка статьи</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%A1%D1%82%D1%80%D0%BE%D0%BA%D0%B0_%D1%81%D1%82%D0%B0%D1%82%D1%8C%D0%B8&amp;diff=931"/>
		<updated>2026-07-07T14:07:49Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: Новая страница: «&amp;lt;includeonly&amp;gt;{{#switch:{{{type|}}} | Парк = 🌳 | Памятник = 🗿 | Музей = 🏛️ | Церковь = ⛪ | Школа = 🏫 | Кафе = ☕ | Мост = 🌉 | Фонтан = ⛲ | Театр = 🎭 | Библиотека = 📚 | Стадион = ⚽ | Аквапарк = 💦 | Зоопарк = 🐘 | Кинотеатр = 🎬 | Торговый центр = 🛍️ | Вокзал = 🚂 | Гостиница = 🏨 | Ресторан =...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#switch:{{{type|}}}&lt;br /&gt;
| Парк = 🌳&lt;br /&gt;
| Памятник = 🗿&lt;br /&gt;
| Музей = 🏛️&lt;br /&gt;
| Церковь = ⛪&lt;br /&gt;
| Школа = 🏫&lt;br /&gt;
| Кафе = ☕&lt;br /&gt;
| Мост = 🌉&lt;br /&gt;
| Фонтан = ⛲&lt;br /&gt;
| Театр = 🎭&lt;br /&gt;
| Библиотека = 📚&lt;br /&gt;
| Стадион = ⚽&lt;br /&gt;
| Аквапарк = 💦&lt;br /&gt;
| Зоопарк = 🐘&lt;br /&gt;
| Кинотеатр = 🎬&lt;br /&gt;
| Торговый центр = 🛍️&lt;br /&gt;
| Вокзал = 🚂&lt;br /&gt;
| Гостиница = 🏨&lt;br /&gt;
| Ресторан = 🍽️&lt;br /&gt;
| Другое = 📍&lt;br /&gt;
| #default = 📍&lt;br /&gt;
}} &amp;lt;b&amp;gt;[[{{{_pageName|}}}|{{{name|}}}]]&amp;lt;/b&amp;gt; — {{{address|}}} — Тип: {{{type|}}}{{#if:{{{description|}}}|, Описание: {{{description|}}}}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%A1%D1%82%D1%80%D0%BE%D0%BA%D0%B0_%D0%BC%D0%B5%D1%81%D1%82%D0%B0&amp;diff=930</id>
		<title>Шаблон Строка места</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%A1%D1%82%D1%80%D0%BE%D0%BA%D0%B0_%D0%BC%D0%B5%D1%81%D1%82%D0%B0&amp;diff=930"/>
		<updated>2026-07-07T14:07:19Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: Новая страница: «&amp;lt;includeonly&amp;gt;{{#switch:{{{type|}}} | Парк = 🌳 | Памятник = 🗿 | Музей = 🏛️ | Церковь = ⛪ | Школа = 🏫 | Кафе = ☕ | Мост = 🌉 | Фонтан = ⛲ | Театр = 🎭 | Библиотека = 📚 | Стадион = ⚽ | Аквапарк = 💦 | Зоопарк = 🐘 | Кинотеатр = 🎬 | Торговый центр = 🛍️ | Вокзал = 🚂 | Гостиница = 🏨 | Ресторан =...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#switch:{{{type|}}}&lt;br /&gt;
| Парк = 🌳&lt;br /&gt;
| Памятник = 🗿&lt;br /&gt;
| Музей = 🏛️&lt;br /&gt;
| Церковь = ⛪&lt;br /&gt;
| Школа = 🏫&lt;br /&gt;
| Кафе = ☕&lt;br /&gt;
| Мост = 🌉&lt;br /&gt;
| Фонтан = ⛲&lt;br /&gt;
| Театр = 🎭&lt;br /&gt;
| Библиотека = 📚&lt;br /&gt;
| Стадион = ⚽&lt;br /&gt;
| Аквапарк = 💦&lt;br /&gt;
| Зоопарк = 🐘&lt;br /&gt;
| Кинотеатр = 🎬&lt;br /&gt;
| Торговый центр = 🛍️&lt;br /&gt;
| Вокзал = 🚂&lt;br /&gt;
| Гостиница = 🏨&lt;br /&gt;
| Ресторан = 🍽️&lt;br /&gt;
| Другое = 📍&lt;br /&gt;
| #default = 📍&lt;br /&gt;
}} &amp;lt;b&amp;gt;[[{{{_pageName|}}}|{{{name|}}}]]&amp;lt;/b&amp;gt; — {{{address|}}} — Тип: {{{type|}}}{{#if:{{{quest|}}}|, Квест: {{{quest|}}}}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%94%D0%B0%D1%88%D0%B1%D0%BE%D1%80%D0%B4_%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0&amp;diff=929</id>
		<title>Дашборд администратора</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%94%D0%B0%D1%88%D0%B1%D0%BE%D1%80%D0%B4_%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0&amp;diff=929"/>
		<updated>2026-07-07T14:06:25Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background: #f0f7ff; border-radius: 20px; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 🖥️ Дашборд администратора =&lt;br /&gt;
&lt;br /&gt;
Добро пожаловать! Здесь вы видите последние добавленные места и статьи.&lt;br /&gt;
&lt;br /&gt;
== 🗺️ Новые места (последние 20) ==&lt;br /&gt;
&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
tables=Objects&lt;br /&gt;
|fields=_pageName, name, address, lat, lon, type, quest&lt;br /&gt;
|order by=_pageID DESC&lt;br /&gt;
|limit=20&lt;br /&gt;
|format=template&lt;br /&gt;
|template=Строка_места&lt;br /&gt;
|default=Новых мест пока нет.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 📝 Новые статьи (последние 20) ==&lt;br /&gt;
&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
tables=Objects&lt;br /&gt;
|fields=_pageName, name, address, type, description&lt;br /&gt;
|order by=_pageID DESC&lt;br /&gt;
|limit=20&lt;br /&gt;
|format=template&lt;br /&gt;
|template=Строка_статьи&lt;br /&gt;
|default=Новых статей пока нет.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 📌 Быстрые ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [[Служебная:Новые_страницы|Все новые страницы]]&lt;br /&gt;
* [[Служебная:Свежие_правки|Свежие правки]]&lt;br /&gt;
* [[Карта города|Посмотреть карту]]&lt;br /&gt;
* [[Связь с нами|Написать нам]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%94%D0%B0%D1%88%D0%B1%D0%BE%D1%80%D0%B4_%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0&amp;diff=928</id>
		<title>Дашборд администратора</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%94%D0%B0%D1%88%D0%B1%D0%BE%D1%80%D0%B4_%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0&amp;diff=928"/>
		<updated>2026-07-07T12:27:05Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background: #f0f7ff; border-radius: 20px; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 🖥️ Дашборд администратора =&lt;br /&gt;
&lt;br /&gt;
Добро пожаловать! Здесь вы видите последние добавленные места. &lt;br /&gt;
🟢 &#039;&#039;&#039;Зелёный&#039;&#039;&#039; — место уникально.&lt;br /&gt;
🔴 &#039;&#039;&#039;Красный&#039;&#039;&#039; — возможно, дубликат.&lt;br /&gt;
&lt;br /&gt;
== 🗺️ Новые места (последние 20) ==&lt;br /&gt;
&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
tables=Objects&lt;br /&gt;
|fields=_pageName, name, address, lat, lon, type, quest&lt;br /&gt;
|order by=_pageID DESC&lt;br /&gt;
|limit=20&lt;br /&gt;
|format=table&lt;br /&gt;
|default=Новых мест пока нет.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 📝 Новые статьи (последние 20) ==&lt;br /&gt;
&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
tables=Objects&lt;br /&gt;
|fields=_pageName, name, address, type&lt;br /&gt;
|order by=_pageID DESC&lt;br /&gt;
|limit=20&lt;br /&gt;
|format=table&lt;br /&gt;
|default=Новых статей пока нет.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 📌 Быстрые ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [[Служебная:Новые_страницы|Все новые страницы]]&lt;br /&gt;
* [[Служебная:Свежие_правки|Свежие правки]]&lt;br /&gt;
* [[Карта города|Посмотреть карту]]&lt;br /&gt;
* [[Связь с нами|Написать нам]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A1%D1%82%D1%80%D0%BE%D0%BA%D0%B0_%D1%81%D1%82%D0%B0%D1%82%D1%8C%D0%B8&amp;diff=927</id>
		<title>Шаблон:Строка статьи</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A1%D1%82%D1%80%D0%BE%D0%BA%D0%B0_%D1%81%D1%82%D0%B0%D1%82%D1%8C%D0%B8&amp;diff=927"/>
		<updated>2026-07-07T12:24:08Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: Новая страница: «&amp;lt;includeonly&amp;gt;{{#vardefine:pageName|{{{Страница|}}}}} {{#vardefine:articleName|{{{Название|}}}}} {{#vardefine:articleAddress|{{{Адрес|}}}}}  {{#cargo_query: tables=Objects |fields=COUNT(*) |where=(name=&amp;quot;{{{Название|}}}&amp;quot; OR address=&amp;quot;{{{Адрес|}}}&amp;quot;) AND _pageID != {{{_pageID|}}} |no html |default=0 |limit=1 |format=plain |name=countDuplicates }}  {{#ifexpr: {{#var:countDuplicates}} &amp;gt; 0   | &amp;lt;div style=&amp;quot;background: #ffebee; paddin...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#vardefine:pageName|{{{Страница|}}}}}&lt;br /&gt;
{{#vardefine:articleName|{{{Название|}}}}}&lt;br /&gt;
{{#vardefine:articleAddress|{{{Адрес|}}}}}&lt;br /&gt;
&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
tables=Objects&lt;br /&gt;
|fields=COUNT(*)&lt;br /&gt;
|where=(name=&amp;quot;{{{Название|}}}&amp;quot; OR address=&amp;quot;{{{Адрес|}}}&amp;quot;) AND _pageID != {{{_pageID|}}}&lt;br /&gt;
|no html&lt;br /&gt;
|default=0&lt;br /&gt;
|limit=1&lt;br /&gt;
|format=plain&lt;br /&gt;
|name=countDuplicates&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#ifexpr: {{#var:countDuplicates}} &amp;gt; 0&lt;br /&gt;
  | &amp;lt;div style=&amp;quot;background: #ffebee; padding: 5px; border-radius: 5px; margin-bottom: 3px;&amp;quot;&amp;gt;&lt;br /&gt;
  | &amp;lt;div style=&amp;quot;background: #e8f5e9; padding: 5px; border-radius: 5px; margin-bottom: 3px;&amp;quot;&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{{Страница|}}} — &#039;&#039;&#039;{{{Название|}}}&#039;&#039;&#039; — {{{Адрес|}}} — Тип: {{{Тип|}}} — Описание: {{{Описание|}}}&lt;br /&gt;
&lt;br /&gt;
{{#ifexpr: {{#var:countDuplicates}} &amp;gt; 0&lt;br /&gt;
  | &amp;lt;span style=&amp;quot;color: #c62828;&amp;quot;&amp;gt;⚠️ Возможно, дубликат! Проверьте.&amp;lt;/span&amp;gt;&lt;br /&gt;
  | &amp;lt;span style=&amp;quot;color: #2e7d32;&amp;quot;&amp;gt;✅ Уникальная статья.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A1%D1%82%D1%80%D0%BE%D0%BA%D0%B0_%D0%BC%D0%B5%D1%81%D1%82%D0%B0&amp;diff=926</id>
		<title>Шаблон:Строка места</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A1%D1%82%D1%80%D0%BE%D0%BA%D0%B0_%D0%BC%D0%B5%D1%81%D1%82%D0%B0&amp;diff=926"/>
		<updated>2026-07-07T12:23:32Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: Новая страница: «&amp;lt;includeonly&amp;gt;{{#vardefine:pageName|{{{Страница|}}}}} {{#vardefine:placeName|{{{Название|}}}}} {{#vardefine:placeAddress|{{{Адрес|}}}}}  {{#cargo_query: tables=Objects |fields=COUNT(*) |where=(name=&amp;quot;{{{Название|}}}&amp;quot; OR address=&amp;quot;{{{Адрес|}}}&amp;quot; OR lat=&amp;quot;{{{Широта|}}}&amp;quot; AND lon=&amp;quot;{{{Долгота|}}}&amp;quot;) AND _pageID != {{{_pageID|}}} |no html |default=0 |limit=1 |format=plain |name=countDuplicates }}  {{#ifexpr: {{#var:countDup...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#vardefine:pageName|{{{Страница|}}}}}&lt;br /&gt;
{{#vardefine:placeName|{{{Название|}}}}}&lt;br /&gt;
{{#vardefine:placeAddress|{{{Адрес|}}}}}&lt;br /&gt;
&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
tables=Objects&lt;br /&gt;
|fields=COUNT(*)&lt;br /&gt;
|where=(name=&amp;quot;{{{Название|}}}&amp;quot; OR address=&amp;quot;{{{Адрес|}}}&amp;quot; OR lat=&amp;quot;{{{Широта|}}}&amp;quot; AND lon=&amp;quot;{{{Долгота|}}}&amp;quot;) AND _pageID != {{{_pageID|}}}&lt;br /&gt;
|no html&lt;br /&gt;
|default=0&lt;br /&gt;
|limit=1&lt;br /&gt;
|format=plain&lt;br /&gt;
|name=countDuplicates&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#ifexpr: {{#var:countDuplicates}} &amp;gt; 0&lt;br /&gt;
  | &amp;lt;div style=&amp;quot;background: #ffebee; padding: 5px; border-radius: 5px; margin-bottom: 3px;&amp;quot;&amp;gt;&lt;br /&gt;
  | &amp;lt;div style=&amp;quot;background: #e8f5e9; padding: 5px; border-radius: 5px; margin-bottom: 3px;&amp;quot;&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{{Страница|}}} — &#039;&#039;&#039;{{{Название|}}}&#039;&#039;&#039; — {{{Адрес|}}} — Тип: {{{Тип|}}} — Квест: {{{Квест|}}}&lt;br /&gt;
&lt;br /&gt;
{{#ifexpr: {{#var:countDuplicates}} &amp;gt; 0&lt;br /&gt;
  | &amp;lt;span style=&amp;quot;color: #c62828;&amp;quot;&amp;gt;⚠️ Возможно, дубликат! Проверьте.&amp;lt;/span&amp;gt;&lt;br /&gt;
  | &amp;lt;span style=&amp;quot;color: #2e7d32;&amp;quot;&amp;gt;✅ Уникальное место.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%94%D0%B0%D1%88%D0%B1%D0%BE%D1%80%D0%B4_%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0&amp;diff=925</id>
		<title>Дашборд администратора</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%94%D0%B0%D1%88%D0%B1%D0%BE%D1%80%D0%B4_%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0&amp;diff=925"/>
		<updated>2026-07-07T12:21:34Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background: #f0f7ff; border-radius: 20px; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 🖥️ Дашборд администратора =&lt;br /&gt;
&lt;br /&gt;
Добро пожаловать! Здесь вы видите последние добавленные места и статьи. &lt;br /&gt;
🟢 &#039;&#039;&#039;Зелёный фон&#039;&#039;&#039; — место уже есть на карте или статья уже существует.&lt;br /&gt;
🔴 &#039;&#039;&#039;Красный фон&#039;&#039;&#039; — возможно, это дубликат (проверьте).&lt;br /&gt;
&lt;br /&gt;
== 🗺️ Новые места (последние 20) ==&lt;br /&gt;
&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
tables=Objects&lt;br /&gt;
|fields=CONCAT(&#039;[[&#039;, _pageName, &#039;|&#039;, _pageName, &#039;]]&#039;)=Страница, name=Название, address=Адрес, lat=Широта, lon=Долгота, type=Тип, quest=Квест, _pageID&lt;br /&gt;
|order by=_pageID DESC&lt;br /&gt;
|limit=20&lt;br /&gt;
|format=template&lt;br /&gt;
|template=Строка_места&lt;br /&gt;
|default=Новых мест пока нет.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 📝 Новые статьи (последние 20) ==&lt;br /&gt;
&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
tables=Objects&lt;br /&gt;
|fields=CONCAT(&#039;[[&#039;, _pageName, &#039;|&#039;, _pageName, &#039;]]&#039;)=Страница, name=Название, address=Адрес, type=Тип, description=Описание, _pageID&lt;br /&gt;
|order by=_pageID DESC&lt;br /&gt;
|limit=20&lt;br /&gt;
|format=template&lt;br /&gt;
|template=Строка_статьи&lt;br /&gt;
|default=Новых статей пока нет.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 📌 Быстрые ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [[Служебная:Новые_страницы|Все новые страницы]]&lt;br /&gt;
* [[Служебная:Свежие_правки|Свежие правки]]&lt;br /&gt;
* [[Карта города|Посмотреть карту]]&lt;br /&gt;
* [[Связь с нами|Написать нам]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=MediaWiki:Sidebar&amp;diff=924</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=MediaWiki:Sidebar&amp;diff=924"/>
		<updated>2026-07-07T12:18:43Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Навигация&lt;br /&gt;
** Заглавная страница|Главная&lt;br /&gt;
** Все разделы|Все разделы проекта&lt;br /&gt;
** Карта города|Карта города&lt;br /&gt;
** recentchanges|Свежие правки&lt;br /&gt;
** randompage|Случайная статья&lt;br /&gt;
* Инструкции для детей&lt;br /&gt;
** Помощь:Как создать статью|Как создать статью&lt;br /&gt;
** Помощь:Как добавить место на карту|Как добавить место на карту&lt;br /&gt;
** Помощь:Как выбрать жанр|Как выбрать жанр&lt;br /&gt;
** Помощь:Как выбрать тему|Как выбрать тему&lt;br /&gt;
* Инструкции для взрослых&lt;br /&gt;
** Помощь:Родителям|Информация для родителей&lt;br /&gt;
** Помощь:Организаторам|Помощь организаторам&lt;br /&gt;
** Помощь:Регистрация участника|Регистрация участника (админ)&lt;br /&gt;
** Помощь:Памятка администратора|Памятка администратора&lt;br /&gt;
** Помощь:Модераторам|Модераторам&lt;br /&gt;
** Дашборд администратора|Дашборд администратора&lt;br /&gt;
** Регистрационная форма|Заполнить заявку на регистрацию&lt;br /&gt;
** Связь с нами|Написать нам&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%94%D0%B0%D1%88%D0%B1%D0%BE%D1%80%D0%B4_%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0&amp;diff=923</id>
		<title>Дашборд администратора</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%94%D0%B0%D1%88%D0%B1%D0%BE%D1%80%D0%B4_%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0&amp;diff=923"/>
		<updated>2026-07-07T12:16:05Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: Новая страница: «&amp;lt;div style=&amp;quot;background: #f0f7ff; border-radius: 20px; padding: 20px;&amp;quot;&amp;gt;  = 🖥️ Дашборд администратора =  Добро пожаловать! Здесь вы видите последние добавленные места и статьи. Используйте эту страницу, чтобы отслеживать новые материалы и связывать их с картами.  == 🗺️ Новые места (посл...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background: #f0f7ff; border-radius: 20px; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 🖥️ Дашборд администратора =&lt;br /&gt;
&lt;br /&gt;
Добро пожаловать! Здесь вы видите последние добавленные места и статьи. Используйте эту страницу, чтобы отслеживать новые материалы и связывать их с картами.&lt;br /&gt;
&lt;br /&gt;
== 🗺️ Новые места (последние 20) ==&lt;br /&gt;
&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
tables=Objects&lt;br /&gt;
|fields=CONCAT(&#039;[[&#039;, _pageName, &#039;|&#039;, _pageName, &#039;]]&#039;)=Название, name=Название места, address=Адрес, lat=Широта, lon=Долгота, type=Тип, quest=Квест, _pageID&lt;br /&gt;
|order by=_pageID DESC&lt;br /&gt;
|limit=20&lt;br /&gt;
|format=table&lt;br /&gt;
|default=Новых мест пока нет.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 📝 Новые статьи (последние 20) ==&lt;br /&gt;
&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
tables=Objects&lt;br /&gt;
|fields=CONCAT(&#039;[[&#039;, _pageName, &#039;|&#039;, _pageName, &#039;]]&#039;)=Страница, name=Название, address=Адрес, type=Тип, description=Описание, _pageID&lt;br /&gt;
|order by=_pageID DESC&lt;br /&gt;
|limit=20&lt;br /&gt;
|format=table&lt;br /&gt;
|default=Новых статей пока нет.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 📌 Быстрые ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [[Служебная:Новые_страницы|Все новые страницы]]&lt;br /&gt;
* [[Служебная:Свежие_правки|Свежие правки]]&lt;br /&gt;
* [[Карта города|Посмотреть карту]]&lt;br /&gt;
* [[Связь с нами|Написать нам]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=920</id>
		<title>Widget:KidsMap</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=920"/>
		<updated>2026-07-06T22:43:34Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;text-align: right; margin-bottom: 8px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;button id=&amp;quot;refreshMapBtn&amp;quot; style=&amp;quot;background: #1565c0; color: white; border: none; padding: 6px 16px; border-radius: 20px; font-size: 14px; cursor: pointer; display: inline-flex; align-items: center; gap: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
    🔄 Обновить карту&lt;br /&gt;
  &amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 100%; height: 500px; margin: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 6px rgba(0,0,0,0.1); background: #d9e6d9;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;loading-message&amp;quot; style=&amp;quot;display: none; text-align: center; margin-top: 4px; font-size: 0.9em;&amp;quot;&amp;gt;Загрузка маркеров...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.emoji-marker {&lt;br /&gt;
    background: white;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 2px solid #2e7d32;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 28px;&lt;br /&gt;
    width: 28px !important;&lt;br /&gt;
    height: 28px !important;&lt;br /&gt;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var map = L.map(&#039;map&#039;).setView([59.9343, 30.3351], 12);&lt;br /&gt;
L.tileLayer(&#039;https://tile.openstreetmap.org/{z}/{x}/{y}.png&#039;, {&lt;br /&gt;
    maxZoom: 19,&lt;br /&gt;
    attribution: &#039;© OpenStreetMap&#039;&lt;br /&gt;
}).addTo(map);&lt;br /&gt;
&lt;br /&gt;
function getIconByType(type) {&lt;br /&gt;
    const icons = {&lt;br /&gt;
        &#039;Парк&#039;: &#039;🌳&#039;, &#039;Памятник&#039;: &#039;🗿&#039;, &#039;Музей&#039;: &#039;🏛️&#039;, &#039;Церковь&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Школа&#039;: &#039;🏫&#039;, &#039;Кафе&#039;: &#039;☕&#039;, &#039;Мост&#039;: &#039;🌉&#039;, &#039;Фонтан&#039;: &#039;⛲&#039;,&lt;br /&gt;
        &#039;Театр&#039;: &#039;🎭&#039;, &#039;Библиотека&#039;: &#039;📚&#039;, &#039;Стадион&#039;: &#039;⚽&#039;, &#039;Аквапарк&#039;: &#039;💦&#039;,&lt;br /&gt;
        &#039;Зоопарк&#039;: &#039;🐘&#039;, &#039;Кинотеатр&#039;: &#039;🎬&#039;, &#039;Торговый центр&#039;: &#039;🛍️&#039;,&lt;br /&gt;
        &#039;Вокзал&#039;: &#039;🚂&#039;, &#039;Гостиница&#039;: &#039;🏨&#039;, &#039;Ресторан&#039;: &#039;🍽️&#039;, &#039;Другое&#039;: &#039;📍&#039;&lt;br /&gt;
    };&lt;br /&gt;
    return L.divIcon({&lt;br /&gt;
        html: icons[type] || &#039;📍&#039;,&lt;br /&gt;
        iconSize: [28, 28],&lt;br /&gt;
        className: &#039;emoji-marker&#039;,&lt;br /&gt;
        popupAnchor: [0, -14]&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function drawMarkers() {&lt;br /&gt;
    document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
    &lt;br /&gt;
    fetch(&#039;/data.php&#039;)&lt;br /&gt;
        .then(response =&amp;gt; {&lt;br /&gt;
            if (!response.ok) throw new Error(&#039;HTTP &#039; + response.status);&lt;br /&gt;
            return response.json();&lt;br /&gt;
        })&lt;br /&gt;
        .then(data =&amp;gt; {&lt;br /&gt;
            console.log(&#039;Данные загружены, объектов:&#039;, data.length);&lt;br /&gt;
            map.eachLayer(layer =&amp;gt; {&lt;br /&gt;
                if (layer instanceof L.Marker) map.removeLayer(layer);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            data.forEach(obj =&amp;gt; {&lt;br /&gt;
                var lat = parseFloat(obj.lat);&lt;br /&gt;
                var lon = parseFloat(obj.lon);&lt;br /&gt;
                if (isNaN(lat) || isNaN(lon)) return;&lt;br /&gt;
                &lt;br /&gt;
                var icon = getIconByType(obj.type);&lt;br /&gt;
                var popupHtml = &#039;&amp;lt;b&amp;gt;&#039; + obj.name + &#039;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;b&amp;gt;Тип:&amp;lt;/b&amp;gt; &#039; + obj.type + &#039;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                obj.address + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.quest) popupHtml += &#039;&amp;lt;b&amp;gt;🎯 Квест:&amp;lt;/b&amp;gt; &#039; + obj.quest + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.image) popupHtml += &#039;&amp;lt;img src=&amp;quot;&#039; + obj.image + &#039;&amp;quot; style=&amp;quot;max-width:150px; max-height:100px; margin-top:8px; border-radius:8px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.description) popupHtml += &#039;&amp;lt;b&amp;gt;Описание:&amp;lt;/b&amp;gt; &#039; + obj.description + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.page) popupHtml += &#039;&amp;lt;a href=&amp;quot;/index.php/&#039; + encodeURIComponent(obj.page) + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;📖 Читать подробнее&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
                L.marker([lat, lon], {icon: icon}).addTo(map).bindPopup(popupHtml);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
            &lt;br /&gt;
            if (data.length === 0) {&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;😕 Нет мест. Добавь первое!&#039;;&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка загрузки данных:&#039;, error);&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;⚠️ Не удалось загрузить данные. Попробуйте позже.&#039;;&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
drawMarkers();&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&#039;refreshMapBtn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
    drawMarkers();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var attributionControl = map.attributionControl;&lt;br /&gt;
if (attributionControl) {&lt;br /&gt;
    attributionControl.setPrefix(&#039;&#039;);&lt;br /&gt;
    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.innerHTML = &#039;.leaflet-attribution-flag { display: none !important; }&#039;;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%BA%D0%B0_%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0&amp;diff=919</id>
		<title>Помощь:Памятка администратора</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%BA%D0%B0_%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0&amp;diff=919"/>
		<updated>2026-07-06T22:23:21Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Руководство администратора проекта «Город на ладошках» =&lt;br /&gt;
&lt;br /&gt;
Добро пожаловать в команду администраторов! Ваша задача — регистрировать новых участников, создавать тематические карты и поддерживать работу вики.&lt;br /&gt;
&lt;br /&gt;
== 📝 Добавление места через форму (для администраторов) ==&lt;br /&gt;
&lt;br /&gt;
Если нужно добавить место, связанное с кумиром или событием, используйте специальную админскую форму.&lt;br /&gt;
&lt;br /&gt;
=== Шаг 1. Откройте форму ===&lt;br /&gt;
&lt;br /&gt;
Перейдите на страницу: &#039;&#039;&#039;[[Добавить место (админ)]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Шаг 2. Заполните поля ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Название объекта&#039;&#039;&#039; – например, «Домик Петра I»&lt;br /&gt;
* &#039;&#039;&#039;Адрес&#039;&#039;&#039; – улица, дом&lt;br /&gt;
* &#039;&#039;&#039;Широта&#039;&#039;&#039; и &#039;&#039;&#039;Долгота&#039;&#039;&#039; – координаты (можно узнать на Яндекс.Картах)&lt;br /&gt;
* &#039;&#039;&#039;Тип места&#039;&#039;&#039; – выберите из списка&lt;br /&gt;
* &#039;&#039;&#039;Ссылка на фото&#039;&#039;&#039; – опционально&lt;br /&gt;
* &#039;&#039;&#039;Кумир (ID)&#039;&#039;&#039; – укажите ID кумира (1 = Влад Бумага, другие ID смотрите в таблице Heroes)&lt;br /&gt;
* &#039;&#039;&#039;Событие (ID)&#039;&#039;&#039; – укажите ID события (1 = Алые паруса, 2 = Ночь музеев, 3 = Моя первая профессия)&lt;br /&gt;
* &#039;&#039;&#039;Описание&#039;&#039;&#039; – расскажите о месте&lt;br /&gt;
&lt;br /&gt;
=== Шаг 3. Сохраните ===&lt;br /&gt;
&lt;br /&gt;
Нажмите кнопку «Сохранить объект». Место автоматически добавится в таблицу `Objects` и появится на карте.&lt;br /&gt;
&lt;br /&gt;
&amp;gt; 💡 &#039;&#039;Эта форма доступна только администраторам. Обычные пользователи её не видят.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 🗺️ Создание тематических карт (Кумиры, События, Достопримечательности, Квесты) ==&lt;br /&gt;
&lt;br /&gt;
Все тематические карты создаются через Конструктор Яндекс.Карт.&lt;br /&gt;
&lt;br /&gt;
=== Шаг 1. Создайте карту в Конструкторе Яндекс.Карт ===&lt;br /&gt;
&lt;br /&gt;
1. Перейдите на [Конструктор карт Яндекс.Карт](https://yandex.ru/map-constructor).&lt;br /&gt;
2. Нажмите «Создать карту».&lt;br /&gt;
3. Добавьте нужные точки, маршруты, линии.&lt;br /&gt;
4. Настройте внешний вид (цвета, иконки).&lt;br /&gt;
5. Сохраните карту и получите iframe-код.&lt;br /&gt;
&lt;br /&gt;
=== Шаг 2. Создайте виджет для карты ===&lt;br /&gt;
&lt;br /&gt;
1. Создайте страницу `Widget:YandexPlaces` (или `Widget:YandexHeroes`, `Widget:YandexEvents`, `Widget:YandexQuests`).&lt;br /&gt;
2. Вставьте iframe-код карты.&lt;br /&gt;
3. Сохраните.&lt;br /&gt;
&lt;br /&gt;
=== Шаг 3. Создайте страницу для карты ===&lt;br /&gt;
&lt;br /&gt;
1. Создайте страницу, например, `Достопримечательности карта`.&lt;br /&gt;
2. Вставьте код: `{{#widget:YandexPlaces}}`.&lt;br /&gt;
3. Сохраните.&lt;br /&gt;
&lt;br /&gt;
=== Шаг 4. Добавьте ссылку в навигатор ===&lt;br /&gt;
&lt;br /&gt;
1. Откройте страницу `Карта города` для редактирования.&lt;br /&gt;
2. Добавьте ссылку на новую карту в блок админских карт.&lt;br /&gt;
3. Сохраните.&lt;br /&gt;
&lt;br /&gt;
== 🕵️‍♂️ Как проверить новое место (добавленное ребёнком) ==&lt;br /&gt;
&lt;br /&gt;
Сейчас места, добавленные детьми, появляются на карте &#039;&#039;&#039;автоматически&#039;&#039;&#039; сразу после сохранения. Администратор может:&lt;br /&gt;
&lt;br /&gt;
1. Проверить новое место на карте.&lt;br /&gt;
2. Если есть ошибки — отредактировать страницу места (через «Править»).&lt;br /&gt;
3. Если фото не отображается — поправить ссылку на фото.&lt;br /&gt;
4. При необходимости связаться с автором через страницу обсуждения.&lt;br /&gt;
&lt;br /&gt;
== 🗺️ Как обновить детскую карту ==&lt;br /&gt;
&lt;br /&gt;
Детская карта (на главной странице) обновляется автоматически через `data.php`. Никаких ручных действий не требуется. Новые места появляются после добавления.&lt;br /&gt;
&lt;br /&gt;
== 🔧 Если на карте пропали все маркеры ==&lt;br /&gt;
&lt;br /&gt;
1. Проверьте, что файл `data.php` в корне сайта существует и работает.&lt;br /&gt;
2. Откройте в браузере: `https://onpiterpalms.ru/data.php` — должен быть JSON.&lt;br /&gt;
3. Если JSON пустой — проверьте таблицу `Objects` в Cargo.&lt;br /&gt;
4. Если ошибка — обратитесь к администратору сервера.&lt;br /&gt;
&lt;br /&gt;
== 🖼️ Как добавить фото к объекту ==&lt;br /&gt;
&lt;br /&gt;
Дети могут добавлять фото через прямую ссылку в поле «Фото места». Если нужно поправить фото:&lt;br /&gt;
&lt;br /&gt;
1. Откройте страницу места для редактирования.&lt;br /&gt;
2. В поле `|image=` вставьте правильную ссылку на фото (URL).&lt;br /&gt;
3. Сохраните страницу.&lt;br /&gt;
&lt;br /&gt;
== 📝 Как часто обновлять карту ==&lt;br /&gt;
&lt;br /&gt;
Карта обновляется автоматически. Тематические карты (Яндекс) обновляются в Конструкторе — изменения появляются сразу.&lt;br /&gt;
&lt;br /&gt;
== 🆘 Нужна помощь? ==&lt;br /&gt;
&lt;br /&gt;
* [[Связь с нами]] – написать администратору.&lt;br /&gt;
* [[Помощь:Модераторам]] – инструкция для модераторов.&lt;br /&gt;
* [[Помощь:Организаторам]] – все инструкции в одном месте.&lt;br /&gt;
&lt;br /&gt;
Спасибо, что поддерживаете карту города в актуальном состоянии!&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%9C%D0%BE%D0%B4%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0%D0%BC&amp;diff=918</id>
		<title>Помощь:Модераторам</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%9C%D0%BE%D0%B4%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B0%D0%BC&amp;diff=918"/>
		<updated>2026-07-06T22:21:05Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Руководство модератора проекта «Город на ладошках» =&lt;br /&gt;
&lt;br /&gt;
Добро пожаловать в команду модераторов! Ваша задача — проверять и одобрять статьи, которые создают дети, общаться с авторами и помогать поддерживать порядок на вики.&lt;br /&gt;
&lt;br /&gt;
== 🔑 Как войти в вики ==&lt;br /&gt;
# Перейдите на сайт: https://onpiterpalms.ru&lt;br /&gt;
# Нажмите «Войти» в правом верхнем углу.&lt;br /&gt;
# Введите ваш логин и пароль (получены от администратора).&lt;br /&gt;
# При первом входе смените пароль: кликните на своё имя → «Настройки» → «Смена пароля».&lt;br /&gt;
&lt;br /&gt;
== ✅ Как одобрить статью ==&lt;br /&gt;
1. Откройте статью, которую нужно проверить.&lt;br /&gt;
2. Перейдите на вкладку &#039;&#039;&#039;«История»&#039;&#039;&#039; (вверху, рядом с «Читать», «Править»).&lt;br /&gt;
3. Напротив последней версии (обычно самой новой) найдите ссылку &#039;&#039;&#039;«одобрить»&#039;&#039;&#039; и нажмите её.&lt;br /&gt;
4. После одобрения версия станет помеченной, и все посетители увидят именно её.&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Если статья ещё не создана, её нужно сначала создать (автор может быть зарегистрирован и написать черновик).&lt;br /&gt;
&lt;br /&gt;
== 💬 Как оставить замечание автору ==&lt;br /&gt;
* Перейдите на &#039;&#039;&#039;страницу обсуждения&#039;&#039;&#039; статьи (вкладка «Обсуждение» рядом с «Читать»).&lt;br /&gt;
* Нажмите «Править», напишите своё замечание (например: «Пожалуйста, укажите источник фотографии» или «Уточните адрес места»).&lt;br /&gt;
* Подпишитесь, поставив четыре тильды: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (система сама добавит имя и дату).&lt;br /&gt;
* Сохраните страницу. Автор получит уведомление (если включены уведомления).&lt;br /&gt;
&lt;br /&gt;
== ❗ Если нужно отклонить статью (не публиковать) ==&lt;br /&gt;
* Процесс одобрения единичный. Если статья не соответствует правилам, не одобряйте её.&lt;br /&gt;
* Оставьте замечание на странице обсуждения с просьбой доработать.&lt;br /&gt;
* Если статья содержит грубые нарушения (оскорбления, спам, персональные данные без согласия), свяжитесь с администратором (gub2006@bk.ru).&lt;br /&gt;
&lt;br /&gt;
== 🧭 Главные разделы вики (для проверки) ==&lt;br /&gt;
* [[:Категория:Адреса моей семьи]]&lt;br /&gt;
* [[:Категория:Мой Петербург]]&lt;br /&gt;
* [[:Категория:Утраченные памятники]]&lt;br /&gt;
* [[:Категория:Петербург в искусстве]]&lt;br /&gt;
* [[:Категория:Творческие проекты]]&lt;br /&gt;
* [[:Категория:Учебные материалы]]&lt;br /&gt;
&lt;br /&gt;
== 🗺️ Проверка новых мест ==&lt;br /&gt;
Сейчас места, добавленные детьми, появляются на карте &#039;&#039;&#039;сразу после сохранения&#039;&#039;&#039;. Модератор может:&lt;br /&gt;
* Проверить новое место на карте и в случае ошибки связаться с автором через страницу обсуждения.&lt;br /&gt;
* Поправить данные самостоятельно (если есть права на редактирование).&lt;br /&gt;
* Сообщить администратору о проблемах.&lt;br /&gt;
&lt;br /&gt;
== 📌 Важно ==&lt;br /&gt;
# Не одобряйте статьи, содержащие ошибки, непроверенные факты, нецензурную лексику, рекламу или личные данные третьих лиц.&lt;br /&gt;
# Если сомневаетесь – посоветуйтесь с другим модератором или администратором.&lt;br /&gt;
# Одобрение означает, что статья соответствует правилам проекта (орфографические ошибки допускаются, но если их много – лучше вернуть автору на доработку с комментарием).&lt;br /&gt;
&lt;br /&gt;
== 🆘 Нужна помощь? ==&lt;br /&gt;
* [[Связь с нами]] – написать администратору.&lt;br /&gt;
* [[Помощь:Как создать статью]] – инструкция для авторов (чтобы понимать, что ожидают от детей).&lt;br /&gt;
* [[Помощь:Организаторам]] – все инструкции для организаторов в одном месте.&lt;br /&gt;
&lt;br /&gt;
Спасибо, что помогаете делать «Город на ладошках» лучше и безопаснее!&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%9A%D0%B0%D0%BA_%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C_%D1%81%D1%82%D0%B0%D1%82%D1%8C%D1%8E&amp;diff=917</id>
		<title>Помощь:Как создать статью</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%9A%D0%B0%D0%BA_%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C_%D1%81%D1%82%D0%B0%D1%82%D1%8C%D1%8E&amp;diff=917"/>
		<updated>2026-07-06T21:57:41Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background: #f0f7ff; border-radius: 20px; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ✍️ Как создать статью в «Городе на ладошках» =&lt;br /&gt;
&lt;br /&gt;
Создать статью очень просто! Следуй этой инструкции.&lt;br /&gt;
&lt;br /&gt;
== 📝 Шаг 1. Выбери жанр и тему ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
&lt;br /&gt;
! width=&amp;quot;50%&amp;quot; | 🎭 Жанр (как писать)&lt;br /&gt;
! width=&amp;quot;50%&amp;quot; | 🏷️ Тема (о чём писать)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* 📖 &#039;&#039;&#039;Легенда&#039;&#039;&#039; — придумай тайну или необычную историю&lt;br /&gt;
* ⏱️ &#039;&#039;&#039;Маршрут&#039;&#039;&#039; — куда можно сходить за 30 минут&lt;br /&gt;
* 🤣 &#039;&#039;&#039;Уноси ноги&#039;&#039;&#039; — с юмором о неудачных местах&lt;br /&gt;
* 🎒 &#039;&#039;&#039;Проверено&#039;&#039;&#039; — личный опыт и фото&lt;br /&gt;
* ❤️ &#039;&#039;&#039;Любимое&#039;&#039;&#039; — душевный рассказ&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* 🏡 &#039;&#039;&#039;Адреса семьи&#039;&#039;&#039; — где живёшь, семейные истории&lt;br /&gt;
* 🏙️ &#039;&#039;&#039;Мой Петербург&#039;&#039;&#039; — любимые места и маршруты&lt;br /&gt;
* 🏛️ &#039;&#039;&#039;Утраченное&#039;&#039;&#039; — что исчезло с карты&lt;br /&gt;
* 🎨 &#039;&#039;&#039;Искусство&#039;&#039;&#039; — город в стихах и картинах&lt;br /&gt;
* 🎭 &#039;&#039;&#039;Творчество&#039;&#039;&#039; — проекты и фантазии&lt;br /&gt;
* 📚 &#039;&#039;&#039;Шпаргалки&#039;&#039;&#039; — полезные материалы&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 📝 Шаг 2. Скопируй шаблон ==&lt;br /&gt;
&lt;br /&gt;
Скопируй этот код (полностью) в новую страницу:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Шаблон:Место&lt;br /&gt;
|название = Впиши название места&lt;br /&gt;
|жанр = выбери: легенда / маршрут / уноси ноги / проверено / любимое&lt;br /&gt;
|тема = выбери: семья / мойпетербург / утраченное / искусство / творчество / шпаргалки&lt;br /&gt;
|тип = Парк / Памятник / Музей / Кафе / Другое&lt;br /&gt;
|адрес = Улица, дом&lt;br /&gt;
|широта = 59.9343&lt;br /&gt;
|долгота = 30.3351&lt;br /&gt;
|описание = Напиши свою историю здесь...&lt;br /&gt;
|автор = Твоё имя&lt;br /&gt;
|фото = Вставь прямую ссылку на фото (URL)&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 📝 Шаг 3. Заполни шаблон ==&lt;br /&gt;
&lt;br /&gt;
Замени значения после знака «=» на свои:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;название&#039;&#039;&#039; — как называется место&lt;br /&gt;
* &#039;&#039;&#039;жанр&#039;&#039;&#039; — выбери одно из: легенда / маршрут / уноси ноги / проверено / любимое&lt;br /&gt;
* &#039;&#039;&#039;тема&#039;&#039;&#039; — выбери одно из: семья / мойпетербург / утраченное / искусство / творчество / шпаргалки&lt;br /&gt;
* &#039;&#039;&#039;тип&#039;&#039;&#039; — например: Парк, Памятник, Музей, Кафе&lt;br /&gt;
* &#039;&#039;&#039;адрес&#039;&#039;&#039; — где находится место&lt;br /&gt;
* &#039;&#039;&#039;широта&#039;&#039;&#039; и &#039;&#039;&#039;долгота&#039;&#039;&#039; — координаты (можно найти на карте)&lt;br /&gt;
* &#039;&#039;&#039;описание&#039;&#039;&#039; — твоя история о месте&lt;br /&gt;
* &#039;&#039;&#039;автор&#039;&#039;&#039; — твоё имя или ник&lt;br /&gt;
* &#039;&#039;&#039;фото&#039;&#039;&#039; — вставь &#039;&#039;&#039;прямую ссылку&#039;&#039;&#039; на фото (URL). Можно загрузить фото на внешний хостинг (например, PostImages или ImgBB) и скопировать ссылку. Или загрузить через [[Служебная:Загрузка|страницу загрузки]] и скопировать ссылку на файл.&lt;br /&gt;
&lt;br /&gt;
== 📝 Шаг 4. Создай свою статью ==&lt;br /&gt;
&lt;br /&gt;
1. Перейди по ссылке: &#039;&#039;&#039;[[Создать новую статью|Создать новую статью]]&#039;&#039;&#039;&lt;br /&gt;
2. Вставь заполненный шаблон в поле редактирования&lt;br /&gt;
3. Напиши название статьи вверху&lt;br /&gt;
4. Нажми «Сохранить страницу»&lt;br /&gt;
&lt;br /&gt;
== ✅ Пример готовой статьи ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Шаблон:Место&lt;br /&gt;
|название = Тайна дома Зингера&lt;br /&gt;
|жанр = легенда&lt;br /&gt;
|тема = мойпетербург&lt;br /&gt;
|тип = Памятник&lt;br /&gt;
|адрес = Невский пр., 28&lt;br /&gt;
|широта = 59.9348&lt;br /&gt;
|долгота = 30.3270&lt;br /&gt;
|описание = Говорят, что на крыше этого дома живёт призрак...&lt;br /&gt;
|автор = Аня Смирнова&lt;br /&gt;
|фото = https://example.com/photo.jpg&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ❓ Нужна помощь? ==&lt;br /&gt;
&lt;br /&gt;
Если что-то не получается — напиши нам: &#039;&#039;&#039;[[Связь с нами]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Помощь]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%9A%D0%B0%D0%BA_%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C_%D0%BC%D0%B5%D1%81%D1%82%D0%BE_%D0%BD%D0%B0_%D0%BA%D0%B0%D1%80%D1%82%D1%83&amp;diff=916</id>
		<title>Помощь:Как добавить место на карту</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%9A%D0%B0%D0%BA_%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C_%D0%BC%D0%B5%D1%81%D1%82%D0%BE_%D0%BD%D0%B0_%D0%BA%D0%B0%D1%80%D1%82%D1%83&amp;diff=916"/>
		<updated>2026-07-06T21:49:07Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background: linear-gradient(135deg, #e8f5e9 0%, #c8e6c9 100%); padding: 30px; border-radius: 30px; margin-bottom: 30px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;font-size: 3em;&amp;quot;&amp;gt;🗺️&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;font-size: 2em; font-weight: bold; color: #2e7d32;&amp;quot;&amp;gt;Как добавить своё место на карту&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;font-size: 1.2em; color: #555; margin-top: 10px;&amp;quot;&amp;gt;Расскажи всем о любимом уголке Петербурга!&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; flex-wrap: wrap; gap: 20px; margin-bottom: 30px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;flex: 1; min-width: 200px; background: white; padding: 20px; border-radius: 20px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;font-size: 2.5em;&amp;quot;&amp;gt;1️⃣&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;font-weight: bold; font-size: 1.2em;&amp;quot;&amp;gt;Нажми на кнопку&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;color: #666;&amp;quot;&amp;gt;Зелёная кнопка&amp;lt;br&amp;gt;«Добавь место на карту»&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;flex: 1; min-width: 200px; background: white; padding: 20px; border-radius: 20px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;font-size: 2.5em;&amp;quot;&amp;gt;2️⃣&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;font-weight: bold; font-size: 1.2em;&amp;quot;&amp;gt;Придумай название&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;color: #666;&amp;quot;&amp;gt;Коротко и ясно:&amp;lt;br&amp;gt;«Мой любимый парк»&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;flex: 1; min-width: 200px; background: white; padding: 20px; border-radius: 20px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;font-size: 2.5em;&amp;quot;&amp;gt;3️⃣&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;font-weight: bold; font-size: 1.2em;&amp;quot;&amp;gt;Заполни форму&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;color: #666;&amp;quot;&amp;gt;Адрес, координаты (автоматически),&amp;lt;br&amp;gt;тип, квест, фото и описание&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;flex: 1; min-width: 200px; background: white; padding: 20px; border-radius: 20px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;font-size: 2.5em;&amp;quot;&amp;gt;4️⃣&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;font-weight: bold; font-size: 1.2em;&amp;quot;&amp;gt;Сохрани&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;color: #666;&amp;quot;&amp;gt;Нажми синюю кнопку&amp;lt;br&amp;gt;«Сохранить место»&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #fff3e0; padding: 25px; border-radius: 20px; margin-bottom: 30px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-size: 1.8em; margin-bottom: 15px;&amp;quot;&amp;gt;🧭 Как узнать координаты (широту и долготу)&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-wrap: wrap; gap: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;flex: 1;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;Шаг 1.&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div&amp;gt;Введи адрес в поле «Адрес»&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;flex: 1;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;Шаг 2.&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div&amp;gt;Нажми кнопку &#039;&#039;&#039;«Найти координаты»&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;flex: 1;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;Шаг 3.&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div&amp;gt;Координаты появятся автоматически&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;flex: 1;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;Шаг 4.&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div&amp;gt;Если адрес не найден — введи координаты вручную (их можно узнать, например, в сервисе Карта Яндекса)&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background: #f9f9f9; padding: 15px; border-radius: 15px; margin-top: 15px; text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;📌 &#039;&#039;&#039;Пример:&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;Введи «Елагин остров, 4» → нажми «Найти координаты» → координаты появятся сами!&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;font-family: monospace; font-size: 1.2em; margin-top: 10px;&amp;quot;&amp;gt;Широта: 59.9783 &amp;amp;nbsp;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;amp;nbsp; Долгота: 30.2592&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #e3f2fd; padding: 25px; border-radius: 20px; margin-bottom: 30px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-size: 1.8em; margin-bottom: 15px;&amp;quot;&amp;gt;🏷️ Выбери тип места&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-wrap: wrap; gap: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;🌳 Парк&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;🗿 Памятник&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;🏛️ Музей&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;⛪ Церковь&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;🏫 Школа&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;☕ Кафе&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;🌉 Мост&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;⛲ Фонтан&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;🎭 Театр&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;📚 Библиотека&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;⚽ Стадион&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;💦 Аквапарк&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;🐘 Зоопарк&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;🎬 Кинотеатр&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;🛍️ Торговый центр&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;🚂 Вокзал&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;🏨 Гостиница&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;🍽️ Ресторан&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; padding: 8px 16px; border-radius: 30px;&amp;quot;&amp;gt;📍 Другое&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- БЛОК ПРО КВЕСТЫ --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #e8f0fe; border-radius: 20px; padding: 20px; margin-bottom: 30px; border-left: 5px solid #ff9800;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; align-items: center; gap: 15px; flex-wrap: wrap;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;font-size: 3em;&amp;quot;&amp;gt;🎯&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;flex: 1;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-size: 1.5em; font-weight: bold;&amp;quot;&amp;gt;Участвуешь в квесте?&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;margin-top: 5px;&amp;quot;&amp;gt;В форме есть специальное поле &#039;&#039;&#039;«Квест»&#039;&#039;&#039;. Выбери название квеста из списка (или оставь пустым, если не участвуешь).&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;margin-top: 10px; font-size: 14px;&amp;quot;&amp;gt;🌼 Пример: выбери «Петербург цветёт» из выпадающего списка&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-top: 15px; display: flex; flex-wrap: wrap; gap: 10px; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;background: #fff; padding: 5px 12px; border-radius: 20px;&amp;quot;&amp;gt;🦁 Квест «Львиный глаз»&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;background: #fff; padding: 5px 12px; border-radius: 20px;&amp;quot;&amp;gt;🌸 Квест «Петербург цветёт»&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;background: #fff; padding: 5px 12px; border-radius: 20px;&amp;quot;&amp;gt;🌉 Квест «Белые ночи»&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- БЛОК ПРО ФОТО (исправлен) --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #e0f2f1; border-radius: 20px; padding: 20px; margin-bottom: 30px; border-left: 5px solid #00796b;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; align-items: center; gap: 15px; flex-wrap: wrap;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;font-size: 3em;&amp;quot;&amp;gt;📸&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;flex: 1;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-size: 1.5em; font-weight: bold;&amp;quot;&amp;gt;Как добавить фото?&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;margin-top: 5px;&amp;quot;&amp;gt;В поле «Фото места» нужно вставить &amp;lt;strong&amp;gt;прямую ссылку&amp;lt;/strong&amp;gt; на изображение.&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;margin-top: 10px; font-size: 0.95em;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;strong&amp;gt;Вариант 1 (легче всего):&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Загрузи фото на &amp;lt;a href=&amp;quot;https://postimages.org/&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;PostImages&amp;lt;/a&amp;gt; или &amp;lt;a href=&amp;quot;https://imgbb.com/&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;ImgBB&amp;lt;/a&amp;gt; → скопируй ссылку «Прямая ссылка» → вставь в поле.&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;margin-top: 8px; font-size: 0.95em;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;strong&amp;gt;Вариант 2 (через сайт):&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Загрузи фото через [[Служебная:Загрузка|страницу загрузки]] (откроется в новой вкладке).&amp;lt;br&amp;gt;&lt;br /&gt;
        После загрузки скопируй ссылку на файл из адресной строки и вставь в поле.&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;margin-top: 8px; font-size: 0.9em; color: #555; background: #f0f7ff; padding: 6px 10px; border-radius: 8px;&amp;quot;&amp;gt;&lt;br /&gt;
        💡 Ссылка должна вести на сам файл — заканчиваться на &amp;lt;code&amp;gt;.jpg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.png&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;.gif&amp;lt;/code&amp;gt;.&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #fce4ec; padding: 25px; border-radius: 20px; margin-bottom: 30px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-size: 1.8em; margin-bottom: 15px;&amp;quot;&amp;gt;📝 Пример описания&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background: white; padding: 15px; border-radius: 15px; font-style: italic;&amp;quot;&amp;gt;&lt;br /&gt;
    «Этот парк находится недалеко от моей школы. Здесь мы гуляем с друзьями после уроков, а летом здесь цветут удивительные клумбы. Зимой я люблю приходить сюда смотреть на белок.»&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-top: 15px; background: #fff3e0; padding: 10px; border-radius: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;🌟 А если участвуешь в квесте:&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;font-style: italic;&amp;quot;&amp;gt;«В этом парке каждую весну распускаются тысячи тюльпанов. Я прихожу сюда с бабушкой уже третий год!» (квест выбран в специальном поле)&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #e8eaf6; padding: 25px; border-radius: 20px; margin-bottom: 30px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-size: 1.8em; margin-bottom: 15px;&amp;quot;&amp;gt;❓ А если я ошибся(лась)?&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background: white; padding: 15px; border-radius: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;Не переживай! Ошибку можно исправить самому:&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;Открой &#039;&#039;&#039;свою страницу&#039;&#039;&#039; с местом (например, «Мой любимый парк»).&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;Вверху страницы найди кнопку &#039;&#039;&#039;«Править»&#039;&#039;&#039; (или «Править код»).&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;Исправь то, что нужно: адрес, координаты, описание, тип места или квест.&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;Нажми синюю кнопку &#039;&#039;&#039;«Сохранить страницу»&#039;&#039;&#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;💡 &#039;&#039;&#039;Важно:&#039;&#039;&#039; Кнопка «Править» есть только у тех, кто вошёл в свой аккаунт.&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- БЛОК «А когда моё место появится на карте?» (исправлен) --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #d1c4e9; padding: 25px; border-radius: 20px; margin-bottom: 30px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-size: 1.8em; margin-bottom: 15px;&amp;quot;&amp;gt;⏳ А когда моё место появится на карте?&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background: white; padding: 15px; border-radius: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;Твоё место появится на карте &amp;lt;strong&amp;gt;сразу после сохранения&amp;lt;/strong&amp;gt;! 🎉&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;margin-top: 10px;&amp;quot;&amp;gt;✅ Найди его на главной странице в разделе «Карта детских открытий».&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;margin-top: 10px;&amp;quot;&amp;gt;📌 Если что-то пошло не так (например, не отображается фото), администратор поможет поправить.&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;margin-top: 15px; text-align: center; font-size: 1.1em;&amp;quot;&amp;gt;✨ Твой маркер появится на карте со своим значком! ✨&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: linear-gradient(135deg, #4CAF50, #2E7D32); padding: 30px; border-radius: 30px; text-align: center; color: white;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-size: 2em;&amp;quot;&amp;gt;🎉&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-size: 1.5em; font-weight: bold;&amp;quot;&amp;gt;Ты — картограф «Города на ладошках»!&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-top: 10px;&amp;quot;&amp;gt;Спасибо, что помогаешь делать карту города интереснее&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-top: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;background: white; display: inline-block; padding: 12px 24px; border-radius: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
      [[Добавить место (ребёнок) v2|&amp;lt;span style=&amp;quot;color: #2e7d32; font-weight: bold; text-decoration: none;&amp;quot;&amp;gt;📌 Добавить место на карту&amp;lt;/span&amp;gt;]]&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=915</id>
		<title>Widget:KidsMap</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=915"/>
		<updated>2026-07-06T21:30:55Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;text-align: right; margin-bottom: 8px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;button id=&amp;quot;refreshMapBtn&amp;quot; style=&amp;quot;background: #1565c0; color: white; border: none; padding: 6px 16px; border-radius: 20px; font-size: 14px; cursor: pointer; display: inline-flex; align-items: center; gap: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
    🔄 Обновить карту&lt;br /&gt;
  &amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 100%; height: 500px; margin: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 6px rgba(0,0,0,0.1); background: #d9e6d9;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;loading-message&amp;quot; style=&amp;quot;display: none; text-align: center; margin-top: 4px; font-size: 0.9em;&amp;quot;&amp;gt;Загрузка маркеров...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.emoji-marker {&lt;br /&gt;
    background: white;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 2px solid #2e7d32;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 28px;&lt;br /&gt;
    width: 28px !important;&lt;br /&gt;
    height: 28px !important;&lt;br /&gt;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var map = L.map(&#039;map&#039;).setView([59.9343, 30.3351], 12);&lt;br /&gt;
L.tileLayer(&#039;https://tile.openstreetmap.org/{z}/{x}/{y}.png&#039;, {&lt;br /&gt;
    maxZoom: 19,&lt;br /&gt;
    attribution: &#039;© OpenStreetMap&#039;&lt;br /&gt;
}).addTo(map);&lt;br /&gt;
&lt;br /&gt;
function getIconByType(type) {&lt;br /&gt;
    const icons = {&lt;br /&gt;
        &#039;Парк&#039;: &#039;🌳&#039;, &#039;Памятник&#039;: &#039;🗿&#039;, &#039;Музей&#039;: &#039;🏛️&#039;, &#039;Церковь&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Школа&#039;: &#039;🏫&#039;, &#039;Кафе&#039;: &#039;☕&#039;, &#039;Мост&#039;: &#039;🌉&#039;, &#039;Фонтан&#039;: &#039;⛲&#039;,&lt;br /&gt;
        &#039;Театр&#039;: &#039;🎭&#039;, &#039;Библиотека&#039;: &#039;📚&#039;, &#039;Стадион&#039;: &#039;⚽&#039;, &#039;Аквапарк&#039;: &#039;💦&#039;,&lt;br /&gt;
        &#039;Зоопарк&#039;: &#039;🐘&#039;, &#039;Кинотеатр&#039;: &#039;🎬&#039;, &#039;Торговый центр&#039;: &#039;🛍️&#039;,&lt;br /&gt;
        &#039;Вокзал&#039;: &#039;🚂&#039;, &#039;Гостиница&#039;: &#039;🏨&#039;, &#039;Ресторан&#039;: &#039;🍽️&#039;, &#039;Другое&#039;: &#039;📍&#039;&lt;br /&gt;
    };&lt;br /&gt;
    return L.divIcon({&lt;br /&gt;
        html: icons[type] || &#039;📍&#039;,&lt;br /&gt;
        iconSize: [28, 28],&lt;br /&gt;
        className: &#039;emoji-marker&#039;,&lt;br /&gt;
        popupAnchor: [0, -14]&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function drawMarkers() {&lt;br /&gt;
    document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
    &lt;br /&gt;
    fetch(&#039;/data.php&#039;)&lt;br /&gt;
        .then(response =&amp;gt; {&lt;br /&gt;
            if (!response.ok) throw new Error(&#039;HTTP &#039; + response.status);&lt;br /&gt;
            return response.json();&lt;br /&gt;
        })&lt;br /&gt;
        .then(data =&amp;gt; {&lt;br /&gt;
            console.log(&#039;Данные загружены, объектов:&#039;, data.length);&lt;br /&gt;
            map.eachLayer(layer =&amp;gt; {&lt;br /&gt;
                if (layer instanceof L.Marker) map.removeLayer(layer);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            data.forEach(obj =&amp;gt; {&lt;br /&gt;
                var lat = parseFloat(obj.lat);&lt;br /&gt;
                var lon = parseFloat(obj.lon);&lt;br /&gt;
                if (isNaN(lat) || isNaN(lon)) return;&lt;br /&gt;
                &lt;br /&gt;
                var icon = getIconByType(obj.type);&lt;br /&gt;
                var popupHtml = &#039;&amp;lt;b&amp;gt;&#039; + obj.name + &#039;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;b&amp;gt;Тип:&amp;lt;/b&amp;gt; &#039; + obj.type + &#039;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                obj.address + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.quest) popupHtml += &#039;&amp;lt;b&amp;gt;🎯 Квест:&amp;lt;/b&amp;gt; &#039; + obj.quest + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.description) popupHtml += &#039;&amp;lt;b&amp;gt;Описание:&amp;lt;/b&amp;gt; &#039; + obj.description + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.page) popupHtml += &#039;&amp;lt;a href=&amp;quot;/index.php/&#039; + encodeURIComponent(obj.page) + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;📖 Читать подробнее&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
                L.marker([lat, lon], {icon: icon}).addTo(map).bindPopup(popupHtml);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
            &lt;br /&gt;
            if (data.length === 0) {&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;😕 Нет мест. Добавь первое!&#039;;&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка загрузки данных:&#039;, error);&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;⚠️ Не удалось загрузить данные. Попробуйте позже.&#039;;&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
drawMarkers();&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&#039;refreshMapBtn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
    drawMarkers();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var attributionControl = map.attributionControl;&lt;br /&gt;
if (attributionControl) {&lt;br /&gt;
    attributionControl.setPrefix(&#039;&#039;);&lt;br /&gt;
    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.innerHTML = &#039;.leaflet-attribution-flag { display: none !important; }&#039;;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=914</id>
		<title>Widget:KidsMap</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=914"/>
		<updated>2026-07-06T21:28:18Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;text-align: right; margin-bottom: 8px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;button id=&amp;quot;refreshMapBtn&amp;quot; style=&amp;quot;background: #1565c0; color: white; border: none; padding: 6px 16px; border-radius: 20px; font-size: 14px; cursor: pointer; display: inline-flex; align-items: center; gap: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
    🔄 Обновить карту&lt;br /&gt;
  &amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 100%; height: 500px; margin: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 6px rgba(0,0,0,0.1); background: #d9e6d9;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;loading-message&amp;quot; style=&amp;quot;display: none; text-align: center; margin-top: 4px; font-size: 0.9em;&amp;quot;&amp;gt;Загрузка маркеров...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.emoji-marker {&lt;br /&gt;
    background: white;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 2px solid #2e7d32;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 28px;&lt;br /&gt;
    width: 28px !important;&lt;br /&gt;
    height: 28px !important;&lt;br /&gt;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var map = L.map(&#039;map&#039;).setView([59.9343, 30.3351], 12);&lt;br /&gt;
L.tileLayer(&#039;https://tile.openstreetmap.org/{z}/{x}/{y}.png&#039;, {&lt;br /&gt;
    maxZoom: 19,&lt;br /&gt;
    attribution: &#039;© OpenStreetMap&#039;&lt;br /&gt;
}).addTo(map);&lt;br /&gt;
&lt;br /&gt;
function getIconByType(type) {&lt;br /&gt;
    const icons = {&lt;br /&gt;
        &#039;Парк&#039;: &#039;🌳&#039;, &#039;Памятник&#039;: &#039;🗿&#039;, &#039;Музей&#039;: &#039;🏛️&#039;, &#039;Церковь&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Школа&#039;: &#039;🏫&#039;, &#039;Кафе&#039;: &#039;☕&#039;, &#039;Мост&#039;: &#039;🌉&#039;, &#039;Фонтан&#039;: &#039;⛲&#039;,&lt;br /&gt;
        &#039;Театр&#039;: &#039;🎭&#039;, &#039;Библиотека&#039;: &#039;📚&#039;, &#039;Стадион&#039;: &#039;⚽&#039;, &#039;Аквапарк&#039;: &#039;💦&#039;,&lt;br /&gt;
        &#039;Зоопарк&#039;: &#039;🐘&#039;, &#039;Кинотеатр&#039;: &#039;🎬&#039;, &#039;Торговый центр&#039;: &#039;🛍️&#039;,&lt;br /&gt;
        &#039;Вокзал&#039;: &#039;🚂&#039;, &#039;Гостиница&#039;: &#039;🏨&#039;, &#039;Ресторан&#039;: &#039;🍽️&#039;, &#039;Другое&#039;: &#039;📍&#039;&lt;br /&gt;
    };&lt;br /&gt;
    return L.divIcon({&lt;br /&gt;
        html: icons[type] || &#039;📍&#039;,&lt;br /&gt;
        iconSize: [28, 28],&lt;br /&gt;
        className: &#039;emoji-marker&#039;,&lt;br /&gt;
        popupAnchor: [0, -14]&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function drawMarkers() {&lt;br /&gt;
    document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
    &lt;br /&gt;
    fetch(&#039;/data.php&#039;)&lt;br /&gt;
        .then(response =&amp;gt; {&lt;br /&gt;
            if (!response.ok) throw new Error(&#039;HTTP &#039; + response.status);&lt;br /&gt;
            return response.json();&lt;br /&gt;
        })&lt;br /&gt;
        .then(data =&amp;gt; {&lt;br /&gt;
            console.log(&#039;Данные загружены, объектов:&#039;, data.length);&lt;br /&gt;
            map.eachLayer(layer =&amp;gt; {&lt;br /&gt;
                if (layer instanceof L.Marker) map.removeLayer(layer);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            data.forEach(obj =&amp;gt; {&lt;br /&gt;
                var lat = parseFloat(obj.lat);&lt;br /&gt;
                var lon = parseFloat(obj.lon);&lt;br /&gt;
                if (isNaN(lat) || isNaN(lon)) return;&lt;br /&gt;
                &lt;br /&gt;
                var icon = getIconByType(obj.type);&lt;br /&gt;
                var popupHtml = &#039;&amp;lt;b&amp;gt;&#039; + obj.name + &#039;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;b&amp;gt;Тип:&amp;lt;/b&amp;gt; &#039; + obj.type + &#039;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                obj.address + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.quest) popupHtml += &#039;&amp;lt;b&amp;gt;🎯 Квест:&amp;lt;/b&amp;gt; &#039; + obj.quest + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.description) popupHtml += &#039;&amp;lt;b&amp;gt;Описание:&amp;lt;/b&amp;gt; &#039; + obj.description + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.page) popupHtml += &#039;&amp;lt;a href=&amp;quot;/index.php/&#039; + encodeURIComponent(obj.page) + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;📖 Читать подробнее&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
                L.marker([lat, lon], {icon: icon}).addTo(map).bindPopup(popupHtml);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
            &lt;br /&gt;
            if (data.length === 0) {&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;😕 Нет мест. Добавь первое!&#039;;&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка загрузки данных:&#039;, error);&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;⚠️ Не удалось загрузить данные. Попробуйте позже.&#039;;&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
drawMarkers();&lt;br /&gt;
&lt;br /&gt;
var attributionControl = map.attributionControl;&lt;br /&gt;
if (attributionControl) {&lt;br /&gt;
    attributionControl.setPrefix(&#039;&#039;);&lt;br /&gt;
    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.innerHTML = &#039;.leaflet-attribution-flag { display: none !important; }&#039;;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=913</id>
		<title>Widget:KidsMap</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=913"/>
		<updated>2026-07-06T20:47:59Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 100%; height: 500px; margin: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 6px rgba(0,0,0,0.1); background: #d9e6d9;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;loading-message&amp;quot; style=&amp;quot;display: none; text-align: center; margin-top: 4px; font-size: 0.9em;&amp;quot;&amp;gt;Загрузка маркеров...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.emoji-marker {&lt;br /&gt;
    background: white;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 2px solid #2e7d32;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 28px;&lt;br /&gt;
    width: 28px !important;&lt;br /&gt;
    height: 28px !important;&lt;br /&gt;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var map = L.map(&#039;map&#039;).setView([59.9343, 30.3351], 12);&lt;br /&gt;
L.tileLayer(&#039;https://tile.openstreetmap.org/{z}/{x}/{y}.png&#039;, {&lt;br /&gt;
    maxZoom: 19,&lt;br /&gt;
    attribution: &#039;© OpenStreetMap&#039;&lt;br /&gt;
}).addTo(map);&lt;br /&gt;
&lt;br /&gt;
function getIconByType(type) {&lt;br /&gt;
    const icons = {&lt;br /&gt;
        &#039;Парк&#039;: &#039;🌳&#039;, &#039;Памятник&#039;: &#039;🗿&#039;, &#039;Музей&#039;: &#039;🏛️&#039;, &#039;Церковь&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Школа&#039;: &#039;🏫&#039;, &#039;Кафе&#039;: &#039;☕&#039;, &#039;Мост&#039;: &#039;🌉&#039;, &#039;Фонтан&#039;: &#039;⛲&#039;,&lt;br /&gt;
        &#039;Театр&#039;: &#039;🎭&#039;, &#039;Библиотека&#039;: &#039;📚&#039;, &#039;Стадион&#039;: &#039;⚽&#039;, &#039;Аквапарк&#039;: &#039;💦&#039;,&lt;br /&gt;
        &#039;Зоопарк&#039;: &#039;🐘&#039;, &#039;Кинотеатр&#039;: &#039;🎬&#039;, &#039;Торговый центр&#039;: &#039;🛍️&#039;,&lt;br /&gt;
        &#039;Вокзал&#039;: &#039;🚂&#039;, &#039;Гостиница&#039;: &#039;🏨&#039;, &#039;Ресторан&#039;: &#039;🍽️&#039;, &#039;Другое&#039;: &#039;📍&#039;&lt;br /&gt;
    };&lt;br /&gt;
    return L.divIcon({&lt;br /&gt;
        html: icons[type] || &#039;📍&#039;,&lt;br /&gt;
        iconSize: [28, 28],&lt;br /&gt;
        className: &#039;emoji-marker&#039;,&lt;br /&gt;
        popupAnchor: [0, -14]&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function drawMarkers() {&lt;br /&gt;
    document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
    &lt;br /&gt;
    fetch(&#039;/data.php&#039;)&lt;br /&gt;
        .then(response =&amp;gt; {&lt;br /&gt;
            if (!response.ok) throw new Error(&#039;HTTP &#039; + response.status);&lt;br /&gt;
            return response.json();&lt;br /&gt;
        })&lt;br /&gt;
        .then(data =&amp;gt; {&lt;br /&gt;
            console.log(&#039;Данные загружены, объектов:&#039;, data.length);&lt;br /&gt;
            map.eachLayer(layer =&amp;gt; {&lt;br /&gt;
                if (layer instanceof L.Marker) map.removeLayer(layer);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            data.forEach(obj =&amp;gt; {&lt;br /&gt;
                var lat = parseFloat(obj.lat);&lt;br /&gt;
                var lon = parseFloat(obj.lon);&lt;br /&gt;
                if (isNaN(lat) || isNaN(lon)) return;&lt;br /&gt;
                &lt;br /&gt;
                var icon = getIconByType(obj.type);&lt;br /&gt;
                var popupHtml = &#039;&amp;lt;b&amp;gt;&#039; + obj.name + &#039;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;b&amp;gt;Тип:&amp;lt;/b&amp;gt; &#039; + obj.type + &#039;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                obj.address + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.quest) popupHtml += &#039;&amp;lt;b&amp;gt;🎯 Квест:&amp;lt;/b&amp;gt; &#039; + obj.quest + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.description) popupHtml += &#039;&amp;lt;b&amp;gt;Описание:&amp;lt;/b&amp;gt; &#039; + obj.description + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.page) popupHtml += &#039;&amp;lt;a href=&amp;quot;/index.php/&#039; + encodeURIComponent(obj.page) + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;📖 Читать подробнее&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
                L.marker([lat, lon], {icon: icon}).addTo(map).bindPopup(popupHtml);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
            &lt;br /&gt;
            if (data.length === 0) {&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;😕 Нет мест. Добавь первое!&#039;;&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка загрузки данных:&#039;, error);&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;⚠️ Не удалось загрузить данные. Попробуйте позже.&#039;;&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
drawMarkers();&lt;br /&gt;
&lt;br /&gt;
var attributionControl = map.attributionControl;&lt;br /&gt;
if (attributionControl) {&lt;br /&gt;
    attributionControl.setPrefix(&#039;&#039;);&lt;br /&gt;
    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.innerHTML = &#039;.leaflet-attribution-flag { display: none !important; }&#039;;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=912</id>
		<title>Widget:KidsMap</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=912"/>
		<updated>2026-07-06T20:43:05Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 100%; height: 500px; margin: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 6px rgba(0,0,0,0.1); background: #d9e6d9;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;loading-message&amp;quot; style=&amp;quot;display: none; text-align: center; margin-top: 4px; font-size: 0.9em;&amp;quot;&amp;gt;Загрузка маркеров...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.emoji-marker {&lt;br /&gt;
    background: white;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 2px solid #2e7d32;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 28px;&lt;br /&gt;
    width: 28px !important;&lt;br /&gt;
    height: 28px !important;&lt;br /&gt;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var map = L.map(&#039;map&#039;).setView([59.9343, 30.3351], 12);&lt;br /&gt;
L.tileLayer(&#039;https://tile.openstreetmap.org/{z}/{x}/{y}.png&#039;, {&lt;br /&gt;
    maxZoom: 19,&lt;br /&gt;
    attribution: &#039;© OpenStreetMap&#039;&lt;br /&gt;
}).addTo(map);&lt;br /&gt;
&lt;br /&gt;
function getIconByType(type) {&lt;br /&gt;
    const icons = {&lt;br /&gt;
        &#039;Парк&#039;: &#039;🌳&#039;, &#039;Памятник&#039;: &#039;🗿&#039;, &#039;Музей&#039;: &#039;🏛️&#039;, &#039;Церковь&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Школа&#039;: &#039;🏫&#039;, &#039;Кафе&#039;: &#039;☕&#039;, &#039;Мост&#039;: &#039;🌉&#039;, &#039;Фонтан&#039;: &#039;⛲&#039;,&lt;br /&gt;
        &#039;Театр&#039;: &#039;🎭&#039;, &#039;Библиотека&#039;: &#039;📚&#039;, &#039;Стадион&#039;: &#039;⚽&#039;, &#039;Аквапарк&#039;: &#039;💦&#039;,&lt;br /&gt;
        &#039;Зоопарк&#039;: &#039;🐘&#039;, &#039;Кинотеатр&#039;: &#039;🎬&#039;, &#039;Торговый центр&#039;: &#039;🛍️&#039;,&lt;br /&gt;
        &#039;Вокзал&#039;: &#039;🚂&#039;, &#039;Гостиница&#039;: &#039;🏨&#039;, &#039;Ресторан&#039;: &#039;🍽️&#039;, &#039;Другое&#039;: &#039;📍&#039;&lt;br /&gt;
    };&lt;br /&gt;
    return L.divIcon({&lt;br /&gt;
        html: icons[type] || &#039;📍&#039;,&lt;br /&gt;
        iconSize: [28, 28],&lt;br /&gt;
        className: &#039;emoji-marker&#039;,&lt;br /&gt;
        popupAnchor: [0, -14]&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function drawMarkers() {&lt;br /&gt;
    document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
    &lt;br /&gt;
    fetch(&#039;/data.php&#039;)&lt;br /&gt;
    .then(response =&amp;gt; {&lt;br /&gt;
        if (!response.ok) throw new Error(&#039;HTTP &#039; + response.status);&lt;br /&gt;
        return response.json();&lt;br /&gt;
    })&lt;br /&gt;
        .then(response =&amp;gt; {&lt;br /&gt;
            console.log(&#039;Ответ от сервера, статус:&#039;, response.status);&lt;br /&gt;
            if (!response.ok) throw new Error(&#039;HTTP &#039; + response.status);&lt;br /&gt;
            return response.json();&lt;br /&gt;
        })&lt;br /&gt;
        .then(data =&amp;gt; {&lt;br /&gt;
            console.log(&#039;Данные загружены, объектов:&#039;, data.length);&lt;br /&gt;
            map.eachLayer(layer =&amp;gt; {&lt;br /&gt;
                if (layer instanceof L.Marker) map.removeLayer(layer);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            data.forEach(obj =&amp;gt; {&lt;br /&gt;
                var lat = parseFloat(obj.lat);&lt;br /&gt;
                var lon = parseFloat(obj.lon);&lt;br /&gt;
                if (isNaN(lat) || isNaN(lon)) return;&lt;br /&gt;
                &lt;br /&gt;
                var icon = getIconByType(obj.type);&lt;br /&gt;
                var popupHtml = &#039;&amp;lt;b&amp;gt;&#039; + obj.name + &#039;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;b&amp;gt;Тип:&amp;lt;/b&amp;gt; &#039; + obj.type + &#039;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                obj.address + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.quest) popupHtml += &#039;&amp;lt;b&amp;gt;🎯 Квест:&amp;lt;/b&amp;gt; &#039; + obj.quest + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.description) popupHtml += &#039;&amp;lt;b&amp;gt;Описание:&amp;lt;/b&amp;gt; &#039; + obj.description + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.page) popupHtml += &#039;&amp;lt;a href=&amp;quot;/index.php/&#039; + encodeURIComponent(obj.page) + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;📖 Читать подробнее&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
                L.marker([lat, lon], {icon: icon}).addTo(map).bindPopup(popupHtml);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
            &lt;br /&gt;
            if (data.length === 0) {&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;😕 Нет мест. Добавь первое!&#039;;&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка загрузки данных:&#039;, error);&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;⚠️ Не удалось загрузить данные. Попробуйте позже.&#039;;&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
drawMarkers();&lt;br /&gt;
&lt;br /&gt;
var attributionControl = map.attributionControl;&lt;br /&gt;
if (attributionControl) {&lt;br /&gt;
    attributionControl.setPrefix(&#039;&#039;);&lt;br /&gt;
    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.innerHTML = &#039;.leaflet-attribution-flag { display: none !important; }&#039;;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=911</id>
		<title>Widget:KidsMap</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=911"/>
		<updated>2026-07-06T20:02:57Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 100%; height: 500px; margin: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 6px rgba(0,0,0,0.1); background: #d9e6d9;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;loading-message&amp;quot; style=&amp;quot;display: none; text-align: center; margin-top: 4px; font-size: 0.9em;&amp;quot;&amp;gt;Загрузка маркеров...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.emoji-marker {&lt;br /&gt;
    background: white;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 2px solid #2e7d32;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 28px;&lt;br /&gt;
    width: 28px !important;&lt;br /&gt;
    height: 28px !important;&lt;br /&gt;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var map = L.map(&#039;map&#039;).setView([59.9343, 30.3351], 12);&lt;br /&gt;
L.tileLayer(&#039;https://tile.openstreetmap.org/{z}/{x}/{y}.png&#039;, {&lt;br /&gt;
    maxZoom: 19,&lt;br /&gt;
    attribution: &#039;© OpenStreetMap&#039;&lt;br /&gt;
}).addTo(map);&lt;br /&gt;
&lt;br /&gt;
function getIconByType(type) {&lt;br /&gt;
    const icons = {&lt;br /&gt;
        &#039;Парк&#039;: &#039;🌳&#039;, &#039;Памятник&#039;: &#039;🗿&#039;, &#039;Музей&#039;: &#039;🏛️&#039;, &#039;Церковь&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Школа&#039;: &#039;🏫&#039;, &#039;Кафе&#039;: &#039;☕&#039;, &#039;Мост&#039;: &#039;🌉&#039;, &#039;Фонтан&#039;: &#039;⛲&#039;,&lt;br /&gt;
        &#039;Театр&#039;: &#039;🎭&#039;, &#039;Библиотека&#039;: &#039;📚&#039;, &#039;Стадион&#039;: &#039;⚽&#039;, &#039;Аквапарк&#039;: &#039;💦&#039;,&lt;br /&gt;
        &#039;Зоопарк&#039;: &#039;🐘&#039;, &#039;Кинотеатр&#039;: &#039;🎬&#039;, &#039;Торговый центр&#039;: &#039;🛍️&#039;,&lt;br /&gt;
        &#039;Вокзал&#039;: &#039;🚂&#039;, &#039;Гостиница&#039;: &#039;🏨&#039;, &#039;Ресторан&#039;: &#039;🍽️&#039;, &#039;Другое&#039;: &#039;📍&#039;&lt;br /&gt;
    };&lt;br /&gt;
    return L.divIcon({&lt;br /&gt;
        html: icons[type] || &#039;📍&#039;,&lt;br /&gt;
        iconSize: [28, 28],&lt;br /&gt;
        className: &#039;emoji-marker&#039;,&lt;br /&gt;
        popupAnchor: [0, -14]&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function drawMarkers() {&lt;br /&gt;
    document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
    &lt;br /&gt;
    fetch(&#039;https://onpiterpalms.ru/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:CargoExport&amp;amp;tables=Objects&amp;amp;&amp;amp;fields=page%2Cname%2Caddress%2Clat%2Clon%2Ctype%2Cquest%2Cimage&amp;amp;&amp;amp;order+by=&amp;amp;limit=100&amp;amp;format=json&#039;)&lt;br /&gt;
        .then(response =&amp;gt; {&lt;br /&gt;
            console.log(&#039;Ответ от сервера, статус:&#039;, response.status);&lt;br /&gt;
            if (!response.ok) throw new Error(&#039;HTTP &#039; + response.status);&lt;br /&gt;
            return response.json();&lt;br /&gt;
        })&lt;br /&gt;
        .then(data =&amp;gt; {&lt;br /&gt;
            console.log(&#039;Данные загружены, объектов:&#039;, data.length);&lt;br /&gt;
            map.eachLayer(layer =&amp;gt; {&lt;br /&gt;
                if (layer instanceof L.Marker) map.removeLayer(layer);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            data.forEach(obj =&amp;gt; {&lt;br /&gt;
                var lat = parseFloat(obj.lat);&lt;br /&gt;
                var lon = parseFloat(obj.lon);&lt;br /&gt;
                if (isNaN(lat) || isNaN(lon)) return;&lt;br /&gt;
                &lt;br /&gt;
                var icon = getIconByType(obj.type);&lt;br /&gt;
                var popupHtml = &#039;&amp;lt;b&amp;gt;&#039; + obj.name + &#039;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;b&amp;gt;Тип:&amp;lt;/b&amp;gt; &#039; + obj.type + &#039;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                obj.address + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.quest) popupHtml += &#039;&amp;lt;b&amp;gt;🎯 Квест:&amp;lt;/b&amp;gt; &#039; + obj.quest + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.description) popupHtml += &#039;&amp;lt;b&amp;gt;Описание:&amp;lt;/b&amp;gt; &#039; + obj.description + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.page) popupHtml += &#039;&amp;lt;a href=&amp;quot;/index.php/&#039; + encodeURIComponent(obj.page) + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;📖 Читать подробнее&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
                L.marker([lat, lon], {icon: icon}).addTo(map).bindPopup(popupHtml);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
            &lt;br /&gt;
            if (data.length === 0) {&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;😕 Нет мест. Добавь первое!&#039;;&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка загрузки данных:&#039;, error);&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;⚠️ Не удалось загрузить данные. Попробуйте позже.&#039;;&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
drawMarkers();&lt;br /&gt;
&lt;br /&gt;
var attributionControl = map.attributionControl;&lt;br /&gt;
if (attributionControl) {&lt;br /&gt;
    attributionControl.setPrefix(&#039;&#039;);&lt;br /&gt;
    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.innerHTML = &#039;.leaflet-attribution-flag { display: none !important; }&#039;;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%9F%D0%BB%D0%BE%D1%89%D0%B0%D0%B4%D1%8C_%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D0%B8%D1%82%D1%83%D1%86%D0%B8%D0%B8&amp;diff=910</id>
		<title>Площадь Конституции</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%9F%D0%BB%D0%BE%D1%89%D0%B0%D0%B4%D1%8C_%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D0%B8%D1%82%D1%83%D1%86%D0%B8%D0%B8&amp;diff=910"/>
		<updated>2026-07-06T15:04:06Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: Admin Gorod переименовал страницу Площадь Конституции в Заячий остров: Название с ошибкой&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Заячий остров]]&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%90%D1%8D%D1%80%D0%BE%D0%BF%D0%BE%D1%80%D1%82_%D0%9F%D1%83%D0%BB%D0%BA%D0%BE%D0%B2%D0%BE&amp;diff=907</id>
		<title>Аэропорт Пулково</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%90%D1%8D%D1%80%D0%BE%D0%BF%D0%BE%D1%80%D1%82_%D0%9F%D1%83%D0%BB%D0%BA%D0%BE%D0%B2%D0%BE&amp;diff=907"/>
		<updated>2026-07-06T14:41:52Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: Новая страница: «{{Объект en |name=Аэропорт Пулково |address=Пулковское ш., 41, лит.ЗА, Санкт-Петербург |lat=59.799987 |lon=30.271195 |type=Вокзал |image=https://yandex.ru/maps/org/aeroport_pulkovo/1423973195/gallery/?ll=30.260406%2C59.800989&amp;amp;photos%5Bbusiness%5D=1423973195&amp;amp;photos%5Bid%5D=urn%3Ayandex%3Asprav%3Aphoto%3A16404250_2a00000198b8904ced63a682725202ec3bc0&amp;amp;tab=gallery&amp;amp;z=13.29 |description=Международн...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Объект en&lt;br /&gt;
|name=Аэропорт Пулково&lt;br /&gt;
|address=Пулковское ш., 41, лит.ЗА, Санкт-Петербург&lt;br /&gt;
|lat=59.799987&lt;br /&gt;
|lon=30.271195&lt;br /&gt;
|type=Вокзал&lt;br /&gt;
|image=https://yandex.ru/maps/org/aeroport_pulkovo/1423973195/gallery/?ll=30.260406%2C59.800989&amp;amp;photos%5Bbusiness%5D=1423973195&amp;amp;photos%5Bid%5D=urn%3Ayandex%3Asprav%3Aphoto%3A16404250_2a00000198b8904ced63a682725202ec3bc0&amp;amp;tab=gallery&amp;amp;z=13.29&lt;br /&gt;
|description=Международный аэропорт Пу́лково — международный аэропорт, имеющий статус федерального значения, располагающийся в 15 км от центра Санкт-Петербурга в Московском районе. Единственный аэропорт Санкт-Петербурга, обслуживающий регулярные рейсы. Пулково является одним из наиболее загруженных аэропортов России&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%BD%D0%B8%D0%BA_%D0%92.%D0%98._%D0%9B%D0%B5%D0%BD%D0%B8%D0%BD%D1%83&amp;diff=906</id>
		<title>Памятник В.И. Ленину</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%BD%D0%B8%D0%BA_%D0%92.%D0%98._%D0%9B%D0%B5%D0%BD%D0%B8%D0%BD%D1%83&amp;diff=906"/>
		<updated>2026-07-06T14:30:36Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: Новая страница: «{{Объект en |name=Памятник В.И.Ленину |address=Московская площадь |lat=59.5108 |lon=30.1923 |type=Памятник |image=https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%BD%D0%B8%D0%BA_%D0%92._%D0%98._%D0%9B%D0%B5%D0%BD%D0%B8%D0%BD%D1%83_%D0%BD%D0%B0_%D0%9C%D0%BE%D1%81%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D0%BF%D0%BB%D0%BE%D1%89%D0%B0%D0%B4%D0%B8#/media/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9F%D0%B0%D0%BC%D...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Объект en&lt;br /&gt;
|name=Памятник В.И.Ленину&lt;br /&gt;
|address=Московская площадь&lt;br /&gt;
|lat=59.5108&lt;br /&gt;
|lon=30.1923&lt;br /&gt;
|type=Памятник&lt;br /&gt;
|image=https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%BD%D0%B8%D0%BA_%D0%92._%D0%98._%D0%9B%D0%B5%D0%BD%D0%B8%D0%BD%D1%83_%D0%BD%D0%B0_%D0%9C%D0%BE%D1%81%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D0%BF%D0%BB%D0%BE%D1%89%D0%B0%D0%B4%D0%B8#/media/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%BD%D0%B8%D0%BA_%D0%92.%D0%98._%D0%9B%D0%B5%D0%BD%D0%B8%D0%BD%D1%83._%D0%9C%D0%BE%D1%81%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F_%D0%BF%D0%BB%D0%BE%D1%89%D0%B0%D0%B4%D1%8C,_%D0%A1%D0%B0%D0%BD%D0%BA%D1%82-%D0%9F%D0%B5%D1%82%D0%B5%D1%80%D0%B1%D1%83%D1%80%D0%B3_2H1A5714WI.JPG&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%BD%D0%B8%D0%BA_%D0%92.%D0%98._%D0%9B%D0%B5%D0%BD%D0%B8%D0%BD%D1%83._%D0%9C%D0%BE%D1%81%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F_%D0%BF%D0%BB%D0%BE%D1%89%D0%B0%D0%B4%D1%8C,_%D0%A1%D0%B0%D0%BD%D0%BA%D1%82-%D0%9F%D0%B5%D1%82%D0%B5%D1%80%D0%B1%D1%83%D1%80%D0%B3_2H1A5714WI.jpeg&amp;diff=905</id>
		<title>Файл:Памятник В.И. Ленину. Московская площадь, Санкт-Петербург 2H1A5714WI.jpeg</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%BD%D0%B8%D0%BA_%D0%92.%D0%98._%D0%9B%D0%B5%D0%BD%D0%B8%D0%BD%D1%83._%D0%9C%D0%BE%D1%81%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F_%D0%BF%D0%BB%D0%BE%D1%89%D0%B0%D0%B4%D1%8C,_%D0%A1%D0%B0%D0%BD%D0%BA%D1%82-%D0%9F%D0%B5%D1%82%D0%B5%D1%80%D0%B1%D1%83%D1%80%D0%B3_2H1A5714WI.jpeg&amp;diff=905"/>
		<updated>2026-07-06T14:29:46Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: Авторство: Kora27. File:Памятник В.И. Ленину. Московская площадь, Санкт-Петербург 2H1A5714WI.jpg, CC BY-SA 4.0, https://ru.wikipedia.org/w/index.php?curid=10272899&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Краткое описание ==&lt;br /&gt;
Авторство: Kora27. File:Памятник В.И. Ленину. Московская площадь, Санкт-Петербург 2H1A5714WI.jpg, CC BY-SA 4.0, https://ru.wikipedia.org/w/index.php?curid=10272899&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%BD%D0%B8%D0%BA_%D0%9B%D0%B5%D0%BD%D0%B8%D0%BD%D1%83&amp;diff=904</id>
		<title>Памятник Ленину</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%BD%D0%B8%D0%BA_%D0%9B%D0%B5%D0%BD%D0%B8%D0%BD%D1%83&amp;diff=904"/>
		<updated>2026-07-06T14:24:02Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: Новая страница: «{{Объект en |name=Памятник В.И.Ленину |address=Московская площадь |lat=59.852158 |lon=30.323144 |type=Памятник |image=https://onpiterpalms.ru/images/8/81/%D0%A6%D0%B2%D0%B5%D1%82%D1%8B_%D0%BD%D0%B0_%D0%9C%D0%BE%D1%81%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D0%BF%D0%BB%D0%BE%D1%89%D0%B0%D0%B4%D0%B8.jpg |quest=Петербург цветёт |description=Вот так прекрасна Московская п...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Объект en&lt;br /&gt;
|name=Памятник В.И.Ленину&lt;br /&gt;
|address=Московская площадь&lt;br /&gt;
|lat=59.852158&lt;br /&gt;
|lon=30.323144&lt;br /&gt;
|type=Памятник&lt;br /&gt;
|image=https://onpiterpalms.ru/images/8/81/%D0%A6%D0%B2%D0%B5%D1%82%D1%8B_%D0%BD%D0%B0_%D0%9C%D0%BE%D1%81%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D0%BF%D0%BB%D0%BE%D1%89%D0%B0%D0%B4%D0%B8.jpg&lt;br /&gt;
|quest=Петербург цветёт&lt;br /&gt;
|description=Вот так прекрасна Московская площадь&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=903</id>
		<title>Widget:KidsMap</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=903"/>
		<updated>2026-07-06T14:15:35Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 100%; height: 500px; margin: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 6px rgba(0,0,0,0.1); background: #d9e6d9;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;loading-message&amp;quot; style=&amp;quot;display: none; text-align: center; margin-top: 4px; font-size: 0.9em;&amp;quot;&amp;gt;Загрузка маркеров...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.emoji-marker {&lt;br /&gt;
    background: white;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 2px solid #2e7d32;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 28px;&lt;br /&gt;
    width: 28px !important;&lt;br /&gt;
    height: 28px !important;&lt;br /&gt;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var map = L.map(&#039;map&#039;).setView([59.9343, 30.3351], 12);&lt;br /&gt;
L.tileLayer(&#039;https://tile.openstreetmap.org/{z}/{x}/{y}.png&#039;, {&lt;br /&gt;
    maxZoom: 19,&lt;br /&gt;
    attribution: &#039;© OpenStreetMap&#039;&lt;br /&gt;
}).addTo(map);&lt;br /&gt;
&lt;br /&gt;
function getIconByType(type) {&lt;br /&gt;
    const icons = {&lt;br /&gt;
        &#039;Парк&#039;: &#039;🌳&#039;, &#039;Памятник&#039;: &#039;🗿&#039;, &#039;Музей&#039;: &#039;🏛️&#039;, &#039;Церковь&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Школа&#039;: &#039;🏫&#039;, &#039;Кафе&#039;: &#039;☕&#039;, &#039;Мост&#039;: &#039;🌉&#039;, &#039;Фонтан&#039;: &#039;⛲&#039;,&lt;br /&gt;
        &#039;Театр&#039;: &#039;🎭&#039;, &#039;Библиотека&#039;: &#039;📚&#039;, &#039;Стадион&#039;: &#039;⚽&#039;, &#039;Аквапарк&#039;: &#039;💦&#039;,&lt;br /&gt;
        &#039;Зоопарк&#039;: &#039;🐘&#039;, &#039;Кинотеатр&#039;: &#039;🎬&#039;, &#039;Торговый центр&#039;: &#039;🛍️&#039;,&lt;br /&gt;
        &#039;Вокзал&#039;: &#039;🚂&#039;, &#039;Гостиница&#039;: &#039;🏨&#039;, &#039;Ресторан&#039;: &#039;🍽️&#039;, &#039;Другое&#039;: &#039;📍&#039;&lt;br /&gt;
    };&lt;br /&gt;
    return L.divIcon({&lt;br /&gt;
        html: icons[type] || &#039;📍&#039;,&lt;br /&gt;
        iconSize: [28, 28],&lt;br /&gt;
        className: &#039;emoji-marker&#039;,&lt;br /&gt;
        popupAnchor: [0, -14]&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function drawMarkers() {&lt;br /&gt;
    document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
    &lt;br /&gt;
    fetch(&#039;https://onpiterpalms.ru/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:CargoExport&amp;amp;tables=Objects&amp;amp;&amp;amp;fields=page%2Cname%2Caddress%2Clat%2Clon%2Ctype%2Cquest%2Cimage&amp;amp;&amp;amp;order+by=&amp;amp;limit=100&amp;amp;format=json&#039;)&lt;br /&gt;
        .then(response =&amp;gt; {&lt;br /&gt;
            if (!response.ok) throw new Error(&#039;HTTP &#039; + response.status);&lt;br /&gt;
            return response.json();&lt;br /&gt;
        })&lt;br /&gt;
        .then(data =&amp;gt; {&lt;br /&gt;
            map.eachLayer(layer =&amp;gt; {&lt;br /&gt;
                if (layer instanceof L.Marker) map.removeLayer(layer);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            data.forEach(obj =&amp;gt; {&lt;br /&gt;
                var lat = parseFloat(obj.lat);&lt;br /&gt;
                var lon = parseFloat(obj.lon);&lt;br /&gt;
                if (isNaN(lat) || isNaN(lon)) return;&lt;br /&gt;
                &lt;br /&gt;
                var icon = getIconByType(obj.type);&lt;br /&gt;
                var popupHtml = &#039;&amp;lt;b&amp;gt;&#039; + obj.name + &#039;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;b&amp;gt;Тип:&amp;lt;/b&amp;gt; &#039; + obj.type + &#039;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                obj.address + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.quest) popupHtml += &#039;&amp;lt;b&amp;gt;🎯 Квест:&amp;lt;/b&amp;gt; &#039; + obj.quest + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.description) popupHtml += &#039;&amp;lt;b&amp;gt;Описание:&amp;lt;/b&amp;gt; &#039; + obj.description + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.page) popupHtml += &#039;&amp;lt;a href=&amp;quot;/index.php/&#039; + encodeURIComponent(obj.page) + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;📖 Читать подробнее&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
                L.marker([lat, lon], {icon: icon}).addTo(map).bindPopup(popupHtml);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
            &lt;br /&gt;
            if (data.length === 0) {&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;😕 Нет мест. Добавь первое!&#039;;&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка загрузки данных:&#039;, error);&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;⚠️ Не удалось загрузить данные. Попробуйте позже.&#039;;&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
drawMarkers();&lt;br /&gt;
&lt;br /&gt;
var attributionControl = map.attributionControl;&lt;br /&gt;
if (attributionControl) {&lt;br /&gt;
    attributionControl.setPrefix(&#039;&#039;);&lt;br /&gt;
    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.innerHTML = &#039;.leaflet-attribution-flag { display: none !important; }&#039;;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=902</id>
		<title>Widget:KidsMap</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=902"/>
		<updated>2026-07-06T13:54:38Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 100%; height: 500px; margin: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 6px rgba(0,0,0,0.1); background: #d9e6d9;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;loading-message&amp;quot; style=&amp;quot;display: none; text-align: center; margin-top: 4px; font-size: 0.9em;&amp;quot;&amp;gt;Загрузка маркеров...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.emoji-marker {&lt;br /&gt;
    background: white;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 2px solid #2e7d32;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 28px;&lt;br /&gt;
    width: 28px !important;&lt;br /&gt;
    height: 28px !important;&lt;br /&gt;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var map = L.map(&#039;map&#039;).setView([59.9343, 30.3351], 12);&lt;br /&gt;
L.tileLayer(&#039;https://tile.openstreetmap.org/{z}/{x}/{y}.png&#039;, {&lt;br /&gt;
    maxZoom: 19,&lt;br /&gt;
    attribution: &#039;© OpenStreetMap&#039;&lt;br /&gt;
}).addTo(map);&lt;br /&gt;
&lt;br /&gt;
function getIconByType(type) {&lt;br /&gt;
    const icons = {&lt;br /&gt;
        &#039;Парк&#039;: &#039;🌳&#039;, &#039;Памятник&#039;: &#039;🗿&#039;, &#039;Музей&#039;: &#039;🏛️&#039;, &#039;Церковь&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Школа&#039;: &#039;🏫&#039;, &#039;Кафе&#039;: &#039;☕&#039;, &#039;Мост&#039;: &#039;🌉&#039;, &#039;Фонтан&#039;: &#039;⛲&#039;,&lt;br /&gt;
        &#039;Театр&#039;: &#039;🎭&#039;, &#039;Библиотека&#039;: &#039;📚&#039;, &#039;Стадион&#039;: &#039;⚽&#039;, &#039;Аквапарк&#039;: &#039;💦&#039;,&lt;br /&gt;
        &#039;Зоопарк&#039;: &#039;🐘&#039;, &#039;Кинотеатр&#039;: &#039;🎬&#039;, &#039;Торговый центр&#039;: &#039;🛍️&#039;,&lt;br /&gt;
        &#039;Вокзал&#039;: &#039;🚂&#039;, &#039;Гостиница&#039;: &#039;🏨&#039;, &#039;Ресторан&#039;: &#039;🍽️&#039;, &#039;Другое&#039;: &#039;📍&#039;&lt;br /&gt;
    };&lt;br /&gt;
    return L.divIcon({&lt;br /&gt;
        html: icons[type] || &#039;📍&#039;,&lt;br /&gt;
        iconSize: [28, 28],&lt;br /&gt;
        className: &#039;emoji-marker&#039;,&lt;br /&gt;
        popupAnchor: [0, -14]&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function drawMarkers() {&lt;br /&gt;
    document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
    &lt;br /&gt;
    fetch(&#039;/index.php?title=Служебная:CargoQuery&amp;amp;format=json&amp;amp;tables=Objects&amp;amp;fields=page,name,address,lat,lon,type,quest,image&#039;)&lt;br /&gt;
        .then(response =&amp;gt; {&lt;br /&gt;
            if (!response.ok) throw new Error(&#039;HTTP &#039; + response.status);&lt;br /&gt;
            return response.json();&lt;br /&gt;
        })&lt;br /&gt;
        .then(data =&amp;gt; {&lt;br /&gt;
            map.eachLayer(layer =&amp;gt; {&lt;br /&gt;
                if (layer instanceof L.Marker) map.removeLayer(layer);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            data.forEach(obj =&amp;gt; {&lt;br /&gt;
                var lat = parseFloat(obj.lat);&lt;br /&gt;
                var lon = parseFloat(obj.lon);&lt;br /&gt;
                if (isNaN(lat) || isNaN(lon)) return;&lt;br /&gt;
                &lt;br /&gt;
                var icon = getIconByType(obj.type);&lt;br /&gt;
                var popupHtml = &#039;&amp;lt;b&amp;gt;&#039; + obj.name + &#039;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;b&amp;gt;Тип:&amp;lt;/b&amp;gt; &#039; + obj.type + &#039;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                obj.address + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.quest) popupHtml += &#039;&amp;lt;b&amp;gt;🎯 Квест:&amp;lt;/b&amp;gt; &#039; + obj.quest + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.description) popupHtml += &#039;&amp;lt;b&amp;gt;Описание:&amp;lt;/b&amp;gt; &#039; + obj.description + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.page) popupHtml += &#039;&amp;lt;a href=&amp;quot;/index.php/&#039; + encodeURIComponent(obj.page) + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;📖 Читать подробнее&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
                L.marker([lat, lon], {icon: icon}).addTo(map).bindPopup(popupHtml);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
            &lt;br /&gt;
            if (data.length === 0) {&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;😕 Нет мест. Добавь первое!&#039;;&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка загрузки данных:&#039;, error);&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;⚠️ Не удалось загрузить данные. Попробуйте позже.&#039;;&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
drawMarkers();&lt;br /&gt;
&lt;br /&gt;
var attributionControl = map.attributionControl;&lt;br /&gt;
if (attributionControl) {&lt;br /&gt;
    attributionControl.setPrefix(&#039;&#039;);&lt;br /&gt;
    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.innerHTML = &#039;.leaflet-attribution-flag { display: none !important; }&#039;;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=901</id>
		<title>Widget:KidsMap</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=901"/>
		<updated>2026-07-06T13:48:43Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 100%; height: 500px; margin: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 6px rgba(0,0,0,0.1); background: #d9e6d9;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;loading-message&amp;quot; style=&amp;quot;display: none; text-align: center; margin-top: 4px; font-size: 0.9em;&amp;quot;&amp;gt;Загрузка маркеров...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.emoji-marker {&lt;br /&gt;
    background: white;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 2px solid #2e7d32;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 28px;&lt;br /&gt;
    width: 28px !important;&lt;br /&gt;
    height: 28px !important;&lt;br /&gt;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var map = L.map(&#039;map&#039;).setView([59.9343, 30.3351], 12);&lt;br /&gt;
L.tileLayer(&#039;https://tile.openstreetmap.org/{z}/{x}/{y}.png&#039;, {&lt;br /&gt;
    maxZoom: 19,&lt;br /&gt;
    attribution: &#039;© OpenStreetMap&#039;&lt;br /&gt;
}).addTo(map);&lt;br /&gt;
&lt;br /&gt;
function getIconByType(type) {&lt;br /&gt;
    const icons = {&lt;br /&gt;
        &#039;Парк&#039;: &#039;🌳&#039;, &#039;Памятник&#039;: &#039;🗿&#039;, &#039;Музей&#039;: &#039;🏛️&#039;, &#039;Церковь&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Школа&#039;: &#039;🏫&#039;, &#039;Кафе&#039;: &#039;☕&#039;, &#039;Мост&#039;: &#039;🌉&#039;, &#039;Фонтан&#039;: &#039;⛲&#039;,&lt;br /&gt;
        &#039;Театр&#039;: &#039;🎭&#039;, &#039;Библиотека&#039;: &#039;📚&#039;, &#039;Стадион&#039;: &#039;⚽&#039;, &#039;Аквапарк&#039;: &#039;💦&#039;,&lt;br /&gt;
        &#039;Зоопарк&#039;: &#039;🐘&#039;, &#039;Кинотеатр&#039;: &#039;🎬&#039;, &#039;Торговый центр&#039;: &#039;🛍️&#039;,&lt;br /&gt;
        &#039;Вокзал&#039;: &#039;🚂&#039;, &#039;Гостиница&#039;: &#039;🏨&#039;, &#039;Ресторан&#039;: &#039;🍽️&#039;, &#039;Другое&#039;: &#039;📍&#039;&lt;br /&gt;
    };&lt;br /&gt;
    return L.divIcon({&lt;br /&gt;
        html: icons[type] || &#039;📍&#039;,&lt;br /&gt;
        iconSize: [28, 28],&lt;br /&gt;
        className: &#039;emoji-marker&#039;,&lt;br /&gt;
        popupAnchor: [0, -14]&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function drawMarkers() {&lt;br /&gt;
    document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
    &lt;br /&gt;
    fetch(&#039;/index.php?title=Служебная:CargoQuery&amp;amp;format=json&amp;amp;tables=Objects&amp;amp;fields=page,name,address,lat,lon,type,quest,image&#039;)&lt;br /&gt;
        .then(data =&amp;gt; {&lt;br /&gt;
            map.eachLayer(layer =&amp;gt; {&lt;br /&gt;
                if (layer instanceof L.Marker) map.removeLayer(layer);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            data.forEach(obj =&amp;gt; {&lt;br /&gt;
                var lat = parseFloat(obj.lat);&lt;br /&gt;
                var lon = parseFloat(obj.lon);&lt;br /&gt;
                if (isNaN(lat) || isNaN(lon)) return;&lt;br /&gt;
                &lt;br /&gt;
                var icon = getIconByType(obj.type);&lt;br /&gt;
                var popupHtml = &#039;&amp;lt;b&amp;gt;&#039; + obj.name + &#039;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;b&amp;gt;Тип:&amp;lt;/b&amp;gt; &#039; + obj.type + &#039;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                obj.address + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.quest) popupHtml += &#039;&amp;lt;b&amp;gt;🎯 Квест:&amp;lt;/b&amp;gt; &#039; + obj.quest + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.description) popupHtml += &#039;&amp;lt;b&amp;gt;Описание:&amp;lt;/b&amp;gt; &#039; + obj.description + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.page) popupHtml += &#039;&amp;lt;a href=&amp;quot;/index.php/&#039; + encodeURIComponent(obj.page) + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;📖 Читать подробнее&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
                L.marker([lat, lon], {icon: icon}).addTo(map).bindPopup(popupHtml);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
            &lt;br /&gt;
            if (data.length === 0) {&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;😕 Нет мест. Добавь первое!&#039;;&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка загрузки данных:&#039;, error);&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;⚠️ Не удалось загрузить данные. Попробуйте позже.&#039;;&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
drawMarkers();&lt;br /&gt;
&lt;br /&gt;
var attributionControl = map.attributionControl;&lt;br /&gt;
if (attributionControl) {&lt;br /&gt;
    attributionControl.setPrefix(&#039;&#039;);&lt;br /&gt;
    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.innerHTML = &#039;.leaflet-attribution-flag { display: none !important; }&#039;;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%94%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%B0%D1%80%D1%82%D1%8B&amp;diff=900</id>
		<title>Данные для карты</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%94%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%B0%D1%80%D1%82%D1%8B&amp;diff=900"/>
		<updated>2026-07-06T13:30:50Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#cargo_query:tables=Objects|fields=page,name,address,lat,lon,type,quest,image|format=json|no html}}&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%94%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D0%BA%D0%B0%D1%80%D1%82%D1%8B&amp;diff=899</id>
		<title>Данные карты</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%94%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D0%BA%D0%B0%D1%80%D1%82%D1%8B&amp;diff=899"/>
		<updated>2026-07-06T13:28:45Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: Новая страница: «{{#cargo_query: tables=Objects |fields=page,name,address,lat,lon,type,quest,image |format=json |no html }}»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#cargo_query:&lt;br /&gt;
tables=Objects&lt;br /&gt;
|fields=page,name,address,lat,lon,type,quest,image&lt;br /&gt;
|format=json&lt;br /&gt;
|no html&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=898</id>
		<title>Widget:KidsMap</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=898"/>
		<updated>2026-07-06T13:24:03Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 100%; height: 500px; margin: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 6px rgba(0,0,0,0.1); background: #d9e6d9;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;loading-message&amp;quot; style=&amp;quot;display: none; text-align: center; margin-top: 4px; font-size: 0.9em;&amp;quot;&amp;gt;Загрузка маркеров...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.emoji-marker {&lt;br /&gt;
    background: white;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 2px solid #2e7d32;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 28px;&lt;br /&gt;
    width: 28px !important;&lt;br /&gt;
    height: 28px !important;&lt;br /&gt;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var map = L.map(&#039;map&#039;).setView([59.9343, 30.3351], 12);&lt;br /&gt;
L.tileLayer(&#039;https://tile.openstreetmap.org/{z}/{x}/{y}.png&#039;, {&lt;br /&gt;
    maxZoom: 19,&lt;br /&gt;
    attribution: &#039;© OpenStreetMap&#039;&lt;br /&gt;
}).addTo(map);&lt;br /&gt;
&lt;br /&gt;
function getIconByType(type) {&lt;br /&gt;
    const icons = {&lt;br /&gt;
        &#039;Парк&#039;: &#039;🌳&#039;, &#039;Памятник&#039;: &#039;🗿&#039;, &#039;Музей&#039;: &#039;🏛️&#039;, &#039;Церковь&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Школа&#039;: &#039;🏫&#039;, &#039;Кафе&#039;: &#039;☕&#039;, &#039;Мост&#039;: &#039;🌉&#039;, &#039;Фонтан&#039;: &#039;⛲&#039;,&lt;br /&gt;
        &#039;Театр&#039;: &#039;🎭&#039;, &#039;Библиотека&#039;: &#039;📚&#039;, &#039;Стадион&#039;: &#039;⚽&#039;, &#039;Аквапарк&#039;: &#039;💦&#039;,&lt;br /&gt;
        &#039;Зоопарк&#039;: &#039;🐘&#039;, &#039;Кинотеатр&#039;: &#039;🎬&#039;, &#039;Торговый центр&#039;: &#039;🛍️&#039;,&lt;br /&gt;
        &#039;Вокзал&#039;: &#039;🚂&#039;, &#039;Гостиница&#039;: &#039;🏨&#039;, &#039;Ресторан&#039;: &#039;🍽️&#039;, &#039;Другое&#039;: &#039;📍&#039;&lt;br /&gt;
    };&lt;br /&gt;
    return L.divIcon({&lt;br /&gt;
        html: icons[type] || &#039;📍&#039;,&lt;br /&gt;
        iconSize: [28, 28],&lt;br /&gt;
        className: &#039;emoji-marker&#039;,&lt;br /&gt;
        popupAnchor: [0, -14]&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function drawMarkers() {&lt;br /&gt;
    document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
    &lt;br /&gt;
    fetch(&#039;/index.php/Данные_для_детской_карты?action=raw&#039;)&lt;br /&gt;
        .then(response =&amp;gt; {&lt;br /&gt;
            if (!response.ok) throw new Error(&#039;HTTP &#039; + response.status);&lt;br /&gt;
            return response.json();&lt;br /&gt;
        })&lt;br /&gt;
        .then(data =&amp;gt; {&lt;br /&gt;
            map.eachLayer(layer =&amp;gt; {&lt;br /&gt;
                if (layer instanceof L.Marker) map.removeLayer(layer);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            data.forEach(obj =&amp;gt; {&lt;br /&gt;
                var lat = parseFloat(obj.lat);&lt;br /&gt;
                var lon = parseFloat(obj.lon);&lt;br /&gt;
                if (isNaN(lat) || isNaN(lon)) return;&lt;br /&gt;
                &lt;br /&gt;
                var icon = getIconByType(obj.type);&lt;br /&gt;
                var popupHtml = &#039;&amp;lt;b&amp;gt;&#039; + obj.name + &#039;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;b&amp;gt;Тип:&amp;lt;/b&amp;gt; &#039; + obj.type + &#039;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                obj.address + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.quest) popupHtml += &#039;&amp;lt;b&amp;gt;🎯 Квест:&amp;lt;/b&amp;gt; &#039; + obj.quest + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.description) popupHtml += &#039;&amp;lt;b&amp;gt;Описание:&amp;lt;/b&amp;gt; &#039; + obj.description + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.page) popupHtml += &#039;&amp;lt;a href=&amp;quot;/index.php/&#039; + encodeURIComponent(obj.page) + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;📖 Читать подробнее&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
                L.marker([lat, lon], {icon: icon}).addTo(map).bindPopup(popupHtml);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
            &lt;br /&gt;
            if (data.length === 0) {&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;😕 Нет мест. Добавь первое!&#039;;&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка загрузки данных:&#039;, error);&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;⚠️ Не удалось загрузить данные. Попробуйте позже.&#039;;&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
drawMarkers();&lt;br /&gt;
&lt;br /&gt;
var attributionControl = map.attributionControl;&lt;br /&gt;
if (attributionControl) {&lt;br /&gt;
    attributionControl.setPrefix(&#039;&#039;);&lt;br /&gt;
    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.innerHTML = &#039;.leaflet-attribution-flag { display: none !important; }&#039;;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=897</id>
		<title>Widget:KidsMap</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=897"/>
		<updated>2026-07-06T13:22:02Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 100%; height: 500px; margin: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 6px rgba(0,0,0,0.1); background: #d9e6d9;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;loading-message&amp;quot; style=&amp;quot;display: none; text-align: center; margin-top: 4px; font-size: 0.9em;&amp;quot;&amp;gt;Загрузка маркеров...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.emoji-marker {&lt;br /&gt;
    background: white;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 2px solid #2e7d32;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 28px;&lt;br /&gt;
    width: 28px !important;&lt;br /&gt;
    height: 28px !important;&lt;br /&gt;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var map = L.map(&#039;map&#039;).setView([59.9343, 30.3351], 12);&lt;br /&gt;
L.tileLayer(&#039;https://tile.openstreetmap.org/{z}/{x}/{y}.png&#039;, {&lt;br /&gt;
    maxZoom: 19,&lt;br /&gt;
    attribution: &#039;© OpenStreetMap&#039;&lt;br /&gt;
}).addTo(map);&lt;br /&gt;
&lt;br /&gt;
function getIconByType(type) {&lt;br /&gt;
    const icons = {&lt;br /&gt;
        &#039;Парк&#039;: &#039;🌳&#039;, &#039;Памятник&#039;: &#039;🗿&#039;, &#039;Музей&#039;: &#039;🏛️&#039;, &#039;Церковь&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Школа&#039;: &#039;🏫&#039;, &#039;Кафе&#039;: &#039;☕&#039;, &#039;Мост&#039;: &#039;🌉&#039;, &#039;Фонтан&#039;: &#039;⛲&#039;,&lt;br /&gt;
        &#039;Театр&#039;: &#039;🎭&#039;, &#039;Библиотека&#039;: &#039;📚&#039;, &#039;Стадион&#039;: &#039;⚽&#039;, &#039;Аквапарк&#039;: &#039;💦&#039;,&lt;br /&gt;
        &#039;Зоопарк&#039;: &#039;🐘&#039;, &#039;Кинотеатр&#039;: &#039;🎬&#039;, &#039;Торговый центр&#039;: &#039;🛍️&#039;,&lt;br /&gt;
        &#039;Вокзал&#039;: &#039;🚂&#039;, &#039;Гостиница&#039;: &#039;🏨&#039;, &#039;Ресторан&#039;: &#039;🍽️&#039;, &#039;Другое&#039;: &#039;📍&#039;&lt;br /&gt;
    };&lt;br /&gt;
    return L.divIcon({&lt;br /&gt;
        html: icons[type] || &#039;📍&#039;,&lt;br /&gt;
        iconSize: [28, 28],&lt;br /&gt;
        className: &#039;emoji-marker&#039;,&lt;br /&gt;
        popupAnchor: [0, -14]&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function drawMarkers() {&lt;br /&gt;
    document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
    &lt;br /&gt;
    fetch(&#039;/index.php/Данные_для_детской_карты?action=raw&#039;)&lt;br /&gt;
    .then(response =&amp;gt; {&lt;br /&gt;
        if (!response.ok) throw new Error(&#039;HTTP &#039; + response.status);&lt;br /&gt;
        return response.json();&lt;br /&gt;
    })&lt;br /&gt;
    .then(data =&amp;gt; {&lt;br /&gt;
        // ваш код&lt;br /&gt;
    })&lt;br /&gt;
    .catch(error =&amp;gt; console.error(&#039;Ошибка:&#039;, error));&lt;br /&gt;
        .then(data =&amp;gt; {&lt;br /&gt;
            map.eachLayer(layer =&amp;gt; {&lt;br /&gt;
                if (layer instanceof L.Marker) map.removeLayer(layer);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            data.forEach(obj =&amp;gt; {&lt;br /&gt;
                var lat = parseFloat(obj.lat);&lt;br /&gt;
                var lon = parseFloat(obj.lon);&lt;br /&gt;
                if (isNaN(lat) || isNaN(lon)) return;&lt;br /&gt;
                &lt;br /&gt;
                var icon = getIconByType(obj.type);&lt;br /&gt;
                var popupHtml = &#039;&amp;lt;b&amp;gt;&#039; + obj.name + &#039;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;b&amp;gt;Тип:&amp;lt;/b&amp;gt; &#039; + obj.type + &#039;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                obj.address + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.quest) popupHtml += &#039;&amp;lt;b&amp;gt;🎯 Квест:&amp;lt;/b&amp;gt; &#039; + obj.quest + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.description) popupHtml += &#039;&amp;lt;b&amp;gt;Описание:&amp;lt;/b&amp;gt; &#039; + obj.description + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.page) popupHtml += &#039;&amp;lt;a href=&amp;quot;/index.php/&#039; + encodeURIComponent(obj.page) + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;📖 Читать подробнее&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
                L.marker([lat, lon], {icon: icon}).addTo(map).bindPopup(popupHtml);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
            &lt;br /&gt;
            if (data.length === 0) {&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;😕 Нет мест. Добавь первое!&#039;;&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка загрузки данных:&#039;, error);&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;⚠️ Не удалось загрузить данные. Попробуйте позже.&#039;;&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
drawMarkers();&lt;br /&gt;
&lt;br /&gt;
var attributionControl = map.attributionControl;&lt;br /&gt;
if (attributionControl) {&lt;br /&gt;
    attributionControl.setPrefix(&#039;&#039;);&lt;br /&gt;
    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.innerHTML = &#039;.leaflet-attribution-flag { display: none !important; }&#039;;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=896</id>
		<title>Widget:KidsMap</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=896"/>
		<updated>2026-07-06T13:16:46Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 100%; height: 500px; margin: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 6px rgba(0,0,0,0.1); background: #d9e6d9;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;loading-message&amp;quot; style=&amp;quot;display: none; text-align: center; margin-top: 4px; font-size: 0.9em;&amp;quot;&amp;gt;Загрузка маркеров...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.emoji-marker {&lt;br /&gt;
    background: white;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 2px solid #2e7d32;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 28px;&lt;br /&gt;
    width: 28px !important;&lt;br /&gt;
    height: 28px !important;&lt;br /&gt;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var map = L.map(&#039;map&#039;).setView([59.9343, 30.3351], 12);&lt;br /&gt;
L.tileLayer(&#039;https://tile.openstreetmap.org/{z}/{x}/{y}.png&#039;, {&lt;br /&gt;
    maxZoom: 19,&lt;br /&gt;
    attribution: &#039;© OpenStreetMap&#039;&lt;br /&gt;
}).addTo(map);&lt;br /&gt;
&lt;br /&gt;
function getIconByType(type) {&lt;br /&gt;
    const icons = {&lt;br /&gt;
        &#039;Парк&#039;: &#039;🌳&#039;, &#039;Памятник&#039;: &#039;🗿&#039;, &#039;Музей&#039;: &#039;🏛️&#039;, &#039;Церковь&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Школа&#039;: &#039;🏫&#039;, &#039;Кафе&#039;: &#039;☕&#039;, &#039;Мост&#039;: &#039;🌉&#039;, &#039;Фонтан&#039;: &#039;⛲&#039;,&lt;br /&gt;
        &#039;Театр&#039;: &#039;🎭&#039;, &#039;Библиотека&#039;: &#039;📚&#039;, &#039;Стадион&#039;: &#039;⚽&#039;, &#039;Аквапарк&#039;: &#039;💦&#039;,&lt;br /&gt;
        &#039;Зоопарк&#039;: &#039;🐘&#039;, &#039;Кинотеатр&#039;: &#039;🎬&#039;, &#039;Торговый центр&#039;: &#039;🛍️&#039;,&lt;br /&gt;
        &#039;Вокзал&#039;: &#039;🚂&#039;, &#039;Гостиница&#039;: &#039;🏨&#039;, &#039;Ресторан&#039;: &#039;🍽️&#039;, &#039;Другое&#039;: &#039;📍&#039;&lt;br /&gt;
    };&lt;br /&gt;
    return L.divIcon({&lt;br /&gt;
        html: icons[type] || &#039;📍&#039;,&lt;br /&gt;
        iconSize: [28, 28],&lt;br /&gt;
        className: &#039;emoji-marker&#039;,&lt;br /&gt;
        popupAnchor: [0, -14]&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function drawMarkers() {&lt;br /&gt;
    document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
    &lt;br /&gt;
    fetch(&#039;/index.php/Данные_для_детской_карты&#039;)&lt;br /&gt;
    .then(response =&amp;gt; {&lt;br /&gt;
        if (!response.ok) throw new Error(&#039;HTTP &#039; + response.status);&lt;br /&gt;
        return response.json();&lt;br /&gt;
    })&lt;br /&gt;
        .then(data =&amp;gt; {&lt;br /&gt;
            map.eachLayer(layer =&amp;gt; {&lt;br /&gt;
                if (layer instanceof L.Marker) map.removeLayer(layer);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            data.forEach(obj =&amp;gt; {&lt;br /&gt;
                var lat = parseFloat(obj.lat);&lt;br /&gt;
                var lon = parseFloat(obj.lon);&lt;br /&gt;
                if (isNaN(lat) || isNaN(lon)) return;&lt;br /&gt;
                &lt;br /&gt;
                var icon = getIconByType(obj.type);&lt;br /&gt;
                var popupHtml = &#039;&amp;lt;b&amp;gt;&#039; + obj.name + &#039;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;b&amp;gt;Тип:&amp;lt;/b&amp;gt; &#039; + obj.type + &#039;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                obj.address + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.quest) popupHtml += &#039;&amp;lt;b&amp;gt;🎯 Квест:&amp;lt;/b&amp;gt; &#039; + obj.quest + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.description) popupHtml += &#039;&amp;lt;b&amp;gt;Описание:&amp;lt;/b&amp;gt; &#039; + obj.description + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.page) popupHtml += &#039;&amp;lt;a href=&amp;quot;/index.php/&#039; + encodeURIComponent(obj.page) + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;📖 Читать подробнее&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
                L.marker([lat, lon], {icon: icon}).addTo(map).bindPopup(popupHtml);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
            &lt;br /&gt;
            if (data.length === 0) {&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;😕 Нет мест. Добавь первое!&#039;;&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка загрузки данных:&#039;, error);&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;⚠️ Не удалось загрузить данные. Попробуйте позже.&#039;;&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
drawMarkers();&lt;br /&gt;
&lt;br /&gt;
var attributionControl = map.attributionControl;&lt;br /&gt;
if (attributionControl) {&lt;br /&gt;
    attributionControl.setPrefix(&#039;&#039;);&lt;br /&gt;
    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.innerHTML = &#039;.leaflet-attribution-flag { display: none !important; }&#039;;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%AD%D1%82%D0%BD%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D1%83%D0%B7%D0%B5%D0%B9&amp;diff=895</id>
		<title>Этнографический музей</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%AD%D1%82%D0%BD%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D1%83%D0%B7%D0%B5%D0%B9&amp;diff=895"/>
		<updated>2026-07-06T12:30:10Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Объект en&lt;br /&gt;
|name=Этнографический музей&lt;br /&gt;
|address=ул. Инженерная, д.4/1&lt;br /&gt;
|lat=59.938009&lt;br /&gt;
|lon=30.335191&lt;br /&gt;
|type=Музей&lt;br /&gt;
|description=В Российском этнографическом музее есть тихий музейный двор, о котором знают мало кто знает. В этот дворик экскурсии устраиваются редко, например один раз год в ночь музее, а также специальные дни (летом в белые ночи). Если удастся его посетить - не пожалеете!!!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Посмотреть на картах ==&lt;br /&gt;
* [[Этнографический_музей_архитектура|Об архитектуре музея]]&lt;br /&gt;
* [[Этнографический_музей_Влад_А4|Влад А4 в музее]]&lt;br /&gt;
* [[Этнографический_музей_День_города|Музей в День города]]&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=893</id>
		<title>Widget:KidsMap</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=893"/>
		<updated>2026-07-06T12:18:15Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 100%; height: 500px; margin: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 6px rgba(0,0,0,0.1); background: #d9e6d9;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;loading-message&amp;quot; style=&amp;quot;display: none; text-align: center; margin-top: 4px; font-size: 0.9em;&amp;quot;&amp;gt;Загрузка маркеров...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.emoji-marker {&lt;br /&gt;
    background: white;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 2px solid #2e7d32;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 28px;&lt;br /&gt;
    width: 28px !important;&lt;br /&gt;
    height: 28px !important;&lt;br /&gt;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var map = L.map(&#039;map&#039;).setView([59.9343, 30.3351], 12);&lt;br /&gt;
L.tileLayer(&#039;https://tile.openstreetmap.org/{z}/{x}/{y}.png&#039;, {&lt;br /&gt;
    maxZoom: 19,&lt;br /&gt;
    attribution: &#039;© OpenStreetMap&#039;&lt;br /&gt;
}).addTo(map);&lt;br /&gt;
&lt;br /&gt;
function getIconByType(type) {&lt;br /&gt;
    const icons = {&lt;br /&gt;
        &#039;Парк&#039;: &#039;🌳&#039;, &#039;Памятник&#039;: &#039;🗿&#039;, &#039;Музей&#039;: &#039;🏛️&#039;, &#039;Церковь&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Школа&#039;: &#039;🏫&#039;, &#039;Кафе&#039;: &#039;☕&#039;, &#039;Мост&#039;: &#039;🌉&#039;, &#039;Фонтан&#039;: &#039;⛲&#039;,&lt;br /&gt;
        &#039;Театр&#039;: &#039;🎭&#039;, &#039;Библиотека&#039;: &#039;📚&#039;, &#039;Стадион&#039;: &#039;⚽&#039;, &#039;Аквапарк&#039;: &#039;💦&#039;,&lt;br /&gt;
        &#039;Зоопарк&#039;: &#039;🐘&#039;, &#039;Кинотеатр&#039;: &#039;🎬&#039;, &#039;Торговый центр&#039;: &#039;🛍️&#039;,&lt;br /&gt;
        &#039;Вокзал&#039;: &#039;🚂&#039;, &#039;Гостиница&#039;: &#039;🏨&#039;, &#039;Ресторан&#039;: &#039;🍽️&#039;, &#039;Другое&#039;: &#039;📍&#039;&lt;br /&gt;
    };&lt;br /&gt;
    return L.divIcon({&lt;br /&gt;
        html: icons[type] || &#039;📍&#039;,&lt;br /&gt;
        iconSize: [28, 28],&lt;br /&gt;
        className: &#039;emoji-marker&#039;,&lt;br /&gt;
        popupAnchor: [0, -14]&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function drawMarkers() {&lt;br /&gt;
    document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
    &lt;br /&gt;
    fetch(&#039;/index.php/Данные_для_детской_карты&#039;)&lt;br /&gt;
        .then(response =&amp;gt; {&lt;br /&gt;
            if (!response.ok) {&lt;br /&gt;
                throw new Error(&#039;HTTP &#039; + response.status);&lt;br /&gt;
            }&lt;br /&gt;
            return response.json();&lt;br /&gt;
        })&lt;br /&gt;
        .then(data =&amp;gt; {&lt;br /&gt;
            map.eachLayer(layer =&amp;gt; {&lt;br /&gt;
                if (layer instanceof L.Marker) map.removeLayer(layer);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            data.forEach(obj =&amp;gt; {&lt;br /&gt;
                var lat = parseFloat(obj.lat);&lt;br /&gt;
                var lon = parseFloat(obj.lon);&lt;br /&gt;
                if (isNaN(lat) || isNaN(lon)) return;&lt;br /&gt;
                &lt;br /&gt;
                var icon = getIconByType(obj.type);&lt;br /&gt;
                var popupHtml = &#039;&amp;lt;b&amp;gt;&#039; + obj.name + &#039;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;b&amp;gt;Тип:&amp;lt;/b&amp;gt; &#039; + obj.type + &#039;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                obj.address + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.quest) popupHtml += &#039;&amp;lt;b&amp;gt;🎯 Квест:&amp;lt;/b&amp;gt; &#039; + obj.quest + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.description) popupHtml += &#039;&amp;lt;b&amp;gt;Описание:&amp;lt;/b&amp;gt; &#039; + obj.description + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.page) popupHtml += &#039;&amp;lt;a href=&amp;quot;/index.php/&#039; + encodeURIComponent(obj.page) + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;📖 Читать подробнее&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
                L.marker([lat, lon], {icon: icon}).addTo(map).bindPopup(popupHtml);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
            &lt;br /&gt;
            if (data.length === 0) {&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;😕 Нет мест. Добавь первое!&#039;;&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка загрузки данных:&#039;, error);&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;⚠️ Не удалось загрузить данные. Попробуйте позже.&#039;;&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
drawMarkers();&lt;br /&gt;
&lt;br /&gt;
var attributionControl = map.attributionControl;&lt;br /&gt;
if (attributionControl) {&lt;br /&gt;
    attributionControl.setPrefix(&#039;&#039;);&lt;br /&gt;
    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.innerHTML = &#039;.leaflet-attribution-flag { display: none !important; }&#039;;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=%D0%94%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B4%D0%BB%D1%8F_%D0%B4%D0%B5%D1%82%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%B0%D1%80%D1%82%D1%8B&amp;diff=892</id>
		<title>Данные для детской карты</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=%D0%94%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B4%D0%BB%D1%8F_%D0%B4%D0%B5%D1%82%D1%81%D0%BA%D0%BE%D0%B9_%D0%BA%D0%B0%D1%80%D1%82%D1%8B&amp;diff=892"/>
		<updated>2026-07-06T12:16:58Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: Новая страница: «&amp;lt;noinclude&amp;gt;__HIDDENCAT__&amp;lt;/noinclude&amp;gt;{{#cargo_query: tables=Objects |fields=page,name,address,lat,lon,type,quest,image |format=json |no html }}»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;__HIDDENCAT__&amp;lt;/noinclude&amp;gt;{{#cargo_query:&lt;br /&gt;
tables=Objects&lt;br /&gt;
|fields=page,name,address,lat,lon,type,quest,image&lt;br /&gt;
|format=json&lt;br /&gt;
|no html&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
	<entry>
		<id>https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=891</id>
		<title>Widget:KidsMap</title>
		<link rel="alternate" type="text/html" href="https://onpiterpalms.ru/index.php?title=Widget:KidsMap&amp;diff=891"/>
		<updated>2026-07-06T12:10:39Z</updated>

		<summary type="html">&lt;p&gt;Admin Gorod: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 100%; height: 500px; margin: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 6px rgba(0,0,0,0.1); background: #d9e6d9;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;loading-message&amp;quot; style=&amp;quot;display: none; text-align: center; margin-top: 4px; font-size: 0.9em;&amp;quot;&amp;gt;Загрузка маркеров...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.9.4/dist/leaflet.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.emoji-marker {&lt;br /&gt;
    background: white;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 2px solid #2e7d32;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 28px;&lt;br /&gt;
    width: 28px !important;&lt;br /&gt;
    height: 28px !important;&lt;br /&gt;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var map = L.map(&#039;map&#039;).setView([59.9343, 30.3351], 12);&lt;br /&gt;
L.tileLayer(&#039;https://tile.openstreetmap.org/{z}/{x}/{y}.png&#039;, {&lt;br /&gt;
    maxZoom: 19,&lt;br /&gt;
    attribution: &#039;© OpenStreetMap&#039;&lt;br /&gt;
}).addTo(map);&lt;br /&gt;
&lt;br /&gt;
function getIconByType(type) {&lt;br /&gt;
    const icons = {&lt;br /&gt;
        &#039;Парк&#039;: &#039;🌳&#039;, &#039;Памятник&#039;: &#039;🗿&#039;, &#039;Музей&#039;: &#039;🏛️&#039;, &#039;Церковь&#039;: &#039;⛪&#039;,&lt;br /&gt;
        &#039;Школа&#039;: &#039;🏫&#039;, &#039;Кафе&#039;: &#039;☕&#039;, &#039;Мост&#039;: &#039;🌉&#039;, &#039;Фонтан&#039;: &#039;⛲&#039;,&lt;br /&gt;
        &#039;Театр&#039;: &#039;🎭&#039;, &#039;Библиотека&#039;: &#039;📚&#039;, &#039;Стадион&#039;: &#039;⚽&#039;, &#039;Аквапарк&#039;: &#039;💦&#039;,&lt;br /&gt;
        &#039;Зоопарк&#039;: &#039;🐘&#039;, &#039;Кинотеатр&#039;: &#039;🎬&#039;, &#039;Торговый центр&#039;: &#039;🛍️&#039;,&lt;br /&gt;
        &#039;Вокзал&#039;: &#039;🚂&#039;, &#039;Гостиница&#039;: &#039;🏨&#039;, &#039;Ресторан&#039;: &#039;🍽️&#039;, &#039;Другое&#039;: &#039;📍&#039;&lt;br /&gt;
    };&lt;br /&gt;
    return L.divIcon({&lt;br /&gt;
        html: icons[type] || &#039;📍&#039;,&lt;br /&gt;
        iconSize: [28, 28],&lt;br /&gt;
        className: &#039;emoji-marker&#039;,&lt;br /&gt;
        popupAnchor: [0, -14]&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function drawMarkers() {&lt;br /&gt;
    document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
    &lt;br /&gt;
    // Загружаем данные из Cargo через API&lt;br /&gt;
    fetch(&#039;/index.php?title=Служебная:CargoQuery&amp;amp;format=json&amp;amp;tables=Objects&amp;amp;fields=page,name,address,lat,lon,type,quest,image&#039;)&lt;br /&gt;
        .then(response =&amp;gt; response.json())&lt;br /&gt;
        .then(data =&amp;gt; {&lt;br /&gt;
            map.eachLayer(layer =&amp;gt; {&lt;br /&gt;
                if (layer instanceof L.Marker) map.removeLayer(layer);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            // Проверяем структуру ответа&lt;br /&gt;
            var objects = data.results || data;&lt;br /&gt;
            &lt;br /&gt;
            objects.forEach(obj =&amp;gt; {&lt;br /&gt;
                var lat = parseFloat(obj.lat);&lt;br /&gt;
                var lon = parseFloat(obj.lon);&lt;br /&gt;
                if (isNaN(lat) || isNaN(lon)) return;&lt;br /&gt;
                &lt;br /&gt;
                var icon = getIconByType(obj.type);&lt;br /&gt;
                var popupHtml = &#039;&amp;lt;b&amp;gt;&#039; + obj.name + &#039;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                &#039;&amp;lt;b&amp;gt;Тип:&amp;lt;/b&amp;gt; &#039; + obj.type + &#039;&amp;lt;br&amp;gt;&#039; +&lt;br /&gt;
                                obj.address + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.quest) popupHtml += &#039;&amp;lt;b&amp;gt;🎯 Квест:&amp;lt;/b&amp;gt; &#039; + obj.quest + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.description) popupHtml += &#039;&amp;lt;b&amp;gt;Описание:&amp;lt;/b&amp;gt; &#039; + obj.description + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                if (obj.page) popupHtml += &#039;&amp;lt;a href=&amp;quot;/index.php/&#039; + encodeURIComponent(obj.page) + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;📖 Читать подробнее&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
                L.marker([lat, lon], {icon: icon}).addTo(map).bindPopup(popupHtml);&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
            &lt;br /&gt;
            if (objects.length === 0) {&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;😕 Нет мест. Добавь первое!&#039;;&lt;br /&gt;
                document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
        .catch(error =&amp;gt; {&lt;br /&gt;
            console.error(&#039;Ошибка загрузки данных:&#039;, error);&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).innerHTML = &#039;⚠️ Не удалось загрузить данные. Попробуйте позже.&#039;;&lt;br /&gt;
            document.getElementById(&#039;loading-message&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
drawMarkers();&lt;br /&gt;
&lt;br /&gt;
var attributionControl = map.attributionControl;&lt;br /&gt;
if (attributionControl) {&lt;br /&gt;
    attributionControl.setPrefix(&#039;&#039;);&lt;br /&gt;
    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
    style.innerHTML = &#039;.leaflet-attribution-flag { display: none !important; }&#039;;&lt;br /&gt;
    document.head.appendChild(style);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin Gorod</name></author>
	</entry>
</feed>