Skip to content

Commit 8ccec62

Browse files
committed
Added preview stuff
1 parent 08493c1 commit 8ccec62

15 files changed

Lines changed: 418 additions & 50 deletions

README.md

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1-
# Fordelingskomponent for Drupal
1+
# Fordelingskomponent for OS2Forms
22

3-
## Example keys
3+
## Installation
44

5-
| Key | Type | Provider |
6-
|-------------------------|----------------|----------|
7-
| SF2900 Certificate | Certificate | File |
8-
| SF2900 SFTP private key | Authentication | File |
5+
1. Create two keys (on `/admin/config/system/keys`)
96

10-
Note: The "SFTP private key" key must be passwordless.
7+
| Key | Type | Provider |
8+
|-------------------------|----------------|----------|
9+
| SF2900 Certificate | Certificate | File |
10+
| SF2900 SFTP private key | Authentication | File |
11+
12+
Note: The "SFTP private key" key must be passwordless.
13+
14+
2. Go to `/admin/os2forms_fordelingskomponent/settings` and configure the Fordelingskomponent module.

composer.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@
1111
],
1212
"require": {
1313
"ext-dom": "*",
14-
"drupal/webform": "^6.1",
14+
"drupal/system_stream_wrapper": "^2.1",
15+
"drupal/webform": "^6.2",
1516
"drush/drush": "^12 || ^13",
1617
"itk-dev/serviceplatformen": "dev-feature/SF2900-Fordelingskomponenten",
1718
"os2web/os2web_audit": "^1.2",
18-
"os2web/os2web_key": "^1.0",
19-
"drupal/system_stream_wrapper": "^2.1"
19+
"os2web/os2web_key": "^1.0"
2020
},
2121
"require-dev": {
2222
"drupal/coder": "^8.3",

modules/os2forms_fordelingskomponent_examples/config/install/webform.webform.os2_fdk_kp_anmoding.yml

Lines changed: 6 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -271,44 +271,18 @@ handlers:
271271
titel: "Your document"
272272
beskrivelse: "This is a very important document"
273273

274-
xml_structure:
275-
- name: Anmodning
276-
elements:
277-
- name: Header
278-
elements:
279-
- name:
280-
281-
xml_stuff:
282-
Anmodning:
283-
Header:
284-
# Static values
285-
Myndighed: "urn:oio:cvr-nr:00000000"
286-
ModtagetDato: "2006-05-04"
287-
KLE: KLE
288-
AnsoegerOplysninger:
289-
Ansoeger:
290-
# Submission values
291-
Fornavn: "[webform_submission:values:fornavn]"
292-
Efternavn: "[webform_submission:values:efternavn]"
293-
Personnummer: "[webform_submission:values:personnummer]"
294-
Sagstype:
295-
AlmindeligtHelbredstillaeg: "[webform_submission:values:almindeligthelbredstillaeg]"
296-
Underskriftsoplysninger:
297-
Underskrift: "[webform_submission:values:underskrift]"
298-
Underskriftsdato: "[webform_submission:completed:custom:Y-m-d]"
299-
300274
xml_template: |
301275
<?xml version="1.0" encoding="UTF-8"?>
302276
<Anmodning xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
303277
<Header>
304-
<Myndighed>urn:oio:cvr-nr:{{ handlers.settings.cvr }}</Myndighed>
305-
<ModtagetDato>{{ webform_submission.complete|date(Y-m-d) }}</ModtagetDato>
306-
<KLE>{{ handlers.settings.kle }}</KLE>
278+
<Myndighed>urn:oio:cvr-nr:{{ handler.settings.sf2900.cvr|default(module.settings.sf2900.sender_id|default("")) }}</Myndighed>
279+
<ModtagetDato>{{ submission.completed.value|date("Y-m-d") }}</ModtagetDato>
280+
<KLE>{{ handler.settings.sf2900.kle_emne }}</KLE>
307281
</Header>
308282
<AnsoegerOplysninger>
309283
<Ansoeger>
310-
<Fornavn>{{ webform_submission.values.fornavn }}</Fornavn>
311-
<Efternavn>{{ webform_submission.values.efternavn }}</Efternavn>
284+
<Fornavn>{{ submission.data.fornavn }}</Fornavn>
285+
<Efternavn>{{ submission.data.efternavn }}</Efternavn>
312286
<Personnummer>urn:oio:cpr:0000000000</Personnummer>
313287
</Ansoeger>
314288
</AnsoegerOplysninger>
@@ -317,7 +291,7 @@ handlers:
317291
</Sagstype>
318292
<Underskriftsoplysninger>
319293
<Underskrift>Underskrift0</Underskrift>
320-
<Underskriftsdato>{{ webform_submission.complete|date('Y-m-d') }}</Underskriftsdato>
294+
<Underskriftsdato>{{ submission.completed.value|date("Y-m-d") }}</Underskriftsdato>
321295
</Underskriftsoplysninger>
322296
</Anmodning>
323297

os2forms_fordelingskomponent.info.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,7 @@ dependencies:
99
- "os2web_audit:os2web_audit"
1010
# Why don't we get this dependency implicitly from os2web_key?
1111
- "key:key"
12+
- "system_stream_wrapper:system_stream_wrapper"
13+
- "webform:webform"
1214

1315
configure: os2forms_fordelingskomponent.admin.settings
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
/**
4+
* @file
5+
* Module file for os2forms_fordelingskomponent.
6+
*/
7+
8+
use Drupal\os2forms_fordelingskomponent\Hook\Hooks;
9+
10+
/**
11+
* Implements hook_theme().
12+
*/
13+
function os2forms_fordelingskomponent_theme(array $existing, string $type, string $theme, string $path) : array {
14+
return \Drupal::service(Hooks::class)->theme($existing, $type, $theme, $path);
15+
}

os2forms_fordelingskomponent.routing.yml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,31 @@ os2forms_fordelingskomponent.routing_info:
1717
type: "entity:webform"
1818
requirements:
1919
_permission: "administer site configuration"
20+
21+
os2forms_fordelingskomponent.fordelingskomponent_payload.preview:
22+
path: "/admin/structure/webform/manage/{webform}/os2forms_fordelingskomponent/payload/{handler}/preview"
23+
defaults:
24+
_controller: '\Drupal\os2forms_fordelingskomponent\Controller\Os2formsFordelingskomponentPayloadPreviewController'
25+
_title: "Fordelingskomponent payload preview"
26+
options:
27+
parameters:
28+
webform:
29+
type: "entity:webform"
30+
handler:
31+
type: "entity:webform_handler"
32+
requirements:
33+
_permission: "view any webform submission"
34+
35+
os2forms_fordelingskomponent.fordelingskomponent_payload.preview_render:
36+
path: "/admin/structure/webform/manage/{webform}/os2forms_fordelingskomponent/payload/{handler}/preview/render/{submission}"
37+
defaults:
38+
_controller: '\Drupal\os2forms_fordelingskomponent\Controller\Os2formsFordelingskomponentPayloadPreviewRenderController'
39+
_title: "Fordelingskomponent payload preview"
40+
options:
41+
parameters:
42+
webform:
43+
type: "entity:webform"
44+
submission:
45+
type: "entity:webform_submission"
46+
requirements:
47+
_permission: "view any webform submission"

os2forms_fordelingskomponent.services.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,7 @@ services:
1313
Drupal\os2forms_fordelingskomponent\Helper\FordelingskomponentHelper:
1414

1515
Drupal\os2forms_fordelingskomponent\Helper\WebformHelperSF2900:
16+
17+
Drupal\os2forms_fordelingskomponent\Helper\XmlHelper:
18+
19+
Drupal\os2forms_fordelingskomponent\Hook\Hooks:
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Drupal\os2forms_fordelingskomponent\Controller;
6+
7+
use Drupal\Core\Controller\ControllerBase;
8+
use Drupal\Core\Entity\EntityTypeManagerInterface;
9+
use Drupal\Core\Url;
10+
use Drupal\webform\WebformInterface;
11+
use Drupal\webform\WebformSubmissionStorageInterface;
12+
use Symfony\Component\HttpFoundation\Request;
13+
use Symfony\Component\HttpFoundation\Response;
14+
15+
/**
16+
* Returns responses for Fordelingskomponent routes.
17+
*/
18+
final class Os2formsFordelingskomponentPayloadPreviewController extends ControllerBase {
19+
20+
/**
21+
* The webform submission storage.
22+
*/
23+
private WebformSubmissionStorageInterface $submissionStorage;
24+
25+
public function __construct(
26+
EntityTypeManagerInterface $entityTypeManager,
27+
) {
28+
$this->submissionStorage = $entityTypeManager->getStorage('webform_submission');
29+
}
30+
31+
/**
32+
* Builds the response.
33+
*/
34+
public function __invoke(Request $request, WebformInterface $webform, string $handler): array|Response {
35+
$handler = $webform->getHandler($handler);
36+
$submissionIds = array_keys($this->submissionStorage->getQuery()
37+
->accessCheck()
38+
->condition('webform_id', $webform->id())
39+
->sort('created', 'DESC')
40+
->execute());
41+
$currentSubmission = (int) $request->query->get('submission');
42+
$index = array_search($currentSubmission, $submissionIds);
43+
if (FALSE === $index) {
44+
$currentSubmission = reset($submissionIds) ?: NULL;
45+
$index = array_search($currentSubmission, $submissionIds);
46+
}
47+
48+
$previewUrls = array_map(
49+
static fn($submission) => Url::fromRoute('os2forms_fordelingskomponent.fordelingskomponent_payload.preview', [
50+
'webform' => $webform->id(),
51+
'handler' => $handler->getHandlerId(),
52+
'submission' => $submission,
53+
]),
54+
array_filter([
55+
'prev' => $submissionIds[$index + 1] ?? NULL,
56+
'self' => $currentSubmission,
57+
'next' => $submissionIds[$index - 1] ?? NULL,
58+
])
59+
);
60+
61+
$renderUrl = NULL !== $currentSubmission
62+
? Url::fromRoute('os2forms_fordelingskomponent.fordelingskomponent_payload.preview_render', [
63+
'webform' => $webform->id(),
64+
'handler' => $handler->getHandlerId(),
65+
'submission' => $currentSubmission,
66+
])
67+
: NULL;
68+
69+
return [
70+
'#theme' => 'os2forms_fordelingskomponent_payload_preview',
71+
'#webform' => $webform,
72+
'#handler' => $handler,
73+
'#submission' => $currentSubmission,
74+
'#return_url' => $webform->toUrl('handlers'),
75+
'#render_url' => $renderUrl,
76+
'#preview_urls' => $previewUrls,
77+
];
78+
79+
}
80+
81+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Drupal\os2forms_fordelingskomponent\Controller;
6+
7+
use Drupal\Core\Controller\ControllerBase;
8+
use Drupal\Core\Render\RendererInterface;
9+
use Drupal\os2forms_fordelingskomponent\Exception\Exception;
10+
use Drupal\os2forms_fordelingskomponent\Helper\XmlHelper;
11+
use Drupal\webform\WebformInterface;
12+
use Drupal\webform\WebformSubmissionInterface;
13+
use Symfony\Component\HttpFoundation\Response;
14+
15+
/**
16+
* Returns responses for Fordelingskomponent routes.
17+
*/
18+
final class Os2formsFordelingskomponentPayloadPreviewRenderController extends ControllerBase {
19+
20+
public function __construct(
21+
private readonly XmlHelper $xmlHelper,
22+
private readonly RendererInterface $renderer,
23+
) {
24+
}
25+
26+
/**
27+
* Builds the response.
28+
*/
29+
public function __invoke(WebformInterface $webform, string $handler, WebformSubmissionInterface $submission): Response {
30+
$handler = $webform->getHandler($handler);
31+
$handlerSettings = $handler->getSetting('sf2900');
32+
33+
$exceptions = [];
34+
$warnings = [];
35+
36+
$template = $handlerSettings['xml_template'] ?? NULL;
37+
if (NULL === $template) {
38+
// @todo Handle this
39+
}
40+
41+
/** @var ?string $xml */
42+
$xml = NULL;
43+
try {
44+
$context = $this->xmlHelper->getRenderContext($handler, $submission);
45+
$xml = $this->xmlHelper->render($template, $context);
46+
47+
$this->xmlHelper->validateXml($xml);
48+
49+
$xsdUrl = $handlerSettings['xsd_url'] ?? NULL;
50+
if (NULL === $xsdUrl) {
51+
$warnings[] = new \RuntimeException('XSD URL not defined');
52+
}
53+
else {
54+
$this->xmlHelper->validateXml($xml, $xsdUrl, loadXsdContent: TRUE);
55+
}
56+
}
57+
catch (Exception $e) {
58+
$exceptions[] = $e;
59+
}
60+
61+
$build = [
62+
'#theme' => 'os2forms_fordelingskomponent_payload_preview_render_xml',
63+
'#webform' => $webform,
64+
'#handler' => $handler,
65+
'#submission' => $submission,
66+
'#exceptions' => $exceptions,
67+
'#warnings' => $warnings,
68+
'#template' => $template,
69+
'#context' => $context,
70+
'#xml' => $xml ?? NULL,
71+
];
72+
73+
return new Response((string) $this->renderer->renderRoot($build));
74+
}
75+
76+
}

src/Exception/RuntimeException.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@
55
/**
66
* Base RuntimeException for module.
77
*/
8-
class RuntimeException extends \RuntimeException {
8+
class RuntimeException extends Exception {
99

1010
}

0 commit comments

Comments
 (0)