SitePoint Sponsor

User Tag List

Results 1 to 9 of 9
  1. #1
    SitePoint Zealot yukimushu's Avatar
    Join Date
    Feb 2005
    Location
    United Kingdom
    Posts
    183
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Seperation of code and presentation

    Being relatively new to OOP I'm wondering if any of you guys could help me with a question I have.

    When building a product list page, I'm under the understanding it's important to have a seperation of both code/process and presentation, how would I go about doing this?

    By something like the following example?

    Code PHP:
     
    (productlist.php)
     
    <?php
     
    $prod = new prod;
     
    echo $page->pageTitle;
     
    echo "<ul id=\"prod_list\">\n";
    while ($prow= mysql_fetch_assoc($prod->prod_res())) {
     
    <li>
    <h1><?php echo $prow['title']; ?></h1>
    <p><?php echo $prow['desc']; ?></p>
    </li>
     
    }
    </ul>
     
    ?>

    Or would it be better just creating the product list (along with all of the above html) in a method, then outputting the method? Like:

    Code PHP:
     
    (product_class.php)
    ...
     
    public function prodList() {
     
    $query= "SELECT title, desc FROM prod"
    $pres = mysql_query($query);
     
    echo "<ul id=\"prod_list\">\n";
    while ($prow= mysql_fetch_assoc($query)) {
    echo "
    <li>
    <h1>" . $prow['title'] . "</h1>
    <p>" . $prow['desc'] . "</p>
    </li>";
    }
    echo "</ul>\n";
     
    }
     
    ...

    Code PHP:
     
    (productlist.php)
     
    <?php
     
    $prod = new prod;
     
    $prod->prodList();
     
    ?>

  2. #2
    SitePoint Wizard wheeler's Avatar
    Join Date
    Mar 2006
    Location
    Gold Coast, Australia
    Posts
    1,369
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    I am by no means a OOP guru and struggle with this own concept myself.

    My first suggestion is to use return inside methods instead of echo. That way you can control the output and perhaps use it differently down the track.

    Second, my feeling is mixed as to how the result should be generated:

    - in an ajax heavy environment, I think the result should be generated by a method or methods somewhere, including the necessary html. That way you can make a ajax call to update the result after an action has occurred - such as GET ajax.php?action=fetchSomeList, and update the div with the result.

    - in a more static environment, I am more inclined to use conventional mixes of html and php loops to produce results, which make it easier from a design POV. For example say you want to add a class to a list item - how hard should it be?

    There is a trade off with each approach, and I figure that the middle ground is some portable language like xml or json, allowing you to output in multiple ways in multiple environments - but what I have seen of xml based templating seems way too complicated for me.
    Studiotime - Time Management for Web Developers
    to-do's, messages, invoicing, reporting - 30 day free trial!
    Thomas Multimedia Web Development

  3. #3
    SitePoint Zealot
    Join Date
    Dec 2010
    Posts
    187
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    In both approaches, you didn't really separate anything so you didn't achieve much.
    The goal of OOP is to group similar tasks and that you can reuse class methods or extend the classes to fit other roles with similar subjects.

    So why not combine the two approaches? Use the class to retrieve the data from the database, store it in an array and fetch the array in another script where you can change the html output. That way, you did achieve some separation. You have the class method to obtain the data and a viewer to display it.

    That way, you can have multiple pages using the same class and method to retrieve the products, but you can style them completely different.

  4. #4
    SitePoint Wizard bronze trophy
    Join Date
    Jul 2006
    Location
    Augusta, Georgia, United States
    Posts
    4,147
    Mentioned
    16 Post(s)
    Tagged
    3 Thread(s)
    model/products.php
    PHP Code:
    function productsList() {

        
    $products = array();
     
        
    $sql 'SELECT title, desc FROM prod';
        
    $result mysql_query($sql);
     
        while (
    $productmysql_fetch_assoc($result)) {
            
    $products[] = $product;
        }
        
        return 
    $products;
     

    template file usage
    PHP Code:
    <ul>
        <?php foreach(productsList() as $product) { ?>
            <li>
                 <h1><?php echo $product['title']; ?></h1>
                 <p><?php echo $product['desc']; ?></p>
            </li>
        <?php ?>
    </ul>
    Without getting into a full blown OO business layer the above achieves separation between business and presentation logic. if you would like to take it further you could organize all the product based data access methods into a class. You would than instantiate the class and call appropriate method to fetch the data or carry out the business task at hand.
    The only code I hate more than my own is everyone else's.

  5. #5
    SitePoint Wizard wheeler's Avatar
    Join Date
    Mar 2006
    Location
    Gold Coast, Australia
    Posts
    1,369
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    I guess thats true, an array is probably the most re-usable storage option - I guess what I have found challenging about that method in the past is to factor in all the different usages without creating a huge method.

    For example, I once made a method to retrieve a bunch of auctions. The variables included:
    - category id
    - seller id
    - keywords
    - low and high price
    - dynamic category variants
    - buy now only
    - items with video only
    - make an offer only
    - order by

    Of course most of those variables are easily dealt with, but some are quite complex to deal with, and the requirements changed from page to page.

    I guess my point is, I find handling the result is the easy part. The hard part is retrieving the data efficiently and in a re-usable way in a complex application.

    What method would be used to output html for ajax? Would you include the template file? I guess thats the point where I start to confuse how to chain things together and find -
    PHP Code:
    echo fetchSomeList(); 
    easier than "include some file and pass an array to produce a result".
    Studiotime - Time Management for Web Developers
    to-do's, messages, invoicing, reporting - 30 day free trial!
    Thomas Multimedia Web Development

  6. #6
    SitePoint Wizard wheeler's Avatar
    Join Date
    Mar 2006
    Location
    Gold Coast, Australia
    Posts
    1,369
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    going back to ajax again, given oddz example, which contained <ul> and <li>... sometimes you just want a single <li> - sometimes you want the whole list. If strictly keeping html out of methods, in what reusable way can this be achieved without having separate templates for whole list and list item?

    Not trying to be a thorn here, I am just genuinely confused when I try and combine MVC and ajax driven environments.
    Studiotime - Time Management for Web Developers
    to-do's, messages, invoicing, reporting - 30 day free trial!
    Thomas Multimedia Web Development

  7. #7
    SitePoint Wizard bronze trophy
    Join Date
    Jul 2006
    Location
    Augusta, Georgia, United States
    Posts
    4,147
    Mentioned
    16 Post(s)
    Tagged
    3 Thread(s)
    Quote Originally Posted by wheeler
    going back to ajax again, given oddz example, which contained <ul> and <li>... sometimes you just want a single <li> - sometimes you want the whole list. If strictly keeping html out of methods, in what reusable way can this be achieved without having separate templates for whole list and list item?
    How that would dealt with depends entirely on the existing architecture. My framework itself uses a REST layer that is a direct gateway to data access methods. By default the results are returned as XML but variable can be supplied to change the output to JSON or any other format so long as a translation exists.

    model.php?pkg=Product&method=fetchById&args[]=23

    Navigation to a URL similar to that would result in a XML output for the return value of the fetchById method within the model package Product 23.

    On the other hand when I want to execute a complete module returning HTML another entry point is used.

    controller.php?pkg=Product&method=list

    In that case the output of the list method within the products controller is returned as string that can be placed on the page using innerHTML dynamically.

    That is how I have set-up my framework to separate REST (data access) from merely returning the HTML output of a request without the wrapper/layout.

    That is what this entire thread is about actually. Just in that case its a JQuery integration but the endpoints are the same.
    The only code I hate more than my own is everyone else's.

  8. #8
    SitePoint Enthusiast
    Join Date
    Dec 2003
    Location
    norway
    Posts
    61
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Quote Originally Posted by wheeler View Post
    going back to ajax again, given oddz example, which contained <ul> and <li>... sometimes you just want a single <li> - sometimes you want the whole list. If strictly keeping html out of methods, in what reusable way can this be achieved without having separate templates for whole list and list item?
    I sometimes have html in methods for stuff like simple listitem lists, menu lists and dropdown lists since a strict separation gives to much complexity for me..

  9. #9
    SitePoint Guru bronze trophy TomB's Avatar
    Join Date
    Oct 2005
    Location
    Milton Keynes, UK
    Posts
    989
    Mentioned
    9 Post(s)
    Tagged
    2 Thread(s)
    Quote Originally Posted by wheeler View Post
    going back to ajax again, given oddz example, which contained <ul> and <li>... sometimes you just want a single <li> - sometimes you want the whole list. If strictly keeping html out of methods, in what reusable way can this be achieved without having separate templates for whole list and list item?
    You pull data into the template rather than pushing from the method.

    The template/view requests the data it needs rather than being passed data the container thinks it will need. Sorts out all these problems


Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •