Textpattern CMS support forum
You are not logged in. Register | Login | Help
- Topics: Active | Unanswered
#196 2013-09-27 21:20:36
Re: etc_query: all things Textpattern
Nice job, Mr. Dale! I’ve got only few comments to add:
<txp:etc_query data="{?some_script||trim.preg_replace(/^document\.write\(|\);$/i,,$).json_decode}"
get the variable and apply a transformation chain to it and use that for data (through php functions?)
Exactly! Actually, the variable could be transformed with pax_grep/rah_replace/rah_function or mere txp:php as well, and then passed as data to etc_query.
json_decode decodes the output into an array (why do I need this?)
You get not an array, but a plain string here, with \" and \/ unescaped. Same result can be achieved with str_replace, but the argument of document.write seems JSON-encoded, so json_decode should do the job fine.
argsep: separates the arguments of which part with a comma?
functions arguments, like in preg_replace(/^document\.write\(|\);$/i,,$). The default argsep is | (pipe), but here we need it in regexp pattern.
functions: allow the following php functions to be used inside this tag
Yes, XPath 1.0 used in PHP DOM has a very limited collection of functions (translate is one of them), but one can complete it with php (string) functions.
query: limit the output of this tag to all divs who’s class is “campaign”
It rather creates a list of nodes you want to use as landmarks, over which etc_query will iterate. The {xpath}’s inside etc_query will be relative to these landmarks ({.} is the node itself, {text()} is the text immediately inside it, and so on). This does not really limit the output, you can display the nodes parent with {..}, for example.
Offline
#197 2013-11-13 11:47:19
- gfdesign
- Member

