RTLizing html_checkboxes

[email protected] (Armen Baghumian) Wed, 28 Mar 2007 14:32:02 +0330
Newsgroups php.smarty.dev
Message-ID <20070328143202.544c2916@localhost>
--MP_qhCzblpK3mV_EudOaxTZsSq
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Hi there,

I just fixed a problem in html_checkboxes for right to left languages.
lets explain the problem. 

I'll try to explain that with an screenshot.
I just put {html_checkboxes} in a <div dir="rtl"> and got some screenshots.

In (1) you will see html_checkboxes, every thing seems normal but when
I clicked *Anonymous* label, it checked wrong checkbox (it was not wrong
it just rendered in wrong way), (2) shows this problem.

(3) and (4) shows the problem when I used <br /> as a separator.

Okey, I wish I explained the problem well, sorry my english is poor.

I just attached a patch for this problem. it just add dir attribute to
an span (if label attribute was false) or the label tag.
I just use direction attribute for html_checkboxes to prevent conflicts
with extra variables (because *dir* could be used as extra attribute).

(5) and (6) shows fixed html_checkboxes result.

html_radios has this problem too, but html_options is okey.
I'll patch html_radios later if my current patch approved.

Regards,
Armen

--MP_qhCzblpK3mV_EudOaxTZsSq
Content-Type: application/x-php; name=function.html_checkboxes.php
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=function.html_checkboxes.php

