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:
1 parent
22dc14c8c8
commit
b8c0422318
3 files changed
+55
-62
No files matched your search
@@ -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 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 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; ?>
|
||||||
@@ -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 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>
|
||||||
|
|||||||
@@ -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 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>
|
||||||
|
|||||||
Reference in new issue
Block a user