Separating code from layout in template

后端 未结 4 1422
渐次进展
渐次进展 2021-02-20 08:17

I have an app built around an MVC pattern. The view is php but mostly html with minimal php code embedded, stuff like this -

Welcome 

        
相关标签:
4条回答
  • 2021-02-20 08:54

    If I may add a suggestion, you can convert all PHP output to DOM/XML and feed it to an XSLT processor where the presentation, however complex, is more consistent, because XSLT and XHTML are both based on XML. You do get presentation separated from content both in terms of physical location and technology used to deliver it.

    0 讨论(0)
  • 2021-02-20 08:59

    Separate the code to create the table into a ViewHelper. Configure the method call from the template. Have the ViewHelper render the actual table with all required settings. Your main template should then contain only a line like this:

    <?php echo table($data, $sortOptions, $otherConfig) ?>
    

    Basically, any logic required to build that table will be contained within the ViewHelper which is why you might want to make it a class. The complete implementation will vary depending on your needs.

    If you dont want to put all the logic into one large Table Helper, consider making helper functions for any parts of the table. For instance, something like

    <th><?php echo sortLink('Name', $current); ?></th>
    

    This way, the sortLink helper would decide whether and how to create and insert any sort links, so you dont have to have that logic or any conditionals in the main template.

    0 讨论(0)
  • 2021-02-20 09:13

    One solution is to use Javascript sorting, there is some good ones for jQuery.

    If that is not possible y0ou might have a look on some template solution like Smarty to handle templateing for you.

    0 讨论(0)
  • 2021-02-20 09:18

    Excellent question, which is very uncommon for this site.

    First of all you HAVE to accept the fact that any real life template will never be simple. That's it. It's called presentation logic and it follows the complexity of the presentation itself.

    So, just make it the same way as before -- by using the same loop and conditional operator and -- possibly -- some home-brewed helper functions, which will spoil template purity but greatly helps.

    In fact, you have almost nailed it. you can use predefined variables, however they should contain no HTML but just values to be displayed.

    <tr>
     <th>
      <a href="<?=$links['name']['url']?>">
       Name
       <?if($links['name']['dir']=='asc'):?><img src="arrow.gif"><?endif?>
       <?if($links['name']['dir']=='desc'):?><img src="reverse_arrow.gif"><?endif?>
      </a>
     <td>
    

    it is tempting to make a loop out of this but I would advise against that, because it will lead you to inventing some HTML builder which is another story and not that reliable as pure HTML itself.

    The only blame for you: a programmer, asking for the code assistance, should bring the code, not wordy blab. An example of the actual HTML would be much better, allowing answerers not to invent it out of the head.

    0 讨论(0)
提交回复
热议问题