Some fixes
This commit is contained in:
parent
971b163367
commit
76d33237b2
|
|
@ -28,7 +28,7 @@ if (!$bookModel->userOwnsBook($book_id, $user_id)) {
|
|||
redirect('books.php');
|
||||
}
|
||||
|
||||
// Получаем информацию о книге перед удалением (для сообщения)
|
||||
// Получаем информацию о книге перед удалением
|
||||
$book = $bookModel->findById($book_id);
|
||||
if (!empty($book['cover_image'])) {
|
||||
$cover_path = COVERS_PATH . $book['cover_image'];
|
||||
|
|
|
|||
|
|
@ -2,8 +2,6 @@
|
|||
require_once 'config/config.php';
|
||||
require_login();
|
||||
|
||||
// Подключаем функции для обложек
|
||||
|
||||
$user_id = $_SESSION['user_id'];
|
||||
$bookModel = new Book($pdo);
|
||||
|
||||
|
|
@ -99,8 +97,6 @@ $page_title = $is_edit ? "Редактирование книги" : "Созда
|
|||
include 'views/header.php';
|
||||
?>
|
||||
|
||||
<!-- Остальная часть формы остается той же, но добавляем поле обложки -->
|
||||
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<input type="hidden" name="csrf_token" value="<?= generate_csrf_token() ?>">
|
||||
|
||||
|
|
@ -147,7 +143,7 @@ include 'views/header.php';
|
|||
placeholder="Номер по порядку в серии"
|
||||
min="1"
|
||||
style="width: 100%; margin-bottom: 1.5rem;">
|
||||
<!-- ПОЛЕ ДЛЯ ОБЛОЖКИ -->
|
||||
<!-- Обложка -->
|
||||
<div style="margin-bottom: 1.5rem;">
|
||||
<label for="cover_image" style="display: block; margin-bottom: 0.5rem; font-weight: bold;">
|
||||
Обложка книги
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ include 'views/header.php';
|
|||
</article>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<!-- Модальное окно для удаления всех книг -->
|
||||
<!-- Подтверждение удаления всех книг -->
|
||||
<dialog id="deleteAllDialog" style="border-radius: 8px; padding: 20px; max-width: 500px; background-color: #fff;">
|
||||
<h3 style="margin-top: 0;">Удалить все книги?</h3>
|
||||
<p>Это действие удалит все ваши книги и все связанные с ними главы. Это действие нельзя отменить.</p>
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ if (!$chapterModel->userOwnsChapter($chapter_id, $user_id)) {
|
|||
redirect('books.php');
|
||||
}
|
||||
|
||||
// Получаем информацию о главе перед удалением (для редиректа)
|
||||
|
||||
$chapter = $chapterModel->findById($chapter_id);
|
||||
$book_id = $chapter['book_id'];
|
||||
|
||||
|
|
@ -39,6 +39,5 @@ if ($chapterModel->delete($chapter_id)) {
|
|||
$_SESSION['error'] = "Ошибка при удалении главы";
|
||||
}
|
||||
|
||||
// Редирект обратно к списку глав книги
|
||||
redirect("chapters.php?book_id=$book_id");
|
||||
?>
|
||||
|
|
@ -23,7 +23,6 @@ if ($chapter_id) {
|
|||
$is_edit = true;
|
||||
}
|
||||
|
||||
// Проверяем, что book_id указан и пользователь имеет доступ к книге
|
||||
if (!$book_id) {
|
||||
$_SESSION['error'] = "Не указана книга";
|
||||
redirect('books.php');
|
||||
|
|
@ -47,8 +46,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||
// Обработка автосохранения
|
||||
if (isset($_POST['autosave']) && $_POST['autosave'] === 'true') {
|
||||
// Автосохранение работает только для существующих глав
|
||||
// Если это не редактирование, игнорируем автосохранение
|
||||
if (!$is_edit) {
|
||||
// Если это не редактирование, игнорируем автосохранение
|
||||
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode(['success' => false, 'message' => 'Автосохранение недоступно для новых глав']);
|
||||
exit;
|
||||
|
|
@ -200,7 +200,6 @@ include 'views/header.php';
|
|||
</div>
|
||||
</form>
|
||||
|
||||
<!-- Основные кнопки формы - Сохранить, Отмена и Предпросмотр -->
|
||||
<div class="button-group">
|
||||
<button type="submit" form="main-form" class="contrast">
|
||||
<?= $is_edit ? '💾 Сохранить изменения' : '📝 Создать главу' ?>
|
||||
|
|
@ -215,13 +214,12 @@ include 'views/header.php';
|
|||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Скрытая форма для предпросмотра -->
|
||||
<!-- Форма для предпросмотра -->
|
||||
<form method="post" action="preview.php" target="_blank" id="preview-form" style="display: none;">
|
||||
<input type="hidden" name="content" id="preview-content">
|
||||
<input type="hidden" name="title" id="preview-title" value="<?= e($chapter['title'] ?? 'Новая глава') ?>">
|
||||
</form>
|
||||
|
||||
<!-- Дополнительные кнопки (вне основной формы) -->
|
||||
<?php if ($is_edit): ?>
|
||||
<div class="button-group">
|
||||
<a href="chapter_edit.php?book_id=<?= $book_id ?>" role="button">
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ if (!$book_id) {
|
|||
$bookModel = new Book($pdo);
|
||||
$chapterModel = new Chapter($pdo);
|
||||
|
||||
// Проверяем права доступа к книге
|
||||
|
||||
if (!$bookModel->userOwnsBook($book_id, $user_id)) {
|
||||
$_SESSION['error'] = "У вас нет доступа к этой книге";
|
||||
redirect('books.php');
|
||||
|
|
|
|||
|
|
@ -55,10 +55,7 @@ if ($book) {
|
|||
}
|
||||
|
||||
$author_name = $author_info['display_name'] ?? $author_info['username'] ?? 'Неизвестный автор';
|
||||
// Функция для очистки имени файла
|
||||
// function cleanFilename($filename) {
|
||||
// return preg_replace('/[^a-zA-Z0-9_\-]/', '_', $filename);
|
||||
// }
|
||||
|
||||
|
||||
// Функция для преобразования Markdown в чистый текст с форматированием абзацев
|
||||
function markdownToPlainText($markdown) {
|
||||
|
|
@ -98,7 +95,7 @@ function markdownToPlainText($markdown) {
|
|||
|
||||
return $text;
|
||||
}
|
||||
// Улучшенная функция для разбивки Markdown на абзацы с сохранением структуры
|
||||
// Функция для разбивки Markdown на абзацы с сохранением структуры
|
||||
function markdownToParagraphs($markdown) {
|
||||
// Нормализуем переносы строк
|
||||
$text = str_replace(["\r\n", "\r"], "\n", $markdown);
|
||||
|
|
@ -239,9 +236,6 @@ switch ($format) {
|
|||
case 'docx':
|
||||
exportDOCX($book, $chapters, $is_public, $author_name);
|
||||
break;
|
||||
case 'odt':
|
||||
exportODT($book, $chapters, $is_public, $author_name);
|
||||
break;
|
||||
case 'html':
|
||||
exportHTML($book, $chapters, $is_public, $author_name);
|
||||
break;
|
||||
|
|
@ -317,7 +311,7 @@ function exportPDF($book, $chapters, $is_public, $author_name) {
|
|||
$pdf->Ln(10);
|
||||
}
|
||||
|
||||
// Интерактивное оглавление - СОЗДАЕМ ССЫЛКИ
|
||||
// Интерактивное оглавление
|
||||
$chapterLinks = [];
|
||||
if (!empty($chapters)) {
|
||||
$pdf->SetFont('dejavusans', 'B', 14);
|
||||
|
|
@ -433,7 +427,7 @@ function exportDOCX($book, $chapters, $is_public, $author_name) {
|
|||
|
||||
foreach ($chapters as $index => $chapter) {
|
||||
$chapter_number = $index + 1;
|
||||
// Создаем гиперссылку на заголовок главы - ИСПРАВЛЕННЫЙ СИНТАКСИС
|
||||
// Создаем гиперссылку на заголовок главы
|
||||
$section->addLink("chapter_{$chapter['id']}", "{$chapter_number}. {$chapter['title']}", null, null, true);
|
||||
$section->addTextBreak(1);
|
||||
}
|
||||
|
|
@ -443,9 +437,9 @@ function exportDOCX($book, $chapters, $is_public, $author_name) {
|
|||
// Разделитель
|
||||
$section->addPageBreak();
|
||||
|
||||
// Главы с закладками - ДОБАВЛЯЕМ ПРАВИЛЬНЫЕ ЗАКЛАДКИ
|
||||
// Главы с закладками
|
||||
foreach ($chapters as $index => $chapter) {
|
||||
// Добавляем закладку для главы ПЕРЕД заголовком
|
||||
// Добавляем закладку для главы
|
||||
$section->addBookmark("chapter_{$chapter['id']}");
|
||||
|
||||
// Заголовок главы
|
||||
|
|
@ -588,7 +582,7 @@ function exportHTML($book, $chapters, $is_public, $author_name) {
|
|||
font-size: 12px;
|
||||
color: #666;
|
||||
}
|
||||
/* Улучшаем отображение абзацев */
|
||||
/* Отображение абзацев */
|
||||
.chapter-content p {
|
||||
margin-bottom: 1em;
|
||||
text-align: justify;
|
||||
|
|
@ -720,7 +714,7 @@ function exportTXT($book, $chapters, $is_public, $author_name) {
|
|||
|
||||
if (!empty($book['description'])) {
|
||||
$content .= "ОПИСАНИЕ:\n";
|
||||
// Увеличиваем ширину до 144 символов (80 * 1.8)
|
||||
// Ширина до 144 символов
|
||||
$content .= wordwrap($book['description'], 144) . "\n\n";
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue