「Widget:Custom map」の版間の差分
提供:メタファー リファンタジオ 攻略Wiki
ヘイグ運営用アカウント (トーク | 投稿記録) 編集の要約なし タグ: 手動差し戻し |
ヘイグ運営用アカウント (トーク | 投稿記録) 編集の要約なし タグ: 差し戻し済み |
||
508行目: | 508行目: | ||
// トークン取得のユーティリティ関数 | |||
function getNewToken() { | |||
return $.ajax({ | |||
url: API_BASE_URL + '/api.php', | |||
data: { | |||
action: 'query', | |||
meta: 'tokens', | |||
type: 'csrf', | |||
format: 'json' | |||
}, | |||
type: 'GET', | |||
dataType: 'json' | |||
}) | |||
.then(function(tokenData) { | |||
if (!tokenData.query || !tokenData.query.tokens || !tokenData.query.tokens.csrftoken) { | |||
throw new Error('Failed to get CSRF token'); | |||
} | |||
return tokenData.query.tokens.csrftoken; | |||
}); | |||
} | |||
515行目: | 536行目: | ||
var url = API_BASE_URL + '/index.php/' + geojsonPage; | var url = API_BASE_URL + '/index.php/' + geojsonPage; | ||
$.ajax({ | // まず新しいトークンを取得 | ||
getNewToken() | |||
.then(function(token) { | |||
return $.ajax({ | |||
type: "GET", | |||
url: API_BASE_URL + '/api.php', | |||
data: { | |||
action: 'query', | |||
prop: 'revisions', | |||
titles: geojsonPage, | |||
rvprop: 'content', | |||
format: 'json', | |||
token: token | |||
}, | |||
dataType: 'json' | |||
}); | |||
}) | |||
.then(function(response) { | |||
try { | try { | ||
// | // レスポンスからページコンテンツを取得 | ||
const pages = response.query.pages; | |||
const pageId = Object.keys(pages)[0]; | |||
var | const content = pages[pageId].revisions[0]['*']; | ||
if (! | |||
throw new Error(" | // GeoJSONデータを抽出 | ||
const geoJSONMatch = content.match(/var GeoJson =(\{[\s\S]*\});/); | |||
if (!geoJSONMatch || geoJSONMatch.length < 2) { | |||
throw new Error("GeoJSON data not found"); | |||
} | } | ||
const parsedData = JSON.parse(geoJSONMatch[1]); | |||
processGeoJSONData(parsedData); | processGeoJSONData(parsedData); | ||
} catch (error) { | } catch (error) { | ||
console.error("Error processing data:", error); | console.error("Error processing data:", error); | ||
// | // エラーが発生した場合は再読み込みを試みる | ||
setTimeout(loadPinsFromWikiPage, 2000); | |||
} | } | ||
} | }) | ||
.catch(function(error) { | |||
console.error("Error loading map data:", error); | |||
// | // エラーが発生した場合は再読み込みを試みる | ||
setTimeout(loadPinsFromWikiPage, 2000); | |||
}); | |||
} | } | ||
684行目: | 709行目: | ||
function saveToWikiPage(geoJSONData) { | function saveToWikiPage(geoJSONData) { | ||
var formattedData = geoJSONData; | var formattedData = geoJSONData; | ||
$.ajax({ | |||
getNewToken() | |||
.then(function(token) { | |||
return $.ajax({ | |||
type: "POST", | |||
url: API_BASE_URL + '/api.php', | |||
data: { | |||
action: 'edit', | |||
title: '<!--{$geojson}-->', | |||
} | text: formattedData, | ||
token: token, | |||
format: 'json' | |||
} | |||
}); | |||
}) | |||
.then(function(response) { | |||
if (response.edit && response.edit.result === 'Success') { | if (response.edit && response.edit.result === 'Success') { | ||
alert('データは正常に保存されました'); | alert('データは正常に保存されました'); | ||
701行目: | 730行目: | ||
drawControl.remove(); | drawControl.remove(); | ||
editButton.state('enable-edit'); | editButton.state('enable-edit'); | ||
saveButton.remove(); | saveButton.remove(); | ||
setTimeout(function() { | setTimeout(function() { | ||
709行目: | 738行目: | ||
alert('Error saving data: ' + JSON.stringify(response)); | alert('Error saving data: ' + JSON.stringify(response)); | ||
} | } | ||
} | }) | ||
.catch(function(error) { | |||
console.error("Save error:", error); | console.error("Save error:", error); | ||
alert('Error saving data: ' + error.message); | |||
// | |||
// エラーが発生した場合、再試行オプションを提供 | |||
if (confirm('保存に失敗しました。再試行しますか?')) { | |||
saveToWikiPage(geoJSONData); | |||
} | |||
}); | |||
} | } | ||
map.on(L.Draw.Event.CREATED, function (event) { | map.on(L.Draw.Event.CREATED, function (event) { | ||
var layer = event.layer; | var layer = event.layer; | ||
732行目: | 765行目: | ||
// ページ読み込み時にデータを読み込む | // ページ読み込み時にデータを読み込む | ||
$(document).ready(function() { | $(document).ready(function() { | ||
// 地図の初期化後にデータを読み込む | |||
setTimeout(function() { | setTimeout(function() { | ||
map.invalidateSize(); | map.invalidateSize(); | ||
loadPinsFromWikiPage(); | |||
}, 500); | // セッションの初期化とトークンの取得 | ||
getNewToken() | |||
.then(function() { | |||
loadPinsFromWikiPage(); | |||
}) | |||
.catch(function(error) { | |||
console.error("Initial token error:", error); | |||
// エラーが発生した場合は再試行 | |||
setTimeout(loadPinsFromWikiPage, 2000); | |||
}); | |||
}, 500); | |||
}); | }); | ||
// 定期的なトークンの更新 | |||
setInterval(function() { | |||
getNewToken() | |||
.then(function(token) { | |||
console.log("Token refreshed successfully"); | |||
}) | |||
.catch(function(error) { | |||
console.error("Token refresh error:", error); | |||
}); | |||
}, 1800000); // 30分ごとにトークンを更新 | |||
</script> | </script> | ||
</includeonly> | </includeonly> |