Skip to content

Commit 9f37b68

Browse files
committed
Refactor to use new classes, improve error handling and messages
1 parent 11730a8 commit 9f37b68

File tree

3 files changed

+51
-79
lines changed

3 files changed

+51
-79
lines changed

src/aleksip/DataTransformPlugin/DataTransformer.php

Lines changed: 39 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,26 @@
44

55
use Drupal\Core\Template\Attribute;
66
use Drupal\Core\Url;
7-
use PatternLab\Console;
87
use PatternLab\Data;
98
use PatternLab\PatternData;
109

11-
class PatternNotFoundException extends \Exception {}
12-
1310
/**
1411
* @author Aleksi Peebles <[email protected]>
1512
*/
1613
class DataTransformer
1714
{
15+
use ErrorHandlerTrait;
16+
1817
protected static $processed = array();
1918

20-
protected $verbose;
2119
protected $reservedKeys;
2220
protected $patternDataStore;
2321
protected $renderer;
2422
protected $hasRun;
2523
protected $currentPattern;
26-
protected $renderError;
2724

28-
public function __construct($verbose = false)
25+
public function __construct()
2926
{
30-
$this->verbose = $verbose;
3127
// TODO: Add an accessor function for $reservedKeys to the Data class?
3228
$this->reservedKeys = array("cacheBuster","link","patternSpecific","patternLabHead","patternLabFoot");
3329
$this->patternDataStore = PatternData::get();
@@ -48,9 +44,7 @@ public function run(Renderer $renderer)
4844
$this->processPattern($pattern);
4945
}
5046
$this->hasRun = true;
51-
if ($this->verbose) {
52-
Console::writeInfo('[data transform plugin] processing done...');
53-
}
47+
DataTransformPlugin::writeInfo('processing done');
5448
}
5549

