On Mar 29, 2011, at 10:34 AM, Anthony wrote:
> When web2py writes A('my link', _href=URL(r=request, vars=request.vars)) to
> HTML, it results in:
>
> <a href="/page?input_one=aaa®_no=bbb">my link</a>
>
> The problem is, the browser converts the "®" in the href to the registered
> trademark symbol, so when you click the link, the requested URL sent to
> web2py ends up including the trademark symbol in place of the "®" portion
> of the URL (presumably, this would happen with any HTML entity, such as
> ©, etc.).
>
> To avoid this kind of problem, I think href attributes are supposed to
> include "&" in place of "&", so the link should have been written as:
>
> <a href="/page?input_one=aaa&reg_no=bbb">my link</a>
>
> So, why doesn't web2py write the URL properly? When a helper (such as the A()
> helper) is converted to HTML, web2py passes its attributes to the xmlescape()
> function, which calls cgi.escape(), which automatically converts "&" to
> "&". However, the xmlescape() function does not escape objects that have
> an 'xml' attribute, and because the URL() function returns an object with an
> 'xml' attribute, it is not escaped.
That's a good explanation. ISTR that not too long ago URL was changed to return
XML(whatever), which is why the xml attribute is there. I don't remember why
the change was made, though. Maybe Massimo does.
>
> This should probably be fixed somehow, but for now, a workaround is to
> explicitly call the 'xml' method of URL, which will convert it to a string
> before it is passed to xmlescape(). So, change your code to:
>
> link = A('my link', _href=URL(r=request, vars=request.vars).xml())
>
> Note, this issue is not a problem if you manually enter an href that includes
> an HTML entity. For example:
>
> link = A('my link', _href='/page?input_one=aaa®_no=bbb')
>
> will properly be converted to:
>
> <a href="/page?input_one=aaa&reg_no=bbb">my link</a>
>
> Best,
> Anthony
>
>
> On Tuesday, March 29, 2011 9:53:50 AM UTC-4, Jim Karsten wrote:
> I have a variable named 'reg_no' that when used as a link paramater is
> getting converted into a registered trademark symbol. Here is a simple
> example that illustrates it.
>
> The controller:
>
> def page():
> link = A('my link', _href=URL(r=request, vars=request.vars))
> form = SQLFORM.factory(
> Field('input_one', default=request.vars.input_one),
> Field('reg_no', default=request.vars.reg_no),
> )
> return dict(form=form, link=link)
>
> The view:
>
> {{=form}}
> {{=link}}
>
>
> Enter values in both fields, then submit. Then click the link. The
> link should refresh the page, with the form populated with the entered
> values. If the second field is named 'input_two' it works. But when
> it's named 'reg_no' the first input has 'aaaR_no=bbb' where 'aaa' and
> 'bbb' are the entered values and R is the registered trademark symbol,
> and the second input is blank.
>
> The link url is very different depending on the field name:
>
> 'input_two': http://www...com/demo/default/page?input_one=aaa&input_two=bbb
> 'reg_no' : http://www...com/demo/default/page?input_one=aaa%C2%AE_no%3Dbbb
>
> I renamed 'reg_no' to something not starting with 'reg_' and I have it
> working. I'm not sure if this is a bug or not.
>
> Any insight would be welcome.
>
> Jim Karsten