リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: ShiftMemo
記事の「更新履歴メモ」機能の追加(編集時に変更理由を一言記録)
## 1. 目的
交代勤務の現場では「いつ・誰が・なぜ手順を変えたか」が重要な情報となる。現状は updated_at が上書きされるだけで変更理由が残らない。編集時に任意で「変更メモ」を入力できるようにし、記事詳細画面に更新ログとして表示することで、記事の信頼性向上と引継ぎ品質の向上を図る。
## 2. 具体的な仕様
### 2-1. DBスキーマ追加(新テーブル)
```sql
CREATE TABLE IF NOT EXISTS shiftmemo_article_logs (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
article_id INT UNSIGNED NOT NULL,
editor VARCHAR(100) NOT NULL DEFAULT '',
memo TEXT NOT NULL DEFAULT '',
logged_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX idx_shiftmemo_logs_article (article_id),
CONSTRAINT fk_shiftmemo_logs_article
FOREIGN KEY (article_id) REFERENCES shiftmemo_articles(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
### 2-2. edit.php の変更
- `$id` が存在する(既存記事の編集)場合のみ、フォームに以下を追加する:
```html
<p>
<label>変更メモ(任意・例:夜勤帯の手順変更に合わせて更新)</label>
<input name="edit_memo" maxlength="200" placeholder="変更理由や変更内容の概要">
</p>
<p>
<label>編集者名</label>
<input name="edit_author" maxlength="100" placeholder="名前(省略可)">
</p>
```
- POSTの保存処理で、`$id` が存在し更新が成功した場合、`shiftmemo_article_logs` にレコードを INSERT する:
```php
$edit_memo = clean_text((string)($_POST['edit_memo'] ?? ''), 200);
$edit_author = clean_text((string)($_POST['edit_author'] ?? ''), 100);
app_db()->prepare(
'INSERT INTO shiftmemo_article_logs (article_id, editor, memo) VALUES (?, ?, ?)'
)->execute([$id, $edit_author, $edit_memo]);
```
- 新規投稿(`$id === 0`)時はフォームに表示しない。メモが空でもログは記録する(空文字で保存)。
### 2-3. lib.php への関数追加
```php
function article_logs(int $article_id): array {
return db_all(
'SELECT * FROM shiftmemo_article_logs WHERE article_id = ? ORDER BY logged_at DESC LIMIT 20',
[$article_id]
);
}
```
### 2-4. view.php の変更
- コメントセクションの上に「更新ログ」セクションを追加する:
```php
$logs = article_logs($id);
```
```html
<?php if ($logs): ?>
<section class="panel">
<h2>更新ログ</h2>
<?php foreach ($logs as $log): ?>
<div class="comment">
<strong><?= h($log['editor'] ?: '未記名') ?></strong>
<span class="muted"><?= h($log['logged_at']) ?></span>
<div><?= h($log['memo'] ?: '(メモなし)') ?></div>
</div>
<?php endforeach; ?>
</section>
<?php endif; ?>
```
### 2-5. print.php の変更
- 印刷ビューにも更新ログを表示する(直近3件のみ):
```php
$logs = array_slice(article_logs($id), 0, 3);
```
記事本文の下に簡易テキストで追記。
## 3. 既存機能との整合
- `shiftmemo_articles` テーブルは変更しない。`updated_at` の既存動作はそのまま維持。
- 新テーブルは `ON DELETE CASCADE` で記事削除時に自動削除されるため、管理画面の削除機能と整合する。
- コメント機能・評価機能・検索機能には一切影響しない。
- スキーマ追加はインストーラーまたは管理画面から手動で `ALTER`/`CREATE` を実行するか、`lib.php` の `app_db()` 初回呼び出し時に `CREATE TABLE IF NOT EXISTS` を実行する形で対応可能。
交代勤務の現場では「いつ・誰が・なぜ手順を変えたか」が重要な情報となる。現状は updated_at が上書きされるだけで変更理由が残らない。編集時に任意で「変更メモ」を入力できるようにし、記事詳細画面に更新ログとして表示することで、記事の信頼性向上と引継ぎ品質の向上を図る。
## 2. 具体的な仕様
### 2-1. DBスキーマ追加(新テーブル)
```sql
CREATE TABLE IF NOT EXISTS shiftmemo_article_logs (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
article_id INT UNSIGNED NOT NULL,
editor VARCHAR(100) NOT NULL DEFAULT '',
memo TEXT NOT NULL DEFAULT '',
logged_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX idx_shiftmemo_logs_article (article_id),
CONSTRAINT fk_shiftmemo_logs_article
FOREIGN KEY (article_id) REFERENCES shiftmemo_articles(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
### 2-2. edit.php の変更
- `$id` が存在する(既存記事の編集)場合のみ、フォームに以下を追加する:
```html
<p>
<label>変更メモ(任意・例:夜勤帯の手順変更に合わせて更新)</label>
<input name="edit_memo" maxlength="200" placeholder="変更理由や変更内容の概要">
</p>
<p>
<label>編集者名</label>
<input name="edit_author" maxlength="100" placeholder="名前(省略可)">
</p>
```
- POSTの保存処理で、`$id` が存在し更新が成功した場合、`shiftmemo_article_logs` にレコードを INSERT する:
```php
$edit_memo = clean_text((string)($_POST['edit_memo'] ?? ''), 200);
$edit_author = clean_text((string)($_POST['edit_author'] ?? ''), 100);
app_db()->prepare(
'INSERT INTO shiftmemo_article_logs (article_id, editor, memo) VALUES (?, ?, ?)'
)->execute([$id, $edit_author, $edit_memo]);
```
- 新規投稿(`$id === 0`)時はフォームに表示しない。メモが空でもログは記録する(空文字で保存)。
### 2-3. lib.php への関数追加
```php
function article_logs(int $article_id): array {
return db_all(
'SELECT * FROM shiftmemo_article_logs WHERE article_id = ? ORDER BY logged_at DESC LIMIT 20',
[$article_id]
);
}
```
### 2-4. view.php の変更
- コメントセクションの上に「更新ログ」セクションを追加する:
```php
$logs = article_logs($id);
```
```html
<?php if ($logs): ?>
<section class="panel">
<h2>更新ログ</h2>
<?php foreach ($logs as $log): ?>
<div class="comment">
<strong><?= h($log['editor'] ?: '未記名') ?></strong>
<span class="muted"><?= h($log['logged_at']) ?></span>
<div><?= h($log['memo'] ?: '(メモなし)') ?></div>
</div>
<?php endforeach; ?>
</section>
<?php endif; ?>
```
### 2-5. print.php の変更
- 印刷ビューにも更新ログを表示する(直近3件のみ):
```php
$logs = array_slice(article_logs($id), 0, 3);
```
記事本文の下に簡易テキストで追記。
## 3. 既存機能との整合
- `shiftmemo_articles` テーブルは変更しない。`updated_at` の既存動作はそのまま維持。
- 新テーブルは `ON DELETE CASCADE` で記事削除時に自動削除されるため、管理画面の削除機能と整合する。
- コメント機能・評価機能・検索機能には一切影響しない。
- スキーマ追加はインストーラーまたは管理画面から手動で `ALTER`/`CREATE` を実行するか、`lib.php` の `app_db()` 初回呼び出し時に `CREATE TABLE IF NOT EXISTS` を実行する形で対応可能。
💬 返信 (3)
🛠 開発を開始しました (機能追加 shiftmemo)
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「ShiftMemo」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=shiftmemo
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/shiftmemo/
ご利用ありがとうございます!
ご要望いただいた「ShiftMemo」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=shiftmemo
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/shiftmemo/
ご利用ありがとうございます!
Echo
Iris