refactor(modalidades): partilhar _form.php entre create e edit (audit 6.8)

Extrai os campos comuns (nome, cor, ícone/upload, ordem, descrição, e a
biblioteca de ícones disponíveis) para _form.php, seguindo o padrão de
events/ e memberships/. A diferença genuína entre criar e editar — o
bloco de ícone mostra pré-visualização e checkbox "remover imagem
atual" só quando já existe um registo — fica como um if ($item ===
null) explícito dentro do parcial, tal como o hero_image em events/.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
andreandClaude Sonnet 5 committed 2026-09-25 21:45:14 +01:00
1 parent 22dc14c8c8
commit b8c0422318
3 files changed
+55 -62

No files matched your search

+53
View File
@@ -0,0 +1,53 @@
<?php
// Shared modalidade form fields, rendered inside the <form> of both create.php and
// edit.php. Expects:
// $data : associative array with every modalidades column (nome, cor, icon,
// descricao, item_order)
// $item : the existing row on edit (for the current icon preview/remove
// checkbox), or null
// $icons : rows from db_flaticon_list($pdo) — the shared icon library
$item = $item ?? null;
?>
<div class="row g-3">
<div class="col-md-8"><label class="form-label">Nome <span class="text-danger">*</span></label>
<input class="form-control" name="nome" required value="<?= htmlspecialchars($data['nome'] ?? '') ?>"></div>
<div class="col-md-4"><label class="form-label">Cor</label>
<input type="color" class="form-control form-control-color" name="cor" value="<?= htmlspecialchars($data['cor'] ?? '#808080') ?>"></div>
<?php if ($item === null): ?>
<div class="col-md-6"><label class="form-label">Ícone (nome do ficheiro)</label>
<input class="form-control" name="icon" placeholder="ex: crossfit.png" value="<?= htmlspecialchars($data['icon'] ?? '') ?>">
<div class="form-text">Escolha um da biblioteca abaixo, ou carregue um novo.</div></div>
<div class="col-md-6"><label class="form-label">Carregar imagem</label>
<input type="file" class="form-control" name="icon_file" accept=".png,.jpg,.jpeg,.gif,.webp,.svg">
<div class="form-text">Substitui o nome acima. Máx. 2&nbsp;MB.</div></div>
<?php else: ?>
<div class="col-md-6"><label class="form-label">Ícone</label>
<input class="form-control" name="icon" value="<?= htmlspecialchars($data['icon'] ?? '') ?>">
<?php if (!empty($item['icon'])): ?><div class="form-text"><img src="<?= base_url('uploads/modalidades/icons/' . $item['icon']) ?>" style="height:28px;"> atual</div><?php endif; ?></div>
<div class="col-md-6"><label class="form-label">Carregar imagem</label>
<input type="file" class="form-control" name="icon_file" accept=".png,.jpg,.jpeg,.gif,.webp,.svg">
<div class="form-text">Substitui o ícone atual. Máx. 2&nbsp;MB.</div>
<?php if (!empty($item['icon'])): ?>
<div class="form-check mt-2">
<input class="form-check-input" type="checkbox" name="remove_icon" id="remove_icon" value="1">
<label class="form-check-label small" for="remove_icon">Remover imagem atual</label>
</div>
<?php endif; ?></div>
<?php endif; ?>
<div class="col-md-3"><label class="form-label">Ordem</label>
<input type="number" class="form-control" name="item_order" value="<?= (int) ($data['item_order'] ?? 0) ?>" min="0"></div>
<div class="col-12"><label class="form-label">Descrição</label>
<textarea class="form-control js-wysiwyg" data-wysiwyg-height="200" name="descricao" rows="3"><?= htmlspecialchars($data['descricao'] ?? '') ?></textarea></div>
</div>
<?php if ($icons): ?>
<div class="mt-3"><label class="form-label small text-muted">Ícones disponíveis</label>
<div class="d-flex flex-wrap gap-3">
<?php foreach ($icons as $icon): ?>
<div class="text-center" style="width:90px">
<img src="<?= base_url('uploads/modalidades/icons/' . $icon['name']) ?>" alt="" style="height:28px" onerror="this.style.display='none'">
<div class="small text-muted text-truncate"><?= htmlspecialchars($icon['name']) ?></div>
</div>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
+1 -28
View File
@@ -43,34 +43,7 @@ include __DIR__ . '/../../../includes/header.php';
<form method="POST" enctype="multipart/form-data" class="card shadow-sm"><div class="card-body"> <form method="POST" enctype="multipart/form-data" class="card shadow-sm"><div class="card-body">
<?= csrf_field() ?> <?= csrf_field() ?>
<div class="row g-3"> <?php include __DIR__ . '/_form.php'; ?>
<div class="col-md-8"><label class="form-label">Nome <span class="text-danger">*</span></label>
<input class="form-control" name="nome" required value="<?= htmlspecialchars($data['nome']) ?>"></div>
<div class="col-md-4"><label class="form-label">Cor</label>
<input type="color" class="form-control form-control-color" name="cor" value="<?= htmlspecialchars($data['cor']) ?>"></div>
<div class="col-md-6"><label class="form-label">Ícone (nome do ficheiro)</label>
<input class="form-control" name="icon" placeholder="ex: crossfit.png" value="<?= htmlspecialchars($data['icon']) ?>">
<div class="form-text">Escolha um da biblioteca abaixo, ou carregue um novo.</div></div>
<div class="col-md-6"><label class="form-label">Carregar imagem</label>
<input type="file" class="form-control" name="icon_file" accept=".png,.jpg,.jpeg,.gif,.webp,.svg">
<div class="form-text">Substitui o nome acima. Máx. 2&nbsp;MB.</div></div>
<div class="col-md-3"><label class="form-label">Ordem</label>
<input type="number" class="form-control" name="item_order" value="<?= (int) $data['item_order'] ?>" min="0"></div>
<div class="col-12"><label class="form-label">Descrição</label>
<textarea class="form-control js-wysiwyg" data-wysiwyg-height="200" name="descricao" rows="3"><?= htmlspecialchars($data['descricao']) ?></textarea></div>
</div>
<?php if ($icons): ?>
<div class="mt-3"><label class="form-label small text-muted">Ícones disponíveis</label>
<div class="d-flex flex-wrap gap-3">
<?php foreach ($icons as $icon): ?>
<div class="text-center" style="width:90px">
<img src="<?= base_url('uploads/modalidades/icons/' . $icon['name']) ?>" alt="" style="height:28px" onerror="this.style.display='none'">
<div class="small text-muted text-truncate"><?= htmlspecialchars($icon['name']) ?></div>
</div>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
<div class="mt-4 d-flex gap-2"> <div class="mt-4 d-flex gap-2">
<button type="submit" class="btn btn-primary">Guardar</button> <button type="submit" class="btn btn-primary">Guardar</button>
<a class="btn btn-outline-secondary" href="index.php">Cancelar</a> <a class="btn btn-outline-secondary" href="index.php">Cancelar</a>
+1 -34
View File
@@ -70,40 +70,7 @@ include __DIR__ . '/../../../includes/header.php';
<form method="POST" enctype="multipart/form-data" class="card shadow-sm"><div class="card-body"> <form method="POST" enctype="multipart/form-data" class="card shadow-sm"><div class="card-body">
<?= csrf_field() ?> <?= csrf_field() ?>
<div class="row g-3"> <?php include __DIR__ . '/_form.php'; ?>
<div class="col-md-8"><label class="form-label">Nome <span class="text-danger">*</span></label>
<input class="form-control" name="nome" required value="<?= htmlspecialchars($data['nome'] ?? '') ?>"></div>
<div class="col-md-4"><label class="form-label">Cor</label>
<input type="color" class="form-control form-control-color" name="cor" value="<?= htmlspecialchars($data['cor'] ?? '#808080') ?>"></div>
<div class="col-md-6"><label class="form-label">Ícone</label>
<input class="form-control" name="icon" value="<?= htmlspecialchars($data['icon'] ?? '') ?>">
<?php if (!empty($item['icon'])): ?><div class="form-text"><img src="<?= base_url('uploads/modalidades/icons/' . $item['icon']) ?>" style="height:28px;"> atual</div><?php endif; ?></div>
<div class="col-md-6"><label class="form-label">Carregar imagem</label>
<input type="file" class="form-control" name="icon_file" accept=".png,.jpg,.jpeg,.gif,.webp,.svg">
<div class="form-text">Substitui o ícone atual. Máx. 2&nbsp;MB.</div>
<?php if (!empty($item['icon'])): ?>
<div class="form-check mt-2">
<input class="form-check-input" type="checkbox" name="remove_icon" id="remove_icon" value="1">
<label class="form-check-label small" for="remove_icon">Remover imagem atual</label>
</div>
<?php endif; ?></div>
<div class="col-md-3"><label class="form-label">Ordem</label>
<input type="number" class="form-control" name="item_order" value="<?= (int) ($data['item_order'] ?? 0) ?>" min="0"></div>
<div class="col-12"><label class="form-label">Descrição</label>
<textarea class="form-control js-wysiwyg" data-wysiwyg-height="200" name="descricao" rows="3"><?= htmlspecialchars($data['descricao'] ?? '') ?></textarea></div>
</div>
<?php if ($icons): ?>
<div class="mt-3"><label class="form-label small text-muted">Ícones disponíveis</label>
<div class="d-flex flex-wrap gap-3">
<?php foreach ($icons as $icon): ?>
<div class="text-center" style="width:90px">
<img src="<?= base_url('uploads/modalidades/icons/' . $icon['name']) ?>" alt="" style="height:28px" onerror="this.style.display='none'">
<div class="small text-muted text-truncate"><?= htmlspecialchars($icon['name']) ?></div>
</div>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
<div class="mt-4 d-flex gap-2"> <div class="mt-4 d-flex gap-2">
<button type="submit" class="btn btn-primary">Atualizar</button> <button type="submit" class="btn btn-primary">Atualizar</button>
<a class="btn btn-outline-secondary" href="index.php">Cancelar</a> <a class="btn btn-outline-secondary" href="index.php">Cancelar</a>