Могу предложить такой вариант: у вас будет код, который будет обрабатывать данные (грубо говоря - контроллер) и шаблон, который будет вставлять готовые данные в html (это называется view).
Функция рендера такого шаблона может выглядеть так:
function render($templateName, $templateData)
{
extract($templateData,EXTR_SKIP);
ob_start();
require($templateName);
return ob_get_clean();
}
В этой функции мы с помощью
extract все ключи ассоциативного массива $templateData превращаем в переменные текущей области видимости (они попадут в шаблон). Первый параметр - путь к шаблону.
Вызываться в контроллере она будет примерно так:
$templateVars = array();
$templateVars['data'] = array();
$templateVars['content'] = array(); // итд
while ($templateVars['data'][] = mysqli_fetch_assoc($result));
$html = render('templates/templ1.php',$templateVars);
echo $html;
А код шаблона будет выглядеть примерно так (тот самый файл templates/templ1.php, который мы использовали выше):
<?php for($i = 0; $i != count($data); ++$i) { $row = $data[$i]; ?>
<div class='panel panel-default'>
<div class='panel-heading'><h4><?=$row['title']?></h4></div>
<div class='panel-body story'>
<?=$content[0]?>
<div class='clearfix'></div>
<hr>
<div class='row'>
<p class='col-xs-6 text-left'>
<a href='post.php?id=<?=$row['id']?>'>Прочитать</a>
</p>
<p class='col-xs-6 text-right'>
<span class='glyphicon glyphicon-comment'><?=$row['countcomments']?></span>
</p>
</div>
</div>
</div>
<?php } ?>
Очень желательно ничего с данными в шаблоне не делать.