Fix BaseArrayHelper::htmlDecode() (#19386)

* Fix BaseArrayHelper::htmlDecode()

Add missed second argument on recursive calling.

* Fix BaseArrayHelper::htmlDecode()

`htmlspecialchars_decode()` flags must be same to `htmlspecialchars()` in `BaseArrayHelper::htmlEncode()`

* Update ArrayHelperTest.php

* Update ArrayHelperTest.php

* Update ArrayHelperTest.php

* Update CHANGELOG.md

* test workflow fix
This commit is contained in:
Anton
2022-05-22 11:20:04 +03:00
committed by GitHub
parent f458263d93
commit c409264484
3 changed files with 18 additions and 9 deletions

View File

@ -26,6 +26,7 @@ Yii Framework 2 Change Log
- Bug #19237: Fix OCI PHP 8.1 passing `null` to trim() (longthanhtran) - Bug #19237: Fix OCI PHP 8.1 passing `null` to trim() (longthanhtran)
- Bug #19312: Fix PHP 8.1 error when passing null to `yii\helpers\BaseInflector` (WinterSilence) - Bug #19312: Fix PHP 8.1 error when passing null to `yii\helpers\BaseInflector` (WinterSilence)
- Bug #19368: Fix PHP 8.1 error when `$fileMimeType` is `null` in `yii\validators\FileValidator::validateMimeType()` (bizley) - Bug #19368: Fix PHP 8.1 error when `$fileMimeType` is `null` in `yii\validators\FileValidator::validateMimeType()` (bizley)
- Bug #19386: Fix recursive calling `yii\helpers\BaseArrayHelper::htmlDecode()` (WinterSilence)
2.0.45 February 11, 2022 2.0.45 February 11, 2022

View File

@ -726,12 +726,14 @@ class BaseArrayHelper
/** /**
* Decodes HTML entities into the corresponding characters in an array of strings. * Decodes HTML entities into the corresponding characters in an array of strings.
*
* Only array values will be decoded by default. * Only array values will be decoded by default.
* If a value is an array, this method will also decode it recursively. * If a value is an array, this method will also decode it recursively.
* Only string values will be decoded. * Only string values will be decoded.
*
* @param array $data data to be decoded * @param array $data data to be decoded
* @param bool $valuesOnly whether to decode array values only. If false, * @param bool $valuesOnly whether to decode array values only. If `false`,
* both the array keys and array values will be decoded. * then both the array keys and array values will be decoded.
* @return array the decoded data * @return array the decoded data
* @see https://www.php.net/manual/en/function.htmlspecialchars-decode.php * @see https://www.php.net/manual/en/function.htmlspecialchars-decode.php
*/ */
@ -740,12 +742,12 @@ class BaseArrayHelper
$d = []; $d = [];
foreach ($data as $key => $value) { foreach ($data as $key => $value) {
if (!$valuesOnly && is_string($key)) { if (!$valuesOnly && is_string($key)) {
$key = htmlspecialchars_decode($key, ENT_QUOTES); $key = htmlspecialchars_decode($key, ENT_QUOTES | ENT_SUBSTITUTE);
} }
if (is_string($value)) { if (is_string($value)) {
$d[$key] = htmlspecialchars_decode($value, ENT_QUOTES); $d[$key] = htmlspecialchars_decode($value, ENT_QUOTES | ENT_SUBSTITUTE);
} elseif (is_array($value)) { } elseif (is_array($value)) {
$d[$key] = static::htmlDecode($value); $d[$key] = static::htmlDecode($value, $valuesOnly);
} else { } else {
$d[$key] = $value; $d[$key] = $value;
} }

View File

@ -1185,29 +1185,35 @@ class ArrayHelperTest extends TestCase
3 => 'blank', 3 => 'blank',
[ [
'<>' => 'a&lt;&gt;b', '<>' => 'a&lt;&gt;b',
'&lt;a&gt;' => '&lt;a href=&quot;index.php?a=1&amp;b=2&quot;&gt;link&lt;/a&gt;',
'23' => true, '23' => true,
], ],
]; ];
$this->assertEquals([
$expected = [
'abc' => '123', 'abc' => '123',
'&lt;' => '>', '&lt;' => '>',
'cde' => false, 'cde' => false,
3 => 'blank', 3 => 'blank',
[ [
'<>' => 'a<>b', '<>' => 'a<>b',
'&lt;a&gt;' => '<a href="index.php?a=1&b=2">link</a>',
'23' => true, '23' => true,
], ],
], ArrayHelper::htmlDecode($array)); ];
$this->assertEquals([ $this->assertEquals($expected, ArrayHelper::htmlDecode($array));
$expected = [
'abc' => '123', 'abc' => '123',
'<' => '>', '<' => '>',
'cde' => false, 'cde' => false,
3 => 'blank', 3 => 'blank',
[ [
'<>' => 'a<>b', '<>' => 'a<>b',
'<a>' => '<a href="index.php?a=1&b=2">link</a>',
'23' => true, '23' => true,
], ],
], ArrayHelper::htmlDecode($array, false)); ];
$this->assertEquals($expected, ArrayHelper::htmlDecode($array, false));
} }
public function testIsIn() public function testIsIn()