PD9waHAKLyoqCiAqIFNtYXJ0eSBwbHVnaW4KICogQHBhY2thZ2UgU21hcnR5CiAqIEBzdWJwYWNr
YWdlIHBsdWdpbnMKICovCgoKLyoqCiAqIFNtYXJ0eSB7aHRtbF9jaGVja2JveGVzfSBmdW5jdGlv
biBwbHVnaW4KICoKICogRmlsZTogICAgICAgZnVuY3Rpb24uaHRtbF9jaGVja2JveGVzLnBocDxi
cj4KICogVHlwZTogICAgICAgZnVuY3Rpb248YnI+CiAqIE5hbWU6ICAgICAgIGh0bWxfY2hlY2ti
b3hlczxicj4KICogRGF0ZTogICAgICAgMjQuRmViLjIwMDM8YnI+CiAqIFB1cnBvc2U6ICAgIFBy
aW50cyBvdXQgYSBsaXN0IG9mIGNoZWNrYm94IGlucHV0IHR5cGVzPGJyPgogKiBJbnB1dDo8YnI+
CiAqICAgICAgICAgICAtIG5hbWUgICAgICAgKG9wdGlvbmFsKSAtIHN0cmluZyBkZWZhdWx0ICJj
aGVja2JveCIKICogICAgICAgICAgIC0gdmFsdWVzICAgICAocmVxdWlyZWQpIC0gYXJyYXkKICog
ICAgICAgICAgIC0gb3B0aW9ucyAgICAob3B0aW9uYWwpIC0gYXNzb2NpYXRpdmUgYXJyYXkKICog
ICAgICAgICAgIC0gY2hlY2tlZCAgICAob3B0aW9uYWwpIC0gYXJyYXkgZGVmYXVsdCBub3Qgc2V0
CiAqICAgICAgICAgICAtIHNlcGFyYXRvciAgKG9wdGlvbmFsKSAtIGllIDxicj4gb3IgJm5ic3A7
CiAqICAgICAgICAgICAtIG91dHB1dCAgICAgKG9wdGlvbmFsKSAtIHRoZSBvdXRwdXQgbmV4dCB0
byBlYWNoIGNoZWNrYm94CiAqICAgICAgICAgICAtIGFzc2lnbiAgICAgKG9wdGlvbmFsKSAtIGFz
c2lnbiB0aGUgb3V0cHV0IGFzIGFuIGFycmF5IHRvIHRoaXMgdmFyaWFibGUKICogICAgICAgICAg
IC0gZGlyZWN0aW9uICAob3B0aW9uYWwpIC0gYWRkIGRpcmVjdGlvbiBmb3IgZmllbGRzCiAqIEV4
YW1wbGVzOgogKiA8cHJlPgogKiB7aHRtbF9jaGVja2JveGVzIHZhbHVlcz0kaWRzIG91dHB1dD0k
bmFtZXN9CiAqIHtodG1sX2NoZWNrYm94ZXMgdmFsdWVzPSRpZHMgbmFtZT0nYm94JyBzZXBhcmF0
b3I9Jzxicj4nIG91dHB1dD0kbmFtZXN9CiAqIHtodG1sX2NoZWNrYm94ZXMgdmFsdWVzPSRpZHMg
Y2hlY2tlZD0kY2hlY2tlZCBzZXBhcmF0b3I9Jzxicj4nIG91dHB1dD0kbmFtZXN9CiAqIDwvcHJl
PgogKiBAbGluayBodHRwOi8vc21hcnR5LnBocC5uZXQvbWFudWFsL2VuL2xhbmd1YWdlLmZ1bmN0
aW9uLmh0bWwuY2hlY2tib3hlcy5waHAge2h0bWxfY2hlY2tib3hlc30KICogICAgICAoU21hcnR5
IG9ubGluZSBtYW51YWwpCiAqIEBhdXRob3IgICAgIENocmlzdG9waGVyIEt2YXJtZSA8Y2hyaXN0
b3BoZXIua3Zhcm1lQGZsYXNoamFiLmNvbT4KICogQGF1dGhvciBjcmVkaXRzIHRvIE1vbnRlIE9o
cnQgPG1vbnRlQGlzcGkubmV0PgogKiBAdmVyc2lvbiAgICAxLjAKICogQHBhcmFtIGFycmF5CiAq
IEBwYXJhbSBTbWFydHkKICogQHJldHVybiBzdHJpbmcKICogQHVzZXMgc21hcnR5X2Z1bmN0aW9u
X2VzY2FwZV9zcGVjaWFsX2NoYXJzKCkKICovCmZ1bmN0aW9uIHNtYXJ0eV9mdW5jdGlvbl9odG1s
X2NoZWNrYm94ZXMoJHBhcmFtcywgJiRzbWFydHkpCnsKICAgIHJlcXVpcmVfb25jZSAkc21hcnR5
LT5fZ2V0X3BsdWdpbl9maWxlcGF0aCgnc2hhcmVkJywnZXNjYXBlX3NwZWNpYWxfY2hhcnMnKTsK
CiAgICAkbmFtZSA9ICdjaGVja2JveCc7CiAgICAkdmFsdWVzID0gbnVsbDsKICAgICRvcHRpb25z
ID0gbnVsbDsKICAgICRzZWxlY3RlZCA9IG51bGw7CiAgICAkc2VwYXJhdG9yID0gJyc7CiAgICAk
bGFiZWxzID0gdHJ1ZTsKICAgICRvdXRwdXQgPSBudWxsOwogICAgJGRpcmVjdGlvbiA9ICdsdHIn
OwoKICAgICRleHRyYSA9ICcnOwoKICAgIGZvcmVhY2goJHBhcmFtcyBhcyAkX2tleSA9PiAkX3Zh
bCkgewogICAgICAgIHN3aXRjaCgkX2tleSkgewogICAgICAgICAgICBjYXNlICduYW1lJzoKICAg
ICAgICAgICAgY2FzZSAnc2VwYXJhdG9yJzoKICAgICAgICAgICAgY2FzZSAnZGlyZWN0aW9uJzoK
ICAgICAgICAgICAgICAgICQkX2tleSA9ICRfdmFsOwogICAgICAgICAgICAgICAgYnJlYWs7Cgog
ICAgICAgICAgICBjYXNlICdsYWJlbHMnOgogICAgICAgICAgICAgICAgJCRfa2V5ID0gKGJvb2wp
JF92YWw7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ29wdGlvbnMn
OgogICAgICAgICAgICAgICAgJCRfa2V5ID0gKGFycmF5KSRfdmFsOwogICAgICAgICAgICAgICAg
YnJlYWs7CgogICAgICAgICAgICBjYXNlICd2YWx1ZXMnOgogICAgICAgICAgICBjYXNlICdvdXRw
dXQnOgogICAgICAgICAgICAgICAgJCRfa2V5ID0gYXJyYXlfdmFsdWVzKChhcnJheSkkX3ZhbCk7
CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ2NoZWNrZWQnOgogICAg
ICAgICAgICBjYXNlICdzZWxlY3RlZCc6CiAgICAgICAgICAgICAgICAkc2VsZWN0ZWQgPSBhcnJh
eV9tYXAoJ3N0cnZhbCcsIGFycmF5X3ZhbHVlcygoYXJyYXkpJF92YWwpKTsKICAgICAgICAgICAg
ICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAnY2hlY2tib3hlcyc6CiAgICAgICAgICAgICAg
ICAkc21hcnR5LT50cmlnZ2VyX2Vycm9yKCdodG1sX2NoZWNrYm94ZXM6IHRoZSB1c2Ugb2YgdGhl
ICJjaGVja2JveGVzIiBhdHRyaWJ1dGUgaXMgZGVwcmVjYXRlZCwgdXNlICJvcHRpb25zIiBpbnN0
ZWFkJywgRV9VU0VSX1dBUk5JTkcpOwogICAgICAgICAgICAgICAgJG9wdGlvbnMgPSAoYXJyYXkp
JF92YWw7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ2Fzc2lnbic6
CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAg
ICAgICBpZighaXNfYXJyYXkoJF92YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgJGV4dHJhIC49
ICcgJy4kX2tleS4nPSInLnNtYXJ0eV9mdW5jdGlvbl9lc2NhcGVfc3BlY2lhbF9jaGFycygkX3Zh
bCkuJyInOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkc21h
cnR5LT50cmlnZ2VyX2Vycm9yKCJodG1sX2NoZWNrYm94ZXM6IGV4dHJhIGF0dHJpYnV0ZSAnJF9r
ZXknIGNhbm5vdCBiZSBhbiBhcnJheSIsIEVfVVNFUl9OT1RJQ0UpOwogICAgICAgICAgICAgICAg
fQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghaXNzZXQo
JG9wdGlvbnMpICYmICFpc3NldCgkdmFsdWVzKSkKICAgICAgICByZXR1cm4gJyc7IC8qIHJhaXNl
IGVycm9yIGhlcmU/ICovCgogICAgc2V0dHlwZSgkc2VsZWN0ZWQsICdhcnJheScpOwogICAgJF9o
dG1sX3Jlc3VsdCA9IGFycmF5KCk7CgogICAgaWYgKGlzX2FycmF5KCRvcHRpb25zKSkgewoKICAg
ICAgICBmb3JlYWNoICgkb3B0aW9ucyBhcyAkX2tleT0+JF92YWwpCiAgICAgICAgICAgICRfaHRt
bF9yZXN1bHRbXSA9IHNtYXJ0eV9mdW5jdGlvbl9odG1sX2NoZWNrYm94ZXNfb3V0cHV0KCRuYW1l
LCAkX2tleSwgJF92YWwsICRzZWxlY3RlZCwgJGV4dHJhLCAkc2VwYXJhdG9yLCAkbGFiZWxzLCAk
ZGlyZWN0aW9uKTsKCgogICAgfSBlbHNlIHsKICAgICAgICBmb3JlYWNoICgkdmFsdWVzIGFzICRf
aT0+JF9rZXkpIHsKICAgICAgICAgICAgJF92YWwgPSBpc3NldCgkb3V0cHV0WyRfaV0pID8gJG91
dHB1dFskX2ldIDogJyc7CiAgICAgICAgICAgICRfaHRtbF9yZXN1bHRbXSA9IHNtYXJ0eV9mdW5j
dGlvbl9odG1sX2NoZWNrYm94ZXNfb3V0cHV0KCRuYW1lLCAkX2tleSwgJF92YWwsICRzZWxlY3Rl
ZCwgJGV4dHJhLCAkc2VwYXJhdG9yLCAkbGFiZWxzLCAkZGlyZWN0aW9uKTsKICAgICAgICB9Cgog
ICAgfQoKICAgIGlmKCFlbXB0eSgkcGFyYW1zWydhc3NpZ24nXSkpIHsKICAgICAgICAkc21hcnR5
LT5hc3NpZ24oJHBhcmFtc1snYXNzaWduJ10sICRfaHRtbF9yZXN1bHQpOwogICAgfSBlbHNlIHsK
ICAgICAgICByZXR1cm4gaW1wbG9kZSgiXG4iLCRfaHRtbF9yZXN1bHQpOwogICAgfQoKfQoKZnVu
Y3Rpb24gc21hcnR5X2Z1bmN0aW9uX2h0bWxfY2hlY2tib3hlc19vdXRwdXQoJG5hbWUsICR2YWx1
ZSwgJG91dHB1dCwgJHNlbGVjdGVkLCAkZXh0cmEsICRzZXBhcmF0b3IsICRsYWJlbHMsICRkaXJl
Y3Rpb24pIHsKICAgICRfb3V0cHV0ICA9ICcnOwogICAgJF9vdXRwdXQgLj0gKCRsYWJlbHMpPyc8
bGFiZWwgZGlyPSInLnNtYXJ0eV9mdW5jdGlvbl9lc2NhcGVfc3BlY2lhbF9jaGFycygkZGlyZWN0
aW9uKS4nIj4nOgogICAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBkaXI9Iicuc21hcnR5
X2Z1bmN0aW9uX2VzY2FwZV9zcGVjaWFsX2NoYXJzKCRkaXJlY3Rpb24pLiciPic7CgogICAgJF9v
dXRwdXQgLj0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iJwogICAgICAgIC4gc21hcnR5
X2Z1bmN0aW9uX2VzY2FwZV9zcGVjaWFsX2NoYXJzKCRuYW1lKSAuICdbXSIgdmFsdWU9IicKICAg
ICAgICAuIHNtYXJ0eV9mdW5jdGlvbl9lc2NhcGVfc3BlY2lhbF9jaGFycygkdmFsdWUpIC4gJyIn
OwoKICAgIGlmIChpbl9hcnJheSgoc3RyaW5nKSR2YWx1ZSwgJHNlbGVjdGVkKSkgewogICAgICAg
ICRfb3V0cHV0IC49ICcgY2hlY2tlZD0iY2hlY2tlZCInOwogICAgfQogICAgJF9vdXRwdXQgLj0g
JGV4dHJhIC4gJyAvPicgLiAkb3V0cHV0OwogICAgJF9vdXRwdXQgLj0gKCRsYWJlbHMpPyc8L2xh
YmVsPic6Jzwvc3Bhbj4nOwogICAgJF9vdXRwdXQgLj0gJHNlcGFyYXRvcjsKCiAgICByZXR1cm4g
JF9vdXRwdXQ7Cn0KCj8+Cg==

