| Issue 55: | Section names not looked up properly | |
| 2 people starred this issue and may be notified of changes. | Back to list |
Given this data: {"a":{"b":{"c":1}},"d":2}
Try processing Template 1:
{.section a.b}{c}{.end}
Or Template 2:
{.section a}{.section d}{@}{.end}{.end}
I expect template 1 to output "1" and template 2 to output "2". Instead,
template 1 yields "EXCEPTION: UndefinedVariable: c is not defined", and
template 2 yields "null".
I'm using sroussey's PHP version of JSON Template pulled this evening from
his repo here:
https://sroussey-json-template.googlecode.com/hg/
But I think the problem affects more than the PHP version, it's at least
present in the python version as well.
This diff against sroussey-json-template fixes the PHP version:
diff -r b9d923fb113e php/jsontemplate.php
--- a/php/jsontemplate.php Mon Oct 12 23:49:51 2009 -0700
+++ b/php/jsontemplate.php Thu Mar 04 22:20:02 2010 -0800
@@ -372,24 +372,10 @@
function PushSection($name)
{
- $end = end($this->stack);
- $new_context=null;
- if(is_array($end)){
- if(isset($end[$name])){
- $new_context = $end[$name];
- }
- }elseif(is_object($end)){
- // since json_decode returns StdClass
- // check if scope is an object
- if(property_exists($end,$name)){
- $new_context = $end->$name;
- } else if (method_exists($end,$getter="get$name")){
- $new_context = $end->$getter();
- } else if (method_exists($end,'__get')){
- try {
- $new_context = $end->$name;
- } catch (exception $e){}
- }
+ try {
+ $new_context = $this->Lookup($name);
+ } catch(JsonTemplateUndefinedVariable $e) {
+ $new_context = null;
}
$this->name_stack[] = $name;
$this->stack[] = $new_context;
@@ -653,7 +639,7 @@
class JsonTemplateModule
{
- public $section_re = '/^(?:(repeated)\s+)?(section)\s+(@|[A-Za-z0-
9_-]+)(?:\b(.*))?$/';
+ public $section_re = '/^(?:(repeated)\s+)?(section)\s+(@|[A-Za-z0-
9_-]+(\.[A-Za-z0-9_-]+)*)(?:\b(.*))?$/';
public $if_re = '/^if\s+(@|[A-Za-z0-9_-]+)(\?)?(?:\b(.*?))?\s*$/';
public $option_re = '/^([a-zA-Z\-]+):\s*(.*)/';
public $option_names = array('meta','format-char','default-formatter');
Mar 5, 2010
Project Member
#1
sroussey
Owner:
sroussey
Mar 25, 2010
I'm not on my normal PC, so I don't have the test harness setup, so I pushed a change to the sroussey-json-template repo. There were many logic errors, particularly with scopes. I wish I had update the repo as I fixed them, but instead they are all in one big change. I'm checking on the JS version that I use, and will update that as well if warranted.
Status:
Started
Aug 18, 2010
I believe this issue affects more than just the PHP and Python, it seams to be present as well I believe. While using JSON-Template I've had issues with higher level names not being looked up properly in the same way described. One time I rewrote the logic of a template in a somewhat unintuitive way to get around it. Now I appear to have run into another one which will be more trouble. I may have to switch template systems. |