Представление (Вид) в MVC

Представление (Вид)



ПРЕДСТАВЛЕНИЕ (ВИД)



Последний этап формирования нашей страницы - это ее визуализация.


На данный момент у нас есть контроллер ( NewsController.php ), в котором уже есть нужные данные для формировании страницы.


Таблица news базы данных test2:


MVC-5-1



Смысл использования представления на практике состоит в том, чтоб отделить весь HTML-код и положить его в отдельный файл.

Создадим html-файл и назовем его - index.php и положим в папку: views/news/index.php.

Он будет соответствовать для экшена actionIndex() (Список новостей) из NewsController.

Аналогично, в этой папке создадим файл view.php - для экшена actionView($id) (Просмотр одной новости).

В папке tamplate разместим файл стилей - style.css и подключим его в наших файлах:

- <link href="/tamplate/css/style.css" rel="stylesheet" type="text/css">


Файл index.php


-- файл index.php --

<!-- views/news/index.php -->

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<link href="/tamplate/css/style.css" rel="stylesheet" type="text/css">
<title> Список новостей </title>
</head>
<body>

<!--Обертка-->
<div id="wrap">

<!--Шапка-->
<div class="head">
<h1>НОВОСТИ </h1>
</div>

<!--Контент-->
<div id="content">
<div class="post">
<h2 class="title"><a href="#"> Новость 1 </a></h2>
<p class="byline"> 2019-02-02 </p>
<div class="entry">
<p> Краткое содержание новости 1: CSS-ссылки содержат свойства,..
.Краткое содержание новости 1: CSS-ссылки содержат свойства,...
</p>
</div>
<div class="meta">
<p class="links"><a href="#" class="comments"> Читать дальше </a></p>
</div>
</div>

..............................
........Новость 2.............
........Новость 3.............
........Новость 4.............
..............................

<div class="post">
<h2 class="title"><a href="#"> Новость 5 </a></h2>
<p class="byline"> 2019-02-02 </p>
<div class="entry">
<p> Краткое содержание новости 5: CSS-ссылки содержат свойства,..
.Краткое содержание новости 5: CSS-ссылки содержат свойства,...
</p>
</div>
<div class="meta">
<p class="links"><a href="#" class="comments"> Читать дальше </a></p>
</div>
</div>

</div>

<!-- footer -->
<div id="footer">
</div>
</div>
</body>
</html>




Аналогично, в папке views/news/index.php создадим файл view.php - для экшена actionView($id) (Просмотр одной новости).


Файл view.php


-- файл view.php --

<!-- views/news/view.php -->

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<link href="/tamplate/css/style.css" rel="stylesheet" type="text/css">
<title>Новость 1 </title>
</head>
<body>

<!--Обертка-->
<div id="wrap">

<!--Шапка-->
<div class="head">
<h1>НОВОСТИ</h1>
</div>

<!--Контент-->
<div id="content">
<div class="post-news">
<h2 class="title">Новость 1</h2>
<p class="byline">автор 1     2018-12-25 </p>
<div class="entry">
<p>Содержание новости 1</p>
</div>
<div class="meta">
<p class="links"><a href="#" class="comments">Назад к списку новостей </a></p>
</div>
</div>
</div>

<!-- footer -->
<div id="footer">
</div>
</div>
</body>
</html>




В папке tamplate разместим файл стилей - style.css и подключим его в наших файлах:

- <link href="/tamplate/css/style.css" rel="stylesheet" type="text/css">


Файл style.css


-- файл style.php --

/* tamplate/css/style.css */

*{
margin: 0;
padding: 0;
box-sizing: border-box;
/* transition: .5s ease-in-out ; */
}

html, body {
height: 100%;
}

body{
font: 90%/1.5em verdana, arial, helvetica, sans-serif;
color:#000 ;
}

#wrap{
position: relative ;
min-height: 100%;
padding-bottom: 50px; /*отступ величиной с высоту футера*/
}

.head {
margin: 0 auto;
max-width: 100%;
background-image: linear-gradient( white ,#cecece );
background-size: cover;
-webkit-background-size: cover;
-moz-background-size: cover;
height: 100px;
text-align: center;
}

h1{
padding: 30px;
color: orange;
}

#content{
margin: 0 auto 0 auto; /*Поочередно устанавливается отступ от верхнего, правого, нижнего и левого края.*/
width: 90%;
overflow:auto ;
border: solid 1px red;
}

.post {
float: left;
width: 50%;
margin: 20px 0 20px;
overflow: hidden;
background: #F5F5F5;
text-align: center;
border: solid 5px #fff;
}

.title {
padding-top: 10px;
letter-spacing: -2px;
}

.title a {
border: none;
text-decoration: none;
}

.post-news{
width: 100%;
margin: 20px 0 20px;
background: #F5F5F5;
text-align: center;
: ;
}

.byline{
display: block;
padding: 2px 5px 2px 0px;
background: #F5F5F5;
text-align: center;
text-transform: uppercase;
font-size: 10px;
color: gray;
}