--MP_qhCzblpK3mV_EudOaxTZsSq
Content-Type: text/x-patch; name=function.html_checkboxes.php.patch
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=function.html_checkboxes.php.patch

--- function.html_checkboxes.php.orig	2007-03-28 13:42:56.000000000 +0330
+++ function.html_checkboxes.php	2007-03-28 13:42:32.000000000 +0330
@@ -22,6 +22,7 @@
  *           - separator  (optional) - ie <br> or &nbsp;
  *           - output     (optional) - the output next to each checkbox
  *           - assign     (optional) - assign the output as an array to this variable
+ *           - direction  (optional) - add direction for fields
  * Examples:
  * <pre>
  * {html_checkboxes values=$ids output=$names}
@@ -49,6 +50,7 @@
     $separator = '';
     $labels = true;
     $output = null;
+    $direction = 'ltr';
 
     $extra = '';
 
@@ -56,6 +58,7 @@
         switch($_key) {
             case 'name':
             case 'separator':
+            case 'direction':
                 $$_key = $_val;
                 break;
 
@@ -104,13 +107,13 @@
     if (is_array($options)) {
 
         foreach ($options as $_key=>$_val)
-            $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels);
+            $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $direction);
 
 
     } else {
         foreach ($values as $_i=>$_key) {
             $_val = isset($output[$_i]) ? $output[$_i] : '';
-            $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels);
+            $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $direction);
         }
 
     }
@@ -123,9 +126,11 @@
 
 }
 
-function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels) {
-    $_output = '';
-    if ($labels) $_output .= '<label>';
+function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels, $direction) {
+    $_output  = '';
+    $_output .= ($labels)?'<label dir="'.smarty_function_escape_special_chars($direction).'">':
+                          '<span dir="'.smarty_function_escape_special_chars($direction).'">';
+
     $_output .= '<input type="checkbox" name="'
         . smarty_function_escape_special_chars($name) . '[]" value="'
         . smarty_function_escape_special_chars($value) . '"';
@@ -134,8 +139,8 @@
         $_output .= ' checked="checked"';
     }
     $_output .= $extra . ' />' . $output;
-    if ($labels) $_output .= '</label>';
-    $_output .=  $separator;
+    $_output .= ($labels)?'</label>':'</span>';
+    $_output .= $separator;
 
     return $_output;
 }

--MP_qhCzblpK3mV_EudOaxTZsSq--