diff --git a/admin.php b/admin.php index 7cfae93..9e1ab44 100644 --- a/admin.php +++ b/admin.php @@ -338,7 +338,7 @@ if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST["action"]) && $_POST[" $required_quantity = (int)$_POST["required_quantity"]; if ($required_quantity <= 0) { - header("Location: admin.php?tab=levels&error=invalid_quantity"); + header("Location: admin.php?tab=levels&error=invalid_amount"); exit; } @@ -409,15 +409,21 @@ if (isset($_GET['delete_resource'])) { } // Handle Guild System Config +error_log(print_r($_POST, true)); if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST["action"]) && $_POST["action"] === "update_guild_requirements") { $db->exec("DELETE FROM guild_creation_requirements"); - $stmt = $db->prepare("INSERT INTO guild_creation_requirements (resource_id, quantity) VALUES (?, ?)"); + $stmt = $db->prepare("INSERT INTO guild_creation_requirements (resource_id, amount) VALUES (?, ?)"); foreach ($_POST as $key => $value) { - if (strpos($key, "res_") === 0 && (int)$value > 0) { + if (strpos($key, "res_") === 0 && (int)$value >= 0) { $res_id = (int)str_replace("res_", "", $key); $stmt->execute([$res_id, (int)$value]); } } + + if (isset($_POST['guild_member_limit'])) { + $stmt = $db->prepare("UPDATE guild_restrictions SET value = ? WHERE restriction_key = 'member_limit'"); + $stmt->execute([(int)$_POST['guild_member_limit']]); + } header("Location: admin.php?tab=guilds&success=1"); exit; } @@ -563,6 +569,8 @@ $lootboxes_list = []; $project_logs_list = []; $levels_list = []; $ranks_list = []; +$guild_requirements = []; +$guild_member_limit = 50; if ($tab === 'users') { $users_list = $db->query("SELECT id, username, email, role FROM users ORDER BY username ASC")->fetchAll(); @@ -615,6 +623,10 @@ if ($tab === 'users') { $lb['items'] = $stmt_i->fetchAll(); } unset($lb); +} elseif ($tab === 'guilds') { + $guild_requirements = $db->query("SELECT r.id, r.name, r.icon, gr.amount FROM game_resources r LEFT JOIN guild_creation_requirements gr ON r.id = gr.resource_id")->fetchAll(); + $stmt = $db->query("SELECT value FROM guild_restrictions WHERE restriction_key = 'member_limit'"); + $guild_member_limit = $stmt->fetchColumn() ?: 50; } ?> @@ -714,7 +726,7 @@ if ($tab === 'users') {
- +
Erreur : La quantité doit être un nombre strictement positif.
@@ -727,9 +739,6 @@ if ($tab === 'users') { Utilisateurs Niveaux Grades -} elseif ($tab === 'guilds') { - $guild_requirements = $db->query("SELECT r.id, r.name, gr.quantity FROM game_resources r LEFT JOIN guild_creation_requirements gr ON r.id = gr.resource_id")->fetchAll(); - Titres & Badges "> Gestion de guilde
@@ -938,23 +947,28 @@ if ($tab === 'users') { - -} elseif ($tab === 'guilds') { - $guild_requirements = $db->query("SELECT r.id, r.name, gr.quantity FROM game_resources r LEFT JOIN guild_creation_requirements gr ON r.id = gr.resource_id")->fetchAll(); - - +

Gestion des Guildes

-

Coût de création d'une guilde

-
+

Paramètres globaux des Guildes

+ +
+ + +
+ +

Coût de création

- - + + @@ -1290,15 +1304,12 @@ if ($tab === 'users') {
@@ -1336,15 +1347,12 @@ if ($tab === 'users') {
@@ -1998,256 +2006,6 @@ function editStatus(data) { updateMSLabel('ms_orb'); updateMSLabel('ms_terr'); } - - function editSettlementType(data) { - document.getElementById('set_t_id').value = data.id; - document.getElementById('set_t_name').value = data.name; - document.getElementById('set_t_slug').value = data.slug; - document.getElementById('set_t_desc').value = data.description; - window.scrollTo(0,0); - } - function resetSettlementTypeForm() { document.getElementById('settlementTypeForm').reset(); document.getElementById('set_t_id').value = 0; } - - function editModifier(data) { - document.getElementById('mod_id').value = data.id; - document.getElementById('mod_name').value = data.name; - document.getElementById('mod_slug').value = data.slug || ''; - document.getElementById('mod_type').value = data.type; - document.getElementById('mod_desc').value = data.description; - window.scrollTo(0,0); - } - function resetModifierForm() { document.getElementById('modifierForm').reset(); document.getElementById('mod_id').value = 0; } - - function editFaction(data) { - document.getElementById('fac_id').value = data.id; - document.getElementById('fac_name').value = data.name; - document.getElementById('fac_slug').value = data.slug || ''; - const color = data.color || '#808080'; - document.getElementById('fac_color').value = color; - if (document.getElementById('fac_color_picker')) { - document.getElementById('fac_color_picker').value = color.startsWith('#') ? color : '#808080'; - } - document.getElementById('fac_fa_icon').value = data.fa_icon || ''; - - // Handle Alliances - document.querySelectorAll('.alliance-checkbox').forEach(cb => cb.checked = false); - document.querySelectorAll('.alliance-label').forEach(lbl => lbl.style.display = 'flex'); - - // Hide current faction from alliance list - const currentLabel = document.querySelector(`.alliance-label[data-id="${data.id}"]`); - if (currentLabel) currentLabel.style.display = 'none'; - - if (data.alliance_ids) { - data.alliance_ids.forEach(aid => { - const cb = document.querySelector(`.alliance-checkbox[value="${aid}"]`); - if (cb) cb.checked = true; - }); - } - window.scrollTo(0,0); - } - function resetFactionForm() { - document.getElementById('factionForm').reset(); - document.getElementById('fac_id').value = 0; - document.getElementById('fac_color').value = '#808080'; - document.getElementById('fac_color_picker').value = '#808080'; - document.querySelectorAll('.alliance-checkbox').forEach(cb => cb.checked = false); - document.querySelectorAll('.alliance-label').forEach(lbl => lbl.style.display = 'flex'); - } - - function editResource(data) { - document.getElementById('res_id').value = data.id; - document.getElementById('res_name').value = data.name; - document.getElementById('res_slug').value = data.slug; - document.getElementById('res_icon').value = data.icon || ''; - document.getElementById('res_desc').value = data.description || ''; - document.getElementById('res_show').checked = (data.show_in_header == 1); - window.scrollTo(0,0); - } - function resetResourceForm() { document.getElementById('resourceForm').reset(); document.getElementById('res_id').value = 0; } - - // --- LOOTBOX SYSTEM --- - function addRollRow(count = 1, prob = 100) { - const container = document.getElementById('rolls_container'); - const row = document.createElement('div'); - row.className = 'sub-form-row'; - row.innerHTML = ` - - -
×
- `; - container.appendChild(row); - } - - function toggleItemType(cb) { - const row = cb.closest('.sub-form-row'); - const probInput = row.querySelector('.item-prob-input'); - const typeLabel = row.querySelector('.type-label'); - if (cb.checked) { - probInput.style.visibility = 'hidden'; - probInput.value = 100; - typeLabel.textContent = 'DIRECT'; - typeLabel.style.color = '#a3be8c'; - } else { - probInput.style.visibility = 'visible'; - typeLabel.textContent = 'POULE'; - typeLabel.style.color = '#8c92a3'; - } - } - - function addItemRow(slug = '', prob = 0, qmin = 1, qmax = 1, isGuaranteed = 0) { - const container = document.getElementById('items_container'); - const rowIdx = container.children.length; - const row = document.createElement('div'); - row.className = 'sub-form-row'; - let options = ''; - resourcesList.forEach(r => { - options += ``; - }); - - row.innerHTML = ` -
- - ${isGuaranteed ? 'DIRECT' : 'POULE'} -
- - - - -
×
- `; - container.appendChild(row); - } - - function editLootbox(data) { - document.getElementById('lb_id').value = data.id; - document.getElementById('lb_name').value = data.name; - document.getElementById('lb_slug').value = data.slug; - document.getElementById('lb_desc').value = data.description || ''; - - document.getElementById('rolls_container').innerHTML = ''; - if (data.rolls && data.rolls.length > 0) { - data.rolls.forEach(r => addRollRow(r.roll_count, r.probability)); - } else { - addRollRow(); - } - - document.getElementById('items_container').innerHTML = ''; - if (data.items && data.items.length > 0) { - data.items.forEach((i, idx) => addItemRow(i.resource_slug, i.probability, i.quantity_min, i.quantity_max, i.is_guaranteed)); - } else { - addItemRow(); - } - window.scrollTo(0,0); - } - - function resetLootboxForm() { - document.getElementById('lootboxForm').reset(); - document.getElementById('lb_id').value = 0; - document.getElementById('rolls_container').innerHTML = ''; - document.getElementById('items_container').innerHTML = ''; - addRollRow(); - addItemRow(); - } - - - window.onload = function() { - if (document.getElementById('rolls_container').children.length === 0) addRollRow(); - if (document.getElementById('items_container').children.length === 0) addItemRow(); - }; - - - function toggleMS(id) { - const d = document.getElementById(id); - d.style.display = d.style.display === 'block' ? 'none' : 'block'; - } - function updateMSLabel(containerId) { - const container = document.getElementById(containerId); - const checkboxes = container.querySelectorAll('input[type="checkbox"]:checked'); - const display = container.querySelector('.ms-display'); - if (checkboxes.length === 0) { - display.innerText = "Toutes / Peu importe"; - } else { - const labels = Array.from(checkboxes).map(cb => cb.parentElement.innerText.trim()); - display.innerText = labels.join(', '); - } - } - document.addEventListener('click', function(e) { - if (!e.target.closest('.ms-container')) { - document.querySelectorAll('.ms-dropdown').forEach(d => d.style.display = 'none'); - } - }); - - function editLevel(data) { - document.getElementById("level_id").value = data.id; - document.getElementById("level_name").value = data.name; - document.getElementById("level_slug").value = data.slug; - document.getElementById("level_resource_id").value = data.resource_id; - document.getElementById("level_required_quantity").value = data.required_quantity; - window.scrollTo(0,0); - } - function resetLevelForm() { - document.getElementById("levelForm").reset(); - document.getElementById("level_id").value = 0; - const select = document.getElementById("level_resource_id"); - for (let i = 0; i < select.options.length; i++) { - if (select.options[i].text.toLowerCase().includes("expérience") || select.options[i].text.toLowerCase().includes("experience")) { - select.selectedIndex = i; - break; - } - } - } - -function updateRankFields() { - const type = document.getElementById('rank_type').value; - const min = document.getElementById('rank_min'); - const max = document.getElementById('rank_max'); - if (type === 'utilisateur') { - min.disabled = false; - max.disabled = false; - min.required = true; - max.required = true; - min.style.opacity = '1'; - max.style.opacity = '1'; - } else { - min.disabled = true; - max.disabled = true; - min.required = false; - max.required = false; - min.style.opacity = '0.5'; - max.style.opacity = '0.5'; - min.value = ''; - max.value = ''; - } -} - -function editRank(rank) { - document.getElementById('rank_id').value = rank.id; - document.getElementById('rank_name').value = rank.name; - document.getElementById('rank_slug').value = rank.slug; - document.getElementById('rank_type').value = rank.user_type; - document.getElementById('rank_min').value = rank.min_level || ''; - document.getElementById('rank_max').value = rank.max_level || ''; - updateRankFields(); - window.scrollTo({ top: 0, behavior: 'smooth' }); -} - -function resetRankForm() { - document.getElementById('rankForm').reset(); - document.getElementById('rank_id').value = '0'; - updateRankFields(); -} - -// Initial call to set fields on load -document.addEventListener('DOMContentLoaded', function() { - if (document.getElementById('rank_type')) { - updateRankFields(); - } -}); - \ No newline at end of file diff --git a/db/migrate_guild_system.php b/db/migrate_guild_system.php index 1be1ba2..bd4ad85 100644 --- a/db/migrate_guild_system.php +++ b/db/migrate_guild_system.php @@ -12,12 +12,20 @@ $pdo->exec("CREATE TABLE IF NOT EXISTS guilds ( $pdo->exec("CREATE TABLE IF NOT EXISTS guild_creation_requirements ( id INT AUTO_INCREMENT PRIMARY KEY, resource_id INT NOT NULL, - quantity INT NOT NULL, + amount INT NOT NULL, FOREIGN KEY (resource_id) REFERENCES game_resources(id) )"); +// Vérifier si la table guild_restrictions existe déjà et ajouter la colonne si nécessaire $pdo->exec("CREATE TABLE IF NOT EXISTS guild_restrictions ( id INT AUTO_INCREMENT PRIMARY KEY, - restriction_key VARCHAR(255) NOT NULL, - restriction_value TEXT + restriction_key VARCHAR(255) NOT NULL UNIQUE, + value VARCHAR(255) NOT NULL, + description TEXT )"); + +// Migration pour ajouter member_limit si elle n'existe pas +$stmt = $pdo->query("SELECT COUNT(*) FROM guild_restrictions WHERE restriction_key = 'member_limit'"); +if ($stmt->fetchColumn() == 0) { + $pdo->exec("INSERT INTO guild_restrictions (restriction_key, value, description) VALUES ('member_limit', '50', 'Nombre maximum de membres par guilde')"); +} \ No newline at end of file
RessourceQuantité requise
" value=""> + + + " value="">