Создание блога

firep91613

Новичок
Решил создать простой блог, для практики. Но голова пухнет, от неопределенностей всяких.

https://phpfaq.ru/tech/tpl - актуален ли подход из этой статьи? Я просто еще до всяких шаблонизаторов не дошел. Только БД прошел. И книгу еще не до конца прочитал.

Как правильно делают, вывод коротких фрагментов статей с кнопкой "читать далее" на главную страницу? Первая мысль была добавлять статьи с пустыми строками в качестве разделителей параграфов и потом из запроса дергать только два параграфа. Сейчас думаю сделать отдельную колонку и записывать туда короткие фрагменты статей.

Еще вот не понятно, допустим будет пагинация по несколько коротких фрагментов на страницу. Как делать? Допустим по пять фрагментов на страницу, главная страница - запрос на 5 первых статей, вторая страница - запрос на 5 следующих и т.д. Не доставать же сразу все подряд и хранить в массиве?

Как лучше реализовать кнопку читать далее? Я до изучения БД делал блог на текстовых файлах у меня там был article.php. Ну вообщем так:
PHP:
<?php
    session_start();

    include 'functions.php';
    include 'templates/header.php';

    if (isset($_GET['name']) && !empty($_GET['name'])) {
        $article = fetchArticles($_GET['name']);
    }
?>
<main>
    <h1><?= $article[0] ?></h1>
    <?= $article[1] ?>
</main>
<?php include 'templates/footer.php'; ?>
А до этого делал типо динамически:
PHP:
<a href="<?= read_more_url($key) ?>?action=full_article&header_article=<?= urlencode($key) ?>">Читать далее</a>
 

AnrDaemon

Продвинутый новичок
Советую для начала прочитать книгу до конца. И, уже имея общее представление, начинать перечитывать, делая примеры.
 

ivanov77

Новичок
актуален ли подход из этой статьи
да в той статье особо и нет ничего, и она 2009 года..

- анонсы обычно отдельно хранятся
- пагинацию делать нормальную - offset и limit из базы - достает только нужную страницу
- читать далее должно же вести на страницу со статьей, что за проблема?
 

firep91613

Новичок
- читать далее должно же вести на страницу со статьей, что за проблема?
Ну вывод самой статьи делать через файл допустим article.php?
Советую для начала прочитать книгу до конца. И, уже имея общее представление, начинать перечитывать, делая примеры.
Просто хочется по быстрее научится хоть что-то делать :)
 

firep91613

Новичок
Главная проблема это разделение логики и представления. Мне бы хотя бы самый простой подход.
 

weregod

unserializer
Наполняешь массив $scope значениями, require "template.php", в котором HTML + <?= $scope['varName'] ?>
Самый примитив.
 
Последнее редактирование:

firep91613

Новичок
Ну вот, попробовал сделать главную страницу. С пагинацией наверно намудрил? Надо наверно все расчеты в index.php делать? А в шаблон просто выводить?

index.php:
PHP:
<?php
include 'db_config.php';

$page_title = "Главная страница блога";

$limit = 3;
$page = 1;

if (isset($_GET['page']) && $_GET['page'] > $page) {
    $page = $_GET['page'];
}

$offset = ($page - 1) * $limit;

$announcements;
$pages;

