diff options
author | ctrlaltca <ctrlaltca@gmail.com> | 2014-07-19 17:18:36 +0200 |
---|---|---|
committer | ctrlaltca <ctrlaltca@gmail.com> | 2014-07-19 17:18:36 +0200 |
commit | 9c2824b1b752f26cc2bea0667a7ee2c7bbf26db0 (patch) | |
tree | 7ae661d70320fe29649929bf793cc7e96547e38a | |
parent | 071f22c5c038c962823af003a28663d0d2734a16 (diff) | |
parent | 8e07d0781150206fae722d9b9dcbdafd727665f6 (diff) |
Merge pull request #525 from david0/issue-524
Convert encoding of all values inside an array before json_serialize
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"); + } +} |