5650
protected function isProcessed($pattern)
@@ -73,33 +67,31 @@ protected function processPattern($pattern)
7367
return;
7468
}
7569
$this->setProcessed($pattern);
76-
try {
77-
$patternSpecificData =
78-
$this->processData(Data::getPatternSpecificData($pattern));
70+
DataTransformPlugin::writeInfo("processing pattern '$pattern'");
71+
$patternSpecificData =
72+
$this->processData(Data::getPatternSpecificData($pattern));
7973

8074

81-
$dataStore = Data::get();
82-
foreach (array_keys($patternSpecificData) as $key) {
83-
if (!isset($dataStore['patternSpecific'][$pattern]['data'][$key])) {
84-
// Value is default global data.
85-
if (isset($dataStore[$key]) && is_object($dataStore[$key])) {
86-
$patternSpecificData[$key] = clone $dataStore[$key];
87-
}
88-
}
75+
$dataStore = Data::get();
76+
foreach (array_keys($patternSpecificData) as $key) {
77+
if (!isset($dataStore['patternSpecific'][$pattern]['data'][$key])) {
78+
// Value is default global data.
79+
if (isset($dataStore[$key]) && is_object($dataStore[$key])) {
80+
$patternSpecificData[$key] = clone $dataStore[$key];
8981
}
90-
Data::initPattern($pattern);
91-
Data::setPatternData($pattern, $patternSpecificData);
92-
}
93-
catch (PatternNotFoundException $exception) {
94-
throw new PatternNotFoundException("Pattern '$pattern': " . $exception->getMessage());
82+
}
9583
}
84+
Data::initPattern($pattern);
85+
Data::setPatternData($pattern, $patternSpecificData);
9686
}
9787

9888
protected function processData($data)
9989
{
10090
foreach (array_keys($data) as $key) {
10191
if (!in_array($key, $this->reservedKeys)) {
92+
$this->setErrorHandler();
10293
$data = $this->processKey($data, $key);
94+
$this->restoreErrorHandler("error processing key '$key'");
10395
}
10496
}
10597

@@ -115,43 +107,53 @@ protected function processKey($data, $key)
115107
}
116108
if (isset($value['Attribute()']) && is_array($value['Attribute()'])) {
117109
$data[$key] = new Attribute($value['Attribute()']);
110+
DataTransformPlugin::writeInfo('created Attribute object', true);
118111
}
119112
elseif (isset($value['Url()']['url'])) {
120113
$options = isset($value['Url()']['options']) && is_array($value['Url()']['options']) ? $value['Url()']['options'] : [];
121114
$data[$key] = Url::fromUri($value['Url()']['url'], $options);
115+
DataTransformPlugin::writeInfo('created Url object', true);
122116
}
123117
elseif (isset($value['include()']) && is_array($value['include()']) && isset($value['include()']['pattern'])) {
124118
$pattern = $value['include()']['pattern'];
125-
if (is_string($pattern) && isset($this->patternDataStore[$pattern])) {
126-
if (!isset($value['include()']['with']) || !is_array($value['include()']['with'])) {
127-
if (!isset($value['include()']['only'])) {
128-
$patternData = $this->getProcessedPatternSpecificData($pattern);
119+
if (is_string($pattern)) {
120+
if (isset($this->patternDataStore[$pattern])) {
121+
if (!isset($value['include()']['with']) || !is_array($value['include()']['with'])) {
122+
if (!isset($value['include()']['only'])) {
123+
$patternData = $this->getProcessedPatternSpecificData($pattern);
124+
}
125+
else {
126+
$patternData = array();
127+
}
128+
}
129+
elseif (!isset($value['include()']['only'])) {
130+
$patternData = $this->getProcessedPatternSpecificData($pattern, $value['include()']['with']);
129131
}
130132
else {
131-
$patternData = array();
133+
$patternData = $value['include()']['with'];
132134
}
133-
}
134-
elseif (!isset($value['include()']['only'])) {
135-
$patternData = $this->getProcessedPatternSpecificData($pattern, $value['include()']['with']);
135+
$data[$key] = $this->renderPattern($pattern, $patternData);
136+
DataTransformPlugin::writeInfo("included pattern '$pattern'", true);
136137
}
137138
else {
138-
$patternData = $value['include()']['with'];
139+
DataTransformPlugin::writeWarning("could not find '$pattern' to include", DataTransformPlugin::isVerbose());
139140
}
140-
$data[$key] = $this->renderPattern($pattern, $patternData);
141141
}
142142
else {
143-
throw new PatternNotFoundException("Could not find pattern '$pattern' to include!");
143+
DataTransformPlugin::writeWarning('include() pattern key value was not a string', DataTransformPlugin::isVerbose());
144144
}
145145
}
146146
elseif (isset($value['join()']) && is_array($value['join()'])) {
147147
$data[$key] = join($value['join()']);
148+
DataTransformPlugin::writeInfo("joined data under key '$key'", true);
148149
}
149150
else {
150151
$data[$key] = $value;
151152
}
152153
}
153154
elseif (is_string($value) && isset($this->patternDataStore[$value]) && $key !== 'pattern') {
154155
$data[$key] = $this->renderPattern($value, $this->getProcessedPatternSpecificData($value));
156+
DataTransformPlugin::writeInfo("included pattern '$value'", true);
155157
}
156158

157159
return $data;
@@ -164,31 +166,17 @@ public function getProcessedPatternSpecificData($pattern, $extraData = array())
164166
return Data::getPatternSpecificData($pattern, $extraData);
165167
}
166168

167-
public function renderErrorHandler($errno, $errstr) {
168-
$this->renderError = $errstr;
169-
170-
return TRUE;
171-
}
172-
173169
protected function renderPattern($pattern, $data)
174170
{
175171
$rendered = '';
176172
if (isset($this->patternDataStore[$pattern]['patternRaw'])) {
177173
foreach (array_keys($data) as $key) {
178174
$data = $this->cloneObjects($data, $key);
179175
}
180-
$this->renderError = NULL;
181-
set_error_handler(array($this, 'renderErrorHandler'));
182176
$rendered = $this->renderer->render(
183177
$this->patternDataStore[$pattern]['patternRaw'],
184178
$data
185179
);
186-
restore_error_handler();
187-
if (isset($this->renderError)) {
188-
Console::writeWarning('[data transform plugin] pattern ' . $this->currentPattern);
189-
Console::writeWarning('error rendering ' . $pattern, true);
190-
Console::writeWarning($this->renderError, true);
191-
}
192180
}
193181

194182
return $rendered;

src/aleksip/DataTransformPlugin/PatternLabListener.php

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
namespace aleksip\DataTransformPlugin;
44

55
use aleksip\DataTransformPlugin\Twig\PatternDataNodeVisitor;
6+
use aleksip\DataTransformPlugin\Twig\TwigEnvironmentDecorator;
67
use PatternLab\Config;
7-
use PatternLab\Console;
88
use PatternLab\Listener;
99
use PatternLab\PatternEngine;
1010
use PatternLab\PatternEngine\Twig\TwigUtil;
@@ -23,58 +23,40 @@ public function __construct()
2323
{
2424
$this->addListener('patternData.codeHelperStart', 'dataTransformer');
2525
$this->addListener('twigPatternLoader.customize', 'addNodeVisitor', -99);
26-
if ($this->isVerbose()) {
27-
Console::writeLine('[data transform plugin] listeners added...');
28-
}
26+
DataTransformPlugin::writeInfo('listeners added');
2927
}
3028

3129
public function dataTransformer()
3230
{
33-
if (!$this->isEnabled()) {
31+
if (!DataTransformPlugin::isEnabled()) {
3432
return;
3533
}
3634

37-
$this->dataTransformer = new DataTransformer($this->isVerbose());
35+
$this->dataTransformer = new DataTransformer();
3836

3937
if (Config::getOption('patternExtension') !== 'twig') {
4038
$patternEngineBasePath = PatternEngine::getInstance()->getBasePath();
4139
$patternLoaderClass = $patternEngineBasePath.'\Loaders\PatternLoader';
42-
$patternLoader = new $patternLoaderClass(array());
40+
$patternLoader = new $patternLoaderClass([]);
4341
$this->dataTransformer->run(new Renderer($patternLoader));
4442
}
4543
}
4644

4745
public function addNodeVisitor()
4846
{
49-
if (!$this->isEnabled()) {
47+
if (!DataTransformPlugin::isEnabled()) {
5048
return;
5149
}
5250

5351
$nodeVisitor = new PatternDataNodeVisitor($this->dataTransformer);
5452

5553
$env = TwigUtil::getInstance();
54+
if (DataTransformPlugin::isVerbose()) {
55+
$env = new TwigEnvironmentDecorator($env);
56+
}
5657
$env->addNodeVisitor($nodeVisitor);
5758
TwigUtil::setInstance($env);
5859

5960
$this->dataTransformer->run(new Renderer($env));
6061
}
61-
62-
protected function isEnabled()
63-
{
64-
$enabled = Config::getOption('plugins.dataTransform.enabled');
65-
$enabled = (is_null($enabled) || (bool)$enabled);
66-
67-
if ($this->isVerbose() && !$enabled) {
68-
Console::writeLine('[data transform plugin] plugin is disabled...');
69-
}
70-
71-
return $enabled;
72-
}
73-
74-
protected function isVerbose()
75-
{
76-
$verbose = Config::getOption('plugins.dataTransform.verbose');
77-
78-
return (!is_null($verbose) && (bool)$verbose);
79-
}
8062
}

src/aleksip/DataTransformPlugin/Renderer.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace aleksip\DataTransformPlugin;
44

5+
use aleksip\DataTransformPlugin\Twig\TwigEnvironmentDecorator;
6+
57
/**
68
* @author Aleksi Peebles <[email protected]>
79
*/
@@ -16,7 +18,7 @@ public function __construct($renderer)
1618

1719
public function render($pattern, $data = array())
1820
{
19-
if ($this->renderer instanceof \Twig_Environment) {
21+
if ($this->renderer instanceof \Twig_Environment || $this->renderer instanceof TwigEnvironmentDecorator) {
2022
return $this->renderer->render($pattern, $data);
2123
}
2224
else {

0 commit comments

Comments
 (0)