Skip to content

Commit 64f9058

Browse files
committed
#68 refactor pdf & html renderers
1 parent 9b98839 commit 64f9058

File tree

7 files changed

+91
-23
lines changed

7 files changed

+91
-23
lines changed

Service/Export/Renderer/HtmlRenderer.php

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,32 @@
99

1010
use Exception;
1111
use InvalidArgumentException;
12+
use Magento\Framework\App\Area;
13+
use Magento\Framework\App\State;
1214
use Magento\Framework\DataObject;
1315
use Magento\Framework\Filesystem;
1416
use Magento\Framework\Translate\InlineInterface;
17+
use Magento\Framework\View\DesignInterface;
1518
use Magento\Framework\View\Element\Template;
1619
use Magento\Framework\View\FileSystem as ViewFileSystem;
1720
use Magento\Framework\View\Page\Config;
1821
use Magento\Framework\View\Page\Config\RendererInterface;
1922
use Opengento\Gdpr\Model\View\Page\Config\RendererFactory;
2023
use Opengento\Gdpr\Service\Export\Renderer\HtmlRenderer\LayoutInitiatorInterface;
21-
use function array_keys;
2224
use function extract;
2325
use function ob_end_clean;
2426
use function ob_get_clean;
2527
use function ob_start;
2628

