Просмотр в MVC, что такое макет и как его создать

Я не понимаю, что такое макет, в представлении. Ранее я задавал вопрос о шаблонах PHP, но я до сих пор не совсем понимаю. Я предполагаю, что вы создаете общий макет для сайта, а затем включаете каждый конкретный вид в этот макет … Я хотел бы знать, как это сделать. Кроме того, должны ли шаблоны быть сделаны с помощью только html, потому что я также рассматривал эти вещи, называемые помощниками …. Я просто запутался в части просмотра MVC, а также о фактических шаблонах и способах их создания. Я лучше всего учусь примерами, если у вас, ребята, есть.

Кроме того, более важный вопрос, скажем, у меня была форма, которую пользователь видел только в том случае, если он был зарегистрирован, могу ли я контролировать это в представлении или в контроллере?

Так я бы сделал

in the controller include 'header'; if(isset($_SESSION['userID'])){ include 'form'; } include 'footer'; 

или

 in the template <html> <?php if(isset($_SESSION['user_id'])): ?> <form>....</form> <?php endif;?> </html> 

РЕДАКТИРОВАТЬ

Итак, есть ли указатель include из макета, чтобы увидеть конкретный шаблон представления? как так?

Related of "Просмотр в MVC, что такое макет и как его создать"

Я не решаюсь ответить на этот вопрос только из-за религиозного пыла, который его окружает.

Чтобы получить действительно хорошее понимание проблем, стоящих за общими понятиями, см. Эту страницу обсуждения Wiki. Это страница обсуждения вокруг статьи MVC wiki.

Вот эмпирическое правило, которым я люблю следовать (BTW я использую CodeIgniter, и это звучит так же, как и вы):

«Вид» должен иметь практически никакой логики. Он должен быть только HTML (в веб-мире) с перфорированным PHP, который просто перекрестие переменных. В вашем примере вы можете разбить форму на свое собственное представление, и контроллер определит, была ли она загружена или нет.

Мне нравится смотреть на это так: в представлении не должно быть понятия о том, откуда поступают данные или куда они идут. Модель должна выглядеть агностикой. Контроллер суммирует данные из модели и предоставляет ее виду – и он принимает входные данные из представления и фильтрует его в модели.

Вот быстрый и грязный (непроверенный – но он должен понять):

Theapp.php (контроллер приложения)

 class Theapp extends Controller { var $_authenticated; var $_user; var $_menu; // array of menus function __construct() { session_start(); if (isset($_SESSION['authenticated']) && $_SESSION['authenticated']) { $this->_authenticated = $_SESSION['authenticated']; // or some such thing $this->_user = $_SESSION['user']; } $this->_menu = array("Logout", "Help", "More"); parent::__construct(); $this->loadView("welcome"); // loads primary welcome view - but not necessarily a complete "html" page } function index() { if (!$this->_authenticated) $this->loadView("loginform"); else { $viewData['menu'] = $this->_menu; $viewData['user'] = $this->_user; $this->loadView("menu", $viewData); } } function login() { /* code to authenticate user */ } function Logout() { /* code to process Logout menu selection */ } function Help() { /* code to process Help menu selection */ } function More() { /* code to process More menu selection */ } } 

welcome.php

 <h1> Welcome to this quick and dirty app!</h1> All sorts of good HTML, javascript, etc would be put in here! 

LoginForm.php

 <form action"/Theapp/login" method="post"> User: <input id='user' name='user'> Pass: <input id='pass' name='pass' type='password'> <input type='submit'> </form> 

menu.php

 Hi <?= $user ?>!<br> Here's your menu<br> <? foreach ($menu as $option) { ?> <div class='menuOption'><a href='/Theapp/<?=$option?>'><?=$option?></a></div> <? } ?> 

Надеюсь это поможет.

макет – это то, что у вас есть вокруг вашей основной области содержимого. Обычно на обычном веб-сайте это будет любая боковая панель, заголовок, нижний колонтитул. Большинство структур MVC обеспечивают макет, чтобы избежать повторения этих частей во всех представлениях.

Вы можете себе представить, если у вас есть два вида каскадных

  1. вы просматриваете фактическое представление, этот контент сохраняется
  2. вид макета (все элементы вокруг содержимого) отображаются, а ваш контент включен в этот вывод

для вашего логин-вопроса на самом деле вам придется делать как на контроллере, так и на представлении

 $this->view->isLogged = isset($_SESSION['userID']); 

в представлении

 <?php if($isLogged): ?> <form>....</form> <?php endif;?> 

Если вы не используете фреймворк, то простой способ иметь макет и представление может выглядеть так:

 <?php function layout($layout_params) { extract($layout_params); # Remember: $layout_content must be echoed for the view to be seen. ob_start(); include "layout_page.php"; $html = ob_get_contents(); ob_end_clean(); return $html; } function view($view_params) { extract($view_params); ob_start(); include "home_page.php"; $html = ob_get_contents(); ob_end_clean(); return $html; } # # The variable $parameters is extracted and $params becomes a variable in the view as an array, # $logged_in is also now avaiable in the view # $parameters = array("params" => array("name" => "joe"), "logged_in" => false); $view_content = view($parameters); # => Returns the HTML content for home_page.php # Now we need the layout content to include the view: # The layout file will expect a variable called $layout_content to be the html view. # So we need to set $layout_content to be $view_content $parameters["layout_content"] = $view_content; # We no longer need $view_content so we can unset the variable unset($view_content); # When $paramters is extracted it will have $layout_content as a variable: $layout_content = layout_view($paramters); # => Returns the HTML content for the layout_page.php # Now send the results to the browser echo $layout_content; ?> с <?php function layout($layout_params) { extract($layout_params); # Remember: $layout_content must be echoed for the view to be seen. ob_start(); include "layout_page.php"; $html = ob_get_contents(); ob_end_clean(); return $html; } function view($view_params) { extract($view_params); ob_start(); include "home_page.php"; $html = ob_get_contents(); ob_end_clean(); return $html; } # # The variable $parameters is extracted and $params becomes a variable in the view as an array, # $logged_in is also now avaiable in the view # $parameters = array("params" => array("name" => "joe"), "logged_in" => false); $view_content = view($parameters); # => Returns the HTML content for home_page.php # Now we need the layout content to include the view: # The layout file will expect a variable called $layout_content to be the html view. # So we need to set $layout_content to be $view_content $parameters["layout_content"] = $view_content; # We no longer need $view_content so we can unset the variable unset($view_content); # When $paramters is extracted it will have $layout_content as a variable: $layout_content = layout_view($paramters); # => Returns the HTML content for the layout_page.php # Now send the results to the browser echo $layout_content; ?>