Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions docs/Layout/errorPage.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ symfony console importmap:require "@enabel/enabel-bootstrap-theme/dist/css/error

If you serve the theme through a different path, override the `stylesheet` parameter (see below).

> [!NOTE]
> The default `symbol` and `logo` ship as `data:` URIs embedded in the component — the consuming app does not need to provide any image asset. To use a custom logo, pass a path (resolved through `asset()`) or your own `data:` URI; the template detects the prefix automatically.

## Parameters

| Parameter | Type | Description | Default |
Expand All @@ -26,8 +29,8 @@ If you serve the theme through a different path, override the `stylesheet` param
| `details` | `?string` | Optional small print (trace IDs, technical details) | `null` |
| `backUrl` | `?string` | URL of the "back home" button. Button is hidden when `null` | `null` |
| `backLabel` | `string` | Label of the "back home" button | `'Back to homepage'` |
| `symbol` | `string` | Path to the watermark image (`.bg img`) | `'/images/enabel-symbol.png'` |
| `logo` | `string` | Path to the bottom logo (`.logo img`) | `'/images/enabel-logo-email.png'` |
| `symbol` | `string` | Watermark image. Accepts a `data:` URI (rendered as-is) or an asset path passed to `asset()` | Enabel mark embedded as `data:image/svg+xml;base64,…` |
| `logo` | `string` | Bottom logo. Same `data:` vs asset path resolution as `symbol` | Enabel logo embedded as `data:image/png;base64,…` |
| `locale` | `string` | Value used for `<html lang>` | `'en'` |
| `appName` | `string` | Application name used in the `<title>` tag and logo `alt` | `'Enabel'` |
| `stylesheet` | `string` | Path passed to `asset()` for the error CSS | `'vendor/@enabel/enabel-bootstrap-theme/dist/css/error.min.css'` |
Expand All @@ -45,6 +48,19 @@ If you serve the theme through a different path, override the `stylesheet` param
}) }}
```

### With a custom logo (asset path)

```twig
{# templates/bundles/TwigBundle/Exception/error404.html.twig #}
{{ component('Enabel:Ux:ErrorPage', {
statusCode: 404,
title: 'app.error.404.title'|trans,
message: 'app.error.404.message'|trans,
symbol: '/images/my-symbol.png',
logo: '/images/my-logo.png',
}) }}
```

### With back button and localized labels

```twig
Expand Down
1 change: 1 addition & 0 deletions src/Component/Layout/Defaults/error_page_logo.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAAAyCAYAAAC+jCIaAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFDGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMi0wOS0zMFQxMjozMiswMjowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjItMDktMzBUMTI6MzQ6NDUrMDI6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjItMDktMzBUMTI6MzQ6NDUrMDI6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzA4ZDEwMzMtYmFkYS0wMDQxLWEw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
1 change: 1 addition & 0 deletions src/Component/Layout/Defaults/error_page_symbol.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDIwMDEwOTA0Ly9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy1TVkctMjAwMTA5MDQvRFREL3N2ZzEwLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiB3aWR0aD0iMjAwLjAwMDAwMHB0IiBoZWlnaHQ9IjIwMC4wMDAwMDBwdCIgdmlld0JveD0iMCAwIDIwMC4wMDAwMDAgMjAwLjAwMDAwMCIKIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIG1lZXQiPgo8bWV0YWRhdGE+CkNyZWF0ZWQgYnkgcG90cmFjZSAxLjE0LCB3cml0dGVuIGJ5IFBldGVyIFNlbGluZ2VyIDIwMDEtMjAxNwo8L21ldGFkYXRhPgo8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjAwMDAwMCwyMDAuMDAwMDAwKSBzY2FsZSgwLjEwMDAwMCwtMC4xMDAwMDApIgpmaWxsPSIjMDAwMDAwIiBzdHJva2U9Im5vbmUiPgo8cGF0aCBkPSJNNTE4IDE1NzQgYy01MiAtMTIgLTE1OCAtNTggLTE1OCAtNjggMCAtMiA0NCAtMjggOTcgLTU2IDE4NCAtOTgKMzI1IC0yMjAgNDE0IC0zNTggbDQ3IC03MyAxMiA2OCBjMTggOTIgNDMgMTYzIDg5IDI0OSBsMzkgNzIgLTIxIDIwIGMtMzMgMzAKLTEyNiA4NiAtMTg0IDExMCAtMTE5IDUwIC0yMjkgNjIgLTMzNSAzNnoiLz4KPHBhdGggZD0iTTEzMjQgMTUyNiBjLTEwOCAtMzUgLTIyMiAtMTU0IC0yNzUgLTI4NyAtMzQgLTg2IC00NiAtMTMyIC04OSAtMzQ5Ci0yMyAtMTEzIC01MyAtMjM4IC02NiAtMjc5IC0xNCAtNDAgLTIzIC03NiAtMjAgLTc4IDMgLTMgNDcgMTUgOTkgNDAgMjUwIDExOAozNDAgMjI3IDQ0OCA1NDIgMjcgODEgNTcgMTYxIDY1IDE3OCAyOSA1NyA4NiAxMjcgMTIyIDE1MiBsMzYgMjQgLTY5IDMyIGMtNzkKMzcgLTE4MyA0OCAtMjUxIDI1eiIvPgo8cGF0aCBkPSJNNDY0IDY4NSBjLTI1IC0zOCAtOTQgLTIwMyAtOTQgLTIyNSAwIC0yMiA0NCAtMzggMTMxIC00NyAxMDcgLTExCjIzNSA0OCAyODkgMTMzIDI5IDQ2IDY2IDE0MSA1OCAxNDkgLTIgMiAtMjggLTIgLTU4IC0xMCAtNzUgLTIwIC0xMzMgLTE5Ci0yMjUgNSAtNDMgMTEgLTgwIDIwIC04MSAyMCAtMiAwIC0xMSAtMTEgLTIwIC0yNXoiLz4KPC9nPgo8L3N2Zz4K
17 changes: 15 additions & 2 deletions src/Component/Layout/ErrorPage.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@

class ErrorPage
{
private static ?string $defaultLogo = null;
private static ?string $defaultSymbol = null;

public int $statusCode;
public string $title;
public string $message;
Expand Down Expand Up @@ -48,8 +51,8 @@ public function configureOptions(OptionsResolver $resolver): void
'details' => null,
'backUrl' => null,
'backLabel' => 'Back to homepage',
'symbol' => '/images/enabel-symbol.png',
'logo' => '/images/enabel-logo-email.png',
'symbol' => self::defaultSymbol(),
'logo' => self::defaultLogo(),
'locale' => 'en',
'appName' => 'Enabel',
'stylesheet' => 'vendor/@enabel/enabel-bootstrap-theme/dist/css/error.min.css',
Expand All @@ -67,4 +70,14 @@ public function configureOptions(OptionsResolver $resolver): void
$resolver->setAllowedTypes('appName', 'string');
$resolver->setAllowedTypes('stylesheet', 'string');
}

private static function defaultLogo(): string
{
return self::$defaultLogo ??= trim((string) file_get_contents(__DIR__.'/Defaults/error_page_logo.txt'));
}

private static function defaultSymbol(): string
{
return self::$defaultSymbol ??= trim((string) file_get_contents(__DIR__.'/Defaults/error_page_symbol.txt'));
}
}
4 changes: 2 additions & 2 deletions templates/layout/error_page.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@
<link rel="stylesheet" href="{{ asset(stylesheet) }}">
</head>
<body>
<div class="bg"><img src="{{ asset(symbol) }}" alt=""></div>
<div class="bg"><img src="{{ symbol starts with 'data:' ? symbol : asset(symbol) }}" alt=""></div>
<div id="error">
<div class="error">
<div class="code-error"><h1>{{ statusCode }}</h1></div>
<h2>{{ title }}</h2>
<p>{{ message }}</p>
{% if backUrl %}<a href="{{ backUrl }}">{{ backLabel }}</a>{% endif %}
{% if details %}<small>{{ details }}</small>{% endif %}
<img class="logo" src="{{ asset(logo) }}" alt="{{ appName }}">
<img class="logo" src="{{ logo starts with 'data:' ? logo : asset(logo) }}" alt="{{ appName }}">
</div>
</div>
</body>
Expand Down
19 changes: 17 additions & 2 deletions tests/Component/Layout/ErrorPageTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ public function testComponentCanBeInstantiatedWithRequiredParameters(): void
$this->assertNull($component->details);
$this->assertNull($component->backUrl);
$this->assertSame('Back to homepage', $component->backLabel);
$this->assertSame('/images/enabel-symbol.png', $component->symbol);
$this->assertSame('/images/enabel-logo-email.png', $component->logo);
$this->assertStringStartsWith('data:image/svg+xml;base64,', $component->symbol);
$this->assertStringStartsWith('data:image/png;base64,', $component->logo);
$this->assertSame('en', $component->locale);
$this->assertSame('Enabel', $component->appName);
$this->assertSame('vendor/@enabel/enabel-bootstrap-theme/dist/css/error.min.css', $component->stylesheet);
Expand Down Expand Up @@ -154,6 +154,21 @@ public function testInvalidBackUrlTypeThrows(): void
]);
}

public function testCustomSymbolAndLogoPathsOverrideDataUriDefaults(): void
{
$component = new ErrorPage();
$data = $component->preMount([
'statusCode' => 404,
'title' => 'Not Found',
'message' => 'Missing',
'symbol' => '/images/custom-symbol.png',
'logo' => '/images/custom-logo.png',
]);

$this->assertSame('/images/custom-symbol.png', $data['symbol']);
$this->assertSame('/images/custom-logo.png', $data['logo']);
}

public function testPreMountPreservesAdditionalData(): void
{
$component = new ErrorPage();
Expand Down
Loading