try {
    $pdo = new PDO("pgsql:host=$host;dbname=$dbname", $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $query = "SELECT * FROM news LIMIT :limit OFFSET :offset";
    $stmt = $pdo->prepare($query);
    $stmt->execute([ ':limit' => $limit, ':offset' => $offset]);
    $announcements = $stmt->fetchAll(PDO::FETCH_ASSOC);

    $total_pages_query = "SELECT COUNT(*) FROM news";
    $stmt = $pdo->query($total_pages_query);
    $total = $stmt->fetchColumn();
    $pages = ceil($total / $limit);
} catch (PDOException $e) {
    echo "Ошибка подключения: " . $e->getMessage();
}

include 'template.php';
?>
template.php:
PHP:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title><?= $page_title ?></title>
</head>
<body>
    <header>
        <h1>Говно-блог</h1>
    </header>
    <main>
    <?php foreach ($announcements as $announcement): ?>
        <article>
            <h1><?= $announcement['name'] ?></h1>
            <div><?= $announcement['announcement'] ?></div>
            <span><?= $announcement['putdate'] ?></span>
        </article>
    <?php endforeach; ?>
    </main>
    <footer>
        <ul>
        <?php if ($page > 1): ?>
            <li><a href="?page=<?= $page - 1; ?>">Предыдущая</a></li>
        <?php endif; ?>
            
        <?php
            $start = max($page - 1, 1);
            $end = min($start + 2, $pages);

            for ($i = $start; $i <= $end; $i++) {
                echo "<li><a href=?page={$i}>$i</a></li>";
            }
        ?>

        <?php if ($pages > 1 && $page < $pages): ?>
            <li><a href="?page=<?= $page + 1; ?>">Следующая</a></li>
        <?php endif; ?>
        </ul>
    </footer>
</body>
</html>
 

AnrDaemon

Продвинутый новичок
"pgsql:host=$host;dbname=$dbname"
Не надо так делать. PDO DSN это ОДНА настройка. Не пять и не десять.
if (isset($_GET['page']) && $_GET['page'] > $page) { $page = $_GET['page']; }

$query = "SELECT * FROM news LIMIT :limit OFFSET :eek:ffset";
 

weregod

unserializer
С пагинацией наверно намудрил? Надо наверно все расчеты в index.php делать? А в шаблон просто выводить?
Для новичка уже неплохо, но конечно, лучше всю бизнес-логику в одном месте хранить. И не пропусти замечания от AnrDaemon.
 

firep91613

Новичок
Сделал я блог. В общем много дублирования кода. Править и разширять не удобно. Надо изучать MVC.
 

AnrDaemon

Продвинутый новичок
Надо различать дублирование кода и дублирование работы. А аббревиатура "MVC" вообще к вебу за уши притянута.
 

AnrDaemon

Продвинутый новичок
У тебя может повторяться блок кода, но делать он при этом будет другую задачу. И пригорать от такого повторения не надо.

как бы вы сделали блог? Без фреймворков.
Тебя, наверное, смутит мой ответ, но я бы не стал делать блог. Тем более без фреймворка.

Надо понимать, что фреймворк - это не причина, а следствие. Сначала всегда есть бизнес-задача. Потом появляется её решение. А в процессе поддержки и обслуживания этого решения появляется фреймворк. Если задача типовая, если решение не надуманное, фреймворк становится популярным.
 

firep91613

Новичок
У тебя может повторяться блок кода, но делать он при этом будет другую задачу. И пригорать от такого повторения не надо.
Ок. Я понял.
Надо понимать, что фреймворк - это не причина, а следствие. Сначала всегда есть бизнес-задача. Потом появляется её решение. А в процессе поддержки и обслуживания этого решения появляется фреймворк. Если задача типовая, если решение не надуманное, фреймворк становится популярным.
Это я тоже понимаю.
Тебя, наверное, смутит мой ответ, но я бы не стал делать блог. Тем более без фреймворка.
Ну нет. Сейчас то понятное дело. Я имел ввиду когда только вкатываешься в PHP. Я думаю надо сначала попрактиковаться на голом PHP, а потом уже преступать к фреймворкам.

Сейчас я сделал самое простое. Теперь начну изучать роутинг. Или не стоит? :)
 

AnrDaemon

Продвинутый новичок
Фреймворк - это не другой язык. Всё равно приходится писать код, который должен работать. И чтобы его писать, надо понимать, как именно он работает.
Так что одно другого не исключает.
 

firep91613

Новичок
Что в твоём понимании "изучать роутинг" ?
Ну надо вначале настроить встроенный сервер на запуск с указанием корневой директории.

php -S localhost:8000 -t foo/
Видимо в Dockerfile надо CMD ["php", "-S", "0.0.0.0:4000", "-t", "foo/"]?

Сейчас у меня все файлы в корне. Надо раскидать по папкам. Ну и сам роутер написать.
 

weregod

unserializer
Точка входа рекомендуется одна на всё (в контексте страниц сайта), разруливается правилами используемого веб-сервера, роутер лучше подсмотреть в той же симфе, а так-то, конечно, нужно с голого пыха начинать, дабы изучить базовые конструкции языка и вообще его возможности. Последнее бы вообще с командной строки запускал, у самого куча утилит написано под разные ситуации. И да, Composer (getcomposer.org) обязателен к освоению/пониманию, чтобы в будущем не писать своих велосипедов.
 

firep91613

Новичок
Еще одна проблема появилась. Не могу подключить стили. Корневую директорию я указал public. CMD ["php", "-S", "0.0.0.0:4000", "-t", "public/"]
Код:
blog/public/
--index.php
blog/public/assets/
--style.css
blog/app/controllers/
--index.php
blog/app/views/
--index.tpl.php
В файле index.tpl.php пытаюсь подключить style.css:
PHP:
<link rel="stylesheet" href="<?= $_SERVER['DOCUMENT_ROOT'] . '/assets/style.css' ?>" />
Но не работает.

Правильно ли так инклудить?
PHP:
include __DIR__ . '/../views/index.tpl.php';
Ни в подпапках, никак.
Значит у меня все неверно?
 
Сверху