PHP DevCenter

oreilly.comSafari Books Online.Conferences.

We've expanded our LAMP news coverage and improved our search! Search for all things LAMP across O'Reilly!

Search
Search Tips

advertisement

Listen Print Discuss Subscribe to PHP Subscribe to Newsletters

Implementing MVC in PHP: The View

by Joe Stump
01/26/2006

This is the third article in a series about understanding MVC in PHP. The first article explained basics of MVC programming in PHP. The second article showed the implementation of the Controller in MVC. The final article is Implementing MVC in PHP: The Model.

The presentation layer, as I call it, is the View, in common MVC terms. Its sole responsibility is to display information. It could care less about authenticating users, what the data is or, for the most part, where it came from. The only thing it has to worry about is how to render it and where to send it once rendered.

By default, the framework uses Smarty to render the framework. I'm not here to argue semantics, but your presentation layer should consist of a template engine of some sort and a few supporting presentation layers.

The idea is that, after the Model runs, the framework hands it off to a child of the FR_Presenter_common class. Actually, the framework uses the FR_Presenter::factory() to create the presenter. Each presenter should have a display() method that does the actual rendering. When the factory creates the presenter, it passes the presenter the instance of the model class. The presenter then gets the model's data using its getData() method. From there, the presenter is free to present that data however it sees fit.

FR_Presenter_smarty

The way I've created my Smarty presenter is a hybrid of two templates. I create a Smarty template, and the outer page template includes the model's template. The model class's $pageTemplateFile can request a particular outer template. If it does not, the default is tpl/default/templates/page.tpl. The page.tpl template then uses the {$modulePath} and {$tplFile} directives to include the model's template. All model templates should reside in modules/example/tpl/.

After assigning the variables, the controller runs Smarty's display function to render the templates. With little modification, you could wrap these calls with Smarty's built-in caching as well. By using Smarty, you could enable an output modifier to output gzipped code instead of plain HTML.

<?php

  /**
  * FR_Presenter_smarty
  *
  * @author Joe Stump <joe@joestump.net>
  * @copyright Joe Stump <joe@joestump.net>
  * @license http://www.opensource.org/licenses/gpl-license.php
  * @package Framework
  * @filesource
  */

  require_once(SMARTY_DIR.'Smarty.class.php');

  /**
  * FR_Presenter_smarty
  *
  * By default we use Smarty as our websites presentation layer (view). Smarty
  * is a robust compiling template engine with an active community.
  *
  * @author Joe Stump <joe@joestump.net>
  * @package Framework
  * @link http://smarty.php.net
  */
  class FR_Presenter_smarty extends FR_Presenter_common
  {
      private $template = null;
      private $path = null;

      public function __construct(FR_Module $module)
      {
          parent::__construct($module);
          $this->path = FR_BASE_PATH.'/tpl/'.FR_TEMPLATE;
          $this->template = new Smarty();
          $this->template->template_dir = $this->path.'/'.'templates';
          $this->template->compile_dir = $this->path.'/'.'templates_c';
          $this->template->cache_dir = $this->path.'/'.'cache';
          $this->template->config_dir = $this->path.'/'.'config';
      }

      public function display()
      {
          $path = FR_BASE_PATH.'/modules/'.$this->module->moduleName.'/tpl';;
          $tplFile = $this->module->tplFile;

          $this->template->assign('modulePath',$path);
          $this->template->assign('tplFile',$tplFile);
          $this->template->assign('user',$this->user);
          $this->template->assign('session',$this->session);

          foreach ($this->module->getData() as $var => $val) {
              if (!in_array($var,array('path','tplFile'))) {
                  $this->template->assign($var,$val);
              }
          }

          if ($this->module->pageTemplateFile == null) {
              $pageTemplateFile = 'page.tpl';
          } else {
              $pageTemplateFile = $this->module->pageTemplateFile;
          }

          $this->template->display($pageTemplateFile);
      }

      public function __destruct()
      {
          parent::__destruct();
      }
  }

?>
PHP Hacks

Related Reading

PHP Hacks
Tips & Tools For Creating Dynamic Websites
By Jack Herrington

Pages: 1, 2

Next Pagearrow




Recommended for You

Tagged Articles

Be the first to post this article to del.icio.us

Sponsored Resources

  • Inside Lightroom
Advertisement

Sponsored by:

O'Reilly Media

©2010, O'Reilly Media, Inc.
(707) 827-7000 / (800) 998-9938
All trademarks and registered trademarks appearing on oreilly.com are the property of their respective owners.
About O'Reilly
Academic Solutions
Authors
Contacts
Customer Service
Jobs
Newsletters
O'Reilly Labs
Press Room
Privacy Policy
RSS Feeds
Terms of Service
User Groups
Writing for O'Reilly
Content Archive
Business Technology
Computer Technology
Google
Microsoft
Mobile
Network
Operating System
Digital Photography
Programming
Software
Web
Web Design
More O'Reilly Sites
O'Reilly Radar
Ignite
Tools of Change for Publishing
Digital Media
Inside iPhone
makezine.com
craftzine.com
hackszine.com
perl.com
xml.com

Partner Sites
InsideRIA
java.net
O'Reilly Insights on Forbes.com