Skip to content

Commit 9d1e926

Browse files
author
Venkata Uppalapati
committed
Merge branch 'develop' into FearlessKiwis-MAGETWO-59555-Mass-actions-are-slow-Chris
2 parents 9465a2f + 1387fe0 commit 9d1e926

File tree

21 files changed

+991
-152
lines changed

21 files changed

+991
-152
lines changed

app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/Text.php

Lines changed: 46 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@
33
* Copyright © 2016 Magento. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
namespace Magento\Backend\Block\Widget\Grid\Column\Renderer;
7+
8+
use Magento\Framework\DataObject;
69

710
/**
811
* Backend grid item renderer
9-
*
10-
* @author Magento Core Team <core@magentocommerce.com>
1112
*/
12-
namespace Magento\Backend\Block\Widget\Grid\Column\Renderer;
13-
1413
class Text extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRenderer
1514
{
1615
/**
@@ -21,30 +20,53 @@ class Text extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRe
2120
protected $_variablePattern = '/\\$([a-z0-9_]+)/i';
2221

2322
/**
24-
* Renders grid column
23+
* Get value for the cel
2524
*
26-
* @param \Magento\Framework\DataObject $row
27-
* @return mixed
25+
* @param DataObject $row
26+
* @return string
2827
*/
29-
public function _getValue(\Magento\Framework\DataObject $row)
28+
public function _getValue(DataObject $row)
3029
{
31-
$format = $this->getColumn()->getFormat() ? $this->getColumn()->getFormat() : null;
32-
$defaultValue = $this->getColumn()->getDefault();
33-
if ($format === null) {
34-
// If no format and it column not filtered specified return data as is.
35-
$data = parent::_getValue($row);
36-
$string = $data === null ? $defaultValue : $data;
37-
return $this->escapeHtml($string);
38-
} elseif (preg_match_all($this->_variablePattern, $format, $matches)) {
39-
// Parsing of format string
40-
$formattedString = $format;
41-
foreach ($matches[0] as $matchIndex => $match) {
42-
$value = $row->getData($matches[1][$matchIndex]);
43-
$formattedString = str_replace($match, $value, $formattedString);
30+
if (null === $this->getColumn()->getFormat()) {
31+
return $this->getSimpleValue($row);
32+
}
33+
return $this->getFormattedValue($row);
34+
}
35+
36+
/**
37+
* Get simple value
38+
*
39+
* @param DataObject $row
40+
* @return string
41+
*/
42+
private function getSimpleValue(DataObject $row)
43+
{
44+
$data = parent::_getValue($row);
45+
$value = null === $data ? $this->getColumn()->getDefault() : $data;
46+
if (true === $this->getColumn()->getTranslate()) {
47+
$value = __($value);
48+
}
49+
return $this->escapeHtml($value);
50+
}
51+
52+
/**
53+
* Replace placeholders in the string with values
54+
*
55+
* @param DataObject $row
56+
* @return string
57+
*/
58+
private function getFormattedValue(DataObject $row)
59+
{
60+
$value = $this->getColumn()->getFormat() ?: null;
61+
if (true === $this->getColumn()->getTranslate()) {
62+
$value = __($value);
63+
}
64+
if (preg_match_all($this->_variablePattern, $value, $matches)) {
65+
foreach ($matches[0] as $index => $match) {
66+
$replacement = $row->getData($matches[1][$index]);
67+
$value = str_replace($match, $replacement, $value);
4468
}
45-
return $formattedString;
46-
} else {
47-
return $this->escapeHtml($format);
4869
}
70+
return $this->escapeHtml($value);
4971
}
5072
}

app/code/Magento/Backend/view/adminhtml/layout/adminhtml_cache_block.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
<argument name="width" xsi:type="string">180</argument>
4949
<argument name="align" xsi:type="string">left</argument>
5050
<argument name="sortable" xsi:type="string">0</argument>
51+
<argument name="translate" xsi:type="boolean">true</argument>
5152
</arguments>
5253
</block>
5354
<block class="Magento\Backend\Block\Widget\Grid\Column" as="description">
@@ -57,6 +58,7 @@
5758
<argument name="type" xsi:type="string">text</argument>
5859
<argument name="align" xsi:type="string">left</argument>
5960
<argument name="sortable" xsi:type="string">0</argument>
61+
<argument name="translate" xsi:type="boolean">true</argument>
6062
</arguments>
6163
</block>
6264
<block class="Magento\Backend\Block\Widget\Grid\Column" as="tags">

app/code/Magento/Indexer/view/adminhtml/layout/indexer_indexer_list_grid.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
<argument name="index" xsi:type="string">title</argument>
4747
<argument name="sortable" xsi:type="string">0</argument>
4848
<argument name="column_css_class" xsi:type="string">indexer-title</argument>
49+
<argument name="translate" xsi:type="boolean">true</argument>
4950
</arguments>
5051
</block>
5152
<block class="Magento\Backend\Block\Widget\Grid\Column" as="indexer_description">
@@ -54,6 +55,7 @@
5455
<argument name="index" xsi:type="string">description</argument>
5556
<argument name="sortable" xsi:type="string">0</argument>
5657
<argument name="column_css_class" xsi:type="string">indexer-description</argument>
58+
<argument name="translate" xsi:type="boolean">true</argument>
5759
</arguments>
5860
</block>
5961
<block class="Magento\Backend\Block\Widget\Grid\Column" as="indexer_mode">
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Backend\Block\Widget\Grid\Column\Renderer;
7+
8+
use Magento\TestFramework\Helper\Bootstrap;
9+
use Magento\TestFramework\ObjectManager;
10+
use Magento\Backend\Block\Widget\Grid\Column;
11+
use Magento\Framework\DataObject;
12+
use Magento\Framework\Phrase;
13+
use Magento\Framework\Phrase\RendererInterface;
14+
15+
class TextTest extends \PHPUnit_Framework_TestCase
16+
{
17+
/**
18+
* @var ObjectManager
19+
*/
20+
private $objectManager;
21+
22+
/**
23+
* @var RendererInterface
24+
*/
25+
private $origRenderer;
26+
27+
protected function setUp()
28+
{
29+
$this->objectManager = Bootstrap::getObjectManager();
30+
$this->origRenderer = Phrase::getRenderer();
31+
/** @var RendererInterface|PHPUnit_Framework_MockObject_MockObject $rendererMock */
32+
$rendererMock = $this->getMock(RendererInterface::class);
33+
$rendererMock->expects($this->any())
34+
->method('render')
35+
->willReturnCallback(
36+
function ($input) {
37+
return end($input) . ' translated';
38+
}
39+
);
40+
Phrase::setRenderer($rendererMock);
41+
}
42+
43+
protected function tearDown()
44+
{
45+
Phrase::setRenderer($this->origRenderer);
46+
}
47+
48+
/**
49+
* @param array $columnData
50+
* @param array $rowData
51+
* @param string $expected
52+
* @dataProvider renderDataProvider
53+
*/
54+
public function testRender($columnData, $rowData, $expected)
55+
{
56+
/** @var Text $renderer */
57+
$renderer = $this->objectManager->create(Text::class);
58+
/** @var Column $column */
59+
$column = $this->objectManager->create(
60+
Column::class,
61+
[
62+
'data' => $columnData
63+
]
64+
);
65+
/** @var DataObject $row */
66+
$row = $this->objectManager->create(
67+
DataObject::class,
68+
[
69+
'data' => $rowData
70+
]
71+
);
72+
$this->assertEquals(
73+
$expected,
74+
$renderer->setColumn($column)->render($row)
75+
);
76+
}
77+
78+
/**
79+
* @return array
80+
*/
81+
public function renderDataProvider()
82+
{
83+
return [
84+
[
85+
[
86+
'index' => 'title',
87+
'translate' => true
88+
],
89+
[
90+
'title' => 'String'
91+
],
92+
'String translated'
93+
],
94+
[
95+
[
96+
'index' => 'title'
97+
],
98+
[
99+
'title' => 'Doesn\'t need to be translated'
100+
],
101+
'Doesn&#039;t need to be translated'
102+
],
103+
[
104+
[
105+
'format' => '#$subscriber_id $customer_name ($subscriber_email)'
106+
],
107+
[
108+
'subscriber_id' => '10',
109+
'customer_name' => 'John Doe',
110+
'subscriber_email' => 'john@doe.com'
111+
],
112+
'#10 John Doe (john@doe.com)'
113+
],
114+
[
115+
[
116+
'format' => '$customer_name, email: $subscriber_email',
117+
'translate' => true
118+
],
119+
[
120+
'customer_name' => 'John Doe',
121+
'subscriber_email' => 'john@doe.com'
122+
],
123+
'John Doe, email: john@doe.com translated'
124+
],
125+
[
126+
[
127+
'format' => 'String',
128+
'translate' => true
129+
],
130+
[],
131+
'String translated'
132+
],
133+
[
134+
[
135+
'format' => 'Doesn\'t need to be translated'
136+
],
137+
[],
138+
'Doesn&#039;t need to be translated'
139+
]
140+
];
141+
}
142+
}

dev/tests/static/framework/Magento/Sniffs/Translation/ConstantUsageSniff.php

Lines changed: 57 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,10 @@
55
*/
66
namespace Magento\Sniffs\Translation;
77

8-
use PHP_CodeSniffer_File;
9-
108
/**
119
* Make sure that constants are not used as the first argument of translation function.
1210
*/
13-
class ConstantUsageSniff extends \Generic_Sniffs_Files_LineLengthSniff
11+
class ConstantUsageSniff implements \PHP_CodeSniffer_Sniff
1412
{
1513
/**
1614
* Having previous line content allows to process multi-line declaration.
@@ -20,24 +18,73 @@ class ConstantUsageSniff extends \Generic_Sniffs_Files_LineLengthSniff
2018
protected $previousLineContent = '';
2119

2220
/**
23-
* {@inheritdoc}
21+
* {@inheritDoc}
22+
*/
23+
public function register()
24+
{
25+
return [T_OPEN_TAG];
26+
27+
}
28+
29+
/**
30+
* Copied from \Generic_Sniffs_Files_LineLengthSniff, minor changes made
31+
*
32+
* {@inheritDoc}
2433
*/
25-
protected function checkLineLength(\PHP_CodeSniffer_File $phpcsFile, $stackPtr, $lineContent)
34+
public function process(\PHP_CodeSniffer_File $phpcsFile, $stackPtr)
2635
{
27-
$previousLineRegexp = '~__\($|Phrase\($~';
28-
$currentLineRegexp = '~__\(.+\)|Phrase\(.+\)~';
36+
$tokens = $phpcsFile->getTokens();
37+
38+
// Make sure this is the first open tag
39+
$previousOpenTag = $phpcsFile->findPrevious(T_OPEN_TAG, ($stackPtr - 1));
40+
if ($previousOpenTag !== false) {
41+
return;
42+
}
43+
44+
$tokenCount = 0;
45+
$currentLineContent = '';
46+
$currentLine = 1;
47+
48+
for (; $tokenCount < $phpcsFile->numTokens; $tokenCount++) {
49+
if ($tokens[$tokenCount]['line'] === $currentLine) {
50+
$currentLineContent .= $tokens[$tokenCount]['content'];
51+
} else {
52+
$this->checkIfFirstArgumentConstant($phpcsFile, ($tokenCount - 1), $currentLineContent);
53+
$currentLineContent = $tokens[$tokenCount]['content'];
54+
$currentLine++;
55+
}
56+
}
57+
58+
$this->checkIfFirstArgumentConstant($phpcsFile, ($tokenCount - 1), $currentLineContent);
59+
}
60+
61+
/**
62+
* Checks if first argument of \Magento\Framework\Phrase or translation function is a constant
63+
*
64+
* @param \PHP_CodeSniffer_File $phpcsFile
65+
* @param int $stackPtr
66+
* @param string $lineContent
67+
* @return void
68+
*/
69+
private function checkIfFirstArgumentConstant(
70+
\PHP_CodeSniffer_File $phpcsFile,
71+
$stackPtr,
72+
$lineContent
73+
) {
74+
$previousLineRegexp = '/(__|Phrase)\($/im';
75+
$currentLineRegexp = '/(__|Phrase)\(.+\)/';
2976
$currentLineMatch = preg_match($currentLineRegexp, $lineContent) !== 0;
3077
$previousLineMatch = preg_match($previousLineRegexp, $this->previousLineContent) !== 0;
3178
$this->previousLineContent = $lineContent;
3279
$error = 'Constants are not allowed as the first argument of translation function, use string literal instead';
33-
$constantRegexp = '[^\'"]+::[A-Z_0-9]+.*';
80+
$constantRegexp = '[^\$\'"]+::[A-Z_0-9]+.*';
3481
if ($currentLineMatch) {
35-
$variableRegexp = "~__\({$constantRegexp}\)|Phrase\({$constantRegexp}\)~";
82+
$variableRegexp = "/(__|Phrase)\({$constantRegexp}\)/";
3683
if (preg_match($variableRegexp, $lineContent) !== 0) {
3784
$phpcsFile->addError($error, $stackPtr, 'VariableTranslation');
3885
}
3986
} else if ($previousLineMatch) {
40-
$variableRegexp = "~^\s+{$constantRegexp}~";
87+
$variableRegexp = "/^{$constantRegexp}/";
4188
if (preg_match($variableRegexp, $lineContent) !== 0) {
4289
$phpcsFile->addError($error, $stackPtr, 'VariableTranslation');
4390
}

0 commit comments

Comments
 (0)