PEAR is archived and read-only

This mirror preserves historical PEAR package releases and metadata so existing references remain available.

Home » HTML » HTML_Template_Flexy » Bug #10248

Additional Flexy Attributes

Details

Request #10248Additional Flexy Attributes
Submitted2007-03-02 21:39 UTC
Fromrick at coalescentdesign dot com
StatusOpen
PackageHTML_Template_Flexy
PHP VersionIrrelevant
OSwin2k
Roadmaps(Not assigned)

Comments

[2007-03-02 21:39 UTC] rick at coalescentdesign dot com

Description:
------------
Flexy is almost a full "template attribute language". It supports conditionals and loops using flexy:xxx attributes, but it is missing a few things (such as those included in phpTal).

With the addition of a few new flexy attributes, placeholders could be virtually eliminated from source templates. The advantage is cleaner source templates that appear the same in a browser with or without the addition of flexy markup. Furthermore, default content added by a designer could remain in the source template for viewing as html, even though dynamic content would replace it when running php.

Requested flexy attributes:

"Flexy:content"

template:
<span flexy:content="myvar">will be replaced by myvar</span>
output:
<span>contents of myvar</span>

"Flexy:replace"

template:
<span flexy:replace="myvar">element will be replaced by myvar</span>
<span flexy:replace="">element will be deleted</span>
output:
contents of myvar

"Flexy:omit-tag" (useful when the purpose of the tag is just to hold flexy attributes like conditionals and foreach loops)

template:
<span tal:omit-tag="">this text will appear but the tags will be removed</span>
output:
this text will appear but the tags will be removed

[2007-03-04 03:10 UTC] rick at coalescentdesign dot com

Thank you for your response Alan.

The class you suggested seems to allow for the addition of new flexy namespaced tags, which is excellent, but I was hoping to add new flexy namespaced attributes.

The other class in the directory, Tag.php, is what I was looking for. I'll mess around with the ToString method and follow up with my results.

[2007-03-08 03:10 UTC] rick at coalescentdesign dot com

I was able to add the new flexy namespaced attributes as outlined above. I would be happy to share if anyone is interested. Here's what I did...

I created a new class that handles some new flexy namespaced attributes. All it does is modify the element token in different ways depending on what new attribute is found. It is a lot like the existing HTML_Template_Flexy_Compiler_Flexy_Flexy class which handles flexy namespaced tags. I had to make minor changes to the toString method of the HTML_Template_Flexy_Compiler_Flexy_Tag class to avoid printing opening and closing tags for flexy:replace and flexy:omittag.

Changes to Tag.php (HTML_Template_Flexy_Compiler_Flexy_Tag) toString() method:

- Before converting the element token opening tag, child tokens, or closing tag: include and call the new class to handle custom flexy namespaced attributes. Pass in the element token as a parameter.

- Check that the element token tag is defined before converting the opening tag and attributes to string.

- Check that the element tokens tag is defined before converting the closing tag to string. If not defined, then just convert the closing tag postfix token to string.

[2007-03-08 03:49 UTC] rick at coalescentdesign dot com

I would love to, but this Pear bug tracking application could use some help. I was able to make this request by just creating a password, but to submit a patch I now need a username as well. I tried to create a new account two days ago but my email has not been verified.

[2007-03-09 17:38 UTC] rick at coalescentdesign dot com

The following post has the new class and the modifications to the Tag.php toString() method.

http://pastebin.ca/387806

Any changes/suggestions are welcome.

Thanks,
Rick

[2007-03-25 23:07 UTC] rick at coalescentdesign dot com

Hi Allan,

I found some duplicate code in the CVS version of the toString() method of HTML_Template_Flexy_Compiler_Flexy_Tag. The following code can be deleted since it was moved to "toStringChildren($element,$ret)" and "toStringCloseTag($element,$ret)":

/*
// dump contents of script raw - to prevent gettext
// print_r($element);
if ($element->tag == 'SCRIPT') {
foreach($element->children as $c) {
//print_R($c);
if (!$c) {
continue;
}
if ($c->token == 'Text') {
$ret .= $c->value;
continue;
}
// techically we shouldnt have anything else inside of script tags.
// as the tokeinzer is supposted to ignore it..
}
} else {
$add = $element->compileChildren($this->compiler);
if (is_a($add,'PEAR_Error')) {
return $add;
}
$ret .= $add;
}
*/

// output the closing tag.
/*
if ($element->close) {
$add = $element->close->compile($this->compiler);
if (is_a($add,'PEAR_Error')) {
return $add;
}
$ret .= $add;
}
*/

Everything seems to work well once that code is commented out, with one exception. Maybe you have some insight into a bug of mine that I just noticed. When in a foreach loop in the source template, local variables will be referenced within a method (<span flexy:content="someMethod(loopKeyOrValue)">...), but not as a variable (<span flexy:content="loopKeyOrValue">...). Instead, a nonexistent template variable is referenced. The code responsible is in the "replaceChildren(&$element,&$val)" method of the new CustomFlexyAttributes class:

...
$childToken = $element->factory('Method',array(substr($val,0,strpos($val,'(')), $args_clean), $element->line); // WILL reference local foreach variables
} else {
$childToken = $element->factory('Var', '{'.$val.'}', $element->line); // WON'T reference local foreach variables
}

I must be using the "Var" factory method incorrectly?

Thank you,
Rick Jolly