Я относительно новичок в php, и я работаю над проектом с использованием базы данных mysql. Проект состоит из пользователей, которые могут писать сообщения, которые затем отображаются в формате списка. Проблема в том, что сообщения отображаются в разных местах сайта, например, на главной странице и странице профиля пользователей. Похоже на твиттер, если вы в замешательстве. Мой вопрос: каков наилучший способ отображения сообщений? В настоящее время я использую класс, который я создал. Он имеет функции для извлечения сообщений из базы данных, сохраняя их все в многомерном массиве. Затем другая функция в классе форматирует весь список с помощью foreach
, а затем возвращает отформатированный HTML-список сообщений. Все, что мне нужно сделать, это повторить то, что возвращается. Но я где-то читал, что это плохая практика для написания функций (особенно функций класса), которые выводят HTML. Какой был бы лучший способ сделать это, без необходимости переписывать один и тот же код на каждой странице, где отображаются сообщения. Действительно ли испорчена практика использования HTML в функциях?
Пример... страница профиля выглядит примерно так.
<
require('class.php');
require('header.php');
$profile = new Profile();
$userProfile = $profile->GetUserProfile($userID);
echo $userProfile;
$class = new Posts();
$posts = $class->GetUserPosts($userID);
echo $posts;
require('footer.php');
?>
И главная страница выглядит примерно так:
<
$class = new Posts();
$posts = $class->GetAllPosts();
echo $posts;
?>
где класс профиля будет принимать идентификатор пользователя и выводить профиль пользователей, уже отформатированный в HTML. И класс posts имеет функции для возврата определенного количества сообщений, уже отформатированных в списке HTML.
Должен ли я хранить все в классе или есть лучший способ?
Спасибо
Хорошо, если вы не используете какую-либо структуру MVC, я бы сказал, что наличие функций, которые выводят HTML, не собирается никого убивать.
Вообще, однако, полезно отделить HTML от логики, и это обычно делается путем создания HTML-шаблона и фрагментов шаблона с вкрапленным PHP. Что-то вроде этого:
<div>
<h1><?php echo $title; ?></h1>
</div>
Затем вы можете настроить переменную $title
(и другие) и include('title_fragment.php')
для вывода этого бита HTML. Вы можете расширить это, чтобы работать со всеми страницами, делая это так, чтобы ваш код имел дело с небольшим количеством данных, которые передаются в шаблон.
Когда придет время внести изменения в макет страницы или посмотреть, вам не нужно идти на охоту через код, чтобы найти бит сгенерированного HTML... вы можете перейти прямо к файлам шаблонов.
Это важно для поддерживаемого дизайна, а также для кода, и это облегчает выпуск других типов вывода позже.
С PHP одна из простейших библиотек для разделения двух - это шаблоны Smarty. Используя Smarty (или любую другую библиотеку шаблонов), вы можете написать HTML файл с макетом и некоторыми простыми циклами или другими конструкциями, а затем визуализировать этот шаблон с использованием структуры данных. По крайней мере, я бы предложил изменить свой класс, чтобы использовать шаблон и создавать выходные данные таким образом, а не mish-mash выражений print или echo с кучей HTML в них.
Я даже уклоняюсь от @zombat решения выражений эха в фрагментах HTML, они быстро становятся уродливыми.
Пример шаблона Smarty для достижения чего-то вроде того, что вы хотите:
{section name=i loop=$posts}
<li>{$posts[i].author} — {$post[i].text}</li>
{/section}
И некоторый PHP-код поддержки:
// Instantiate Smarty object
$smarty = new Smarty();
// Assign a hash of data
$smarty->assign('posts', array(
array('author' => 'Jim', 'text' => 'Hi this is my post!'),
array('author' => 'Sally', 'text' => 'My first post to the system')
)
);
// Use the file with the above template in it
$smarty->display('posts.html');
Часть, в которой вы назначаете данные шаблону, должна, вероятно, выполняться с помощью некоторых программных средств для преобразования списка объектов класса в список хэшей.
Таким образом вы можете легко изменить способ вывода, просто отредактировав HTML-шаблон, и вам не нужно беспокоиться о касании какого-либо кода, чтобы изменить вывод.
Я вообще не знаком с Smarty... как именно это работает, и каковы преимущества использования smarty или просто создания функций для получения больших объемов данных и возврата html, содержащих эти данные, для последующего эха.
Вы можете использовать буферизацию вывода. Это помогает создавать ваши шаблоны и не принудительно обрабатывать данные в порядке отображения.
<?php
$posts = take_data_from_class();
ob_start();
require_once('path/to/posts.php');
$html_posts = ob_get_clean();
// you can do the same with other parts like header or footer
ob_start();
require_once('path/to/header.php');
$header = ob_get_clean();
ob_start();
require_once('path/to/footer.php');
$footer = ob_get_clean();
?>
В posts.php вы можете отображать сообщения:
<? foreach ($posts as $p) { ?>
<div class="...">
post data here
</div>
<? } ?>
Теперь, чтобы отобразить все это:
<?php echo $header . $html_posts . $footer; ?>
Подробнее в http://us3.php.net/manual/en/book.outcontrol.php
Наслаждайтесь!
Ваш класс должен в идеале предоставить только данные. Используйте другой PHP файл или общий класс для вывода HTML, так что позже вы можете вывести, например. XML, JSON и т.д. Из одного класса данных. Это отделяет вашу обработку данных (модель/контроллер) от представления данных (просмотр).
Я бы не согласился с использованием механизма шаблонов, такого как Smarty. PHP - это механизм шаблонов.