Files
FamilyBook/templates/trips/form.php
T

125 lines
6.3 KiB
PHP
Raw Normal View History

<?php
/**
* 新建 / 编辑旅程(v24 第 16 批精简)。
*
* ⚠️ 术语(用户第 9 条):这一层是**旅程**(容器),里面一段一段的是**行程**。
*
* 用户第 10 条原话:「新建旅程里面,怎么还有备注啊,同行的人啊,这些都不要了,
* 这些都是从行程里面总结出来的。在新建旅程和编辑旅程的时候,都不要了。」
* 上一批(第 4 条)已经定过主区就三项:标题 → 题图 → 简介。
* 所以现在这张表单**只剩这三项 + 公开开关**:
* · 同行的人 —— 删掉(参与人 = 各段行程参与人的合集,在详情页算出来)
* · 备注 —— 删掉(用户明确"都不要了")
* · 时间 / 城市 —— 本来就不是输入项(从行程派生)
* 「公开」保留:它是"这个旅程要不要出现在列表与日历上"的**隐私开关**,
* 不是从行程里能总结出来的信息。
*
* @param array|null $t 编辑时的旅程;null = 新建
* @param array $errors 校验错误
*/
$isEdit = !empty($t);
$canWrite = \App\Auth::canWrite();
$cvSlot = \App\ImageSlot::get('cover') ?: ['ratio' => '16:9', 'w' => 1600, 'h' => 900,
'label' => '题图', 'hint' => ''];
$hasCover = $isEdit && !empty($t['cover_key']);
?>
<div class="page-head">
<h1><?= $isEdit ? '编辑旅程' : '新建旅程' ?></h1>
<span class="sub">旅程里装行程;参与人、城市、天数、花销都从行程里汇总</span>
<div class="actions">
<a class="btn btn-ghost"
href="<?= e($isEdit ? url('trips/show', ['id' => (int)$t['id']]) : url('trips')) ?>">返回</a>
</div>
</div>
<div class="card card-pad">
<form method="post" enctype="multipart/form-data"
action="<?= e(url($isEdit ? 'trips/update' : 'trips/create')) ?>">
<?= csrf_field() ?>
<?php if ($isEdit): ?>
<input type="hidden" name="id" value="<?= (int)$t['id'] ?>">
<?php endif; ?>
<?php /* ==================== ① 标题 ==================== */ ?>
<div class="field full">
<label for="t-title">这个旅程叫什么 *</label>
<input class="input" id="t-title" name="title" required autofocus
value="<?= e(old('title', $t['title'] ?? '')) ?>" placeholder="如:青岛之行 · 2026 暑假">
<?php if (!empty($errors['title'])): ?><span class="err"><?= e($errors['title']) ?></span><?php endif; ?>
</div>
<?php /* ==================== ② 题图(上传 + 16:9 裁剪)====================
⚠️ data-pick-input 让 app.js 的通用逻辑接管"点图 = 开文件框" ——
少了它会"看着能点、点了没反应"(第 15 批用户报过的那个 bug)。 */ ?>
<div class="field full">
<label>题图</label>
<div class="cover-picker">
<img id="cover-preview"
src="<?= e($hasCover ? media_url((string)$t['cover_key']) : '') ?>"
alt="" title="点击选择题图"
data-pick-input="#t-cover"
data-has-cover="<?= $hasCover ? '1' : '0' ?>">
<input class="sr-only" id="t-cover" name="cover" type="file" accept="image/*"
data-crop-ratio="<?= e((string)$cvSlot['ratio']) ?>"
data-crop-w="<?= (int)$cvSlot['w'] ?>"
data-crop-h="<?= (int)$cvSlot['h'] ?>"
data-crop-label="<?= e((string)$cvSlot['label']) ?>"
data-crop-hint="<?= e((string)$cvSlot['hint']) ?>"
data-crop-preview="#cover-preview">
<?php /* 用户挑的裁剪框(归一化 0..1);没裁就留空 = 服务端按 16:9 居中裁 */ ?>
<input type="hidden" name="cover_crop" value="">
<span class="avatar-hint small muted">
点左边那块选题图,选完弹裁剪框。<br>
题图是 16:9 的宽幅横图,详情页也按 16:9 显示。
<?php if ($hasCover): ?>不换图就不用管这里。<?php endif; ?>
</span>
</div>
</div>
<?php /* ==================== ③ 简介 ==================== */ ?>
<div class="field full">
<label for="t-sum">一段简介</label>
<textarea class="input" id="t-sum" name="summary" rows="3"
placeholder="这趟玩得怎么样、为什么想记下来"><?= e(old('summary', $t['summary'] ?? '')) ?></textarea>
</div>
<?php /* ---- 公开开关(隐私开关,不是"从行程总结"出来的信息)----
⚠️ 先放 hidden=0:不勾选时提交的是"明确的不公开",而不是"这个字段没出现"
(后者会被当成"没传"而默认公开,于是"取消勾选"看起来毫无作用)。 */ ?>
<?php $isPub = old('is_public', (string)($t['is_public'] ?? 1)) !== '0'; ?>
<div class="field full">
<label>公开</label>
<label class="chk-inline">
<input type="hidden" name="is_public" value="0">
<input type="checkbox" name="is_public" value="1" <?= $isPub ? 'checked' : '' ?>>
<span>在旅程列表与日历里显示这个旅程</span>
</label>
<span class="tip">不勾 = 只留着自己看:不进列表、不上日历,但有链接仍能打开。</span>
</div>
<?php if ($isEdit): ?>
<?php
/* 编辑时把"已经算出来什么"摆出来:不显示的话,改完标题保存会以为
"我把参与人/时间弄丢了"。 */
$tSpan = \App\Trip::activitySpan($t['starts_at'] ?? null, $t['ends_at'] ?? null);
$tCity = (string)($t['city'] ?? '');
$tN = count((array)($t['attendees'] ?? []));
?>
<p class="form-note">
当前:<b><?= e($tSpan) ?></b><?php if ($tCity !== ''): ?> · 去过 <b><?= e($tCity) ?></b><?php endif; ?>
<?php if ($tN > 0): ?> · <b><?= $tN ?></b> 人参与<?php endif; ?>
<br>这些都是从下面各段行程算出来的,这里改不了 —— 要改就去改对应的那段行程。
</p>
<?php else: ?>
<p class="form-note">
参与人、城市、天数、花销都不用填:加进一段段<b>行程</b>之后会自动汇总。
</p>
<?php endif; ?>
<div class="btn-row">
<button class="btn" type="submit"><?= $isEdit ? '保存' : '建好,去加行程' ?></button>
<a class="btn btn-ghost"
href="<?= e($isEdit ? url('trips/show', ['id' => (int)$t['id']]) : url('trips')) ?>">取消</a>
</div>
</form>
</div>