2729
final class HtmlRenderer extends AbstractRenderer
2830
{
31+
/**
32+
* @var State
33+
*/
34+
private $appState;
35+
36+
private $design;
37+
2938
/**
3039
* @var LayoutInitiatorInterface
3140
*/
@@ -52,6 +61,8 @@ final class HtmlRenderer extends AbstractRenderer
5261
private $template;
5362

5463
public function __construct(
64+
State $appState,
65+
DesignInterface $design,
5566
Filesystem $filesystem,
5667
LayoutInitiatorInterface $layoutInitiator,
5768
Config $pageConfig,
@@ -60,6 +71,8 @@ public function __construct(
6071
ViewFileSystem $viewFileSystem,
6172
string $template
6273
) {
74+
$this->appState = $appState;
75+
$this->design = $design;
6376
$this->layoutInitiator = $layoutInitiator;
6477
$this->pageConfigRenderer = $rendererFactory->create(['pageConfig' => $pageConfig]);
6578
$this->translateInline = $translateInline;
@@ -74,6 +87,23 @@ public function __construct(
7487
*/
7588
public function render(array $data): string
7689
{
90+
return $this->appState->emulateAreaCode(
91+
Area::AREA_FRONTEND,
92+
function () use ($data): string { return $this->renderHtml($data); }
93+
);
94+
}
95+
96+
/**
97+
* @param array $data
98+
* @return string
99+
* @throws Exception
100+
*/
101+
private function renderHtml(array $data): string
102+
{
103+
// Workaround for emulated area code
104+
$this->design->setArea($this->design->getArea());
105+
$this->design->setDefaultDesignTheme();
106+
77107
$layout = $this->layoutInitiator->createLayout();
78108

79109
/** @var Template $block */

Service/Export/Renderer/HtmlRenderer/LayoutInitiator.php

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,7 @@ public function createLayout(): LayoutInterface
8181
'generatorPool' => $this->layoutGeneratorPool,
8282
]);
8383

84-
$layout->getUpdate()->addHandle('default');
8584
$layout->getUpdate()->addHandle($this->defaultLayoutHandle);
86-
/** @var Merge $update */
87-
$update = $layout->getUpdate();
88-
if ($update->isLayoutDefined()) {
89-
$update->removeHandle('default');
90-
}
9185

9286
return $this->addConfigLayout($layout);
9387
}

view/base/layout/customer_privacy_export_personal_data.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="customer_privacy_export" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
99
<update handle="customer_privacy_export_personal_data_renderers"/>
1010
<head>
11+
<meta name="viewport" content="width=device-width, initial-scale=1"/>
12+
<css src="Opengento_Gdpr::css/export.css"/>
1113
<title>My Personal Data</title>
1214
</head>
1315
<body>
1416
<referenceContainer name="main">
15-
<block name="main.content.customer.privacy.export.personal.data" template="Opengento_Gdpr::export/result.phtml" cacheable="false"/>
17+
<block class="Magento\Framework\View\Element\Template" name="main.content.customer.privacy.export.personal.data" template="Opengento_Gdpr::export/result.phtml" cacheable="false"/>
1618
</referenceContainer>
1719
</body>
1820
</page>

view/base/layout/customer_privacy_export_personal_data_renderers.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@
77
-->
88
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
99
<block class="Magento\Framework\View\Element\RendererList" name="opengento.gdpr.customer.privacy.export.renderers">
10-
<block name="opengento.gdpr.customer.privacy.export.renderers.default" as="default"/>
10+
<block class="Magento\Framework\View\Element\Template" name="opengento.gdpr.customer.privacy.export.renderers.default" as="default"/>
1111
</block>
1212
</layout>

view/base/templates/export/renderer/default.phtml

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,42 @@ $escaper = $escaper ?? $block;
1818
$rendererList = $block->getChildBlock('exportRenderer');
1919
/** @var DataObject $viewModel */
2020
$viewModel = $block->getData('viewModel');
21+
22+
$exportData = array_filter($viewModel->toArray());
23+
24+
if (!function_exists('formatLabel')) {
25+
function formatLabel(string $label): string
26+
{
27+
return ucwords(str_replace('_', ' ', $label));
28+
}
29+
}
30+
if (!function_exists('renderNestedItems')) {
31+
function renderNestedItems(array $items, $escaper): string
32+
{
33+
$items = array_filter($items);
34+
if (!$items) {
35+
return '';
36+
}
37+
38+
$html = '<ul class="items">';
39+
foreach ($items as $key => $item) {
40+
$html .= '<li class="item"><span class="label">' . $escaper->escapeHtml(formatLabel($key)) . '</span>: ';
41+
$html .= is_array($item)
42+
? renderNestedItems($item, $escaper)
43+
: '<span class="value">' . $escaper->escapeHtml($item) .'</span>';
44+
$html .= '</li>';
45+
}
46+
$html .= '</ul>';
47+
48+
return $html;
49+
}
50+
}
2151
?>
22-
<?php foreach ($viewModel->toArray() as $key => $value): ?>
52+
<?php foreach ($exportData as $key => $value): ?>
2353
<div class="fieldset info export-data-<?= $escaper->escapeHtmlAttr($key) ?>">
24-
<div class="legend"><span><?= $escaper->escapeHtml($key) ?></span></div>
54+
<div class="legend"><span><?= $escaper->escapeHtml(formatLabel($key)) ?></span></div>
2555
<div class="field field-<?= $escaper->escapeHtmlAttr($key) ?>">
26-
<?php if (is_array($value)): ?>
27-
<pre>
28-
<?= print_r($value, true) ?>
29-
</pre>
30-
<?php elseif ($value): ?>
31-
<p><?= $escaper->escapeHtml($value) ?></p>
32-
<?php endif; ?>
56+
<?= renderNestedItems($value, $escaper) ?>
3357
</div>
3458
</div>
3559
<?php endforeach; ?>

view/base/templates/export/result.phtml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,5 @@ $rendererList = $block->getLayout()->getBlock('opengento.gdpr.customer.privacy.e
1717
$viewModel = $block->getData('viewModel');
1818
?>
1919
<?php foreach ($viewModel->toArray() as $key => $value): ?>
20-
<?=
21-
$rendererList->getRenderer($key, 'default', 'Opengento_Gdpr::export/renderer/default.phtml')
22-
->setData('viewModel', new DataObject([$key => $value]))
23-
->toHtml()
24-
?>
20+
<?= $rendererList->getRenderer($key, 'default', 'Opengento_Gdpr::export/renderer/default.phtml')->setData('viewModel', new DataObject([$key => $value]))->toHtml() ?>
2521
<?php endforeach; ?>

view/base/web/css/export.less

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* Copyright © OpenGento, All rights reserved.
3+
* See LICENSE bundled with this library for license details.
4+
*/
5+
6+
.customer-privacy-export-personal-data {
7+
.fieldset {
8+
.legend {
9+
font-weight: 600;
10+
text-transform: capitalize;
11+
}
12+
}
13+
.items {
14+
.item {
15+
.label {
16+
font-weight: 600;
17+
text-decoration: underline;
18+
text-transform: capitalize;
19+
}
20+
}
21+
}
22+
}

0 commit comments

Comments
 (0)