Skip to content

Commit 0d80366

Browse files
authored
Merge pull request #13 from magento-tango/MAGETWO-69935
MAGETWO-69935 - [Backport] Unable to save Scheduled Changes with Japanese locale due to Date formatting - 2.1
2 parents dd61728 + 55cba54 commit 0d80366

File tree

2 files changed

+88
-28
lines changed

2 files changed

+88
-28
lines changed

lib/internal/Magento/Framework/View/Element/Html/Calendar.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,31 @@ protected function _toHtml()
7676
]
7777
);
7878

79-
// get months names
79+
/**
80+
* Month names in abbreviated format values was added to ICU Data tables
81+
* starting ICU library version 52.1. For some OS, like CentOS, default
82+
* installation version of ICU library is 50.1.2, which not contain
83+
* 'abbreviated' key, and that may cause a PHP fatal error when passing
84+
* as an argument of function 'iterator_to_array'. This issue affects
85+
* locales like ja_JP, ko_KR etc.
86+
*
87+
* @see http://source.icu-project.org/repos/icu/tags/release-50-1-2/icu4c/source/data/locales/ja.txt
88+
* @see http://source.icu-project.org/repos/icu/tags/release-52-1/icu4c/source/data/locales/ja.txt
89+
* @var \ResourceBundle $monthsData
90+
*/
8091
$monthsData = $localeData['calendar']['gregorian']['monthNames'];
8192
$this->assign(
8293
'months',
8394
[
8495
'wide' => $this->encoder->encode(array_values(iterator_to_array($monthsData['format']['wide']))),
8596
'abbreviated' => $this->encoder->encode(
86-
array_values(iterator_to_array($monthsData['format']['abbreviated']))
97+
array_values(
98+
iterator_to_array(
99+
null !== $monthsData->get('format')->get('abbreviated')
100+
? $monthsData['format']['abbreviated']
101+
: $monthsData['format']['wide']
102+
)
103+
)
87104
),
88105
]
89106
);

lib/internal/Magento/Framework/View/Test/Unit/Element/Html/CalendarTest.php

Lines changed: 69 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,49 +5,92 @@
55
*/
66
namespace Magento\Framework\View\Test\Unit\Element\Html;
77

8+
use Magento\Framework\Locale\ResolverInterface;
9+
use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
10+
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
11+
use Magento\Framework\View\Element\Html\Calendar;
12+
use Magento\Framework\View\Element\Template\Context;
13+
use \PHPUnit_Framework_MockObject_MockObject as MockObject;
14+
15+
/**
16+
* @see Calendar
17+
*/
818
class CalendarTest extends \PHPUnit_Framework_TestCase
919
{
1020
/**
11-
* @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
21+
* @see MAGETWO-60828
22+
* @see Calendar::_toHtml
23+
*
24+
* @param string $locale
25+
* @dataProvider localesDataProvider
1226
*/
13-
protected $objectManagerHelper;
14-
15-
/** @var \Magento\Framework\View\Element\Html\Calendar */
16-
protected $block;
17-
18-
/** @var \Magento\Framework\View\Element\Template\Context */
19-
protected $context;
27+
public function testToHtmlWithDifferentLocales($locale)
28+
{
29+
$calendarBlock = (new ObjectManager($this))->getObject(
30+
Calendar::class,
31+
[
32+
'localeResolver' => $this->getLocalResolver($locale)
33+
]
34+
);
2035

21-
/** @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface|\PHPUnit_Framework_MockObject_MockObject */
22-
protected $localeDate;
36+
$calendarBlock->toHtml();
37+
}
2338

24-
protected function setUp()
39+
/**
40+
* @return array
41+
*/
42+
public function localesDataProvider()
2543
{
26-
$this->objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
27-
$this->localeDate = $this->getMockBuilder('Magento\Framework\Stdlib\DateTime\TimezoneInterface')
28-
->getMock();
44+
return [
45+
['en_US'],
46+
['ja_JP'],
47+
['ko_KR'],
48+
];
49+
}
2950

30-
/** @var \Magento\Framework\View\Element\Template\Context $context */
31-
$this->context = $this->objectManagerHelper->getObject(
32-
'Magento\Framework\View\Element\Template\Context',
51+
/**
52+
* @see Calendar::getYearRange
53+
*/
54+
public function testGetYearRange()
55+
{
56+
$calendarBlock = (new ObjectManager($this))->getObject(
57+
Calendar::class,
3358
[
34-
'localeDate' => $this->localeDate,
59+
'context' => $this->getContext()
3560
]
3661
);
3762

38-
/** @var \Magento\Framework\View\Element\Html\Links $block */
39-
$this->block = $this->objectManagerHelper->getObject(
40-
'Magento\Framework\View\Element\Html\Calendar',
41-
['context' => $this->context]
63+
$testCurrentYear = (new \DateTime())->format('Y');
64+
$this->assertEquals(
65+
(int) $testCurrentYear - 100 . ':' . ($testCurrentYear + 100),
66+
$calendarBlock->getYearRange()
4267
);
4368
}
4469

4570
/**
46-
* @test
71+
* @param string $locale
72+
* @return ResolverInterface|MockObject
4773
*/
48-
public function testGetYearRange()
74+
private function getLocalResolver($locale)
4975
{
50-
$testCurrentYear = (new \DateTime())->format('Y');
51-
$this->assertEquals((int)$testCurrentYear - 100 . ':' . ($testCurrentYear + 100), $this->block->getYearRange());
76+
$localResolver = $this->getMockBuilder(ResolverInterface::class)
77+
->getMockForAbstractClass();
78+
$localResolver->method('getLocale')->willReturn($locale);
79+
80+
return $localResolver;
81+
}
82+
83+
/**
84+
* @return Context|Object
85+
*/
86+
private function getContext()
87+
{
88+
$localeDate = $this->getMockBuilder(TimezoneInterface::class)
89+
->getMockForAbstractClass();
90+
91+
return (new ObjectManager($this))->getObject(
92+
Context::class,
93+
['localeDate' => $localeDate]
94+
);
5295
}
5396
}

0 commit comments

Comments
 (0)