summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorctrlaltca <ctrlaltca@gmail.com>2014-07-19 17:18:36 +0200
committerctrlaltca <ctrlaltca@gmail.com>2014-07-19 17:18:36 +0200
commit9c2824b1b752f26cc2bea0667a7ee2c7bbf26db0 (patch)
tree7ae661d70320fe29649929bf793cc7e96547e38a
parent071f22c5c038c962823af003a28663d0d2734a16 (diff)
parent8e07d0781150206fae722d9b9dcbdafd727665f6 (diff)
Merge pull request #525 from david0/issue-524
Convert encoding of all values inside an array before json_serialize
-rw-r--r--framework/Web/Javascripts/TJavaScript.php25
-rwxr-xr-xtests/FunctionalTests/issues/protected/pages/Issue524.page7
-rwxr-xr-xtests/FunctionalTests/issues/protected/pages/Issue524.php20
-rwxr-xr-xtests/FunctionalTests/issues/tests/Issue524TestCase.php20
4 files changed, 67 insertions, 5 deletions
diff --git a/framework/Web/Javascripts/TJavaScript.php b/framework/Web/Javascripts/TJavaScript.php
index f55b5c5b..3684132b 100644
--- a/framework/Web/Javascripts/TJavaScript.php
+++ b/framework/Web/Javascripts/TJavaScript.php
@@ -217,7 +217,6 @@ class TJavaScript
else
return '';
}
-
/**
* Encodes a PHP variable into javascript string.
* This method invokes json_encode to perform the encoding.
@@ -226,16 +225,32 @@ class TJavaScript
*/
public static function jsonEncode($value, $options = 0)
{
- if (is_string($value) &&
- ($g=Prado::getApplication()->getGlobalization(false))!==null &&
- strtoupper($enc=$g->getCharset())!='UTF-8')
- $value=iconv($enc, 'UTF-8', $value);
+ if (($g=Prado::getApplication()->getGlobalization(false))!==null &&
+ strtoupper($enc=$g->getCharset())!='UTF-8') {
+ self::convertToUtf8($value, $enc);
+ }
+
$s = @json_encode($value,$options);
self::checkJsonError();
return $s;
}
/**
+ * Encodes an string or the content of an array to UTF8
+ * @param string|array|mixed $value
+ * @param string $sourceEncoding
+ */
+ private static function convertToUtf8(&$value, $sourceEncoding) {
+ if(is_string($value))
+ $value=iconv($sourceEncoding, 'UTF-8', $value);
+ else if (is_array($value))
+ {
+ foreach($value as &$element)
+ self::convertToUtf8($element, $sourceEncoding);
+ }
+ }
+
+ /**
* Decodes a javascript string into PHP variable.
* This method invokes json_decode to perform the decoding.
* @param string string to be decoded
diff --git a/tests/FunctionalTests/issues/protected/pages/Issue524.page b/tests/FunctionalTests/issues/protected/pages/Issue524.page
new file mode 100755
index 00000000..08ac1814
--- /dev/null
+++ b/tests/FunctionalTests/issues/protected/pages/Issue524.page
@@ -0,0 +1,7 @@
+<com:TContent ID="Content">
+ <h1>Issue 524 Test</h1>
+ <com:TTextBox ID="textbox1" />
+ <com:TActiveButton ID="buttonOk" Text="Ok button" />
+ <com:TActiveCustomValidator ID="Validator" ControlToValidate="textbox1" OnServerValidate="validateText" Text="Input is invalid." />
+</com:TContent>
+
diff --git a/tests/FunctionalTests/issues/protected/pages/Issue524.php b/tests/FunctionalTests/issues/protected/pages/Issue524.php
new file mode 100755
index 00000000..851ff45a
--- /dev/null
+++ b/tests/FunctionalTests/issues/protected/pages/Issue524.php
@@ -0,0 +1,20 @@
+<?php
+
+Prado::using('System.Web.UI.ActiveControls.*');
+
+class Issue524 extends TPage
+{
+
+ public function __construct() {
+ Prado::getApplication()->getGlobalization()->setCharset('ISO-8859-1');
+ parent::__construct();
+ }
+
+ public function validateText($sender, $param)
+ {
+ $param->IsValid = false;
+ $iso8859text=iconv('utf-8', 'iso-8859-1', 'fünf');
+ $this->Validator->ErrorMessage = $iso8859text;
+ }
+
+}
diff --git a/tests/FunctionalTests/issues/tests/Issue524TestCase.php b/tests/FunctionalTests/issues/tests/Issue524TestCase.php
new file mode 100755
index 00000000..2582dda0
--- /dev/null
+++ b/tests/FunctionalTests/issues/tests/Issue524TestCase.php
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * Testcase for Issue 524
+ * Encoding issues caused an error when serializing the
+ * response
+ **/
+class Issue524TestCase extends PradoGenericSelenium2Test
+{
+ function test()
+ {
+ $this->url('issues/index.php?page=Issue524');
+ $this->assertContains('Issue 524 Test', $this->source());
+ $base='ctl0_Content_';
+
+ $this->byID("{$base}buttonOk")->click();
+
+ $this->assertText("{$base}Validator", "fünf");
+ }
+}