Skip to content

Commit

Permalink
Refactor HtmlMailRenderer
Browse files Browse the repository at this point in the history
  • Loading branch information
mariusklocke committed Jan 15, 2025
1 parent b217d26 commit 28bc866
Showing 1 changed file with 32 additions and 21 deletions.
53 changes: 32 additions & 21 deletions src/Application/Email/HtmlMailRenderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -60,33 +60,30 @@ public function render(array $data): string
{
$document = new DOMDocument();

// Add DOCTYPE declaration for HTML5
// <?DOCTYPE html>
$document->insertBefore($document->createProcessingInstruction('DOCTYPE', 'html'), $document->firstChild);

// <html>
$html = $this->addElement($document, $document, 'html');

$this->addHeadElement($document, $html, $data);
$this->addBodyElement($document, $html, $data);

return $document->saveHTML();
}

private function addHeadElement(DOMDocument $document, DOMNode $parent, array $data): DOMElement
{
$head = $this->addElement($document, $parent, 'head');

// <head>
$head = $this->addElement($document, $document, 'head');
$this->addElement($document, $head, 'meta', ['charset' => 'UTF-8']);
$this->addElement($document, $head, 'meta', ['name' => 'viewport', 'value' => 'width=device-width, initial-scale=1.0']);
$this->addElement($document, $head, 'title', [], $data['title']);

return $head;
// <body>
$body = $this->addElement($document, $html, 'body');
$container = $this->addContainer($document, $body);
$this->addHeader($document, $container, $data);
$this->addContent($document, $container, $data);
$this->addFooter($document, $container, $data);

return $document->saveHTML();
}

private function addBodyElement(DOMDocument $document, DOMNode $parent, array $data): DOMElement
private function addContainer(DOMDocument $document, DOMNode $body): DOMElement
{
$body = $this->addElement($document, $parent, 'body');

// Table + Container
$table = $this->addElement($document, $body, 'table', [
'role' => 'presentation',
'width' => '100%',
Expand All @@ -96,31 +93,45 @@ private function addBodyElement(DOMDocument $document, DOMNode $parent, array $d
]);
$tableRow = $this->addElement($document, $table, 'tr');
$tableCol = $this->addElement($document, $tableRow, 'td', ['align' => 'center']);
$container = $this->addElement($document, $tableCol, 'div', ['class' => 'container']);

return $this->addElement($document, $tableCol, 'div', ['class' => 'container']);
}

// Header
private function addHeader(DOMDocument $document, DOMNode $container, array $data): DOMElement
{
$header = $this->addElement($document, $container, 'div', ['class' => 'header']);

$this->addElement($document, $header, 'img', [
'src' => 'https://www.wildeligabremen.de/wp-content/uploads/2023/05/cropped-Logo-mit-Schrift_30-Jahre-Kopie_2-e1683381765583.jpg',
'alt' => 'Wilde Liga Bremen'
]);

// Content
return $header;
}

private function addContent(DOMDocument $document, DOMNode $container, array $data): DOMElement
{
$content = $this->addElement($document, $container, 'div', ['class' => 'content']);

$this->addElement($document, $content, 'h1', [], $data['title']);
$this->addElement($document, $content, 'p', [], $data['content']['text']);
$this->addElement($document, $content, 'a', [
'class' => 'cta-button',
'href' => $data['content']['action']['href']
], $data['content']['action']['label']);

// Footer
return $content;
}

private function addFooter(DOMDocument $document, DOMNode $container, array $data): DOMElement
{
$footer = $this->addElement($document, $container, 'div', ['class' => 'footer']);

foreach ($data['footer']['hints'] as $hint) {
$this->addElement($document, $footer, 'p', [], $hint);
}

return $body;
return $footer;
}

private function addElement(DOMDocument $document, DOMNode $parent, string $tag, array $attributes = [], ?string $text = null): DOMElement
Expand Down

0 comments on commit 28bc866

Please sign in to comment.