Hi all.

I love PHPTAL, but I always get in trouble when I need lots of different
number formatting
or some simple checks that can likely to be done directly in the template,
and that is not part of business logic, but part of layout logic - eg, how
layout built based
on internal representation.

I have recently tried new php framework named F3

Can you please look into its templates section:
... and especially section named "Template Expressions and Functions"

I just want to little discuss whether there is sense to port some ideas to

*1. IF-THEN-ELSE*. First at all, I remember there are many threads in this
mailing list
discussing "else" feature, and I do not know if there is any

I still do not understand why it's not implemented in some way,
taking into account its popularity based on email lists discussion.

As an additional idea, maybe it can be done with some namespace extension,
like talcheck:xxx, so we will not touch tal: and metal: namespaces.

The most universal way from my point of view is to have use-cases control

Examples that may be helpful or may throw any more ideas
(here I'm using both talcheck namespace and tal native namespace):

<talcheck:block check="php: true">
  <talcheck:block case="php: true">...</talcheck:block>
  <talcheck:block case="php: false">...</talcheck:block>

<tal:block check="php: true">
  <tal:block case="php: true">...</tal:block>

<tal:block check="php: 3">
  <tal:block case="php: 1">...</tal:block>
  <tal:block case="php: 2">...</tal:block>
  <tal:block caseelse="">...</tal:block>

Looks like implementation is as simple as adding check context value, when
and then use it for *case* and *caseelse* attributes and convert into
show/hide behavior like for condition attribute.

*2. Calling standard php functions*

After 7 years of making websites, I get convinced that using simple php
does not necessarily mean moving business logic into template.

F3's "Template Expressions and Functions" section has very useful and simply
way to allow / disable native function calls.

I always end up writing up 10 formatting tal:modifiers for different
formatting way,
then using them in my template. Also I have to call some functions in php
before to pass
formatted values into template. All this happens just because it's not
looking great to call php functions
in your template, while you still want to do so - when these functions are
like helper functions
for layout, not for business logic.

Lets take a look on this function:
string number_format ( float $number , int $decimals = 0 , string $dec_point
= '.' , string $thousands_sep = ',' )

<span tal:content="php: number_format(a/b/c, 2)" />

The problem #1 here is that syntax becomes ugly when I want to still call
a/b/c but I cannot do so
because I'm inside PHP modifier.

What if we were able to do something like this:

<span tal:content="number_format(a/b/c, 2)" />

... or, following F3's idea to put expressions inside { and }...

<span tal:content="{number_format(a/b/c, 2)}" />
... and then it looks more like PHP insertion (but me personally I do not
like these figures)

So, why not? With having some special function to control what function
groups are allowed,
we then can easily detect whether it's php function call in some place, and
gracefully pass
correct values from context, like a/b/c in my example. This will make
formatting things more clear:

<span tal:content="number_format(account/amount, 2)" />

<tal:block condition="empty(account/insurance)" />
... take into account that it's not the same as exists: modifier

Another helpful example from F3 (which is often faster and simpler then to
create modifier):

<tr class="{(@key+1)%2?'odd':'even'}">

that in PHPTAL's way will be something like this:

<tr tal:attributes = "class { (key+1)%2? 'odd' : 'even' }">

*3. Combining attributes*

It's often useful to combine attributes. Example:

<div class="wrapper" tal:attributes="class wrapperExtendedClass | nothing "

Is there a way to ADD more class values instead of replace them?
Eg, I want my final DIV to look like:

<div class="wrapper"/>
<div class="wrapper wrapper2"/>

I know, we can use tal:define to define with string: modifier, but it's much
of text to do,
and usually I end up building final class in php and passing it to the
template, which is more
trouble then if I would be able to just add wanted classes with phptal.

<div class="wrapper" tal:*addattributes*="class wrapperExtendedClass |
nothing" />


<div tal:attributes="class theme/mainWrapperClass"
  tal:*addattributes*="class wrapperExtendedClass |
userDefinedTheme/wrapperClass | nothing;
      class wrapperWeatherClass | nothing"/>

can end up with:
*<div class="wrapper winter" />*
... in this example there was no wrapperExtendedClass defined, and
neither userDefinedTheme/wrapperClass was.

Let me know if all this makes sense.

Anton Andriyevskyy
Business Automation & Web Development
PHPTAL mailing list

Reply via email to