- Contactos: nova página no backoffice (fitme3070_info) e 964 201 137 como telefone principal; o telefone secundário só aparece quando existe. - Equipa: título, aptidões/funções e formações; o cartão mostra foto, nome e título e abre um cartão horizontal de detalhe (hover no desktop, toque no telemóvel) sem mexer na grelha. - Mensalidades: cartões editáveis com um destaque, modal de inscrição que guarda o pedido (RGPD + estado + campos reservados para o CRM) e avisa o ginásio por e-mail; lista de pedidos com estados, notas e CSV. - Reviews Google via Places API (New), filtradas por classificação mínima e em cache configurável; página de configuração com pesquisa do Place ID. - Assets com ?v=<mtime>: site/assets é servido com cache imutável de 1 ano. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
64 lines
3.7 KiB
PHP
64 lines
3.7 KiB
PHP
<?php
|
|
// Shared membership form fields, rendered inside the <form> of create.php and
|
|
// edit.php. Expects $data (see memberships_defaults()).
|
|
$price_val = ($data['price'] ?? '') === null ? '' : (string) ($data['price'] ?? '');
|
|
if ($price_val !== '' && is_numeric($price_val)) {
|
|
$p = (float) $price_val;
|
|
$price_val = number_format($p, floor($p) == $p ? 0 : 2, ',', '');
|
|
}
|
|
?>
|
|
<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="name" required maxlength="100" placeholder="ex.: Off-hours" value="<?= htmlspecialchars($data['name'] ?? '') ?>">
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label">Ordem</label>
|
|
<input type="number" class="form-control" name="item_order" value="<?= (int) ($data['item_order'] ?? 0) ?>">
|
|
<div class="form-text">Menor aparece primeiro.</div>
|
|
</div>
|
|
<div class="col-12">
|
|
<label class="form-label">Descrição curta</label>
|
|
<input class="form-control" name="subtitle" maxlength="255" placeholder="ex.: Mensalidade para as horas baixas do ginásio." value="<?= htmlspecialchars($data['subtitle'] ?? '') ?>">
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label">Preço (€)</label>
|
|
<input class="form-control" name="price" inputmode="decimal" placeholder="ex.: 34,90" value="<?= htmlspecialchars($price_val) ?>">
|
|
<div class="form-text">Vazio = «Sob consulta».</div>
|
|
</div>
|
|
<div class="col-md-5">
|
|
<label class="form-label">Texto do preço</label>
|
|
<input class="form-control" name="price_suffix" maxlength="60" placeholder="/mês" value="<?= htmlspecialchars($data['price_suffix'] ?? '') ?>">
|
|
<div class="form-text">ex.: «/mês» ou «acresce à mensalidade».</div>
|
|
</div>
|
|
<div class="col-md-3 d-flex align-items-center">
|
|
<div class="form-check mt-3">
|
|
<input class="form-check-input" type="checkbox" name="is_addon" id="is_addon" value="1" <?= !empty($data['is_addon']) ? 'checked' : '' ?>>
|
|
<label class="form-check-label" for="is_addon">Acresce à mensalidade <span class="text-muted small">(mostra «+»)</span></label>
|
|
</div>
|
|
</div>
|
|
<div class="col-12">
|
|
<label class="form-label">Incluído</label>
|
|
<textarea class="form-control" name="features" rows="5" placeholder="Um ponto por linha"><?= htmlspecialchars($data['features'] ?? '') ?></textarea>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label">Texto do botão</label>
|
|
<input class="form-control" name="cta_label" maxlength="40" value="<?= htmlspecialchars($data['cta_label'] ?? 'Inscrever') ?>">
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label">Selo do destaque</label>
|
|
<input class="form-control" name="featured_label" maxlength="40" value="<?= htmlspecialchars($data['featured_label'] ?? 'Mais popular') ?>">
|
|
</div>
|
|
<div class="col-md-4 d-flex flex-column justify-content-end gap-1">
|
|
<div class="form-check">
|
|
<input class="form-check-input" type="checkbox" name="is_featured" id="is_featured" value="1" <?= !empty($data['is_featured']) ? 'checked' : '' ?>>
|
|
<label class="form-check-label" for="is_featured">Em destaque</label>
|
|
</div>
|
|
<div class="form-check">
|
|
<input class="form-check-input" type="checkbox" name="is_active" id="is_active" value="1" <?= !empty($data['is_active']) ? 'checked' : '' ?>>
|
|
<label class="form-check-label" for="is_active">Visível no site</label>
|
|
</div>
|
|
</div>
|
|
<div class="col-12"><div class="form-text mt-0">Só um cartão pode estar em destaque — ao marcar este, o anterior deixa de estar.</div></div>
|
|
</div>
|