「Widget:Custom map」の版間の差分
提供:ゼルダの伝説 知恵のかりもの 攻略Wiki
ヘイグ運営用アカウント (トーク | 投稿記録) 編集の要約なし |
ヘイグ運営用アカウント (トーク | 投稿記録) 編集の要約なし |
||
14行目: | 14行目: | ||
<link rel="stylesheet" href="https://dq.h1g.jp/img/marker-icon-img/editable-popup.css" /> | <link rel="stylesheet" href="https://dq.h1g.jp/img/marker-icon-img/editable-popup.css" /> | ||
<script src="https://cdnjs.cloudflare.com/ajax/libs/lightgallery/2.7.2/lightgallery.min.js"></script> | <script src="https://cdnjs.cloudflare.com/ajax/libs/lightgallery/2.7.2/lightgallery.min.js"></script> | ||
<link rel="stylesheet" href="https://dq.h1g.jp/img/lightgallery.min.css"/> | <link rel="stylesheet" href="https://dq.h1g.jp/img/lightgallery.min.css"/> | ||
<script type="text/javascript"> | <script type="text/javascript"> | ||
511行目: | 509行目: | ||
function loadPinsFromWikiPage() { | function loadPinsFromWikiPage() { | ||
getMwToken() | |||
.then(function(token) { | |||
var geojsonPage = "<!--{$geojson}-->"; | |||
var url = API_BASE_URL + '/api.php'; | |||
console.log('Request URL:', url); | |||
return $.ajax({ | |||
type: "GET", | |||
url: url, | |||
data: { | |||
action: 'query', | |||
titles: geojsonPage, | |||
prop: 'revisions', | |||
rvprop: 'content', | |||
format: 'json', | |||
// 明示的にwikiを指定 | |||
redirects: 0 // リダイレクトを防ぐ | |||
}, | |||
headers: { | |||
'Authorization': 'Bearer ' + token | |||
} | |||
}); | |||
}) | |||
.then(function(response) { | |||
try { | try { | ||
// | // レスポンスからページコンテンツを取得 | ||
const pages = response.query.pages; | |||
const pageId = Object.keys(pages)[0]; | |||
const content = pages[pageId].revisions[0]['*']; | |||
// GeoJSONデータを抽出して処理 | |||
const geoJSONData = JSON.parse(content); | |||
processGeoJSONData(geoJSONData); | |||
processGeoJSONData( | |||
} catch (error) { | } catch (error) { | ||
console.error("Error processing data:", error); | console.error("Error processing data:", error); | ||
throw error; | |||
} | } | ||
} | }) | ||
.catch(function(error) { | |||
console.error("Error loading data:", error); | |||
// | // より詳細なエラー情報を表示 | ||
console.error('Detailed error:', { | |||
message: error.message, | |||
status: error.status, | |||
responseText: error.responseText | |||
}); | |||
}); | |||
} | } | ||
681行目: | 683行目: | ||
// トークンを取得する関数 | |||
function getMwToken() { | |||
return new Promise((resolve, reject) => { | |||
$.ajax({ | |||
url: API_BASE_URL + '/api.php', | |||
data: { | |||
action: 'query', | |||
meta: 'tokens', | |||
type: 'csrf', | |||
format: 'json' | |||
}, | |||
type: 'GET', | |||
success: function(response) { | |||
if (response.query && response.query.tokens && response.query.tokens.csrftoken) { | |||
resolve(response.query.tokens.csrftoken); | |||
} else { | |||
reject(new Error('Failed to get token')); | |||
} | |||
}, | |||
error: function(xhr, status, error) { | |||
reject(error); | |||
} | |||
}); | |||
}); | |||
} | |||
function saveToWikiPage(geoJSONData) { | function saveToWikiPage(geoJSONData) { | ||
var formattedData = geoJSONData; | var formattedData = geoJSONData; | ||
$.ajax({ | |||
// 保存前に新しいトークンを取得 | |||
getMwToken() | |||
.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行目: | 733行目: | ||
drawControl.remove(); | drawControl.remove(); | ||
editButton.state('enable-edit'); | editButton.state('enable-edit'); | ||
saveButton.remove(); | saveButton.remove(); | ||
// 保存成功後、新しいトークンで再読み込み | |||
getMwToken() | |||
.then(function(newToken) { | |||
loadPinsFromWikiPage(newToken); | |||
}) | |||
.catch(function(error) { | |||
console.error("Failed to get token for reload:", error); | |||
}); | |||
} else { | } else { | ||
throw new Error('保存に失敗しました'); | |||
} | } | ||
} | }) | ||
.catch(function(error) { | |||
console.error("Save error:", error); | console.error("Save error:", error); | ||
alert('データの保存に失敗しました: ' + error.message); | |||
}); | |||
alert(' | |||
} | } | ||
map.on(L.Draw.Event.CREATED, function (event) { | map.on(L.Draw.Event.CREATED, function (event) { | ||
var layer = event.layer; | var layer = event.layer; | ||
734行目: | 772行目: | ||
setTimeout(function() { | setTimeout(function() { | ||
map.invalidateSize(); | map.invalidateSize(); | ||
loadPinsFromWikiPage(); | // 初期読み込み時にトークンを取得してからデータを読み込む | ||
}, 500); | getMwToken() | ||
.then(function(token) { | |||
console.log('Initial token obtained'); | |||
loadPinsFromWikiPage(token); | |||
}) | |||
.catch(function(error) { | |||
console.error("Failed to get initial token:", error); | |||
alert('データの読み込みに失敗しました。ページを再読み込みしてください。'); | |||
}); | |||
}, 500); | |||
}); | }); | ||
</script> | </script> | ||
</includeonly> | </includeonly> |