Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 20 additions & 14 deletions app/Models/BookRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -1690,6 +1690,12 @@ public function updateOptionals(int $bookId, array $data): void
* then maps IDs to the correct cascade levels so the edit form can
* pre-populate all three dropdowns.
*
* Adds COMPUTED, request-only keys prefixed `resolved_` — `resolved_genere_id`
* and `resolved_sottogenere_id` — that hold the depth-correct ids for the
* three dropdown slots. They are NOT columns on `libri` (which stores only
* `genere_id`/`sottogenere_id`); the `resolved_` prefix marks them as a
* derived view of the stored ids, not duplicates (see discussion #286).
*
* @param array<string, mixed> $row Book row (modified in place)
*/
private function resolveGenreHierarchy(array &$row): void
Expand Down Expand Up @@ -1735,9 +1741,9 @@ private function resolveGenreHierarchy(array &$row): void
$row['radice_id'] = 0;
$row['radice_nome'] = null;
$row['genere_nome'] = null;
$row['genere_id_cascade'] = 0;
$row['resolved_genere_id'] = 0;
$row['sottogenere_nome'] = null;
$row['sottogenere_id_cascade'] = 0;
$row['resolved_sottogenere_id'] = 0;
return;
}

Expand Down Expand Up @@ -1776,43 +1782,43 @@ private function resolveGenreHierarchy(array &$row): void
// L2 + deepest descendant
$deepest = end($subChain);
$row['genere_nome'] = $subChain[0]['nome'];
$row['genere_id_cascade'] = (int)$subChain[0]['id'];
$row['resolved_genere_id'] = (int)$subChain[0]['id'];
$row['sottogenere_nome'] = $deepest['nome'];
$row['sottogenere_id_cascade'] = (int)$deepest['id'];
$row['resolved_sottogenere_id'] = (int)$deepest['id'];
} elseif (count($subChain) === 1) {
// Direct child of root → L2 only
$row['genere_nome'] = $subChain[0]['nome'];
$row['genere_id_cascade'] = (int)$subChain[0]['id'];
$row['resolved_genere_id'] = (int)$subChain[0]['id'];
$row['sottogenere_nome'] = null;
$row['sottogenere_id_cascade'] = 0;
$row['resolved_sottogenere_id'] = 0;
} else {
$row['genere_nome'] = null;
$row['genere_id_cascade'] = 0;
$row['resolved_genere_id'] = 0;
$row['sottogenere_nome'] = null;
$row['sottogenere_id_cascade'] = 0;
$row['resolved_sottogenere_id'] = 0;
}
} else {
$row['genere_nome'] = null;
$row['genere_id_cascade'] = 0;
$row['resolved_genere_id'] = 0;
$row['sottogenere_nome'] = null;
$row['sottogenere_id_cascade'] = 0;
$row['resolved_sottogenere_id'] = 0;
}
} elseif ($chainLen === 2) {
// genere_id points to L2 genre — standard case
$row['radice_id'] = $chain[0]['id'];
$row['radice_nome'] = $chain[0]['nome'];
$row['genere_nome'] = $chain[1]['nome'];
$row['genere_id_cascade'] = $chain[1]['id'];
$row['sottogenere_id_cascade'] = $sottogenereId;
$row['resolved_genere_id'] = $chain[1]['id'];
$row['resolved_sottogenere_id'] = $sottogenereId;
} else {
// genere_id points to L3+ — stored at a deeper level
// Map: root=chain[0], genre=chain[1], sotto=genere_id
$row['radice_id'] = $chain[0]['id'];
$row['radice_nome'] = $chain[0]['nome'];
$row['genere_nome'] = $chain[1]['nome'];
$row['genere_id_cascade'] = $chain[1]['id'];
$row['resolved_genere_id'] = $chain[1]['id'];
$row['sottogenere_nome'] = $chain[$chainLen - 1]['nome'];
$row['sottogenere_id_cascade'] = $chain[$chainLen - 1]['id'];
$row['resolved_sottogenere_id'] = $chain[$chainLen - 1]['id'];
}
}

Expand Down
4 changes: 2 additions & 2 deletions app/Views/libri/partials/book_form.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@
$initialData = [
'id' => (int)($book['id'] ?? 0),
'radice_id' => (int)($book['radice_id'] ?? 0),
'genere_id' => (int)(($book['genere_id_cascade'] ?? null) ?: ($book['genere_id'] ?? 0)),
'sottogenere_id' => (int)(($book['sottogenere_id_cascade'] ?? null) ?: ($book['sottogenere_id'] ?? 0)),
'genere_id' => (int)(($book['resolved_genere_id'] ?? null) ?: ($book['genere_id'] ?? 0)),
'sottogenere_id' => (int)(($book['resolved_sottogenere_id'] ?? null) ?: ($book['sottogenere_id'] ?? 0)),
'classificazione_dewey' => $book['classificazione_dewey'] ?? '',
'editore_id' => (int)($book['editore_id'] ?? 0),
'editore_nome' => $book['editore_nome'] ?? '',
Expand Down
6 changes: 3 additions & 3 deletions app/Views/libri/scheda_libro.php
Original file line number Diff line number Diff line change
Expand Up @@ -240,14 +240,14 @@ class="inline-flex items-center px-2 py-1 rounded-full text-sm bg-gray-100 text-
$genreParts[] = [$id, $name];
};
$addGenrePart((int)($libro['radice_id'] ?? 0), $libro['radice_nome'] ?? null);
$addGenrePart((int)($libro['genere_id_cascade'] ?? $libro['genere_id'] ?? 0), $libro['genere_nome'] ?? null);
$addGenrePart((int)($libro['sottogenere_id_cascade'] ?? $libro['sottogenere_id'] ?? 0), $libro['sottogenere_nome'] ?? null);
$addGenrePart((int)($libro['resolved_genere_id'] ?? $libro['genere_id'] ?? 0), $libro['genere_nome'] ?? null);
$addGenrePart((int)($libro['resolved_sottogenere_id'] ?? $libro['sottogenere_id'] ?? 0), $libro['sottogenere_nome'] ?? null);
?>
<?php if (!empty($genreParts)): ?>
<?php foreach ($genreParts as $i => $gp): ?>
<?php if ($i > 0): ?> <span class="text-gray-400">→</span> <?php endif; ?>
<a href="<?= htmlspecialchars(url('/admin/books?genere=' . $gp[0]), ENT_QUOTES, 'UTF-8') ?>"
class="text-gray-900 hover:text-gray-600 hover:underline font-semibold"><?= App\Support\HtmlHelper::e($gp[1]) ?></a>
class="text-gray-900 hover:text-gray-600 hover:underline font-semibold"><?= htmlspecialchars((string) $gp[1], ENT_QUOTES, 'UTF-8') ?></a>
<?php endforeach; ?>
<?php else: ?>
<span class="text-gray-500"><?= __('Non specificato') ?></span>
Expand Down
Loading