Jump to content

How to handle the View


Acs

Recommended Posts

I have been reading a lot bout the mvc pattern and I have some ideas on how to apply this to php! The problem is, how do you guys treat the view? I have seen some examples of some frameworks about creating a blog system or something like that and how they load the view. What I miss to see is how would they work with a global view.

By global view I mean the sites default layout. Normally just the central part of the website changes and not everything.

How do you guys do it? Do you have set a global view which is then filled with the view of the current controller set?

 

Thanks

Link to comment
Share on other sites

I'm banging out that documentation for my little framework right now. If all goes well I'll get it wrapped up tonight and thrown up online somewhere.

 

That being said here is how I'm handling it in my framework:

 

This would be in my Hello_Controller... Variables get loaded and specify the masterpage to be used (this is the global view you are speaking of). In this example I've defined a variable "view" which tells the masterpage which view to use for the content section.

   public function index()
   {
      $arrData = Array();
      $arrData['title'] = "Hello World";
      $arrData['view'] = "Hello_View";
      echo $this->_getView("Masterpage/masterpage", $arrData, true); 
   }

 

This obviously calls the _getView method which handles the request. Basically we create the Template (view) object and set the variables that were passed. If the view is something we want to cache, we tell it so that it can be cached after it's rendered. Ultimately the view gets loaded passing in the data.

   public function _getView($strView, $arrData, $blnIsCacheable=false)
   {       
      if( $strView != "" && file_exists(VIEW_DIR . $strView . ".php") )
      {
         $objTemplate = new Template(VIEW_DIR . $strView . ".php");
         $objTemplate->setAll($arrData);
         
         if( $blnIsCacheable ) { $objTemplate->setIsCacheable(true); }
         
         return $objTemplate->load();
      }
   }   

 

So then over in my masterpage view that gets invoked I've got this:

<html>
<head>
<title><?php echo $title; ?></title>
</head>

<body>

<?php include_once VIEW_DIR . $view . ".php"; ?>

</body>
</html>

 

Which in turn includes the "subview" that we want to use for the content. That view looks like this:

<h1>Hello View</h1>
<?php _doGetInstance('router')->_getModel('Hello')->getNews(); ?>

 

Of course in the above I'm also calling a model to populate some additional data, but that's okay :)

 

There is certainly a lot of cleanup work that I can do with this, and I'm sure smarter people than me are cringing looking at this code, but it seems to be getting the job done and having thrown this thing together in about a day and a half of piddling I'm fairly pleased.

Link to comment
Share on other sites

Thanks for the quick reply!

 

In my cms I am doing something similar to that (except I don't implement the mvc pattern)

I have the template system that checks to see if what I set X to is a variable or a file and if it's a file it will include the files.

So I have my main template

 

<body>
<div id="woman"></div>
<div id="Content">
<div id="Content2">       
<div id="logo"></div>
    <div id="logo_bocado"></div>
        <div id="menuHolder">    
            <div id="navcontainer">            		
                <ul id="navlist">               	 
                    <li><a href="#" title="Inicio" name="inicio" >Inicio</a></li>
                    <li style="margin-left:10px;"><a href="#" title="Quem Somos" name="quemsomos">Quem Somos</a></li>
                    <li style="margin-left:10px;"><a href="#" title="Staff" name="staff">Staff</a></li>
                    <li style="margin-left:8px;"><a href="#" title="Produtos" name="produtos">Produtos</a></li>
                    <li><a href="#" title="Galeria" name="galeria">Galeria</a></li>
                    <li style="margin-left:-5px;"><a href="#" title="Informações" name="info">Informa�oes</a></li>
                    <li style="display:none"><a href="paginas/construcao.html" title="Construcao" name="Construcao"></a></li>
                </ul>
            </div>
        </div> <!-- menuHolder -->
        <div id="imagens">   
        </div><!-- imagens -->    	    
    </div><!-- Content2 -->
    <div id="paginaHolder">
    	<div id="paginas">{TEMPLATE_BODY}</div>
        <div id="cantos">
        
        </div>
    </div>
    <div id="ftr"><a href="http://www.antoniocs.org" target="_blank">AntonioCS.org</a></div>
    
</div><!-- Content -->
</body>

 

And then I use templateManager::setTemplateCode("body","path to file"); to replace {TEMPLATE_BODY} with the page I want to see.

 

Of course this is all called in a non mvc compliant way. That's why I really want to have a good grasp of the mvc pattern so that I can quickly make a very small framework just to show some pages that I have already done for this cms

 

Thanks again!

Link to comment
Share on other sites

I'm no expert, but I'll just add my opinion, fwiw.

I prefer to think that a "routing table" is a good idea for an MVC architecture.

Actually it should be called CMV because the order is C -> M -> V , but that's another topic :)

 

So, further detailing it, we get this:

User HTTP-Req + Data -> Routing Table (first lookup) -> Model / Business Logic / Database access -> Routing Table (second lookup) -> View / HTTP Response

 

First lookup of Routing Table answers this question:

"Which is the right business logic component or class or script to handle this form and data?"

 

Second lookup of Routing Table answers this question:

"Which is the right view component or class or script to display this form and data?

And also, what further input form or interactive element should be shown to the user?"

 

open to discussion :)

Link to comment
Share on other sites

A little bit complex your graphical representation. But I think what I should do is just use like a global view and the sub views. Which something I am using now in my little cms.

I have seen someone using a router class in this tutorial and I was following it, but.. this router class seems something that the main controller could be. At least in my way of seeing this.

Link to comment
Share on other sites

A little bit complex your graphical representation

...

this tutorial

...

This is a page where controller routing is well explained: http://phpfuse.net/wiki/index.php?title=FuseURIRouter

 

In general, IMO, we PHP programmers must stay in touch with the latest programming tricks (aka "patterns") in other languages or platforms, because PHP has some advantages which those do not and this extra power of PHP when combined with the well-organised "patterns" can create auick solutions.

In particular, IMO, everyone interested in this MVC thing must read about "Struts" xml configuration files, "Model2", and "fat controller problem". Really nice stuff.

 

HTH someone :)

 

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.