Задать вопрос
Enlightened1
@Enlightened1

Почему не работает код в задаче гостевая книга на php?


1. Таблица persons в БД phpMyAdmin open server "test", БД рабочая проверял, соединение есть, данные отдельно выводятся:
60f6ae3b6bb5b160112543.jpeg
2. код в файлах на php в папке open server:

index.php:

<?php
require __DIR__ . '/classes/GuestBook.php';
require __DIR__ . '/classes/View.php';
$dsn = 'mysql:host=127.0.0.1;dbname=test';
$dbh = new PDO ($dsn, 'root', '');
$sth = $dbh->prepare('SELECT * FROM persons');
$sth->execute();
$data = $sth->fetchAll();
$view = new View();
$view->assign('persons', $data);
$view->display(__DIR__ . '/templates/index.php');



Папка с шаблонами templates:


index.php:

<!doctype html>
<html lang="ru">
<head>
<title>Гостевая книга</title>
<style>
article {
margin-bottom: 15px;
paddi ng: 1Opx;
border: lpx dotted #008000;
}
</style>
</head>
<body>
<h1>Персонал:</hl>
<hr>
<?php foreach ($persons as $person) { ?>
<ul>
<li><?php echo $person ['lastName'] ; ?></li>
<li><?php echo $person ['firsName']; ?></li> </ul>
<?php } ?>
</body>
</html>

guestBookRecord.php:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<article>
    <p><?php echo $this->getMessage(); ?></p>
    <?php if (!empty($this->getAuthor())) { ?>
        <p style="text-align: right"><?php echo $this->getAuthor(); ?></p>
    <?php } ?>
    <hr>
</article>
</body>
</html>



Папка с классами classes:


GuestBookRecord.php:

<?php

class GuestBookRecord
{
    protected $author;
    protected $message;

    public function __construct($message, $author = null)
    {
        $this->author = $author;
        $this->message = $message;
    }

    public function getMessage()
    {
        return $this->message;
    }

    public function getAuthor()
    {
        return $this->author;
    }

    public function render()
    {
        ob_start();
        include __DIR__ . '/../templates/guestBookRecord.php';
        $content = ob_get_contents();
        ob_end_clean();

        return $content;
    }
}

GuestBook.php:

<?php

require_once __DIR__ . '/GuestBookRecord.php';

class GuestBook
{
    protected $data;

    public function __construct($file)
    {
        $lines  = file($file, FILE_IGNORE_NEW_LINES);
        $this->data = [];
        foreach ($lines as $line)
        {
            $this->data[] = new GuestBookRecord($line, 'Есенин');
        }
    }

    public function getRecords()
    {
        return $this->data;
    }

    public function add(GuestBookRecord $record)
    {
        $this->data[] = $record;
    }
}


/*require_once __DIR__ . '/TextFile.php';

class GuestBook extends TextFile
{
    public function __construct($path)
    {
        $this->path = $path;
        $this->data = file($this->path, FILE_IGNORE_NEW_LINES);
    }
}*/

View.php:

class View
{
    protected $data;

    public function __construct()
    {
    }

    public function assign(string $name, $value)
    {
        $this->data = [];
        $this->data[$name] = $value;

        //file_put_contents($this->path, implode("\n", $this->data));
    }

    public function display(string $template)
    {
        echo $this->render($template);
    }

    public function render(string $template)
    {
        ob_start();
        include $template;
        $content = ob_get_contents();
        ob_end_clean();

        return $content;

//        include __DIR__ . '/../templates/guestBookRecord.php';
//        $content = ob_get_contents();
//        ob_end_clean();
//
//        return $content;
    }
}



Браузер выдает следующую ошибку:
60f6b00c10bed972733283.jpeg

Результат должен быть примерно таким:
Персонал:
• Иванов
• Иван
• Петров
• Петр
• Сидорова
• Екатерина

Я новичек, поэтому прошу не судить строго.
Заранее благодарю за ответ.
  • Вопрос задан
  • 218 просмотров
Подписаться 1 Простой 13 комментариев
Решения вопроса 1
Skiphog
@Skiphog
Crutch developer
Метод render() в классе View работает не так, как вы этого ожидаете.

Когда вы подключаете шаблон, то в данном случае там доступен только $this, а $this - это сам объект View.
Поэтому получить массив персон вы можете только через $this->data['persons'] и никакой $persons там естественно нет.
т.е. в шаблоне работать будет только так
//...
foreach ($this->data['persons'] as $person) {
  echo $person['lastName'];
//  ...
}

Понимаете?

Для того, что был доступ в шаблоне именно к переменной $persons, вам надо импортировать её в методе render() с помощью функции extract() или через присваивание переменной переменной
public function render(string $template) 
{
  ob_start();
  // функция импорта
  extract($this->data, EXTR_OVERWRITE);
  include $template;
  $content = ob_get_contents();
  ob_end_clean();

  return $content;
}

Либо через переменные переменных

public function render(string $template) 
{
  ob_start();
  // Импорт
  foreach($this->data as $key => $value) {
   // Переменные переменных $$
    $$key = $value;
  }
  include $template;
  $content = ob_get_contents();
  ob_end_clean();

  return $content;
}

В том и другом случае результат одинаковый.

И тогда в шаблоне вы уже сможете работать непосредственно с $persons
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
По порядку:
Браузер выдает следующую ошибку:
Во первых не браузер, а сервер, а браузер ее только отображает. Во вторых это уведомление и предупреждение, а не ошибка.
Далее, если ваш $view->assign('persons', $data); работает верно - значит в индексе ДО этого места в дата ничего нет. Что легко проверить с помощью вар_дамп. И если там не пусто - что-то в вашем вью работает криво, или не так как вы предполагаете, читайте документацию к данному методу.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы