Textpattern CMS support forum
You are not logged in. Register | Login | Help
- Topics: Active | Unanswered
smd_multi_choice: select... case conditional-based output
To continue the theme of “programmer” tools in TXP, may I present smd_multi_choice.
This one is for when you have to compare one variable against a load of values. Instead of nesting if after if after if, you can check them all in one go in a simpler structure. Plus it has the ability of a ‘default’ branch should any of the preceding tests fail to match, which is very handy when dealing with custom input from the result of HTML forms.
You can do all the usual tests like equals, less than, greater than, is alphanumeric, begins, ends, contains, etc, and compare any TXP variable (using the usual ?my_variable_name
system) to a series of values or other variables. In terms of functionality it’s kind of a cross between smd_if and smd_each but with a simpler syntax. The examples show a few of the possible avenues of exploration; the rest is up to you.
Happy Easter :-)
Revision history
————————
All available versions and changes are listed here. Each entry indexes the relevant post(s) in this thread to learn about the features.
- 10 Apr 09 | v0.10 | Initial release
- 01 Aug 10 | v0.20 | Added empty type (thanks gomedia) ; added
var_prefix
; fixed default case firing unnecessarily ; fixed problem with multiple switch tags on a page
Last edited by Bloke (2010-08-02 22:33:38)
The smd plugin menagerie — for when you need one more gribble of power from Textpattern. Bleeding-edge code available on GitHub.
Txp Builders – finely-crafted code, design and Txp
Offline
Re: smd_multi_choice: select... case conditional-based output
Sweet :-)
Offline
Re: smd_multi_choice: select... case conditional-based output
Nice – switch and case for txp, eh?
TXP Builders – finely-crafted code, design and txp
Offline
Re: smd_multi_choice: select... case conditional-based output
jakob wrote:
Nice – switch and case for txp, eh?
Essentially yes.
But it’s kind of switch/case+ because it’s not just a simple equality tester like most high level languages. The flexibility of TXP tags lends itself to finer-grained control so I took full advantage, to the extent that you can actually mix and match different types of test in the same switch (e.g. if it starts with this or this then do this; if it is greater than such-and-such then do this; if it contains something else then do this; else do that).
It allows you to do some pretty wacky conditional checks that (in PHP at least) would either be impossible, or require skullduggery and preg-match inside each case statement.
Not bad for a morning’s work even if I do say so myself. I’m sure there’s something I’m missing — and no doubt someone will point it out to put me on the right track — but I’m already using it on my upcoming redesign and it makes some of the complex nested ifs superfluous, and the result is a whole lot more readable.
Last edited by Bloke (2009-04-10 21:21:37)
The smd plugin menagerie — for when you need one more gribble of power from Textpattern. Bleeding-edge code available on GitHub.
Txp Builders – finely-crafted code, design and Txp
Offline
Re: smd_multi_choice: select... case conditional-based output
I have a perfect job for this. To apply different classes for a product’s markup based on inventory levels.
Chanks, Moneypenny!
Offline
Re: smd_multi_choice: select... case conditional-based output
I’ve found that <txp:smd_switch item="?section">
works in a form
, but <txp:smd_switch item="?s">
is required for use in a page
? Is it just me, or is there a quirky Txp explanation for this?
Last edited by speeke (2009-12-01 20:23:42)
“People who value their privileges above their principles soon lose both.”
Dwight D. Eisenhower
Offline
Re: smd_multi_choice: select... case conditional-based output
speeke wrote:
I’ve found that
<txp:smd_switch item="?section">
works in aform
, but<txp:smd_switch item="?s">
is required for use in apage
It may depend where you’re looking at the data from. As you probably know, the TXP global variables come in two main arrays when dealing with articles:
$pretext
houses the current section (as governed by the URL) and it’s designated$pretext['s']
(the?s
shortcut in the plugin)$thisarticle
holds info about the current article when in individual article mode and its data is read primarily from the database.$thisarticle['section']
(the?section
shortcut in the plugin) holds the current article’s section which should be identical to the URL (one would hope, unless some weird htaccess rewrites are in place!)
Both pretext and thisarticle are set and should always agree when in an article context, but only one is set on a section landing page1. Thus, as a rule of thumb, ?s
is accessible anywhere there is a section in the URL (i.e. anywhere except the front page where it is traditionally ‘empty’) and ?section
is only available when viewing an article. Perhaps that’s the differentiator here?
1 Note that the form/container inside an article list generated by <txp:article />
or <txp:article_custom />
on a section landing page actually triggers article context, so both variables will be set in your nominated form or container, but outside any article tags only pretext exists… eeek!
Last edited by Bloke (2009-12-01 22:11:27)
The smd plugin menagerie — for when you need one more gribble of power from Textpattern. Bleeding-edge code available on GitHub.
Txp Builders – finely-crafted code, design and Txp
Offline
Re: smd_multi_choice: select... case conditional-based output
Bloke wrote:
… eeek!
Indeed!!! Many thanks for your explanation.
“People who value their privileges above their principles soon lose both.”
Dwight D. Eisenhower
Offline
#9 2010-07-28 03:49:35
- gomedia
- Plugin Author
- Registered: 2008-06-01
- Posts: 1,373
Re: smd_multi_choice: select... case conditional-based output
Stef, another fine plugin. I’m using it with great success but have a query about empty/unset items.
Consider:
<txp:smd_switch item='<txp:section />'>
I was hoping that it would fall through with a value=""
(on an error page <txp:section />
is empty) but it looks like smd_switch
doesn’t kick in at all.
Tried using leave_empty="0"
but that didn’t do it.
This works OK: Er, I thought it did – but it don’t seem to now, sorry!
<txp:smd_switch item="?section" leave_empty="1">
using value="section"
.
Help!
In this instance there is a ?equivalent
to the TXP tag used in item
but if there wasn’t, how might I test for “empty” or “unset”?
Thanks,
Adi
Last edited by gomedia (2010-07-28 05:54:28)
Offline
Re: smd_multi_choice: select... case conditional-based output
gomedia wrote:
<txp:smd_switch item='<txp:section />'>
Ooh, good call. I’m struggling with how to indicate your intentions here. I’m testing leave_empty="2"
which means “If the item is empty, test it against the special value="SMD_EMPTY"
”, but that’s getting very confusing. Even more so if you want to use a default at all other times (leave_empty="0"
) but your value may also be empty.
I think it’s a case of badly chosen attribute names: thinking about it now I’m sure there’s a better way of doing this so I’ll see what I can come up with. Will also try and fix the ‘default not set unless explicitly used in value attribute’ bug that I’ve found.
Thanks for the report.
The smd plugin menagerie — for when you need one more gribble of power from Textpattern. Bleeding-edge code available on GitHub.
Txp Builders – finely-crafted code, design and Txp
Offline
#11 2010-07-28 22:07:48
- gomedia
- Plugin Author
- Registered: 2008-06-01
- Posts: 1,373
Re: smd_multi_choice: select... case conditional-based output
Stef,
It’s driving me nuts that I thought I had it working with "?section"
and now it’s not! Maybe it was Firefox’s over zealous caching …?
Anyway, I thinks it is smd_switch
deciding not to fire up what’s really confusing. Shouldn’t decisions be the job of the smd_case
tags? Then it would mirror the behaviour of switch/case in other programming languages.
You’ve got a default="1"
attribute for smd_case
, would a undefined="1"
and/or empty="1"
option make sense? Then it’s under the user’s control what gets done & where?
Offline
Re: smd_multi_choice: select... case conditional-based output
gomedia wrote:
Anyway, I thinks it is
smd_switch
deciding not to fire up what’s really confusing.
I’ve been taking a look at the code just now and I think the switch is actually ‘firing’ (as such) but since its entire job is to populate a global variable with the contents of the chosen item
— and that chosen item is empty — then simply parse $thing
, it appears that the switch is short-circuiting: the case statement simply sees an empty global and bypasses the whole code block.
Since item
is mandatory — at least the docs say it is(!) — I think I can approach it like this:
- do an explicit check in smd_switch for an
item
attribute. If it’s not there, throw a message and die - remove the check for emptiness in smd_case. Since I have now asserted that you must have tried to look at something (whether it equates to an empty string or not) I can do like you suggest and permit an undefined case
Hackery in progress.
Last edited by Bloke (2010-07-28 22:28:18)
The smd plugin menagerie — for when you need one more gribble of power from Textpattern. Bleeding-edge code available on GitHub.
Txp Builders – finely-crafted code, design and Txp
Offline