.entry{
text-align: left;
margin-bottom: 25px;
overflow: hidden;
padding: 10px 25px 0px 25px ;
font-size: 0.9rem;
height: 50px;
margin-bottom: 1rem;
}

.links{
display: block;
padding: 2px 0px 2px 25px;
text-align: left;
text-transform: uppercase;
font-size: 10px;
color: #FFFFFF;
}

.post-news .links{
display: block;
padding: 2px 25px 2px 10px;
text-align: right;
text-transform: uppercase;
font-size: 10px;
color: #FFFFFF;
}

.post-news .entry{
text-align: left;
margin-bottom: 25px;
overflow: visible;
height: 100%;
padding: 10px 25px 0px 25px;
font-size: 0.9rem;
margin-bottom: 1rem;
}

.post-news .title{
padding-top: 10px;
letter-spacing: -2px;
color: darkcyan;
}

.post-news .title{
padding-top: 10px;
letter-spacing: -2px;
color: darkcyan;
}

#footer{
position: absolute;
bottom: 0;
width: 100%;
height: 50px;
background-image: linear-gradient( #cecece, white );
}

/* */




В файле .htaccess мы написали перенаправления для всех запросов на файл index.php.

Для того, чтобы файл style.css и изображения (images/img...) работали, добавляем еще два правила:


RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d


Файл .htaccess


-- файл .htaccess --

AddDefaultCharset utf-8
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php




Файловая структура сайта test2:


MVC-5-2



Страница списка новостей


MVC-5-3



Страница просмотра одной новости


MVC-5-4



Далее наша задача состоит в том, чтобы получить информацию из элементов массива $newsList (контроллер NewsController.php) и разместить ее на странице news/index.php

Выбираем один шаблон, который соответствует одной новости на странице и в цикле foreach ($newsList as $newsItem) заменяем статические данные, на данные, полученые из массива $newsList (распечатываем элементы массива).
Используем, при этом, сокращенный синтаксис:


<?php echo $newsItem['title'] ; ?> - заголовки новостей
/news/<?php echo $newsItem['id'];?> - ссылка на эту новость (по индификатору 'id' и пути '/news')
<?php echo $newsItem['date'];?> - дата добавления новости
<?php echo $newsItem['short_content'];?> - краткое содержание новости
/news/<?php echo $newsItem['id'];?> - еще одна ссылка на новость (по индификатору 'id' и пути '/news')




Файл index.php


-- файл index.php --

<!-- views/news/index.php -->

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<link href="/tamplate/css/style.css" rel="stylesheet" type="text/css">
<title> Список новостей </title>
</head>
<body>

<!--Обертка-->
<div id="wrap">

<!--Шапка-->
<div class="head">
<h1>НОВОСТИ </h1>
</div>

<!--Контент-->
<div id="content">

<?php foreach ($newsList as $newsItem):?> <!-- цикл foreach -->

<div class="post">

<!-- ссылка на новость (по индификатору 'id') и заголовок новости -->
<h2 class="title">
<a href= "/news/<?php echo $newsItem['id'];?>" >
<?php echo $newsItem['title'] ; ?>
</a>
</h2>

<!-- дата добавления новости -->
<p class="byline"> <?php echo $newsItem['date']; ?> </p>

<!-- краткое содержание новости -->
<div class="entry">
<p>
<?php echo $newsItem['short_content']; ?>
</p>
</div>

<!-- ссылка на новость -->
<div class="meta">
<p class="links">
<a href= "/news/<?php echo $newsItem['id']; ?> " class="comments"> Читать дальше </a>
</p>

</div>
</div>

<?php endforeach; ?> <!-- конец цикла foreach -->

</div>

<!-- footer -->
<div id="footer">
</div>
</div>
</body>
</html>




Аналогично получаем информацию из массива $newsItem (одна новость) и распечатываем элементы массива на странице news/view.php. Также заменяем запись в заголовке title.


Файл view.php


-- файл view.php --

<!-- views/news/view.php -->

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<link href="/tamplate/css/style.css" rel="stylesheet" type="text/css">

<!-- запись в заголовке -->
<title> <?php echo $newsItem['title']; ?> </title>
</head>
<body>

<!--Обертка-->
<div id="wrap">

<!--Шапка-->
<div class="head">
<h1>НОВОСТИ</h1>
</div>

<!--Контент-->
<div id="content">
<div class="post-news">

<!-- заголовок новости -->
<h2 class="title"> <?php echo $newsItem['title']; ?> </h2>

<!-- автор новости и дата добавления -->
<p class="byline"> <?php echo $newsItem['author_name'];   echo $newsItem['date']; ?> </p>

<!-- полное содержание новости -->
<div class="entry">
<p> <?php echo $newsItem['content']; ?> </p>
</div>

<!-- ссылка к списку новостей -->
<div class="meta">
<p class="links"><a href="/news/" class="comments"> Назад к списку новостей </a></p>
</div>
</div>
</div>

<!-- footer -->
<div id="footer">
</div>
</div>
</body>
</html>






Наверх Наверх