- From: Argentina
- Registered: 2009-04-20
- Posts: 401
Re: etc_query: all things Textpattern
Hi Oleg.
Thanks so much for your plugin and explanation about alphabetic list that you put in your site.
I’ve tried to use it in my site but for any reason I can’t. When I put the code, and click on any letter, the articles display but the alphabetic list doesn’t. What could be the problem?
Other questions is, how you would do it if you’d have to do an alphabetic list of professionals separated by professions such us architects, engineers, carpenters. I created a section called “professionals” and each profession has its own category. So, when I want to load a new professional, I create a new article and I assign to the corresponding category. But I wouldn’t know how to use your code for this request. Any idea?
Thanks again in advance.
Regards
Fernando
Offline
#198 2013-11-13 12:18:38
Re: etc_query: all things Textpattern
Hi Fernando,
gfdesign wrote:
When I put the code, and click on any letter, the articles display but the alphabetic list doesn’t. What could be the problem?
That’s a bit strange, the only explanation I can see right now is that you use another wraptag instead of nav. If so, you should replace {//nav} with {//your_tag} inside the second etc_query. Otherwise, mind providing an url (if it’s online)?
Other questions is, how you would do it if you’d have to do an alphabetic list of professionals separated by professions such us architects, engineers, carpenters. I created a section called “professionals” and each profession has its own category. So, when I want to load a new professional, I create a new article and I assign to the corresponding category. But I wouldn’t know how to use your code for this request. Any idea?
Are you looking for
Architects: A - B - ... - Z
Engineers: A - C - ... - X
or
A: Architects - Engineers
B: Engineers
Both must be doable, let me think about it.
Regards
Offline
#199 2013-11-13 19:54:35
Offline
#200 2014-01-14 08:02:48
Re: etc_query: all things Textpattern
Might there be a way/shortcut to get etc_query to automatically store each node from items in a JSON document as a textpattern variables when using etc_query as a container tag? I have couple of date/timestamps that need formatting and other nodes that need to have the html escaped, etc. My programming knowledge is limited to where I can’t figure out how to wrap a {node?} in an smd_wrap tag or other plugin tags without first defining the nodes as txp:variables and this seems to slow the whole thing down a bit. Thanks in advance for any hints or tips!
Offline
#201 2014-01-14 08:36:38
Re: etc_query: all things Textpattern
photonomad wrote #278126:
Might there be a way/shortcut to get etc_query to automatically store each node from items in a JSON document as a textpattern variables when using etc_query as a container tag?
No, mainly because nodes (e.g. {//a}) are generally lists, so storing them in txp variables (that are strings) is problematic.
I have couple of date/timestamps that need formatting and other nodes that need to have the html escaped, etc. My programming knowledge is limited to where I can’t figure out how to wrap a {node?} in an smd_wrap tag or other plugin tags without first defining the nodes as txp:variables and this seems to slow the whole thing down a bit.
You can do most of formatting with etc_query itself, using php or txp functions. For example, to transform a {timestamp?} into year, call {$strftime(%Y|{timestamp?})}, to escape it call {$txpspecialchars({timestamp?})}, and so on. If you need to inject {node?} as attribute of some <txp:tag />, that’s a mere <txp:tag attr="{node?}" />, or <txp:tag attr="{$txpspecialchars({node?})}" />.
If your treatment is really complex, you can (at least in theory) save the imported JSON object with save attribute of etc_query and reuse it later, without etc_query parsing the object again. An example of what you are doing would help me.
Offline
#202 2014-01-14 09:17:36
Re: etc_query: all things Textpattern
Oleg, Thank you for your reply! I see what you mean by the list/string difference. Makes sense. And, thank you so much for the helpful formatting/function examples!
I am working on a community calendar that consists of multiple Google calendars.* I created a Yahoo Pipe that grabs all the feeds and combines them into a json document. A static public example of the output is here: http://www.outcentral.org/comcaltestfeed.json
The pipe itself takes a while to run. My etc_query code runs slowly because I’ve got a ton of variables and lots of if/else tests for the output. I am using aks_cache (60 minutes) to try to help improve load time. I have to get some sleep right now, but will work on improving my code tomorrow with the tips you provided.
And, here is a link to a test/preview of the end result:
http://www.outcentral.org/comcal-test
- I imagine there may be a way to combine, loop and sort data from multiple feeds with etc_query, but the solution is most definitely currently over my head. I also realize that there is probably a way to do most of this with the Google Calendar API. Once again: beyond my current Google API knowledge.
Last edited by photonomad (2014-01-14 15:35:24)
Offline
#203 2014-01-14 09:24:18
Re: etc_query: all things Textpattern
Challenging, I like it. Good night, and see you tomorrow, I’ll take a look at it meanwhile.
Offline
#204 2014-01-15 04:56:40
Re: etc_query: all things Textpattern
Thank you so much for your help, Oleg.
One thing that I’m stuck on at the moment is whether it is possible to use {$?(if|then|else} or another method to test if the start time minutes = 00. If {$?(if|then|else} is only used to check for emptiness, should I just define a <txp:variable name=“startminutes” value=”{$date(i,{start?})}” /> and then use <txp:if_variable name=“startminutes” value=“00”> to test?
etc_query is so powerful and you make it seem so easy! I wish I could fully understand all of the shortcuts and possibilities.
Last edited by photonomad (2014-01-15 05:47:02)
Offline
#205 2014-01-15 09:30:59
Re: etc_query: all things Textpattern
Glad you like it, Stacey, thanks.
photonomad wrote #278144:
One thing that I’m stuck on at the moment is whether it is possible to use {$?(if|then|else} or another method to test if the start time minutes = 00. If {$?(if|then|else} is only used to check for emptiness, should I just define a <txp:variable name=“startminutes” value=”{$date(i,{start?})}” /> and then use <txp:if_variable name=“startminutes” value=“00”> to test?
You can chain it with another etc_query function: =
{$date(i,{start?}).=00.?(then,else)}
etc_query is so powerful and you make it seem so easy! I wish I could fully understand all of the shortcuts and possibilities.
Thank you again, but, frankly speaking, if my code contained many {$...} or <txp:tag> blocks, I would consider switching to <txp:php>. Here is why: User Defined Functions in PHP are slow, and every {$...} pattern (as well as <txp:tag>) calls few UDFs. That’s ok on small datasets, but when your array contains ~300 rows, the difference starts to be noticeable (I’ve measured ~0.05s). In fact, these {$...} were never intended as replacement for <txp:php>. Bu I hope things can be sped up, so stay with etc_query.
Offline
#206 2014-02-10 13:13:06
- johnno
- Member
- Registered: 2007-06-14
- Posts: 30
Re: etc_query: all things Textpattern
Is it possible to inject a txp variable into the url attribute?
Thanks for the plugin btw!
Offline
#207 2014-02-10 13:39:08
Offline
#208 2014-02-10 14:03:44
Offline
#209 2014-02-10 14:25:25
- johnno
- Member
- Registered: 2007-06-14
- Posts: 30
Re: etc_query: all things Textpattern
etc wrote #278752:
Certainly, as with any txp tag:
<txp:etc_query url='http://<txp:variable name="url" />/something/else' />...
I assumed it should work – and it does; thanks for confirming so quickly.
It’s my ill-disciplined syntax which was causing the problem :(
<txp:etc_query url="http://<txp:variable name='url' />/something/else" />
Offline
#210 2014-03-22 10:33:10
- nardo
- Member

- From: tuvalahiti
- Registered: 2004-04-22
- Posts: 743
Re: etc_query: all things Textpattern
Oleg, this plugin is fantastic. Thank you again.
A question about extracting a random set of nodes. I’m getting a response from the Flickr API describing 200 photos. I’d like to choose 12 of the nodes at random to display, but I want to avoid the same node being picked twice.
Can it be done in etc_query? Or do I need to first come up with my values, and then populate the query?
query="//photos/photo[33] | //photos/photo[143] | -etc- "
Offline