Re: templating engine options

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, May 25, 2009 at 6:44 PM, Nathan Rixham <nrixham@xxxxxxxxx> wrote:
> Stuart wrote:
>>
>> 2009/5/25 Robert Cummings <robert@xxxxxxxxxxxxx>:
>>>
>>> I continued the discussion with Nathan.
>>
>> I too have had an off-list discussion with Nathan on this topic, and a
>> productive one at that.
>>
>
> which would probably be a good time for me to step back in; having had a
>  nice little inside in to both Robert and Stuarts template systems, and
> indeed way(s) of doing things. Also thanks to everybody else who made
> suggestions and gave input - it was all appreciated.
>
> I'm far from making a final decision, as I've decided to approach this by
> setting a few guidelines and a wishlist, then either finding / modifying
> something to do the job, or creating something from scratch.
>
> Both Rob and Stuarts systems were more in common than they may think, focus
> in both was on performance, and only making set data available to the
> templates (whether pushing or pulling).
>
> The syntax did differ though, and functionality aside this is probably one
> of the most important aspects (imho).
>
> Markup & XML sits well with me (and most) because we are web developers and
> use it daily.
>
> PHP syntax also sits well because we also use it daily.
>
> The fact remains though that this "feels like" (and possibly is) a different
> job which requires something different. Both XHTML and PHP do their job well
> - just as ecma(java)script and css do theirs.
>
> However none of these technologies / languages are suited and dedicated to
> converting provided data in to specified output; specifically, and only,
> xhtml.
>
> XSL Templates are near perfect, built for the job, and very powerful - but
> time hasn't favoured them well; and until (if ever) a wide spread adoption
> happens something else needs to fill the gap.
>
> Template Specific Thoughts:
>
> Smarty, Stuarts Engine, Robs Engine, PHPLIB and many more had one common
> theme, they all limited the data available. My terminology of limited
> perhaps sounds wrong, so maybe "make specified selected data available" or
> "provide access to the view" will make more sense. Inline with layered and
> tiered application design this makes perfect sense; thus..
>
> A template /should/ only be able to access the data made available to it,
> nothing else. Whether it requests the data or the data is provided is
> covered later. If it doesn't have all the data needed then this needs
> reviewed and the application needs changed to provide it. Not the template
> engine bastardized to accommodate a limited app.
>
> A template ~should~ have unique yet easy to understand syntax, something
> that complements xhtml and provides all needed functionality. (IMHO it
> should not be php syntax)
>
> A template engine must stick within it's role boundaries, it's not a cache
> engine, its not php, its not xhtml, its not for implementing functionality -
> it is simply and purely to do its job - take data, populate an xhtml
> template with it and return the result - nothing more, nothing less.
>
>
> Push vs Pull.
>
> This is a much bigger issue than I thought, and perhaps is the crux of the
> whole thing. I can see two clear approaches;
>
> Firstly, (the common one)
> - app passes data and a template to the template engine
> - template engine merges it together and passes back
> - app does as it pleases with data (sends it to client, caches it, fires it
> in an email - whatever)
>
> Secondly, (uncomment)
> [think modular]
> - app provides an api / gateway to views of data
> - template engine requests view(s) specified in template from app
> - template engine populates template modules with data & sends output to
>
> I guess the first is template engine as a Util / Service - and the second is
> template engine as a Layer / App.
>
> There are pros and cons in each design, concentrating on the second design
> for now - this brings in a lot of scope which seems to fit well both
> practically and architecturally.
>
> The freedom to be able to specify in template that...
>
> this is template module "latest posts", it is bound to the data view (or
> data provider) "latest posts(8)"
> whilst overall combining template (page) is comprised of modules x,y and z -
> here, here and here.
>
> ...really appeals to me; certainly in this scenario where you request (pull)
> from the application rather than make it all available. This way you only
> ever perform the business logic required for the information available. The
> counter part of making everything available incase it may be used is
> ridiculous (and makes me think coldfusion for some reason??).
>
> Architecturally this appears to be good - it's the presentation tier being a
> presentation tier, the logic tier knows nothing of the presentation tier and
> simply serves up what is requested. However thats only on the one side of
> the tier - on the other side we have a huge gaping hole where functionality
> should be (cache, compilation, delivery) etc, which would require another,
> as yet unknown layer (or 2).
>
> The abstraction and separation of concerns in this setup really appeals -
> but practically I'm not sure if the time spent implementing on a small or
> even medium sized project would be worth it. Still appeals massively though
> - pull makes more logical sense to me.
>
> Meanwhile, we have the first option, the way it's done, "push" the data -
> specify a template for that data and let template engine X do the merging.
> IMHO a clean, simple, lightweight implementation wouldn't be the hardest
> thing to make, and hundreds of apps are freely available all ready.
>
>
> Push vs Pull Conclusion
> Mentally I'm sticking with "pull" for a long term goal, however practically
> I'm going to look at creating "push"; which isn't hard and focussing
> specifically on template syntax, which is were I'm going next :p
>
>
> Syntax
>
> As mentioned previously I strongly feel all the current offerings I've seen
> are not ideal, the syntax is just a bit wrong
>
> preference goes to smarty/phplib style of syntax {$var.child} for only one
> reason.. because it's not as intertwined as:
> echo '<li>'. $var->child . '</li>';
> //simple example but you know how messy this can get
> likewise it's not as ..?.. as xslt nor is it as potentially confusing as two
> versions of markup in the same document.
>
> however, I still don't like it - it's just a workaround imho, a temporary
> measure.
>
> between the last line and here there is a massive trail of thought I can't
> even begin to type out, and it'd be v boring. BUT it leads me to the
> following..
>
> An extended version of xhtml, with a simple dtd, specifically for templates.
> This isn't intertwined or alternative markup, it's enhanced with more
> attributes.. consider
>
> <div id="comments" datasource="blog.recentcomment">
>  <p>
>    <strong data="title" /><br /> ..PROBLEM..
>  </p>
> </div>
>
> and here in and there in lies the great big feckin problems which means
> we'll never have a proper solution.
>
> ..PROBLEM.. how do we specify what the content of problem area is? without
> introducing a new tag rather than just an attribute?
>
> making a template syntax is simple, while you do block elements, the second
> you hit inline elements you are stuffed.
>
> <b> is the bane of our lives, because we can't represent inline elements in
> any language bar xhtml, we work with blocks of everything. Consider drawing
> API's, you can draw a circle inside a square easily, the code is just:
> object.drawSquare( x , y , w , h );
> object.drawCircle( x , y , r);
> it's never
> object.drawSquare( x ,{object.drawCircle( x , y , r)} y , w , h ); //lol
>
> back in xhtml world, to mark off a segment as <b> without using the syntax
> or sending an xhtml fragment in a var we'd have to do it using an
> instruction with offsets and positions.
> $string = 'some content here';
> $boldBit = substr( $string , 5 , 7);
> // .. more code
>
> so the syntax of xhtml doesn't really fit any programming language (?)
>
> interestingly I finished that ..PROBLEM.. off mentally and came up with a
> tag like <data data="whatever" /> which may as well just be <value-of
> data="whatever" /> which is just xslt.
>
> square one.
>
> sub thought.. is that an xslt pre processor which figured out what data the
> xsl needs, then provides it as xml and delivers client side ready for
> rendering would be nice.
>
> ultimately though, I feel I'm getting no-where, syntax syntax syntax - I
> re-iterate, I'll have the solution to this when this can be accomplished
>
> <?php
>
> if( isset($comments) && is_array($comments) && count($comments) > 0 ) {
>  echo '<h2>Comments</h2>';
>  echo '<div id="comments">';
>  foreach( $comments as $index => $comment ) {
>    echo '<a href="' . $comment->link . '">';
>    echo $comment->title;
>    echo '</a>';
>  }
>  echo '</div>';
> } else {
>  echo '<h3>No Comments</h3>';
> }
> ?>
>
> without php and without xml style markup (unless it's by extension of xhtml
> with data attributes)
>
> that was a big one!
>
> regards & any thoughts more than welcome.
>

Nathan,

I've thought on this a (read: very) little, and can't help but think
that some of what you describe sounds an awful lot like ASP.NET. I
haven't done much with .NET, so I could be really off here (I wouldn't
really consider ASP.NET a template engine), but from what I recall an
ASP.NET page is basically an XHTML document that includes special tags
that tell .NET to render content from the compiled code-behind for the
page:

<html>
<body>
<asp:DataGrid
   id="DataGrid1"
   style="Z-INDEX: 101; LEFT: 24px; POSITION: absolute; TOP: 16px"
   runat="server"
   BorderColor="#DEBA84"
   BorderStyle="None"
   CellSpacing="2"
   BorderWidth="1px"
   BackColor="#DEBA84"
   CellPadding="3">
</asp:DataGrid>
</body>
</html>

In this example, DataGrid1 refers to a specific instance of a DataGrid
object in the code that would have been loaded with data in the page's
Page_Load method. As such, the code NEVER calls the template; rather,
the placeholder in the template triggers the framework to call a
function that renders the control using the object in the code-behind.
A DataGrid is an object that knows how to self-render and can be
extended.

Something like this could probably be done in PHP, but it seems to me
that it would itself become a framework, which you stated up front was
not an option.

Andrew

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux