Посмотреть в MVC, что такое макет и как его создать - PullRequest
0 голосов
/ 01 декабря 2009

Я не понимаю, что такое макет, в представлении. Ранее я задавал вопрос на тему шаблонов в PHP, но я все еще не совсем понимаю. Я предполагаю, что вы создаете общий макет для сайта, а затем включаете каждый конкретный вид в этот макет .... Я хотел бы знать, как это сделать. Кроме того, должны ли шаблоны быть сделаны с использованием только HTML, потому что я также рассмотрел эти вещи, называемые помощниками ... Я просто запутался в части View 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>

EDIT

Итак, есть ли в макете оператор включения для просмотра конкретного шаблона представления? как так?

Ответы [ 3 ]

1 голос
/ 01 декабря 2009

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

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

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

для вашего вопроса входа в систему на самом деле вам придется сделать оба на контроллере и вид

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

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

<?php if($isLogged): ?>
  <form>....</form>
<?php endif;?>
0 голосов
/ 01 декабря 2009

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

<?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;

?>
0 голосов
/ 01 декабря 2009

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

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

Вот эмпирическое правило, которому я хотел бы следовать (кстати, я использую 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>
<? } ?>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...