<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.stephanschlegel.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=84.136.109.36</id>
	<title>Wikizone - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.stephanschlegel.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=84.136.109.36"/>
	<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Spezial:Beitr%C3%A4ge/84.136.109.36"/>
	<updated>2026-05-06T22:40:20Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Front_Page_Editing&amp;diff=25279</id>
		<title>ProcessWire - Front Page Editing</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Front_Page_Editing&amp;diff=25279"/>
		<updated>2021-02-13T10:33:47Z</updated>

		<summary type="html">&lt;p&gt;84.136.109.36: /* Front Page Editing in Repeatern */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Front End Page Editor == &lt;br /&gt;
https://processwire.com/docs/front-end/front-end-editing/&lt;br /&gt;
&lt;br /&gt;
* Mehrere Optionen (im Backend auswählen)&lt;br /&gt;
* Option A -&amp;gt; Automatisch&lt;br /&gt;
** Kann verwendet werden wenn ein Feld nur einmal auf einer Seite verwendet wird.&lt;br /&gt;
* Option B -&amp;gt; API Method Call&lt;br /&gt;
** Geeignet für text fields, number fields, dates...&lt;br /&gt;
** Nicht geeignet für Files/Images, PageTables, Repeaters or andere Felder über die man iteriert&lt;br /&gt;
** Statt get einfach edit nehmen&lt;br /&gt;
 &amp;lt;?php echo $page-&amp;gt;edit(&amp;#039;body&amp;#039;); ?&amp;gt;&lt;br /&gt;
* Option C -&amp;gt; HTML Edit Tags&lt;br /&gt;
** Anhand &amp;#039;&amp;#039;&amp;lt;edit [feldname]&amp;gt;...&amp;lt;/edit&amp;gt;&amp;#039;&amp;#039;  findet PW die Felder&lt;br /&gt;
** Für Repeater geeignet&lt;br /&gt;
** Unterstüzt Inline Editor, wenn das Feld es unterstützt&lt;br /&gt;
&lt;br /&gt;
* Option D -&amp;gt; HTML Edit Attributes&lt;br /&gt;
** Gleiche Funktionalität wie Tags&lt;br /&gt;
** edit Attribut für div, span, ... statt eigenständiges Tag&lt;br /&gt;
** always uses the dialog editor and does not use the inline editor.&lt;br /&gt;
 &amp;lt;div edit=&amp;quot;events&amp;quot;&amp;gt;...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
* PageFrontEdit Modul installieren (Core)&lt;br /&gt;
* Für Option A Checkboxen anhaken&lt;br /&gt;
* Für Option B-C Templates berarbeiten.&lt;br /&gt;
== Options in Detail ==&lt;br /&gt;
=== Option A ===&lt;br /&gt;
Einfach im Backend anhaken&lt;br /&gt;
&lt;br /&gt;
=== Option B ===&lt;br /&gt;
Statt&lt;br /&gt;
 $page-&amp;gt;get(&amp;#039;field_name&amp;#039;);&lt;br /&gt;
 $page-&amp;gt;edit(&amp;#039;field_name&amp;#039;);&lt;br /&gt;
Beispiel &lt;br /&gt;
 &amp;lt;?php echo $page-&amp;gt;edit(&amp;#039;body&amp;#039;); ?&amp;gt;&lt;br /&gt;
=== Option C ===&lt;br /&gt;
&lt;br /&gt;
Beispiel Image Feld &amp;#039;photo&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;edit photo&amp;gt;&lt;br /&gt;
  &amp;lt;img src=&amp;quot;&amp;lt;?=$page-&amp;gt;image-&amp;gt;url?&amp;gt;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/edit&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel Repeater, PageTable oder Table Field&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;edit events&amp;gt;&lt;br /&gt;
  &amp;lt;?php foreach($page-&amp;gt;events as $event): ?&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;event&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;h3&amp;gt;&amp;lt;?=$event-&amp;gt;title?&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
      &amp;lt;p class=&amp;quot;date&amp;quot;&amp;gt;&amp;lt;?=$event-&amp;gt;date?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;&amp;lt;?=$event-&amp;gt;summary?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&amp;lt;/edit&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beschreibung von Ryan:&lt;br /&gt;
&lt;br /&gt;
By the way, you can also use some more verbose but alternate syntax for the &amp;lt;edit&amp;gt; tags if you prefer. If your editor does syntax highlighting with your HTML, it may be more consistent (the &amp;quot;quotes&amp;quot; are optional of course):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;edit field=&amp;quot;events&amp;quot;&amp;gt; ... &amp;lt;/edit&amp;gt;&lt;br /&gt;
If your editable region contains multiple fields you want to be edited together, you can specify more than one:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;edit field=&amp;quot;intro,image,events&amp;quot;&amp;gt; ... &amp;lt;/edit&amp;gt;&lt;br /&gt;
If your field happens to be on some other page other than the one being rendered, you can also specify what page you want to be edited:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;edit field=&amp;quot;events&amp;quot; page=&amp;quot;1001&amp;quot;&amp;gt; ... &amp;lt;/edit&amp;gt;&lt;br /&gt;
The 1001 can be any page ID or path. The above can also be shortened to this if you prefer:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;edit field=&amp;quot;1001.events&amp;quot;&amp;gt; ... &amp;lt;/edit&amp;gt;&lt;br /&gt;
Or this:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;edit 1001.events&amp;gt; ... &amp;lt;/edit&amp;gt;&lt;br /&gt;
If you are using &amp;lt;edit&amp;gt; tags with a field that supports inline editing (like a text or CKEditor field), the inline editor will be used. Otherwise it will open a dialog to the editor.&lt;br /&gt;
&lt;br /&gt;
=== Option D ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div edit=&amp;quot;events&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- code to output events --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or to specify a field from some other page (1001):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div edit=&amp;quot;1001.events&amp;quot;&amp;gt; ... &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or to specify multiple fields:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div edit=&amp;quot;intro,image,events&amp;quot;&amp;gt; ... &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The &amp;quot;edit&amp;quot; attributes are stripped from the markup that gets output, so the only place you will see them is where you place them in your template file(s).&lt;br /&gt;
&lt;br /&gt;
Worth noting about &amp;#039;&amp;#039;&amp;#039;option D&amp;#039;&amp;#039;&amp;#039; is that it &amp;#039;&amp;#039;&amp;#039;always uses the dialog editor&amp;#039;&amp;#039;&amp;#039; and does not use the inline editor.&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Front Page Editing in Repeatern ===&lt;br /&gt;
Der Editor zeigt keinen Inhalt. Bei Superadmins funktioniert es aber.&lt;br /&gt;
 https://processwire.com/talk/topic/15357-solved-frontend-edit-on-repeater-fields/&lt;br /&gt;
 https://github.com/processwire/processwire-issues/issues/183&lt;br /&gt;
Lösung: Mit Option C funktioniert es, wenn man noch das page-Attribut mit reinnimmt. Im page Attribut gibt man den Repeater an.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($page-&amp;gt;repeater_field as $item) {&lt;br /&gt;
  echo &amp;quot;&amp;lt;h3&amp;gt;&amp;lt;edit field=&amp;#039;title&amp;#039; page=&amp;#039;$item&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/edit&amp;gt;&amp;lt;/h3&amp;gt;&amp;quot;;&lt;br /&gt;
  echo &amp;quot;&amp;lt;edit field=&amp;#039;body&amp;#039; page=&amp;#039;$item&amp;#039;&amp;gt;$item-&amp;gt;body&amp;lt;/edit&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manchmal auch praktisch wenn man mit fields arbeitet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Body&lt;br /&gt;
if($page-&amp;gt;body){&lt;br /&gt;
  $bodyMarkup = &amp;quot;&amp;lt;edit field=\&amp;quot;body\&amp;quot; page=\&amp;quot;$page\&amp;quot;&amp;gt;$page-&amp;gt;body&amp;lt;/edit&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Noch ein Kopierschnipsel:&lt;br /&gt;
 &amp;lt;edit field=&amp;quot;body&amp;quot; page=&amp;quot;&amp;#039;.$page.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$page-&amp;gt;body.&amp;#039;&amp;lt;/edit&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.136.109.36</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Front_Page_Editing&amp;diff=25278</id>
		<title>ProcessWire - Front Page Editing</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Front_Page_Editing&amp;diff=25278"/>
		<updated>2021-02-13T10:29:14Z</updated>

		<summary type="html">&lt;p&gt;84.136.109.36: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Front End Page Editor == &lt;br /&gt;
https://processwire.com/docs/front-end/front-end-editing/&lt;br /&gt;
&lt;br /&gt;
* Mehrere Optionen (im Backend auswählen)&lt;br /&gt;
* Option A -&amp;gt; Automatisch&lt;br /&gt;
** Kann verwendet werden wenn ein Feld nur einmal auf einer Seite verwendet wird.&lt;br /&gt;
* Option B -&amp;gt; API Method Call&lt;br /&gt;
** Geeignet für text fields, number fields, dates...&lt;br /&gt;
** Nicht geeignet für Files/Images, PageTables, Repeaters or andere Felder über die man iteriert&lt;br /&gt;
** Statt get einfach edit nehmen&lt;br /&gt;
 &amp;lt;?php echo $page-&amp;gt;edit(&amp;#039;body&amp;#039;); ?&amp;gt;&lt;br /&gt;
* Option C -&amp;gt; HTML Edit Tags&lt;br /&gt;
** Anhand &amp;#039;&amp;#039;&amp;lt;edit [feldname]&amp;gt;...&amp;lt;/edit&amp;gt;&amp;#039;&amp;#039;  findet PW die Felder&lt;br /&gt;
** Für Repeater geeignet&lt;br /&gt;
** Unterstüzt Inline Editor, wenn das Feld es unterstützt&lt;br /&gt;
&lt;br /&gt;
* Option D -&amp;gt; HTML Edit Attributes&lt;br /&gt;
** Gleiche Funktionalität wie Tags&lt;br /&gt;
** edit Attribut für div, span, ... statt eigenständiges Tag&lt;br /&gt;
** always uses the dialog editor and does not use the inline editor.&lt;br /&gt;
 &amp;lt;div edit=&amp;quot;events&amp;quot;&amp;gt;...&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
* PageFrontEdit Modul installieren (Core)&lt;br /&gt;
* Für Option A Checkboxen anhaken&lt;br /&gt;
* Für Option B-C Templates berarbeiten.&lt;br /&gt;
== Options in Detail ==&lt;br /&gt;
=== Option A ===&lt;br /&gt;
Einfach im Backend anhaken&lt;br /&gt;
&lt;br /&gt;
=== Option B ===&lt;br /&gt;
Statt&lt;br /&gt;
 $page-&amp;gt;get(&amp;#039;field_name&amp;#039;);&lt;br /&gt;
 $page-&amp;gt;edit(&amp;#039;field_name&amp;#039;);&lt;br /&gt;
Beispiel &lt;br /&gt;
 &amp;lt;?php echo $page-&amp;gt;edit(&amp;#039;body&amp;#039;); ?&amp;gt;&lt;br /&gt;
=== Option C ===&lt;br /&gt;
&lt;br /&gt;
Beispiel Image Feld &amp;#039;photo&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;edit photo&amp;gt;&lt;br /&gt;
  &amp;lt;img src=&amp;quot;&amp;lt;?=$page-&amp;gt;image-&amp;gt;url?&amp;gt;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/edit&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel Repeater, PageTable oder Table Field&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;edit events&amp;gt;&lt;br /&gt;
  &amp;lt;?php foreach($page-&amp;gt;events as $event): ?&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;event&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;h3&amp;gt;&amp;lt;?=$event-&amp;gt;title?&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
      &amp;lt;p class=&amp;quot;date&amp;quot;&amp;gt;&amp;lt;?=$event-&amp;gt;date?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;&amp;lt;?=$event-&amp;gt;summary?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&amp;lt;/edit&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beschreibung von Ryan:&lt;br /&gt;
&lt;br /&gt;
By the way, you can also use some more verbose but alternate syntax for the &amp;lt;edit&amp;gt; tags if you prefer. If your editor does syntax highlighting with your HTML, it may be more consistent (the &amp;quot;quotes&amp;quot; are optional of course):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;edit field=&amp;quot;events&amp;quot;&amp;gt; ... &amp;lt;/edit&amp;gt;&lt;br /&gt;
If your editable region contains multiple fields you want to be edited together, you can specify more than one:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;edit field=&amp;quot;intro,image,events&amp;quot;&amp;gt; ... &amp;lt;/edit&amp;gt;&lt;br /&gt;
If your field happens to be on some other page other than the one being rendered, you can also specify what page you want to be edited:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;edit field=&amp;quot;events&amp;quot; page=&amp;quot;1001&amp;quot;&amp;gt; ... &amp;lt;/edit&amp;gt;&lt;br /&gt;
The 1001 can be any page ID or path. The above can also be shortened to this if you prefer:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;edit field=&amp;quot;1001.events&amp;quot;&amp;gt; ... &amp;lt;/edit&amp;gt;&lt;br /&gt;
Or this:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;edit 1001.events&amp;gt; ... &amp;lt;/edit&amp;gt;&lt;br /&gt;
If you are using &amp;lt;edit&amp;gt; tags with a field that supports inline editing (like a text or CKEditor field), the inline editor will be used. Otherwise it will open a dialog to the editor.&lt;br /&gt;
&lt;br /&gt;
=== Option D ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div edit=&amp;quot;events&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- code to output events --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or to specify a field from some other page (1001):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div edit=&amp;quot;1001.events&amp;quot;&amp;gt; ... &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or to specify multiple fields:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div edit=&amp;quot;intro,image,events&amp;quot;&amp;gt; ... &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The &amp;quot;edit&amp;quot; attributes are stripped from the markup that gets output, so the only place you will see them is where you place them in your template file(s).&lt;br /&gt;
&lt;br /&gt;
Worth noting about &amp;#039;&amp;#039;&amp;#039;option D&amp;#039;&amp;#039;&amp;#039; is that it &amp;#039;&amp;#039;&amp;#039;always uses the dialog editor&amp;#039;&amp;#039;&amp;#039; and does not use the inline editor.&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Front Page Editing in Repeatern ===&lt;br /&gt;
Der Editor zeigt keinen Inhalt. Bei Superadmins funktioniert es aber.&lt;br /&gt;
 https://processwire.com/talk/topic/15357-solved-frontend-edit-on-repeater-fields/&lt;br /&gt;
 https://github.com/processwire/processwire-issues/issues/183&lt;br /&gt;
Lösung: Mit Option C funktioniert es, wenn man noch das page-Attribut mit reinnimmt. Im page Attribut gibt man den Repeater an.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($page-&amp;gt;repeater_field as $item) {&lt;br /&gt;
  echo &amp;quot;&amp;lt;h3&amp;gt;&amp;lt;edit field=&amp;#039;title&amp;#039; page=&amp;#039;$item&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/edit&amp;gt;&amp;lt;/h3&amp;gt;&amp;quot;;&lt;br /&gt;
  echo &amp;quot;&amp;lt;edit field=&amp;#039;body&amp;#039; page=&amp;#039;$item&amp;#039;&amp;gt;$item-&amp;gt;body&amp;lt;/edit&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manchmal auch praktisch wenn man mit fields arbeitet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Body&lt;br /&gt;
if($page-&amp;gt;body){&lt;br /&gt;
  $bodyMarkup = &amp;quot;&amp;lt;edit field=\&amp;quot;body\&amp;quot; page=\&amp;quot;$page\&amp;quot;&amp;gt;$page-&amp;gt;body&amp;lt;/edit&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.136.109.36</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Visual_Code_Studio&amp;diff=25273</id>
		<title>Visual Code Studio</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Visual_Code_Studio&amp;diff=25273"/>
		<updated>2021-02-08T09:41:56Z</updated>

		<summary type="html">&lt;p&gt;84.136.109.36: /* Nützliche Extensions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Guter freier Editor von Microsoft. Auch für Linux und Mac verfügbar.&lt;br /&gt;
 https://code.visualstudio.com/docs/?dv=osx (Docs für Mac)&lt;br /&gt;
&lt;br /&gt;
== VCS Shortcuts ==&lt;br /&gt;
&lt;br /&gt;
=== Formatieren ===&lt;br /&gt;
Kontextmenü oder&lt;br /&gt;
 Cmd K F -&amp;gt; Auswahl formatieren&lt;br /&gt;
 Shift Alt F -&amp;gt; alles formatieren&lt;br /&gt;
&lt;br /&gt;
=== Kommentieren ===&lt;br /&gt;
&lt;br /&gt;
=== Auswahl ===&lt;br /&gt;
MMB - Drag Select (beliebiger Block)&lt;br /&gt;
=== Multiline Cursor ===&lt;br /&gt;
 Alt + Click -&amp;gt; zusätzlicher Cursor&lt;br /&gt;
 Alt + Cmd + Pfeil -&amp;gt; oben oder unten zusätzlicher Cursor&lt;br /&gt;
 Shift + Alt + Cmd + Pfeil -&amp;gt; Multicursor Auswahl&lt;br /&gt;
&lt;br /&gt;
=== Komplette Zeilen bearbeiten (Copy, Move, Delete) ===&lt;br /&gt;
 Alt + Pfeil -&amp;gt; move line&lt;br /&gt;
 Alt + Cmd + Pfeil -&amp;gt; copy line&lt;br /&gt;
 Shift + Cmd + K -&amp;gt; delete line&lt;br /&gt;
&lt;br /&gt;
=== Refactoring ===&lt;br /&gt;
 F2&lt;br /&gt;
&lt;br /&gt;
=== Fehlermeldungen ===&lt;br /&gt;
 F8 -&amp;gt; cycle durch Fehlermeldungen&lt;br /&gt;
&lt;br /&gt;
== Tipparbeit mit Emmet sparen ==&lt;br /&gt;
 https://docs.emmet.io/cheatsheet-a5.pdf&lt;br /&gt;
 https://docs.emmet.io/cheat-sheet/&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Child: &amp;gt; &lt;br /&gt;
 nav&amp;gt;ul&amp;gt;li   &lt;br /&gt;
&lt;br /&gt;
Sibling: +&lt;br /&gt;
 div+p+bq&lt;br /&gt;
&lt;br /&gt;
Climb-up: ^&lt;br /&gt;
 div+div&amp;gt;p&amp;gt;span+em^bq (Bei Blockquote gehts wieder eine Ebene zurück)&lt;br /&gt;
&lt;br /&gt;
Grouping: ()&lt;br /&gt;
 (div&amp;gt;dl&amp;gt;(dt+dd)*3)+footer&amp;gt;p&lt;br /&gt;
&lt;br /&gt;
Multiplication: * &lt;br /&gt;
 ul&amp;gt;li*5 // 5 li Elemente&lt;br /&gt;
&lt;br /&gt;
Naming and numbering: $&lt;br /&gt;
 ul&amp;gt;li.sample$*5 // li mit class: sample1, sample2...&lt;br /&gt;
&lt;br /&gt;
 h$[title=topic$]{Headline $}*3   &lt;br /&gt;
 &amp;lt;h1 title=&amp;quot;topic1&amp;quot;&amp;gt;Headline 1&amp;lt;/h1&amp;gt;   &lt;br /&gt;
 &amp;lt;h2 title=&amp;quot;topic2&amp;quot;&amp;gt;Headline 2&amp;lt;/h2&amp;gt;   &lt;br /&gt;
 &amp;lt;h3 title=&amp;quot;topic3&amp;quot;&amp;gt;Headline 3&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ul&amp;gt;li.item$$$*5 // item001, item002...&lt;br /&gt;
&lt;br /&gt;
=== HTML Tags mit Emmet erzeugen ===&lt;br /&gt;
 a   &lt;br /&gt;
 &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
 a:link   &lt;br /&gt;
 &amp;lt;a href=&amp;quot;http://&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
 a:mail   &lt;br /&gt;
 &amp;lt;a href=&amp;quot;mailto:&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
 link&lt;br /&gt;
 link:css&lt;br /&gt;
 link:print&lt;br /&gt;
 link:favicon&lt;br /&gt;
 link:touch&lt;br /&gt;
 meta&lt;br /&gt;
 meta:utf&lt;br /&gt;
 img:srcset, img:s&lt;br /&gt;
 img:sizes, img:z&lt;br /&gt;
 ul+&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Nützliche Extensions ==&lt;br /&gt;
 Live Sass Compiler&lt;br /&gt;
 PHP Intellisense&lt;br /&gt;
 OneDarkPro Theme&lt;br /&gt;
&lt;br /&gt;
== Terminal ==&lt;br /&gt;
=== Slow warning ===&lt;br /&gt;
 https://code.visualstudio.com/docs/supporting/faq#_resolving-shell-environment-is-slow-error-warning&lt;br /&gt;
The easiest way to investigate delays in your startup file is to:&lt;br /&gt;
* Open your shell&amp;#039;s startup file (for example, in VS Code by typing ~/.bashrc or ~/.zshrc in quick open).&lt;br /&gt;
* Selectively comment out potentially long running operations.&lt;br /&gt;
* Save and fully restart VS Code until the warning or error disappears.&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
=== Extension Endung hinzufügen ===&lt;br /&gt;
File aufmachen und unten die richtige Syntax auswählen&lt;/div&gt;</summary>
		<author><name>84.136.109.36</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_E-Mail_versenden_(WireMail)&amp;diff=25272</id>
		<title>ProcessWire - E-Mail versenden (WireMail)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_E-Mail_versenden_(WireMail)&amp;diff=25272"/>
		<updated>2021-02-05T18:11:04Z</updated>

		<summary type="html">&lt;p&gt;84.136.109.36: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit der WireMail Klasse kann man in ProcessWire Mails versenden. Sie wurde 2014 eingeführt und soll es ermöglichen Module zu entwickeln um den Mailversand z.B. über smtp zu realisieren. &lt;br /&gt;
 https://processwire.com/talk/topic/5693-new-module-type-wiremail/&lt;br /&gt;
 https://processwire.com/talk/topic/21070-how-to-sendmail-setup-with-smtpgmail-for-local-web-development/&lt;br /&gt;
 [[Ghetto Mailer]]&lt;br /&gt;
 [[ProcessWire - WireMailSmtp (Module)]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 https://processwire.com/api/ref/wire-mail/&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$m = $mail-&amp;gt;new(); // option A (prefered)&lt;br /&gt;
$m = wireMail(); // option B (prefered)&lt;br /&gt;
$m = new WireMail(); // option C (not prefered)&lt;br /&gt;
&lt;br /&gt;
// chained (fluent) method call usage&lt;br /&gt;
$m-&amp;gt;to(&amp;#039;user@domain.com&amp;#039;)&lt;br /&gt;
  -&amp;gt;from(&amp;#039;you@company.com&amp;#039;)&lt;br /&gt;
  -&amp;gt;subject(&amp;#039;Message Subject&amp;#039;)&lt;br /&gt;
  -&amp;gt;body(&amp;#039;Message Body&amp;#039;)&lt;br /&gt;
  -&amp;gt;send();&lt;br /&gt;
&lt;br /&gt;
// separate method call usage&lt;br /&gt;
$m-&amp;gt;to(&amp;#039;user@domain.com&amp;#039;); // specify CSV string or array for multiple addresses&lt;br /&gt;
$m-&amp;gt;from(&amp;#039;you@company.com&amp;#039;);&lt;br /&gt;
$m-&amp;gt;subject(&amp;#039;Message Subject&amp;#039;);&lt;br /&gt;
$m-&amp;gt;body(&amp;#039;Message Body&amp;#039;);&lt;br /&gt;
$m-&amp;gt;send();&lt;br /&gt;
&lt;br /&gt;
// optionally specify “from” or “to” names as 2nd argument&lt;br /&gt;
$m-&amp;gt;to(&amp;#039;user@domain.com&amp;#039;, &amp;#039;John Smith&amp;#039;);&lt;br /&gt;
$m-&amp;gt;from(&amp;#039;you@company.com&amp;#039;, &amp;#039;Mary Jane&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// other methods or properties you might set (or get)&lt;br /&gt;
$m-&amp;gt;bodyHTML(&amp;#039;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message Body&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;#039;);&lt;br /&gt;
$m-&amp;gt;attachment(&amp;#039;/path/to/file.ext&amp;#039;);&lt;br /&gt;
$m-&amp;gt;fromName(&amp;#039;Mary Jane&amp;#039;);&lt;br /&gt;
$m-&amp;gt;toName(&amp;#039;John Smith&amp;#039;);&lt;br /&gt;
$m-&amp;gt;header(&amp;#039;X-Mailer&amp;#039;, &amp;#039;ProcessWire&amp;#039;);&lt;br /&gt;
$m-&amp;gt;param(&amp;#039;-f you@company.com&amp;#039;); // PHP mail() param (envelope from example)&lt;br /&gt;
&lt;br /&gt;
// note that the send() function always returns the quantity of messages sent&lt;br /&gt;
$numSent = $m-&amp;gt;send();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manchmal kann es für E-Mails sinnvoll sein render Templates für einzelne Felder zu haben. Das geht mit der&lt;br /&gt;
renderField Funktion.&lt;br /&gt;
&lt;br /&gt;
[[ProcessWire - Felder rendern (renderField)]]&lt;br /&gt;
&lt;br /&gt;
== Attachments aus ProcessWire ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
foreach($p-&amp;gt;images as $image){&lt;br /&gt;
  $imageSmall = $image-&amp;gt;width(640);&lt;br /&gt;
  $m-&amp;gt;attachment($imageSmall-&amp;gt;filename);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versand über SMTP ==&lt;br /&gt;
 http://modules.processwire.com/modules/wire-mail-smtp/&lt;br /&gt;
Kann von anderen Modulen z.B. FormbuilderPro genutzt werden. Kann aber auch genutzt werden um Massenmails zu versenden etc.&lt;/div&gt;</summary>
		<author><name>84.136.109.36</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_WireMailSmtp_(Module)&amp;diff=25271</id>
		<title>ProcessWire - WireMailSmtp (Module)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_WireMailSmtp_(Module)&amp;diff=25271"/>
		<updated>2021-02-05T18:10:32Z</updated>

		<summary type="html">&lt;p&gt;84.136.109.36: Die Seite wurde neu angelegt: „ https://modules.processwire.com/modules/wire-mail-smtp/  Das geht recht gut wenn man das WireMailSmtp Modul verwendet. ProcessWire selbst kann nur php Mail. E…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://modules.processwire.com/modules/wire-mail-smtp/&lt;br /&gt;
&lt;br /&gt;
Das geht recht gut wenn man das WireMailSmtp Modul verwendet. ProcessWire selbst kann nur php Mail. Es bietet aber eine Schnittstelle, die Module nutzen können um Mails auf andere Weise zu handeln. WireMailSmtp bietet auf diese Weise einen Versand über SMTP an.&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Modul&amp;#039;&amp;#039;&amp;#039; installieren&lt;br /&gt;
# In den Einstellungen des Moduls die &amp;#039;&amp;#039;&amp;#039;SMTP Daten&amp;#039;&amp;#039;&amp;#039; hinterlegen&lt;br /&gt;
# Formbuilder erkennt das Mailer Module automatisch und nutzt es. Aber trotzdem mal in den Settings von Formbuilder nachschauen was ausgewählt ist. Im Zweifel den &amp;#039;&amp;#039;&amp;#039;Versand auf SMTP stellen&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# In den &amp;#039;&amp;#039;&amp;#039;Formbuilder Settings&amp;#039;&amp;#039;&amp;#039; sollte eine E-Mail Adresse ausgewählt sein, die der Server zuläßt.&lt;br /&gt;
&lt;br /&gt;
Einstellungen für KASSERVER: &lt;br /&gt;
&lt;br /&gt;
 smtp hostname z.B. webmynet.kasserver.com&lt;br /&gt;
 port 465&lt;br /&gt;
 allow connection without authentication off&lt;br /&gt;
 smtp user z.B. m0551234 (siehe kas)&lt;br /&gt;
 smtp passwort (siehe kas)&lt;br /&gt;
 use start-tls OFF&lt;br /&gt;
 use SSL ON&lt;br /&gt;
 sender email address die adresse über die versendet wird &lt;br /&gt;
&lt;br /&gt;
Einstellungen für Office365&lt;br /&gt;
&lt;br /&gt;
 port 587&lt;br /&gt;
 smtp user (e-mail adresse)&lt;br /&gt;
 smtp pass (geheim)&lt;br /&gt;
 use start-tls ON&lt;br /&gt;
 crypto for tls - STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT&lt;br /&gt;
 ssl OFF (WICHTIG)&lt;/div&gt;</summary>
		<author><name>84.136.109.36</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_FormBuilder_(Module)&amp;diff=25270</id>
		<title>ProcessWire - FormBuilder (Module)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_FormBuilder_(Module)&amp;diff=25270"/>
		<updated>2021-02-05T18:10:20Z</updated>

		<summary type="html">&lt;p&gt;84.136.109.36: /* Mails per smtp versenden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://processwire.com/store/form-builder/&lt;br /&gt;
&lt;br /&gt;
== Mails per smtp versenden ==&lt;br /&gt;
 [[ProcessWire - WireMailSmtp (Module)]]&lt;br /&gt;
&lt;br /&gt;
== CSS bei einfachem embed per iFrame anpassen ==&lt;br /&gt;
Einfache Lösung: &lt;br /&gt;
* auf Basic Output stellen&lt;br /&gt;
* Standard CSS von /site/templates/FormBuilder/main.css kopieren&lt;br /&gt;
* Neuen Pfad im Formbuilder Formular eingeben.&lt;br /&gt;
Nachteil, das könnte für den User zu kompliziert sein. &lt;br /&gt;
&lt;br /&gt;
== Import Daten für Standard Formular ==&lt;br /&gt;
Hiermit kann man schnell ein Formular erstellen. Einfach in Import Feld des Formbuilder kopieren.&lt;br /&gt;
Einfaches Standardformular:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;action&amp;quot;: &amp;quot;./&amp;quot;,&lt;br /&gt;
    &amp;quot;method&amp;quot;: &amp;quot;post&amp;quot;,&lt;br /&gt;
    &amp;quot;roles&amp;quot;: {&lt;br /&gt;
        &amp;quot;form-submit&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;form-list&amp;quot;: [],&lt;br /&gt;
        &amp;quot;form-edit&amp;quot;: [],&lt;br /&gt;
        &amp;quot;form-delete&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-list&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-edit&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-delete&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-page&amp;quot;: []&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;framework&amp;quot;: &amp;quot;Basic&amp;quot;,&lt;br /&gt;
    &amp;quot;submitText&amp;quot;: &amp;quot;Senden&amp;quot;,&lt;br /&gt;
    &amp;quot;successMessage&amp;quot;: &amp;quot;Vielen Dank, ihre Nachricht wurde versendet.&amp;quot;,&lt;br /&gt;
    &amp;quot;errorMessage&amp;quot;: &amp;quot;Entschuldigung, das Formular konnte nicht versendet werden. Bitte füllen Sie alle Pflichtfelder aus. Zur Kontaktaufnahme benötigen wir entweder Ihre E-Mail oder Ihre Telefonnummer.&amp;quot;,&lt;br /&gt;
    &amp;quot;emailSubject&amp;quot;: &amp;quot;Nachricht über Ihr Kontaktformular&amp;quot;,&lt;br /&gt;
    &amp;quot;responderSubject&amp;quot;: &amp;quot;Auto-Response&amp;quot;,&lt;br /&gt;
    &amp;quot;saveFlags&amp;quot;: 2,&lt;br /&gt;
    &amp;quot;emailTo&amp;quot;: &amp;quot;post@stephanschlegel.de&amp;quot;,&lt;br /&gt;
    &amp;quot;emailFrom&amp;quot;: &amp;quot;e_mail&amp;quot;,&lt;br /&gt;
    &amp;quot;submitText1018&amp;quot;: &amp;quot;Senden&amp;quot;,&lt;br /&gt;
    &amp;quot;successMessage1018&amp;quot;: &amp;quot;Vielen Dank, ihre Nachricht wurde versendet.&amp;quot;,&lt;br /&gt;
    &amp;quot;errorMessage1018&amp;quot;: &amp;quot;Entschuldigung, das Formular konnte nicht versendet werden. Bitte füllen Sie alle Pflichtfelder aus.&amp;quot;,&lt;br /&gt;
    &amp;quot;frBasic_cssURL&amp;quot;: &amp;quot;/site/templates/styles/forms.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frFoundation_foundationURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/foundation/&amp;quot;,&lt;br /&gt;
    &amp;quot;frFoundation_horizHeaderClass&amp;quot;: &amp;quot;small-5 medium-3 right inline&amp;quot;,&lt;br /&gt;
    &amp;quot;frFoundation_horizContentClass&amp;quot;: &amp;quot;small-7 medium-9&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit_ukURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/uikit/&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit_css&amp;quot;: &amp;quot;uikit.gradient.min.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit_horizHeaderWidth&amp;quot;: 30,&lt;br /&gt;
    &amp;quot;frAdmin_styleSet&amp;quot;: &amp;quot;AdminThemeDefault/styles/main-classic.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frBootstrap_bootURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/bootstrap/&amp;quot;,&lt;br /&gt;
    &amp;quot;frBootstrap_bootHorizHeaderClass&amp;quot;: &amp;quot;col-xs-5 col-sm-4 col-md-3&amp;quot;,&lt;br /&gt;
    &amp;quot;frBootstrap_bootHorizContentClass&amp;quot;: &amp;quot;col-xs-7 col-sm-8 col-md-9&amp;quot;,&lt;br /&gt;
    &amp;quot;children&amp;quot;: {&lt;br /&gt;
        &amp;quot;name_1&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Name&amp;quot;,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihr Name&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;requiredAttr&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;telefon&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Telefon&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihre Telefonnummer&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;requiredAttr&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;requiredIf&amp;quot;: &amp;quot;e_mail=&amp;#039;&amp;#039;&amp;quot;,&lt;br /&gt;
            &amp;quot;stripTags&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;e_mail&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;E-Mail&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihre E-Mail&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;requiredIf&amp;quot;: &amp;quot;telefon=&amp;#039;&amp;#039;&amp;quot;,&lt;br /&gt;
            &amp;quot;stripTags&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;ihre_nachricht&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Textarea&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Ihre Nachricht&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihre Nachricht&amp;quot;,&lt;br /&gt;
            &amp;quot;rows&amp;quot;: 5&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;datenschutz&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Checkbox&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Datenschutz&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;Mit meiner Kontaktaufnahme willige ich ein, dass meine Daten gespeichert und zur Bearbeitung meiner Anfrage/Kontaktaufnahme genutzt werden. Meine Daten werden niemals an Dritte weitergeleitet. Diese Einwilligung kann jederzeit widerrufen werden.&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Datenschutz&amp;quot;,&lt;br /&gt;
            &amp;quot;description1018&amp;quot;: &amp;quot;Mit meiner Kontaktaufnahme willige ich ein, dass meine Daten gespeichert und zur Bearbeitung meiner Anfrage/Kontaktaufnahme genutzt werden. Meine Daten werden niemals an Dritte weitergeleitet. Diese Einwilligung kann jederzeit widerrufen werden.&amp;quot;,&lt;br /&gt;
            &amp;quot;checkedValue&amp;quot;: &amp;quot;Ich stimme zu&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mit Adresse...&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;roles&amp;quot;: {&lt;br /&gt;
        &amp;quot;form-submit&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;form-list&amp;quot;: [],&lt;br /&gt;
        &amp;quot;form-edit&amp;quot;: [],&lt;br /&gt;
        &amp;quot;form-delete&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-list&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-edit&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-delete&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-page&amp;quot;: []&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;framework&amp;quot;: &amp;quot;Basic&amp;quot;,&lt;br /&gt;
    &amp;quot;submitText&amp;quot;: &amp;quot;Senden&amp;quot;,&lt;br /&gt;
    &amp;quot;successMessage&amp;quot;: &amp;quot;Vielen Dank, ihre Nachricht wurde versendet.&amp;quot;,&lt;br /&gt;
    &amp;quot;errorMessage&amp;quot;: &amp;quot;Entschuldigung, das Formular konnte nicht versendet werden. Bitte füllen Sie alle Pflichtfelder aus. Zur Kontaktaufnahme benötigen wir entweder Ihre E-Mail oder Ihre Telefonnummer.&amp;quot;,&lt;br /&gt;
    &amp;quot;emailSubject&amp;quot;: &amp;quot;Nachricht über Ihr Kontaktformular&amp;quot;,&lt;br /&gt;
    &amp;quot;responderSubject&amp;quot;: &amp;quot;Auto-Response&amp;quot;,&lt;br /&gt;
    &amp;quot;saveFlags&amp;quot;: 2,&lt;br /&gt;
    &amp;quot;emailTo&amp;quot;: &amp;quot;post@stephanschlegel.de&amp;quot;,&lt;br /&gt;
    &amp;quot;emailFrom&amp;quot;: &amp;quot;e_mail&amp;quot;,&lt;br /&gt;
    &amp;quot;submitText1018&amp;quot;: &amp;quot;Senden&amp;quot;,&lt;br /&gt;
    &amp;quot;successMessage1018&amp;quot;: &amp;quot;Vielen Dank, ihre Nachricht wurde versendet.&amp;quot;,&lt;br /&gt;
    &amp;quot;errorMessage1018&amp;quot;: &amp;quot;Entschuldigung, das Formular konnte nicht versendet werden. Bitte füllen Sie alle Pflichtfelder aus.&amp;quot;,&lt;br /&gt;
    &amp;quot;frBasic_cssURL&amp;quot;: &amp;quot;/site/templates/styles/forms.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frFoundation_foundationURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/foundation/&amp;quot;,&lt;br /&gt;
    &amp;quot;frFoundation_horizHeaderClass&amp;quot;: &amp;quot;small-5 medium-3 right inline&amp;quot;,&lt;br /&gt;
    &amp;quot;frFoundation_horizContentClass&amp;quot;: &amp;quot;small-7 medium-9&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit_ukURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/uikit/&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit_css&amp;quot;: &amp;quot;uikit.gradient.min.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit_horizHeaderWidth&amp;quot;: 30,&lt;br /&gt;
    &amp;quot;frAdmin_styleSet&amp;quot;: &amp;quot;AdminThemeDefault/styles/main-classic.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frBootstrap_bootURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/bootstrap/&amp;quot;,&lt;br /&gt;
    &amp;quot;frBootstrap_bootHorizHeaderClass&amp;quot;: &amp;quot;col-xs-5 col-sm-4 col-md-3&amp;quot;,&lt;br /&gt;
    &amp;quot;frBootstrap_bootHorizContentClass&amp;quot;: &amp;quot;col-xs-7 col-sm-8 col-md-9&amp;quot;,&lt;br /&gt;
    &amp;quot;children&amp;quot;: {&lt;br /&gt;
        &amp;quot;name_1&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Name&amp;quot;,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihr Name&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;requiredAttr&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;telefon&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Telefon&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihre Telefonnummer&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;requiredAttr&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;requiredIf&amp;quot;: &amp;quot;e_mail=&amp;#039;&amp;#039;&amp;quot;,&lt;br /&gt;
            &amp;quot;stripTags&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;e_mail&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;E-Mail&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihre E-Mail&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;requiredIf&amp;quot;: &amp;quot;telefon=&amp;#039;&amp;#039;&amp;quot;,&lt;br /&gt;
            &amp;quot;stripTags&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;ihre_adresse&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Straße&amp;quot;,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 80,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Straße&amp;quot;,&lt;br /&gt;
            &amp;quot;requiredAttr&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;size&amp;quot;: 100&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;hausnummer&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Hausnr.&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 20,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Hausnr.&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;plz_ort&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;PLZ Ort&amp;quot;,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;PLZ Ort&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;ihre_nachricht&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Textarea&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Ihre Nachricht&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihre Nachricht&amp;quot;,&lt;br /&gt;
            &amp;quot;rows&amp;quot;: 5,&lt;br /&gt;
            &amp;quot;requiredAttr&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;datenschutz&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Checkbox&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Datenschutz&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;Mit meiner Kontaktaufnahme willige ich ein, dass meine Daten gespeichert und zur Bearbeitung meiner Anfrage/Kontaktaufnahme genutzt werden. Meine Daten werden niemals an Dritte weitergeleitet. Diese Einwilligung kann jederzeit widerrufen werden.&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Datenschutz&amp;quot;,&lt;br /&gt;
            &amp;quot;description1018&amp;quot;: &amp;quot;Mit meiner Kontaktaufnahme willige ich ein, dass meine Daten gespeichert und zur Bearbeitung meiner Anfrage/Kontaktaufnahme genutzt werden. Meine Daten werden niemals an Dritte weitergeleitet. Diese Einwilligung kann jederzeit widerrufen werden.&amp;quot;,&lt;br /&gt;
            &amp;quot;checkedValue&amp;quot;: &amp;quot;1&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.136.109.36</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Dateien_verarbeiten&amp;diff=25269</id>
		<title>ProcessWire - Dateien verarbeiten</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Dateien_verarbeiten&amp;diff=25269"/>
		<updated>2021-02-05T09:42:25Z</updated>

		<summary type="html">&lt;p&gt;84.136.109.36: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dateien sind immer ein recht komplexes Thema. Hier sind einige Basics dazu welche Funktionen und Fieldtypes es gibt, wo Dateien gespeichert werden etc.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 https://processwire.com/talk/topic/19876-how-to-hook-file-upload-destination/&lt;br /&gt;
 https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_RockPdf_(Module)#Aus_Modul_in_Datei_schreiben&lt;br /&gt;
&lt;br /&gt;
=== Funktionen für Files und Bilder ===&lt;br /&gt;
 https://cheatsheet.processwire.com/#files&lt;br /&gt;
 https://processwire.com/api/ref/wire-file-tools/&lt;br /&gt;
&lt;br /&gt;
=== Pagefiles ===&lt;br /&gt;
Pagefiles verwalten Pagefile Objekte und diese werden wiederum in File oder Image Feldern gespeichert.&lt;br /&gt;
 https://processwire.com/talk/topic/14840-create-pagefile-or-pageimage/&lt;br /&gt;
 https://processwire.com/api/ref/pagefiles/&lt;br /&gt;
&lt;br /&gt;
=== File Uploads in Modulen ===&lt;br /&gt;
Uploads funktionieren entweder über WireUpload, wenn man einen bestimmten Pfad angeben will. Oder über eine Pagefile Instanz wenn die Datei mit der Seite zusammen gespeichert wird. Im letzteren Fall erstellt man meistens ein InputfieldFile Feld. Dann muss man nicht mehr viel machen. Vorsicht, wenn man&lt;br /&gt;
 https://processwire.com/talk/topic/21616-file-upload-inside-custom-module/&lt;br /&gt;
 https://github.com/ryancramerdesign/ImportPagesCSV/blob/master/ImportPagesCSV.module&lt;br /&gt;
&lt;br /&gt;
== Basiswissen zu Dateien ProcessWire ==&lt;br /&gt;
Jede Seite in ProcessWire hat einen eigenen Ordner unterhalb von &lt;br /&gt;
 site/assets/files/&lt;br /&gt;
Wenn Dateien oder Bilder hochgeladen werden (egal ob API oder über ein Feld) muss die Seite gespeichert werden, sonst werden die Dateien gelöscht.&lt;br /&gt;
&lt;br /&gt;
=== Wichtige Klassen und Methoden ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Pagefile&amp;#039;&amp;#039;&amp;#039; class - Represents a single file item attached to a page, typically via a File Fieldtype.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;InputfieldFile&amp;#039;&amp;#039;&amp;#039; class - One or more file uploads (sortable)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;WireUpload&amp;#039;&amp;#039;&amp;#039; - Saves uploads of single or multiple files, saving them to the &amp;#039;&amp;#039;&amp;#039;destination path&amp;#039;&amp;#039;&amp;#039;. If the destination path does not exist, it will be created. &lt;br /&gt;
== Snippets ==&lt;br /&gt;
=== Funktionen um Dateien zu löschen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$page-&amp;gt;files-&amp;gt;deleteAll();&lt;br /&gt;
$page-&amp;gt;files-&amp;gt;delete($pagefile);&lt;br /&gt;
&lt;br /&gt;
$page-&amp;gt;images-&amp;gt;removeAll(); // wirearray&lt;br /&gt;
&lt;br /&gt;
$page-&amp;gt;save();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Custom Directory für Dateien ===&lt;br /&gt;
 https://processwire.com/talk/topic/19876-how-to-hook-file-upload-destination/&lt;br /&gt;
Mit dem InputfieldFile werden Dateien nach $page-&amp;gt;save() automatisch mit einer Seite gespeichert. Wenn man mit den Seiten etwas spezielles vorhat, z.B. in einem Custom Ordner speichern kommt man mit einem Hook weiter. &lt;br /&gt;
&lt;br /&gt;
You can Hook into InputfieldFile::processInputFile. There are other places in that Class you could also hook into, but I think processInputFile works best.&lt;br /&gt;
&lt;br /&gt;
Throw the code below in ready.php&lt;br /&gt;
&lt;br /&gt;
Please note:&lt;br /&gt;
&lt;br /&gt;
#Starter code: not much validation going on other than checking if the field the file was uploaded to is &amp;#039;course_file&amp;#039;&lt;br /&gt;
#You will have to implement other logic yourself. For instance, the code copies the file immediately it is uploaded by ProcessWire Ajax. It doesn&amp;#039;t check if the page is actually saved. If a page is not saved and the page is reloaded, as you know, files in file fields are deleted from disk. This code does not delete the corresponding file in your custom directory&lt;br /&gt;
#You might want the Hook to only run if you are in admin. You can add that logic&lt;br /&gt;
#I&amp;#039;ve purposefully left in verbose and debugging code in there (Tracy stuff) to help you ( maybe and others) understand what&amp;#039;s going on. I suggest you test using Tracy Debugger for a better grasp of the file upload process. Delete the debugging stuff when you&amp;#039;ve got this working as you want :-).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wire()-&amp;gt;addHookAfter(&amp;quot;InputfieldFile::processInputFile&amp;quot;, function(HookEvent $event)  {&lt;br /&gt;
    // @note: here, events are $input, $pagefile, $n @see: the method&lt;br /&gt;
    // get event we are hooking into&lt;br /&gt;
    &lt;br /&gt;
    // get arguments by index {a bit faster, but less-readable}&lt;br /&gt;
    /* $input = $event-&amp;gt;arguments[0];&lt;br /&gt;
    $pagefile = $event-&amp;gt;arguments[1];&lt;br /&gt;
    $n = $event-&amp;gt;arguments[2]; */&lt;br /&gt;
    // get arguments by name&lt;br /&gt;
    #$input = $event-&amp;gt;argumentsByName(&amp;#039;input&amp;#039;);&lt;br /&gt;
    $pagefile = $event-&amp;gt;argumentsByName(&amp;#039;pagefile&amp;#039;);&lt;br /&gt;
    #$n = $event-&amp;gt;argumentsByName(&amp;#039;n&amp;#039;);&lt;br /&gt;
    &lt;br /&gt;
    // $pagefile-&amp;gt;field: The Field object that this file is part of.&lt;br /&gt;
    // limit to a specific field {course_file}&lt;br /&gt;
    if($pagefile-&amp;gt;field-&amp;gt;name != &amp;#039;course_files&amp;#039;) return;&lt;br /&gt;
&lt;br /&gt;
    # intercept file&lt;br /&gt;
    &lt;br /&gt;
    // Tracy Debugger calls to see what&amp;#039;s going on. Also logs Ajax inputs!&lt;br /&gt;
    #bd($input, &amp;#039;input&amp;#039;);&lt;br /&gt;
    #bd($n, &amp;#039;input&amp;#039;);&lt;br /&gt;
    // @see: http://processwire.com/api/ref/pagefile/&lt;br /&gt;
    // pagefile object&lt;br /&gt;
    bd($pagefile, &amp;#039;pagefile&amp;#039;);&lt;br /&gt;
    // name of the field uploading to {your &amp;#039;course_file&amp;#039;}&lt;br /&gt;
    bd($pagefile-&amp;gt;field-&amp;gt;name, &amp;#039;field pagefile is part of&amp;#039;);&lt;br /&gt;
    // file-sanitized name of the file we&amp;#039;ve added, e.g. &amp;#039;checklist_install.pdf&amp;#039;&lt;br /&gt;
    bd($pagefile-&amp;gt;basename, &amp;#039;name of added file&amp;#039;);&lt;br /&gt;
    // full disk path where the file has been uploaded in this page&amp;#039;s files folder...&lt;br /&gt;
    //... in /site/assets/files/1234 where 1234 is this page&amp;#039;s ID&lt;br /&gt;
    // ... e.g. &amp;quot;F:/www/mysite/site/assets/files/1234/checklist_install.pdf&amp;quot;&lt;br /&gt;
    bd($pagefile-&amp;gt;filename, &amp;#039;full disk path name of added file&amp;#039;);&lt;br /&gt;
    // $pagefile-&amp;gt;page: The Page object that this file is part of&lt;br /&gt;
    bd($pagefile-&amp;gt;page-&amp;gt;id, &amp;#039;id of the page file added to&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    // full disk path to your custom uploads directory&lt;br /&gt;
    $customDirectory = $this-&amp;gt;wire(&amp;#039;config&amp;#039;)-&amp;gt;paths-&amp;gt;assets . &amp;#039;custom_directory/&amp;#039;;&lt;br /&gt;
    bd($customDirectory,&amp;#039;custom directory for files&amp;#039;);&lt;br /&gt;
    &lt;br /&gt;
    # copy file&lt;br /&gt;
    // use ProcessWire&amp;#039;s $files API&lt;br /&gt;
    // @see: http://processwire.com/api/ref/files/&lt;br /&gt;
    $files = $this-&amp;gt;wire(&amp;#039;files&amp;#039;);&lt;br /&gt;
    // copy the file(s)&lt;br /&gt;
    $files-&amp;gt;copy($pagefile-&amp;gt;filename,$customDirectory . $pagefile-&amp;gt;basename);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verwaiste Dateien ===&lt;br /&gt;
 https://processwire.com/talk/topic/4437-delete-orphaned-filesimages-from-siteassetsfiles/page/2/&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$keepThumbnails = true;&lt;br /&gt;
$keepPimVariations = true;    // Pageimage Manipulator Variations&lt;br /&gt;
&lt;br /&gt;
ini_set(&amp;#039;max_execution_time&amp;#039;, 60 * 5); // 5 minutes, increase as needed&lt;br /&gt;
include(&amp;quot;./index.php&amp;quot;); // bootstrap ProcessWire&lt;br /&gt;
&lt;br /&gt;
if($keepPimVariations) {&lt;br /&gt;
   if(!wire(&amp;#039;modules&amp;#039;)-&amp;gt;isInstalled(&amp;#039;PageImageManipulator&amp;#039;)) {&lt;br /&gt;
      $keepPimVariations = false;&lt;br /&gt;
   } else {&lt;br /&gt;
      // PiM is installed, but is it a version that has method getPimVariations() (Ver 0.1.0 +)&lt;br /&gt;
      $a = wire(&amp;#039;modules&amp;#039;)-&amp;gt;get(&amp;#039;PageImageManipulator&amp;#039;)-&amp;gt;getModuleInfo();&lt;br /&gt;
      $actual = preg_replace(&amp;#039;/(\d)(?=\d)/&amp;#039;, &amp;#039;$1.&amp;#039;, str_pad(&amp;quot;{$a[&amp;#039;version&amp;#039;]}&amp;quot;, 3, &amp;quot;0&amp;quot;, STR_PAD_LEFT));&lt;br /&gt;
      $keepPimVariations = version_compare($actual, &amp;#039;0.1.0&amp;#039;, &amp;#039;&amp;lt;&amp;#039;) ? false : true;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$dir = new DirectoryIterator(wire(&amp;#039;config&amp;#039;)-&amp;gt;paths-&amp;gt;files);&lt;br /&gt;
foreach ($dir as $file) {&lt;br /&gt;
   if ($file-&amp;gt;isDot() || !$file-&amp;gt;isDir()) {&lt;br /&gt;
      continue;&lt;br /&gt;
   }&lt;br /&gt;
   $id = $file-&amp;gt;getFilename();&lt;br /&gt;
   if (!ctype_digit(&amp;quot;$id&amp;quot;)) {&lt;br /&gt;
      continue;&lt;br /&gt;
   }&lt;br /&gt;
   $page = wire(&amp;#039;pages&amp;#039;)-&amp;gt;get((int) $id);&lt;br /&gt;
   if (!$page-&amp;gt;id) {&lt;br /&gt;
      echo &amp;quot;Orphaned directory: &amp;quot; . wire(&amp;#039;config&amp;#039;)-&amp;gt;urls-&amp;gt;files . &amp;quot;$id/&amp;quot; . $file-&amp;gt;getBasename() . &amp;quot;\n&amp;quot;;&lt;br /&gt;
      continue;&lt;br /&gt;
   }&lt;br /&gt;
   // determine which files are valid for the page&lt;br /&gt;
   $valid = array();&lt;br /&gt;
   foreach ($page-&amp;gt;template-&amp;gt;fieldgroup as $field) {&lt;br /&gt;
      if ($field-&amp;gt;type instanceof FieldtypeFile) {&lt;br /&gt;
         foreach ($page-&amp;gt;get($field-&amp;gt;name) as $file) {&lt;br /&gt;
            $valid[] = $file-&amp;gt;basename;&lt;br /&gt;
            if ($field-&amp;gt;type instanceof FieldtypeImage) {&lt;br /&gt;
               foreach ($file-&amp;gt;getVariations() as $f) {&lt;br /&gt;
                  $valid[] = $f-&amp;gt;basename;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
            // keep thumbnails:&lt;br /&gt;
            if ($keepThumbnails &amp;amp;&amp;amp; $field-&amp;gt;type instanceof FieldtypeCropImage) {&lt;br /&gt;
               $crops = $field-&amp;gt;getArray();&lt;br /&gt;
               $crops = $crops[&amp;#039;thumbSetting&amp;#039;];&lt;br /&gt;
               $crops_a = explode(&amp;quot;\n&amp;quot;, $crops); // ie. thumbname,200,200 (name,width,height)&lt;br /&gt;
               foreach ($crops_a as $crop) {&lt;br /&gt;
                  $crop = explode(&amp;quot;,&amp;quot;, $crop);&lt;br /&gt;
                  $prefix = wire(&amp;#039;sanitizer&amp;#039;)-&amp;gt;name($crop[0]);&lt;br /&gt;
                  $valid[] = $prefix . &amp;quot;_&amp;quot; . $file-&amp;gt;basename;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
            // what&amp;#039;s about PimVariations ?&lt;br /&gt;
            if ($keepPimVariations) {&lt;br /&gt;
               if ($field-&amp;gt;type instanceof FieldtypeImage) {&lt;br /&gt;
                  foreach ($file-&amp;gt;pimLoad(&amp;#039;x&amp;#039;,true)-&amp;gt;getPimVariations() as $f) {&lt;br /&gt;
                     $valid[] = $f-&amp;gt;basename;&lt;br /&gt;
                  }&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   // now find all the files present on the page&lt;br /&gt;
   // identify those that are not part of our $valid array&lt;br /&gt;
   $d = new DirectoryIterator($page-&amp;gt;filesManager-&amp;gt;path);&lt;br /&gt;
   foreach ($d as $f) {&lt;br /&gt;
      if ($f-&amp;gt;isDot() || !$f-&amp;gt;isFile()) {&lt;br /&gt;
         continue;&lt;br /&gt;
      }&lt;br /&gt;
      if (!in_array($f-&amp;gt;getFilename(), $valid)) {&lt;br /&gt;
         echo &amp;quot;Orphaned file: &amp;quot; . wire(&amp;#039;config&amp;#039;)-&amp;gt;urls-&amp;gt;files . &amp;quot;$id/&amp;quot; . $f-&amp;gt;getBasename() . &amp;quot;\n&amp;quot;;&lt;br /&gt;
//         #unlink($f-&amp;gt;getPathname());&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   wire(&amp;#039;pages&amp;#039;)-&amp;gt;uncache($page); // just in case we need the memory&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
ini_set(&amp;#039;max_execution_time&amp;#039;, 60 * 5); // 5 minutes, increase as needed&lt;br /&gt;
include(&amp;quot;./index.php&amp;quot;);&lt;br /&gt;
$dir = new DirectoryIterator(wire(&amp;#039;config&amp;#039;)-&amp;gt;paths-&amp;gt;files);&lt;br /&gt;
&lt;br /&gt;
foreach ($dir as $file) {&lt;br /&gt;
    if ($file-&amp;gt;isDot() || !$file-&amp;gt;isDir()) {&lt;br /&gt;
        continue;&lt;br /&gt;
    }&lt;br /&gt;
    $id = $file-&amp;gt;getFilename();&lt;br /&gt;
    if (!ctype_digit(&amp;quot;$id&amp;quot;)) {&lt;br /&gt;
        continue;&lt;br /&gt;
    }&lt;br /&gt;
    $page = wire(&amp;#039;pages&amp;#039;)-&amp;gt;get((int) $id);&lt;br /&gt;
    if (!$page-&amp;gt;id) {&lt;br /&gt;
        echo &amp;quot;Orphaned directory: &amp;quot; . wire(&amp;#039;config&amp;#039;)-&amp;gt;urls-&amp;gt;files . &amp;quot;$id/&amp;quot; . $file-&amp;gt;getBasename() . &amp;quot;\n&amp;quot;;&lt;br /&gt;
        continue;&lt;br /&gt;
    }&lt;br /&gt;
    // determine which files are valid for the page&lt;br /&gt;
    $valid = array();&lt;br /&gt;
    foreach ($page-&amp;gt;template-&amp;gt;fieldgroup as $field) {&lt;br /&gt;
        if ($field-&amp;gt;type instanceof FieldtypeFile) {&lt;br /&gt;
            foreach ($page-&amp;gt;get($field-&amp;gt;name) as $file) {&lt;br /&gt;
                $valid[] = $file-&amp;gt;basename;&lt;br /&gt;
                if ($field-&amp;gt;type instanceof FieldtypeImage) {&lt;br /&gt;
                    foreach ($file-&amp;gt;getVariations() as $f) {&lt;br /&gt;
                        //$valid[] = $f-&amp;gt;basename;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                // keep thumbnails:&lt;br /&gt;
                /*&lt;br /&gt;
                if ($field-&amp;gt;type instanceof FieldtypeCropImage) {&lt;br /&gt;
                    $crops = $field-&amp;gt;getArray();&lt;br /&gt;
                    $crops = $crops[&amp;#039;thumbSetting&amp;#039;];&lt;br /&gt;
                    $crops_a = explode(&amp;quot;\n&amp;quot;, $crops); // ie. thumbname,200,200 (name,width,height)&lt;br /&gt;
                    foreach ($crops_a as $crop) {&lt;br /&gt;
                        $crop = explode(&amp;quot;,&amp;quot;, $crop);&lt;br /&gt;
                        $prefix = wire(&amp;#039;sanitizer&amp;#039;)-&amp;gt;name($crop[0]);&lt;br /&gt;
                        $valid[] = $prefix . &amp;quot;_&amp;quot; . $file-&amp;gt;basename;&lt;br /&gt;
                    }&lt;br /&gt;
                }*/&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // now find all the files present on the page&lt;br /&gt;
    // identify those that are not part of our $valid array&lt;br /&gt;
    $d = new DirectoryIterator($page-&amp;gt;filesManager-&amp;gt;path);&lt;br /&gt;
    foreach ($d as $f) {&lt;br /&gt;
        if ($f-&amp;gt;isDot() || !$f-&amp;gt;isFile()) {&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
        if (!in_array($f-&amp;gt;getFilename(), $valid)) {&lt;br /&gt;
            echo &amp;quot;Orphaned file: &amp;quot; . wire(&amp;#039;config&amp;#039;)-&amp;gt;urls-&amp;gt;files . &amp;quot;$id/&amp;quot; . $f-&amp;gt;getBasename() . &amp;quot;\n&amp;quot;;&lt;br /&gt;
//             unlink($f-&amp;gt;getPathname());&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    wire(&amp;#039;pages&amp;#039;)-&amp;gt;uncache($page); // just in case we need the memory&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.136.109.36</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Dateien_verarbeiten&amp;diff=25268</id>
		<title>ProcessWire - Dateien verarbeiten</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Dateien_verarbeiten&amp;diff=25268"/>
		<updated>2021-02-05T07:31:24Z</updated>

		<summary type="html">&lt;p&gt;84.136.109.36: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dateien sind immer ein recht komplexes Thema. Hier sind einige Basics dazu welche Funktionen und Fieldtypes es gibt, wo Dateien gespeichert werden etc.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 https://processwire.com/talk/topic/19876-how-to-hook-file-upload-destination/&lt;br /&gt;
 https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_RockPdf_(Module)#Aus_Modul_in_Datei_schreiben&lt;br /&gt;
&lt;br /&gt;
=== Funktionen für Files und Bilder ===&lt;br /&gt;
 https://cheatsheet.processwire.com/#files&lt;br /&gt;
 https://processwire.com/api/ref/wire-file-tools/&lt;br /&gt;
&lt;br /&gt;
=== File Uploads in Modulen ===&lt;br /&gt;
Uploads funktionieren entweder über WireUpload, wenn man einen bestimmten Pfad angeben will. Oder über eine Pagefile Instanz wenn die Datei mit der Seite zusammen gespeichert wird. Im letzteren Fall erstellt man meistens ein InputfieldFile Feld. Dann muss man nicht mehr viel machen. Vorsicht, wenn man&lt;br /&gt;
 https://processwire.com/talk/topic/21616-file-upload-inside-custom-module/&lt;br /&gt;
 https://github.com/ryancramerdesign/ImportPagesCSV/blob/master/ImportPagesCSV.module&lt;br /&gt;
&lt;br /&gt;
== Basiswissen zu Dateien ProcessWire ==&lt;br /&gt;
Jede Seite in ProcessWire hat einen eigenen Ordner unterhalb von &lt;br /&gt;
 site/assets/files/&lt;br /&gt;
Wenn Dateien oder Bilder hochgeladen werden (egal ob API oder über ein Feld) muss die Seite gespeichert werden, sonst werden die Dateien gelöscht.&lt;br /&gt;
&lt;br /&gt;
=== Wichtige Klassen und Methoden ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Pagefile&amp;#039;&amp;#039;&amp;#039; class - Represents a single file item attached to a page, typically via a File Fieldtype.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;InputfieldFile&amp;#039;&amp;#039;&amp;#039; class - One or more file uploads (sortable)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;WireUpload&amp;#039;&amp;#039;&amp;#039; - Saves uploads of single or multiple files, saving them to the &amp;#039;&amp;#039;&amp;#039;destination path&amp;#039;&amp;#039;&amp;#039;. If the destination path does not exist, it will be created. &lt;br /&gt;
== Snippets ==&lt;br /&gt;
=== Funktionen um Dateien zu löschen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$page-&amp;gt;files-&amp;gt;deleteAll();&lt;br /&gt;
$page-&amp;gt;files-&amp;gt;delete($pagefile);&lt;br /&gt;
&lt;br /&gt;
$page-&amp;gt;images-&amp;gt;removeAll(); // wirearray&lt;br /&gt;
&lt;br /&gt;
$page-&amp;gt;save();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Custom Directory für Dateien ===&lt;br /&gt;
 https://processwire.com/talk/topic/19876-how-to-hook-file-upload-destination/&lt;br /&gt;
Mit dem InputfieldFile werden Dateien nach $page-&amp;gt;save() automatisch mit einer Seite gespeichert. Wenn man mit den Seiten etwas spezielles vorhat, z.B. in einem Custom Ordner speichern kommt man mit einem Hook weiter. &lt;br /&gt;
&lt;br /&gt;
You can Hook into InputfieldFile::processInputFile. There are other places in that Class you could also hook into, but I think processInputFile works best.&lt;br /&gt;
&lt;br /&gt;
Throw the code below in ready.php&lt;br /&gt;
&lt;br /&gt;
Please note:&lt;br /&gt;
&lt;br /&gt;
#Starter code: not much validation going on other than checking if the field the file was uploaded to is &amp;#039;course_file&amp;#039;&lt;br /&gt;
#You will have to implement other logic yourself. For instance, the code copies the file immediately it is uploaded by ProcessWire Ajax. It doesn&amp;#039;t check if the page is actually saved. If a page is not saved and the page is reloaded, as you know, files in file fields are deleted from disk. This code does not delete the corresponding file in your custom directory&lt;br /&gt;
#You might want the Hook to only run if you are in admin. You can add that logic&lt;br /&gt;
#I&amp;#039;ve purposefully left in verbose and debugging code in there (Tracy stuff) to help you ( maybe and others) understand what&amp;#039;s going on. I suggest you test using Tracy Debugger for a better grasp of the file upload process. Delete the debugging stuff when you&amp;#039;ve got this working as you want :-).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wire()-&amp;gt;addHookAfter(&amp;quot;InputfieldFile::processInputFile&amp;quot;, function(HookEvent $event)  {&lt;br /&gt;
    // @note: here, events are $input, $pagefile, $n @see: the method&lt;br /&gt;
    // get event we are hooking into&lt;br /&gt;
    &lt;br /&gt;
    // get arguments by index {a bit faster, but less-readable}&lt;br /&gt;
    /* $input = $event-&amp;gt;arguments[0];&lt;br /&gt;
    $pagefile = $event-&amp;gt;arguments[1];&lt;br /&gt;
    $n = $event-&amp;gt;arguments[2]; */&lt;br /&gt;
    // get arguments by name&lt;br /&gt;
    #$input = $event-&amp;gt;argumentsByName(&amp;#039;input&amp;#039;);&lt;br /&gt;
    $pagefile = $event-&amp;gt;argumentsByName(&amp;#039;pagefile&amp;#039;);&lt;br /&gt;
    #$n = $event-&amp;gt;argumentsByName(&amp;#039;n&amp;#039;);&lt;br /&gt;
    &lt;br /&gt;
    // $pagefile-&amp;gt;field: The Field object that this file is part of.&lt;br /&gt;
    // limit to a specific field {course_file}&lt;br /&gt;
    if($pagefile-&amp;gt;field-&amp;gt;name != &amp;#039;course_files&amp;#039;) return;&lt;br /&gt;
&lt;br /&gt;
    # intercept file&lt;br /&gt;
    &lt;br /&gt;
    // Tracy Debugger calls to see what&amp;#039;s going on. Also logs Ajax inputs!&lt;br /&gt;
    #bd($input, &amp;#039;input&amp;#039;);&lt;br /&gt;
    #bd($n, &amp;#039;input&amp;#039;);&lt;br /&gt;
    // @see: http://processwire.com/api/ref/pagefile/&lt;br /&gt;
    // pagefile object&lt;br /&gt;
    bd($pagefile, &amp;#039;pagefile&amp;#039;);&lt;br /&gt;
    // name of the field uploading to {your &amp;#039;course_file&amp;#039;}&lt;br /&gt;
    bd($pagefile-&amp;gt;field-&amp;gt;name, &amp;#039;field pagefile is part of&amp;#039;);&lt;br /&gt;
    // file-sanitized name of the file we&amp;#039;ve added, e.g. &amp;#039;checklist_install.pdf&amp;#039;&lt;br /&gt;
    bd($pagefile-&amp;gt;basename, &amp;#039;name of added file&amp;#039;);&lt;br /&gt;
    // full disk path where the file has been uploaded in this page&amp;#039;s files folder...&lt;br /&gt;
    //... in /site/assets/files/1234 where 1234 is this page&amp;#039;s ID&lt;br /&gt;
    // ... e.g. &amp;quot;F:/www/mysite/site/assets/files/1234/checklist_install.pdf&amp;quot;&lt;br /&gt;
    bd($pagefile-&amp;gt;filename, &amp;#039;full disk path name of added file&amp;#039;);&lt;br /&gt;
    // $pagefile-&amp;gt;page: The Page object that this file is part of&lt;br /&gt;
    bd($pagefile-&amp;gt;page-&amp;gt;id, &amp;#039;id of the page file added to&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    // full disk path to your custom uploads directory&lt;br /&gt;
    $customDirectory = $this-&amp;gt;wire(&amp;#039;config&amp;#039;)-&amp;gt;paths-&amp;gt;assets . &amp;#039;custom_directory/&amp;#039;;&lt;br /&gt;
    bd($customDirectory,&amp;#039;custom directory for files&amp;#039;);&lt;br /&gt;
    &lt;br /&gt;
    # copy file&lt;br /&gt;
    // use ProcessWire&amp;#039;s $files API&lt;br /&gt;
    // @see: http://processwire.com/api/ref/files/&lt;br /&gt;
    $files = $this-&amp;gt;wire(&amp;#039;files&amp;#039;);&lt;br /&gt;
    // copy the file(s)&lt;br /&gt;
    $files-&amp;gt;copy($pagefile-&amp;gt;filename,$customDirectory . $pagefile-&amp;gt;basename);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verwaiste Dateien ===&lt;br /&gt;
 https://processwire.com/talk/topic/4437-delete-orphaned-filesimages-from-siteassetsfiles/page/2/&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$keepThumbnails = true;&lt;br /&gt;
$keepPimVariations = true;    // Pageimage Manipulator Variations&lt;br /&gt;
&lt;br /&gt;
ini_set(&amp;#039;max_execution_time&amp;#039;, 60 * 5); // 5 minutes, increase as needed&lt;br /&gt;
include(&amp;quot;./index.php&amp;quot;); // bootstrap ProcessWire&lt;br /&gt;
&lt;br /&gt;
if($keepPimVariations) {&lt;br /&gt;
   if(!wire(&amp;#039;modules&amp;#039;)-&amp;gt;isInstalled(&amp;#039;PageImageManipulator&amp;#039;)) {&lt;br /&gt;
      $keepPimVariations = false;&lt;br /&gt;
   } else {&lt;br /&gt;
      // PiM is installed, but is it a version that has method getPimVariations() (Ver 0.1.0 +)&lt;br /&gt;
      $a = wire(&amp;#039;modules&amp;#039;)-&amp;gt;get(&amp;#039;PageImageManipulator&amp;#039;)-&amp;gt;getModuleInfo();&lt;br /&gt;
      $actual = preg_replace(&amp;#039;/(\d)(?=\d)/&amp;#039;, &amp;#039;$1.&amp;#039;, str_pad(&amp;quot;{$a[&amp;#039;version&amp;#039;]}&amp;quot;, 3, &amp;quot;0&amp;quot;, STR_PAD_LEFT));&lt;br /&gt;
      $keepPimVariations = version_compare($actual, &amp;#039;0.1.0&amp;#039;, &amp;#039;&amp;lt;&amp;#039;) ? false : true;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$dir = new DirectoryIterator(wire(&amp;#039;config&amp;#039;)-&amp;gt;paths-&amp;gt;files);&lt;br /&gt;
foreach ($dir as $file) {&lt;br /&gt;
   if ($file-&amp;gt;isDot() || !$file-&amp;gt;isDir()) {&lt;br /&gt;
      continue;&lt;br /&gt;
   }&lt;br /&gt;
   $id = $file-&amp;gt;getFilename();&lt;br /&gt;
   if (!ctype_digit(&amp;quot;$id&amp;quot;)) {&lt;br /&gt;
      continue;&lt;br /&gt;
   }&lt;br /&gt;
   $page = wire(&amp;#039;pages&amp;#039;)-&amp;gt;get((int) $id);&lt;br /&gt;
   if (!$page-&amp;gt;id) {&lt;br /&gt;
      echo &amp;quot;Orphaned directory: &amp;quot; . wire(&amp;#039;config&amp;#039;)-&amp;gt;urls-&amp;gt;files . &amp;quot;$id/&amp;quot; . $file-&amp;gt;getBasename() . &amp;quot;\n&amp;quot;;&lt;br /&gt;
      continue;&lt;br /&gt;
   }&lt;br /&gt;
   // determine which files are valid for the page&lt;br /&gt;
   $valid = array();&lt;br /&gt;
   foreach ($page-&amp;gt;template-&amp;gt;fieldgroup as $field) {&lt;br /&gt;
      if ($field-&amp;gt;type instanceof FieldtypeFile) {&lt;br /&gt;
         foreach ($page-&amp;gt;get($field-&amp;gt;name) as $file) {&lt;br /&gt;
            $valid[] = $file-&amp;gt;basename;&lt;br /&gt;
            if ($field-&amp;gt;type instanceof FieldtypeImage) {&lt;br /&gt;
               foreach ($file-&amp;gt;getVariations() as $f) {&lt;br /&gt;
                  $valid[] = $f-&amp;gt;basename;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
            // keep thumbnails:&lt;br /&gt;
            if ($keepThumbnails &amp;amp;&amp;amp; $field-&amp;gt;type instanceof FieldtypeCropImage) {&lt;br /&gt;
               $crops = $field-&amp;gt;getArray();&lt;br /&gt;
               $crops = $crops[&amp;#039;thumbSetting&amp;#039;];&lt;br /&gt;
               $crops_a = explode(&amp;quot;\n&amp;quot;, $crops); // ie. thumbname,200,200 (name,width,height)&lt;br /&gt;
               foreach ($crops_a as $crop) {&lt;br /&gt;
                  $crop = explode(&amp;quot;,&amp;quot;, $crop);&lt;br /&gt;
                  $prefix = wire(&amp;#039;sanitizer&amp;#039;)-&amp;gt;name($crop[0]);&lt;br /&gt;
                  $valid[] = $prefix . &amp;quot;_&amp;quot; . $file-&amp;gt;basename;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
            // what&amp;#039;s about PimVariations ?&lt;br /&gt;
            if ($keepPimVariations) {&lt;br /&gt;
               if ($field-&amp;gt;type instanceof FieldtypeImage) {&lt;br /&gt;
                  foreach ($file-&amp;gt;pimLoad(&amp;#039;x&amp;#039;,true)-&amp;gt;getPimVariations() as $f) {&lt;br /&gt;
                     $valid[] = $f-&amp;gt;basename;&lt;br /&gt;
                  }&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   // now find all the files present on the page&lt;br /&gt;
   // identify those that are not part of our $valid array&lt;br /&gt;
   $d = new DirectoryIterator($page-&amp;gt;filesManager-&amp;gt;path);&lt;br /&gt;
   foreach ($d as $f) {&lt;br /&gt;
      if ($f-&amp;gt;isDot() || !$f-&amp;gt;isFile()) {&lt;br /&gt;
         continue;&lt;br /&gt;
      }&lt;br /&gt;
      if (!in_array($f-&amp;gt;getFilename(), $valid)) {&lt;br /&gt;
         echo &amp;quot;Orphaned file: &amp;quot; . wire(&amp;#039;config&amp;#039;)-&amp;gt;urls-&amp;gt;files . &amp;quot;$id/&amp;quot; . $f-&amp;gt;getBasename() . &amp;quot;\n&amp;quot;;&lt;br /&gt;
//         #unlink($f-&amp;gt;getPathname());&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   wire(&amp;#039;pages&amp;#039;)-&amp;gt;uncache($page); // just in case we need the memory&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
ini_set(&amp;#039;max_execution_time&amp;#039;, 60 * 5); // 5 minutes, increase as needed&lt;br /&gt;
include(&amp;quot;./index.php&amp;quot;);&lt;br /&gt;
$dir = new DirectoryIterator(wire(&amp;#039;config&amp;#039;)-&amp;gt;paths-&amp;gt;files);&lt;br /&gt;
&lt;br /&gt;
foreach ($dir as $file) {&lt;br /&gt;
    if ($file-&amp;gt;isDot() || !$file-&amp;gt;isDir()) {&lt;br /&gt;
        continue;&lt;br /&gt;
    }&lt;br /&gt;
    $id = $file-&amp;gt;getFilename();&lt;br /&gt;
    if (!ctype_digit(&amp;quot;$id&amp;quot;)) {&lt;br /&gt;
        continue;&lt;br /&gt;
    }&lt;br /&gt;
    $page = wire(&amp;#039;pages&amp;#039;)-&amp;gt;get((int) $id);&lt;br /&gt;
    if (!$page-&amp;gt;id) {&lt;br /&gt;
        echo &amp;quot;Orphaned directory: &amp;quot; . wire(&amp;#039;config&amp;#039;)-&amp;gt;urls-&amp;gt;files . &amp;quot;$id/&amp;quot; . $file-&amp;gt;getBasename() . &amp;quot;\n&amp;quot;;&lt;br /&gt;
        continue;&lt;br /&gt;
    }&lt;br /&gt;
    // determine which files are valid for the page&lt;br /&gt;
    $valid = array();&lt;br /&gt;
    foreach ($page-&amp;gt;template-&amp;gt;fieldgroup as $field) {&lt;br /&gt;
        if ($field-&amp;gt;type instanceof FieldtypeFile) {&lt;br /&gt;
            foreach ($page-&amp;gt;get($field-&amp;gt;name) as $file) {&lt;br /&gt;
                $valid[] = $file-&amp;gt;basename;&lt;br /&gt;
                if ($field-&amp;gt;type instanceof FieldtypeImage) {&lt;br /&gt;
                    foreach ($file-&amp;gt;getVariations() as $f) {&lt;br /&gt;
                        //$valid[] = $f-&amp;gt;basename;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                // keep thumbnails:&lt;br /&gt;
                /*&lt;br /&gt;
                if ($field-&amp;gt;type instanceof FieldtypeCropImage) {&lt;br /&gt;
                    $crops = $field-&amp;gt;getArray();&lt;br /&gt;
                    $crops = $crops[&amp;#039;thumbSetting&amp;#039;];&lt;br /&gt;
                    $crops_a = explode(&amp;quot;\n&amp;quot;, $crops); // ie. thumbname,200,200 (name,width,height)&lt;br /&gt;
                    foreach ($crops_a as $crop) {&lt;br /&gt;
                        $crop = explode(&amp;quot;,&amp;quot;, $crop);&lt;br /&gt;
                        $prefix = wire(&amp;#039;sanitizer&amp;#039;)-&amp;gt;name($crop[0]);&lt;br /&gt;
                        $valid[] = $prefix . &amp;quot;_&amp;quot; . $file-&amp;gt;basename;&lt;br /&gt;
                    }&lt;br /&gt;
                }*/&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // now find all the files present on the page&lt;br /&gt;
    // identify those that are not part of our $valid array&lt;br /&gt;
    $d = new DirectoryIterator($page-&amp;gt;filesManager-&amp;gt;path);&lt;br /&gt;
    foreach ($d as $f) {&lt;br /&gt;
        if ($f-&amp;gt;isDot() || !$f-&amp;gt;isFile()) {&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
        if (!in_array($f-&amp;gt;getFilename(), $valid)) {&lt;br /&gt;
            echo &amp;quot;Orphaned file: &amp;quot; . wire(&amp;#039;config&amp;#039;)-&amp;gt;urls-&amp;gt;files . &amp;quot;$id/&amp;quot; . $f-&amp;gt;getBasename() . &amp;quot;\n&amp;quot;;&lt;br /&gt;
//             unlink($f-&amp;gt;getPathname());&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    wire(&amp;#039;pages&amp;#039;)-&amp;gt;uncache($page); // just in case we need the memory&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.136.109.36</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_RockPdf_(Module)&amp;diff=25267</id>
		<title>ProcessWire - RockPdf (Module)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_RockPdf_(Module)&amp;diff=25267"/>
		<updated>2021-02-05T07:29:34Z</updated>

		<summary type="html">&lt;p&gt;84.136.109.36: /* Aus Modul in Datei schreiben */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Modul zum Erzeugen von pdf Dateien. Basiert auf der mpdf Library.&lt;br /&gt;
&lt;br /&gt;
== PDF aus HTML Vorlage ==&lt;br /&gt;
Beispiel aus eigener PadLoper Erweiterung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Create HTML&lt;br /&gt;
$t = $this-&amp;gt;modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;getPadTemplate(&amp;quot;invoice.php&amp;quot;);&lt;br /&gt;
$t-&amp;gt;set(&amp;quot;order&amp;quot;, $order);&lt;br /&gt;
$html = $t-&amp;gt;render();&lt;br /&gt;
                &lt;br /&gt;
// Create PDF from HTML&lt;br /&gt;
$pdf = $this-&amp;gt;modules-&amp;gt;get(&amp;#039;RockPdf&amp;#039;);&lt;br /&gt;
$mpdf = $pdf-&amp;gt;mpdf;&lt;br /&gt;
//$mpdf-&amp;gt;Bookmark(&amp;#039;RECHNUNG&amp;#039;);&lt;br /&gt;
$mpdf-&amp;gt;WriteHTML($html);&lt;br /&gt;
$mpdf-&amp;gt;output();&lt;br /&gt;
exit();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire; &lt;br /&gt;
/**&lt;br /&gt;
 * INVOICE&lt;br /&gt;
 * we have PadOrder object $order ready to go&lt;br /&gt;
 */&lt;br /&gt;
if(!$order-&amp;gt;invoice_id){&lt;br /&gt;
  echo(&amp;quot;Für diese Bestellung wurde noch keine Rechnungsnummer erstellt. Du kannst unter Verwaltung &amp;gt; Padloper Rechnungen eine Nummer erstellen.&amp;quot;);&lt;br /&gt;
  exit();&lt;br /&gt;
}&lt;br /&gt;
$configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); &lt;br /&gt;
$padRender = $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;);&lt;br /&gt;
$padInvoices = $modules-&amp;gt;get(&amp;quot;PadInvoices&amp;quot;); //needed for order prefix&lt;br /&gt;
$prefix = $padInvoices-&amp;gt;getPrefix();&lt;br /&gt;
//$padProcess = $modules-&amp;gt;get(&amp;quot;PadProcess&amp;quot;);&lt;br /&gt;
// logo &lt;br /&gt;
$logo = $configpage-&amp;gt;site_brandmark;&lt;br /&gt;
$logoUrl = $logo-&amp;gt;first()-&amp;gt;httpUrl;&lt;br /&gt;
//bd($order,&amp;#039;order&amp;#039;);&lt;br /&gt;
// Customer Data&lt;br /&gt;
$customerAddress = &amp;#039;&amp;#039;;&lt;br /&gt;
$customerAddress .= $order-&amp;gt;pad_firstname . &amp;quot; &amp;quot; . $order-&amp;gt;pad_lastname.&amp;#039;&amp;lt;br&amp;gt;&amp;#039;;&lt;br /&gt;
if ($order-&amp;gt;pad_address) $customerAddress .= $order-&amp;gt;pad_address . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
if ($order-&amp;gt;pad_address_cont) $customerAddress .= $order-&amp;gt;pad_address_cont . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
if ($order-&amp;gt;pad_city || $order-&amp;gt;pad_postcode) {&lt;br /&gt;
  if ($order-&amp;gt;pad_postcode) $customerAddress .= $order-&amp;gt;pad_postcode . &amp;quot; &amp;quot;;&lt;br /&gt;
  $customerAddress .=  $order-&amp;gt;pad_city;&lt;br /&gt;
} &lt;br /&gt;
// Company Data&lt;br /&gt;
$companyAddress = nl2br($configpage-&amp;gt;company_information);&lt;br /&gt;
&lt;br /&gt;
// Products Table&lt;br /&gt;
$t = $padRender-&amp;gt;getPadTemplate(&amp;quot;order-products-table.php&amp;quot;);&lt;br /&gt;
$t-&amp;gt;set(&amp;quot;order&amp;quot;, $order);&lt;br /&gt;
$productsTable = $t-&amp;gt;render();&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;meta title=&amp;quot;Rechnung&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&amp;lt;?= __(&amp;quot;Invoice&amp;quot;) ?&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;style&amp;gt;&lt;br /&gt;
      /* LETTER A4 Styles (oriented at DIN 5008) */&lt;br /&gt;
      body{&lt;br /&gt;
        font-family: sans-serif;&lt;br /&gt;
        font-size: 10pt;&lt;br /&gt;
      }&lt;br /&gt;
      div {&lt;br /&gt;
        box-sizing: border-box;&lt;br /&gt;
        /*border: 1px solid pink;*/&lt;br /&gt;
      }&lt;br /&gt;
      .small {&lt;br /&gt;
        font-size: 9pt;&lt;br /&gt;
      }&lt;br /&gt;
      table{&lt;br /&gt;
        border-collapse: collapse;&lt;br /&gt;
        font-size: 10pt;&lt;br /&gt;
      }&lt;br /&gt;
      td{&lt;br /&gt;
        border-top: 1px solid #999;&lt;br /&gt;
      }&lt;br /&gt;
      #header{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 0;&lt;br /&gt;
        left:0;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
      }&lt;br /&gt;
      #logo{&lt;br /&gt;
        padding-top:0.7cm;&lt;br /&gt;
        width: 3cm;&lt;br /&gt;
      }&lt;br /&gt;
      #anschrift{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 4.5cm;&lt;br /&gt;
        left: 2cm;&lt;br /&gt;
        height: 4.5cm;&lt;br /&gt;
        width: 8.5cm;&lt;br /&gt;
        padding-left: 0.5cm;&lt;br /&gt;
      }&lt;br /&gt;
      #vermerkzone{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 0;&lt;br /&gt;
        left: 0;&lt;br /&gt;
        height: 1.77cm;&lt;br /&gt;
        width: 8.5cm;&lt;br /&gt;
        padding-top: 0.5rem;&lt;br /&gt;
      }&lt;br /&gt;
      #anschriftzone{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 1.77cm;&lt;br /&gt;
        left: 0;&lt;br /&gt;
        width: 8.5cm;&lt;br /&gt;
        height: 2.73cm;&lt;br /&gt;
      }&lt;br /&gt;
      #informationsblock{&lt;br /&gt;
        font-size: 10pt;&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 5cm;&lt;br /&gt;
        right: 1cm;&lt;br /&gt;
        width: 7.5cm;&lt;br /&gt;
        height: auto;&lt;br /&gt;
      }&lt;br /&gt;
      #datum{&lt;br /&gt;
        position: relative;&lt;br /&gt;
        text-align: right;&lt;br /&gt;
        padding: 2rem 0 2rem 0;&lt;br /&gt;
      }&lt;br /&gt;
      #rechnungsnummer{&lt;br /&gt;
        position: relative;&lt;br /&gt;
        text-align: left;&lt;br /&gt;
        margin-top: 1rem;&lt;br /&gt;
      }&lt;br /&gt;
      #textblock{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 10.1cm;&lt;br /&gt;
        left: 2.5cm;&lt;br /&gt;
        right: 2cm;&lt;br /&gt;
        height: auto;&lt;br /&gt;
      }&lt;br /&gt;
      #betreff{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 2rem;&lt;br /&gt;
      }&lt;br /&gt;
      #text{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        margin-top: 1rem;&lt;br /&gt;
      }&lt;br /&gt;
      #rechtstexte{&lt;br /&gt;
        position: relative;&lt;br /&gt;
        padding-top: 1rem;&lt;br /&gt;
      }&lt;br /&gt;
      #footer{&lt;br /&gt;
        text-align: center;&lt;br /&gt;
        font-size: 9pt;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div id=&amp;quot;header&amp;quot; class=&amp;quot;section&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;img id=&amp;quot;logo&amp;quot; src=&amp;quot;&amp;lt;?=$logoUrl?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div id=&amp;quot;anschrift&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;vermerkzone&amp;quot; class=&amp;quot;small&amp;quot; &amp;gt;&lt;br /&gt;
        &amp;lt;div style=&amp;quot;margin-top: 2rem; border-bottom: 1px solid black; position: relative;&amp;quot;&amp;gt;&lt;br /&gt;
        Oßwald &amp;amp; Schlegel GbR, Uhlandstr.3, 72820 Sonnenbühl&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;anschriftzone&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;?=$customerAddress?&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div id=&amp;quot;informationsblock&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;?=$companyAddress?&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;rechnungsnummer&amp;quot;&amp;gt;UStID: DE378376036&amp;lt;br&amp;gt;Rechnungsnummer: &amp;lt;?=$prefix.$order-&amp;gt;invoice_id?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div id=&amp;quot;textblock&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;betreff&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;datum&amp;quot;&amp;gt;&amp;lt;?=date(&amp;#039;d.m.Y&amp;#039;)?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;strong&amp;gt;RECHNUNG&amp;lt;/strong&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;text&amp;quot;&amp;gt;     &lt;br /&gt;
        &amp;lt;?=$productsTable?&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;rechtstexte&amp;quot;&amp;gt;&lt;br /&gt;
          Es wird gemäß §19 Abs. 1 Umsatzsteuergesetz keine Umsatzsteuer erhoben (Kleinunternehmerregelung).&amp;lt;br&amp;gt;&lt;br /&gt;
          Leistungsdatum = Rechnungsdatum&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;htmlpagefooter name=&amp;quot;InvoiceFooter&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;footer&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;strong&amp;gt;Oßwald &amp;amp; Schlegel GbR | Geschenke vom Lande&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Volksbank Ermstal-Alb eG | IBAN: DE09 6409 1200 05 71 2200 02 | BIC: GENODES1MTZ | Kontoinhaber: Stephan Schlegel&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/htmlpagefooter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;sethtmlpagefooter name=&amp;quot;InvoiceFooter&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weitere Beispiele ==&lt;br /&gt;
=== Aus Modul in Datei schreiben ===&lt;br /&gt;
Beispiel aus dem Modul EasyOffice (eigenes Modul)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wire()-&amp;gt;message(&amp;quot;Rechnungs PDF wird erzeugt.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Create HTML&lt;br /&gt;
$t = $this-&amp;gt;getPdfTemplate($this-&amp;gt;invoicePdfTemplate);&lt;br /&gt;
invoicePdfTemplate is configured as module setting and defines which html template is used&lt;br /&gt;
// set fields&lt;br /&gt;
$t-&amp;gt;set(&amp;#039;p&amp;#039;, $p); // make all invoice fields available in t&lt;br /&gt;
$positionsTable = $this-&amp;gt;renderPositions($p);&lt;br /&gt;
$t-&amp;gt;set(&amp;#039;positionsTable&amp;#039;,  $positionsTable);&lt;br /&gt;
$html = $t-&amp;gt;render();&lt;br /&gt;
&lt;br /&gt;
// Create PDF from HTML&lt;br /&gt;
$pdf = $this-&amp;gt;modules-&amp;gt;get(&amp;#039;RockPdf&amp;#039;);&lt;br /&gt;
$mpdf = $pdf-&amp;gt;mpdf;&lt;br /&gt;
$mpdf-&amp;gt;Bookmark(&amp;#039;RECHNUNG&amp;#039;);&lt;br /&gt;
$mpdf-&amp;gt;WriteHTML($html);&lt;br /&gt;
&lt;br /&gt;
// Write in file&lt;br /&gt;
$filename = $p-&amp;gt;invoice_number_external.&amp;#039;.pdf&amp;#039;;// use invoice number as filename&lt;br /&gt;
$path = wire()-&amp;gt;config-&amp;gt;paths-&amp;gt;siteModules.&amp;#039;EasyOffice/pdf/&amp;#039;.$filename;&lt;br /&gt;
$mpdf-&amp;gt;output($path,&amp;#039;F&amp;#039;); // F-&amp;gt;write file&lt;br /&gt;
return $path.$filename;&lt;br /&gt;
&lt;br /&gt;
// ...&lt;br /&gt;
&lt;br /&gt;
// this is how we can get our templates directory. User can place his own templates inside templates folder in an easyoffice folder&lt;br /&gt;
public function getPdfTemplate($file) {&lt;br /&gt;
    $templatePath = __DIR__ . &amp;quot;/templates/&amp;quot; . $file;&lt;br /&gt;
    if (file_exists($this-&amp;gt;config-&amp;gt;paths-&amp;gt;templates . &amp;quot;easyoffice/&amp;quot; . $file)) {&lt;br /&gt;
      $templatePath = $this-&amp;gt;config-&amp;gt;paths-&amp;gt;templates . &amp;quot;easyoffice/&amp;quot; . $file;&lt;br /&gt;
    }&lt;br /&gt;
    return new TemplateFile($templatePath);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== PDF als Pagefile speichern ====&lt;br /&gt;
Wenn das Template ein File-Feld hat kann man die Datei an die Seite hängen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$path = $pdf-&amp;gt;create($p);&lt;br /&gt;
// Attach file to invoice as pagefile (field pdf)&lt;br /&gt;
$p-&amp;gt;of(false);&lt;br /&gt;
$p-&amp;gt;pdf-&amp;gt;add($path);&lt;br /&gt;
$p-&amp;gt;save(&amp;#039;pdf&amp;#039;);&lt;br /&gt;
$p-&amp;gt;save();&lt;br /&gt;
// Delete temporary file &lt;br /&gt;
unlink($path);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.136.109.36</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_RockPdf_(Module)&amp;diff=25266</id>
		<title>ProcessWire - RockPdf (Module)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_RockPdf_(Module)&amp;diff=25266"/>
		<updated>2021-02-05T07:03:09Z</updated>

		<summary type="html">&lt;p&gt;84.136.109.36: /* Aus Modul in Datei schreiben */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Modul zum Erzeugen von pdf Dateien. Basiert auf der mpdf Library.&lt;br /&gt;
&lt;br /&gt;
== PDF aus HTML Vorlage ==&lt;br /&gt;
Beispiel aus eigener PadLoper Erweiterung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Create HTML&lt;br /&gt;
$t = $this-&amp;gt;modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;getPadTemplate(&amp;quot;invoice.php&amp;quot;);&lt;br /&gt;
$t-&amp;gt;set(&amp;quot;order&amp;quot;, $order);&lt;br /&gt;
$html = $t-&amp;gt;render();&lt;br /&gt;
                &lt;br /&gt;
// Create PDF from HTML&lt;br /&gt;
$pdf = $this-&amp;gt;modules-&amp;gt;get(&amp;#039;RockPdf&amp;#039;);&lt;br /&gt;
$mpdf = $pdf-&amp;gt;mpdf;&lt;br /&gt;
//$mpdf-&amp;gt;Bookmark(&amp;#039;RECHNUNG&amp;#039;);&lt;br /&gt;
$mpdf-&amp;gt;WriteHTML($html);&lt;br /&gt;
$mpdf-&amp;gt;output();&lt;br /&gt;
exit();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire; &lt;br /&gt;
/**&lt;br /&gt;
 * INVOICE&lt;br /&gt;
 * we have PadOrder object $order ready to go&lt;br /&gt;
 */&lt;br /&gt;
if(!$order-&amp;gt;invoice_id){&lt;br /&gt;
  echo(&amp;quot;Für diese Bestellung wurde noch keine Rechnungsnummer erstellt. Du kannst unter Verwaltung &amp;gt; Padloper Rechnungen eine Nummer erstellen.&amp;quot;);&lt;br /&gt;
  exit();&lt;br /&gt;
}&lt;br /&gt;
$configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); &lt;br /&gt;
$padRender = $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;);&lt;br /&gt;
$padInvoices = $modules-&amp;gt;get(&amp;quot;PadInvoices&amp;quot;); //needed for order prefix&lt;br /&gt;
$prefix = $padInvoices-&amp;gt;getPrefix();&lt;br /&gt;
//$padProcess = $modules-&amp;gt;get(&amp;quot;PadProcess&amp;quot;);&lt;br /&gt;
// logo &lt;br /&gt;
$logo = $configpage-&amp;gt;site_brandmark;&lt;br /&gt;
$logoUrl = $logo-&amp;gt;first()-&amp;gt;httpUrl;&lt;br /&gt;
//bd($order,&amp;#039;order&amp;#039;);&lt;br /&gt;
// Customer Data&lt;br /&gt;
$customerAddress = &amp;#039;&amp;#039;;&lt;br /&gt;
$customerAddress .= $order-&amp;gt;pad_firstname . &amp;quot; &amp;quot; . $order-&amp;gt;pad_lastname.&amp;#039;&amp;lt;br&amp;gt;&amp;#039;;&lt;br /&gt;
if ($order-&amp;gt;pad_address) $customerAddress .= $order-&amp;gt;pad_address . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
if ($order-&amp;gt;pad_address_cont) $customerAddress .= $order-&amp;gt;pad_address_cont . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
if ($order-&amp;gt;pad_city || $order-&amp;gt;pad_postcode) {&lt;br /&gt;
  if ($order-&amp;gt;pad_postcode) $customerAddress .= $order-&amp;gt;pad_postcode . &amp;quot; &amp;quot;;&lt;br /&gt;
  $customerAddress .=  $order-&amp;gt;pad_city;&lt;br /&gt;
} &lt;br /&gt;
// Company Data&lt;br /&gt;
$companyAddress = nl2br($configpage-&amp;gt;company_information);&lt;br /&gt;
&lt;br /&gt;
// Products Table&lt;br /&gt;
$t = $padRender-&amp;gt;getPadTemplate(&amp;quot;order-products-table.php&amp;quot;);&lt;br /&gt;
$t-&amp;gt;set(&amp;quot;order&amp;quot;, $order);&lt;br /&gt;
$productsTable = $t-&amp;gt;render();&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;meta title=&amp;quot;Rechnung&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&amp;lt;?= __(&amp;quot;Invoice&amp;quot;) ?&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;style&amp;gt;&lt;br /&gt;
      /* LETTER A4 Styles (oriented at DIN 5008) */&lt;br /&gt;
      body{&lt;br /&gt;
        font-family: sans-serif;&lt;br /&gt;
        font-size: 10pt;&lt;br /&gt;
      }&lt;br /&gt;
      div {&lt;br /&gt;
        box-sizing: border-box;&lt;br /&gt;
        /*border: 1px solid pink;*/&lt;br /&gt;
      }&lt;br /&gt;
      .small {&lt;br /&gt;
        font-size: 9pt;&lt;br /&gt;
      }&lt;br /&gt;
      table{&lt;br /&gt;
        border-collapse: collapse;&lt;br /&gt;
        font-size: 10pt;&lt;br /&gt;
      }&lt;br /&gt;
      td{&lt;br /&gt;
        border-top: 1px solid #999;&lt;br /&gt;
      }&lt;br /&gt;
      #header{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 0;&lt;br /&gt;
        left:0;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
      }&lt;br /&gt;
      #logo{&lt;br /&gt;
        padding-top:0.7cm;&lt;br /&gt;
        width: 3cm;&lt;br /&gt;
      }&lt;br /&gt;
      #anschrift{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 4.5cm;&lt;br /&gt;
        left: 2cm;&lt;br /&gt;
        height: 4.5cm;&lt;br /&gt;
        width: 8.5cm;&lt;br /&gt;
        padding-left: 0.5cm;&lt;br /&gt;
      }&lt;br /&gt;
      #vermerkzone{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 0;&lt;br /&gt;
        left: 0;&lt;br /&gt;
        height: 1.77cm;&lt;br /&gt;
        width: 8.5cm;&lt;br /&gt;
        padding-top: 0.5rem;&lt;br /&gt;
      }&lt;br /&gt;
      #anschriftzone{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 1.77cm;&lt;br /&gt;
        left: 0;&lt;br /&gt;
        width: 8.5cm;&lt;br /&gt;
        height: 2.73cm;&lt;br /&gt;
      }&lt;br /&gt;
      #informationsblock{&lt;br /&gt;
        font-size: 10pt;&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 5cm;&lt;br /&gt;
        right: 1cm;&lt;br /&gt;
        width: 7.5cm;&lt;br /&gt;
        height: auto;&lt;br /&gt;
      }&lt;br /&gt;
      #datum{&lt;br /&gt;
        position: relative;&lt;br /&gt;
        text-align: right;&lt;br /&gt;
        padding: 2rem 0 2rem 0;&lt;br /&gt;
      }&lt;br /&gt;
      #rechnungsnummer{&lt;br /&gt;
        position: relative;&lt;br /&gt;
        text-align: left;&lt;br /&gt;
        margin-top: 1rem;&lt;br /&gt;
      }&lt;br /&gt;
      #textblock{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 10.1cm;&lt;br /&gt;
        left: 2.5cm;&lt;br /&gt;
        right: 2cm;&lt;br /&gt;
        height: auto;&lt;br /&gt;
      }&lt;br /&gt;
      #betreff{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 2rem;&lt;br /&gt;
      }&lt;br /&gt;
      #text{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        margin-top: 1rem;&lt;br /&gt;
      }&lt;br /&gt;
      #rechtstexte{&lt;br /&gt;
        position: relative;&lt;br /&gt;
        padding-top: 1rem;&lt;br /&gt;
      }&lt;br /&gt;
      #footer{&lt;br /&gt;
        text-align: center;&lt;br /&gt;
        font-size: 9pt;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div id=&amp;quot;header&amp;quot; class=&amp;quot;section&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;img id=&amp;quot;logo&amp;quot; src=&amp;quot;&amp;lt;?=$logoUrl?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div id=&amp;quot;anschrift&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;vermerkzone&amp;quot; class=&amp;quot;small&amp;quot; &amp;gt;&lt;br /&gt;
        &amp;lt;div style=&amp;quot;margin-top: 2rem; border-bottom: 1px solid black; position: relative;&amp;quot;&amp;gt;&lt;br /&gt;
        Oßwald &amp;amp; Schlegel GbR, Uhlandstr.3, 72820 Sonnenbühl&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;anschriftzone&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;?=$customerAddress?&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div id=&amp;quot;informationsblock&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;?=$companyAddress?&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;rechnungsnummer&amp;quot;&amp;gt;UStID: DE378376036&amp;lt;br&amp;gt;Rechnungsnummer: &amp;lt;?=$prefix.$order-&amp;gt;invoice_id?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div id=&amp;quot;textblock&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;betreff&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;datum&amp;quot;&amp;gt;&amp;lt;?=date(&amp;#039;d.m.Y&amp;#039;)?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;strong&amp;gt;RECHNUNG&amp;lt;/strong&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;text&amp;quot;&amp;gt;     &lt;br /&gt;
        &amp;lt;?=$productsTable?&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;rechtstexte&amp;quot;&amp;gt;&lt;br /&gt;
          Es wird gemäß §19 Abs. 1 Umsatzsteuergesetz keine Umsatzsteuer erhoben (Kleinunternehmerregelung).&amp;lt;br&amp;gt;&lt;br /&gt;
          Leistungsdatum = Rechnungsdatum&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;htmlpagefooter name=&amp;quot;InvoiceFooter&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;footer&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;strong&amp;gt;Oßwald &amp;amp; Schlegel GbR | Geschenke vom Lande&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Volksbank Ermstal-Alb eG | IBAN: DE09 6409 1200 05 71 2200 02 | BIC: GENODES1MTZ | Kontoinhaber: Stephan Schlegel&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/htmlpagefooter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;sethtmlpagefooter name=&amp;quot;InvoiceFooter&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weitere Beispiele ==&lt;br /&gt;
=== Aus Modul in Datei schreiben ===&lt;br /&gt;
Beispiel aus dem Modul EasyOffice (eigenes Modul)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wire()-&amp;gt;message(&amp;quot;Rechnungs PDF wird erzeugt.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Create HTML&lt;br /&gt;
$t = $this-&amp;gt;getPdfTemplate($this-&amp;gt;invoicePdfTemplate);&lt;br /&gt;
invoicePdfTemplate is configured as module setting and defines which html template is used&lt;br /&gt;
// set fields&lt;br /&gt;
$t-&amp;gt;set(&amp;#039;p&amp;#039;, $p); // make all invoice fields available in t&lt;br /&gt;
$positionsTable = $this-&amp;gt;renderPositions($p);&lt;br /&gt;
$t-&amp;gt;set(&amp;#039;positionsTable&amp;#039;,  $positionsTable);&lt;br /&gt;
$html = $t-&amp;gt;render();&lt;br /&gt;
&lt;br /&gt;
// Create PDF from HTML&lt;br /&gt;
$pdf = $this-&amp;gt;modules-&amp;gt;get(&amp;#039;RockPdf&amp;#039;);&lt;br /&gt;
$mpdf = $pdf-&amp;gt;mpdf;&lt;br /&gt;
$mpdf-&amp;gt;Bookmark(&amp;#039;RECHNUNG&amp;#039;);&lt;br /&gt;
$mpdf-&amp;gt;WriteHTML($html);&lt;br /&gt;
&lt;br /&gt;
// Write in file&lt;br /&gt;
$filename = $p-&amp;gt;invoice_number_external.&amp;#039;.pdf&amp;#039;;// use invoice number as filename&lt;br /&gt;
$path = wire()-&amp;gt;config-&amp;gt;paths-&amp;gt;siteModules.&amp;#039;EasyOffice/pdf/&amp;#039;.$filename;&lt;br /&gt;
$mpdf-&amp;gt;output($path,&amp;#039;F&amp;#039;); // F-&amp;gt;write file&lt;br /&gt;
return $path.$filename;&lt;br /&gt;
&lt;br /&gt;
// ...&lt;br /&gt;
&lt;br /&gt;
// this is how we can get our templates directory. User can place his own templates inside templates folder in an easyoffice folder&lt;br /&gt;
public function getPdfTemplate($file) {&lt;br /&gt;
    $templatePath = __DIR__ . &amp;quot;/templates/&amp;quot; . $file;&lt;br /&gt;
    if (file_exists($this-&amp;gt;config-&amp;gt;paths-&amp;gt;templates . &amp;quot;easyoffice/&amp;quot; . $file)) {&lt;br /&gt;
      $templatePath = $this-&amp;gt;config-&amp;gt;paths-&amp;gt;templates . &amp;quot;easyoffice/&amp;quot; . $file;&lt;br /&gt;
    }&lt;br /&gt;
    return new TemplateFile($templatePath);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.136.109.36</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_RockPdf_(Module)&amp;diff=25265</id>
		<title>ProcessWire - RockPdf (Module)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_RockPdf_(Module)&amp;diff=25265"/>
		<updated>2021-02-05T07:02:19Z</updated>

		<summary type="html">&lt;p&gt;84.136.109.36: /* Aus Modul in Datei schreiben */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Modul zum Erzeugen von pdf Dateien. Basiert auf der mpdf Library.&lt;br /&gt;
&lt;br /&gt;
== PDF aus HTML Vorlage ==&lt;br /&gt;
Beispiel aus eigener PadLoper Erweiterung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Create HTML&lt;br /&gt;
$t = $this-&amp;gt;modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;getPadTemplate(&amp;quot;invoice.php&amp;quot;);&lt;br /&gt;
$t-&amp;gt;set(&amp;quot;order&amp;quot;, $order);&lt;br /&gt;
$html = $t-&amp;gt;render();&lt;br /&gt;
                &lt;br /&gt;
// Create PDF from HTML&lt;br /&gt;
$pdf = $this-&amp;gt;modules-&amp;gt;get(&amp;#039;RockPdf&amp;#039;);&lt;br /&gt;
$mpdf = $pdf-&amp;gt;mpdf;&lt;br /&gt;
//$mpdf-&amp;gt;Bookmark(&amp;#039;RECHNUNG&amp;#039;);&lt;br /&gt;
$mpdf-&amp;gt;WriteHTML($html);&lt;br /&gt;
$mpdf-&amp;gt;output();&lt;br /&gt;
exit();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire; &lt;br /&gt;
/**&lt;br /&gt;
 * INVOICE&lt;br /&gt;
 * we have PadOrder object $order ready to go&lt;br /&gt;
 */&lt;br /&gt;
if(!$order-&amp;gt;invoice_id){&lt;br /&gt;
  echo(&amp;quot;Für diese Bestellung wurde noch keine Rechnungsnummer erstellt. Du kannst unter Verwaltung &amp;gt; Padloper Rechnungen eine Nummer erstellen.&amp;quot;);&lt;br /&gt;
  exit();&lt;br /&gt;
}&lt;br /&gt;
$configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); &lt;br /&gt;
$padRender = $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;);&lt;br /&gt;
$padInvoices = $modules-&amp;gt;get(&amp;quot;PadInvoices&amp;quot;); //needed for order prefix&lt;br /&gt;
$prefix = $padInvoices-&amp;gt;getPrefix();&lt;br /&gt;
//$padProcess = $modules-&amp;gt;get(&amp;quot;PadProcess&amp;quot;);&lt;br /&gt;
// logo &lt;br /&gt;
$logo = $configpage-&amp;gt;site_brandmark;&lt;br /&gt;
$logoUrl = $logo-&amp;gt;first()-&amp;gt;httpUrl;&lt;br /&gt;
//bd($order,&amp;#039;order&amp;#039;);&lt;br /&gt;
// Customer Data&lt;br /&gt;
$customerAddress = &amp;#039;&amp;#039;;&lt;br /&gt;
$customerAddress .= $order-&amp;gt;pad_firstname . &amp;quot; &amp;quot; . $order-&amp;gt;pad_lastname.&amp;#039;&amp;lt;br&amp;gt;&amp;#039;;&lt;br /&gt;
if ($order-&amp;gt;pad_address) $customerAddress .= $order-&amp;gt;pad_address . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
if ($order-&amp;gt;pad_address_cont) $customerAddress .= $order-&amp;gt;pad_address_cont . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
if ($order-&amp;gt;pad_city || $order-&amp;gt;pad_postcode) {&lt;br /&gt;
  if ($order-&amp;gt;pad_postcode) $customerAddress .= $order-&amp;gt;pad_postcode . &amp;quot; &amp;quot;;&lt;br /&gt;
  $customerAddress .=  $order-&amp;gt;pad_city;&lt;br /&gt;
} &lt;br /&gt;
// Company Data&lt;br /&gt;
$companyAddress = nl2br($configpage-&amp;gt;company_information);&lt;br /&gt;
&lt;br /&gt;
// Products Table&lt;br /&gt;
$t = $padRender-&amp;gt;getPadTemplate(&amp;quot;order-products-table.php&amp;quot;);&lt;br /&gt;
$t-&amp;gt;set(&amp;quot;order&amp;quot;, $order);&lt;br /&gt;
$productsTable = $t-&amp;gt;render();&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;meta title=&amp;quot;Rechnung&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&amp;lt;?= __(&amp;quot;Invoice&amp;quot;) ?&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;style&amp;gt;&lt;br /&gt;
      /* LETTER A4 Styles (oriented at DIN 5008) */&lt;br /&gt;
      body{&lt;br /&gt;
        font-family: sans-serif;&lt;br /&gt;
        font-size: 10pt;&lt;br /&gt;
      }&lt;br /&gt;
      div {&lt;br /&gt;
        box-sizing: border-box;&lt;br /&gt;
        /*border: 1px solid pink;*/&lt;br /&gt;
      }&lt;br /&gt;
      .small {&lt;br /&gt;
        font-size: 9pt;&lt;br /&gt;
      }&lt;br /&gt;
      table{&lt;br /&gt;
        border-collapse: collapse;&lt;br /&gt;
        font-size: 10pt;&lt;br /&gt;
      }&lt;br /&gt;
      td{&lt;br /&gt;
        border-top: 1px solid #999;&lt;br /&gt;
      }&lt;br /&gt;
      #header{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 0;&lt;br /&gt;
        left:0;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
      }&lt;br /&gt;
      #logo{&lt;br /&gt;
        padding-top:0.7cm;&lt;br /&gt;
        width: 3cm;&lt;br /&gt;
      }&lt;br /&gt;
      #anschrift{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 4.5cm;&lt;br /&gt;
        left: 2cm;&lt;br /&gt;
        height: 4.5cm;&lt;br /&gt;
        width: 8.5cm;&lt;br /&gt;
        padding-left: 0.5cm;&lt;br /&gt;
      }&lt;br /&gt;
      #vermerkzone{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 0;&lt;br /&gt;
        left: 0;&lt;br /&gt;
        height: 1.77cm;&lt;br /&gt;
        width: 8.5cm;&lt;br /&gt;
        padding-top: 0.5rem;&lt;br /&gt;
      }&lt;br /&gt;
      #anschriftzone{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 1.77cm;&lt;br /&gt;
        left: 0;&lt;br /&gt;
        width: 8.5cm;&lt;br /&gt;
        height: 2.73cm;&lt;br /&gt;
      }&lt;br /&gt;
      #informationsblock{&lt;br /&gt;
        font-size: 10pt;&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 5cm;&lt;br /&gt;
        right: 1cm;&lt;br /&gt;
        width: 7.5cm;&lt;br /&gt;
        height: auto;&lt;br /&gt;
      }&lt;br /&gt;
      #datum{&lt;br /&gt;
        position: relative;&lt;br /&gt;
        text-align: right;&lt;br /&gt;
        padding: 2rem 0 2rem 0;&lt;br /&gt;
      }&lt;br /&gt;
      #rechnungsnummer{&lt;br /&gt;
        position: relative;&lt;br /&gt;
        text-align: left;&lt;br /&gt;
        margin-top: 1rem;&lt;br /&gt;
      }&lt;br /&gt;
      #textblock{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 10.1cm;&lt;br /&gt;
        left: 2.5cm;&lt;br /&gt;
        right: 2cm;&lt;br /&gt;
        height: auto;&lt;br /&gt;
      }&lt;br /&gt;
      #betreff{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 2rem;&lt;br /&gt;
      }&lt;br /&gt;
      #text{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        margin-top: 1rem;&lt;br /&gt;
      }&lt;br /&gt;
      #rechtstexte{&lt;br /&gt;
        position: relative;&lt;br /&gt;
        padding-top: 1rem;&lt;br /&gt;
      }&lt;br /&gt;
      #footer{&lt;br /&gt;
        text-align: center;&lt;br /&gt;
        font-size: 9pt;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div id=&amp;quot;header&amp;quot; class=&amp;quot;section&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;img id=&amp;quot;logo&amp;quot; src=&amp;quot;&amp;lt;?=$logoUrl?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div id=&amp;quot;anschrift&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;vermerkzone&amp;quot; class=&amp;quot;small&amp;quot; &amp;gt;&lt;br /&gt;
        &amp;lt;div style=&amp;quot;margin-top: 2rem; border-bottom: 1px solid black; position: relative;&amp;quot;&amp;gt;&lt;br /&gt;
        Oßwald &amp;amp; Schlegel GbR, Uhlandstr.3, 72820 Sonnenbühl&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;anschriftzone&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;?=$customerAddress?&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div id=&amp;quot;informationsblock&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;?=$companyAddress?&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;rechnungsnummer&amp;quot;&amp;gt;UStID: DE378376036&amp;lt;br&amp;gt;Rechnungsnummer: &amp;lt;?=$prefix.$order-&amp;gt;invoice_id?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div id=&amp;quot;textblock&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;betreff&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;datum&amp;quot;&amp;gt;&amp;lt;?=date(&amp;#039;d.m.Y&amp;#039;)?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;strong&amp;gt;RECHNUNG&amp;lt;/strong&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;text&amp;quot;&amp;gt;     &lt;br /&gt;
        &amp;lt;?=$productsTable?&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;rechtstexte&amp;quot;&amp;gt;&lt;br /&gt;
          Es wird gemäß §19 Abs. 1 Umsatzsteuergesetz keine Umsatzsteuer erhoben (Kleinunternehmerregelung).&amp;lt;br&amp;gt;&lt;br /&gt;
          Leistungsdatum = Rechnungsdatum&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;htmlpagefooter name=&amp;quot;InvoiceFooter&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;footer&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;strong&amp;gt;Oßwald &amp;amp; Schlegel GbR | Geschenke vom Lande&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Volksbank Ermstal-Alb eG | IBAN: DE09 6409 1200 05 71 2200 02 | BIC: GENODES1MTZ | Kontoinhaber: Stephan Schlegel&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/htmlpagefooter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;sethtmlpagefooter name=&amp;quot;InvoiceFooter&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weitere Beispiele ==&lt;br /&gt;
=== Aus Modul in Datei schreiben ===&lt;br /&gt;
Beispiel aus dem Modul EasyOffice (eigenes Modul)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wire()-&amp;gt;message(&amp;quot;Rechnungs PDF wird erzeugt.&amp;quot;);&lt;br /&gt;
// Create HTML&lt;br /&gt;
$t = $this-&amp;gt;getPdfTemplate($this-&amp;gt;invoicePdfTemplate);&lt;br /&gt;
invoicePdfTemplate is configured as module setting and defines which html template is used&lt;br /&gt;
// set fields&lt;br /&gt;
$t-&amp;gt;set(&amp;#039;p&amp;#039;, $p); // make all invoice fields available in t&lt;br /&gt;
$positionsTable = $this-&amp;gt;renderPositions($p);&lt;br /&gt;
$t-&amp;gt;set(&amp;#039;positionsTable&amp;#039;,  $positionsTable);&lt;br /&gt;
$html = $t-&amp;gt;render();&lt;br /&gt;
// Create PDF from HTML&lt;br /&gt;
$pdf = $this-&amp;gt;modules-&amp;gt;get(&amp;#039;RockPdf&amp;#039;);&lt;br /&gt;
$mpdf = $pdf-&amp;gt;mpdf;&lt;br /&gt;
$mpdf-&amp;gt;Bookmark(&amp;#039;RECHNUNG&amp;#039;);&lt;br /&gt;
$mpdf-&amp;gt;WriteHTML($html);&lt;br /&gt;
$filename = $p-&amp;gt;invoice_number_external.&amp;#039;.pdf&amp;#039;;// use invoice number as filename&lt;br /&gt;
$path = wire()-&amp;gt;config-&amp;gt;paths-&amp;gt;siteModules.&amp;#039;EasyOffice/pdf/&amp;#039;.$filename;&lt;br /&gt;
$mpdf-&amp;gt;output($path,&amp;#039;F&amp;#039;); // F-&amp;gt;write file&lt;br /&gt;
return $path.$filename;&lt;br /&gt;
&lt;br /&gt;
// ...&lt;br /&gt;
&lt;br /&gt;
// this is how we can get our templates directory. User can place his own templates inside templates folder in an easyoffice folder&lt;br /&gt;
public function getPdfTemplate($file) {&lt;br /&gt;
    $templatePath = __DIR__ . &amp;quot;/templates/&amp;quot; . $file;&lt;br /&gt;
    if (file_exists($this-&amp;gt;config-&amp;gt;paths-&amp;gt;templates . &amp;quot;easyoffice/&amp;quot; . $file)) {&lt;br /&gt;
      $templatePath = $this-&amp;gt;config-&amp;gt;paths-&amp;gt;templates . &amp;quot;easyoffice/&amp;quot; . $file;&lt;br /&gt;
    }&lt;br /&gt;
    return new TemplateFile($templatePath);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.136.109.36</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_RockPdf_(Module)&amp;diff=25264</id>
		<title>ProcessWire - RockPdf (Module)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_RockPdf_(Module)&amp;diff=25264"/>
		<updated>2021-02-05T06:56:17Z</updated>

		<summary type="html">&lt;p&gt;84.136.109.36: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Modul zum Erzeugen von pdf Dateien. Basiert auf der mpdf Library.&lt;br /&gt;
&lt;br /&gt;
== PDF aus HTML Vorlage ==&lt;br /&gt;
Beispiel aus eigener PadLoper Erweiterung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Create HTML&lt;br /&gt;
$t = $this-&amp;gt;modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;)-&amp;gt;getPadTemplate(&amp;quot;invoice.php&amp;quot;);&lt;br /&gt;
$t-&amp;gt;set(&amp;quot;order&amp;quot;, $order);&lt;br /&gt;
$html = $t-&amp;gt;render();&lt;br /&gt;
                &lt;br /&gt;
// Create PDF from HTML&lt;br /&gt;
$pdf = $this-&amp;gt;modules-&amp;gt;get(&amp;#039;RockPdf&amp;#039;);&lt;br /&gt;
$mpdf = $pdf-&amp;gt;mpdf;&lt;br /&gt;
//$mpdf-&amp;gt;Bookmark(&amp;#039;RECHNUNG&amp;#039;);&lt;br /&gt;
$mpdf-&amp;gt;WriteHTML($html);&lt;br /&gt;
$mpdf-&amp;gt;output();&lt;br /&gt;
exit();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire; &lt;br /&gt;
/**&lt;br /&gt;
 * INVOICE&lt;br /&gt;
 * we have PadOrder object $order ready to go&lt;br /&gt;
 */&lt;br /&gt;
if(!$order-&amp;gt;invoice_id){&lt;br /&gt;
  echo(&amp;quot;Für diese Bestellung wurde noch keine Rechnungsnummer erstellt. Du kannst unter Verwaltung &amp;gt; Padloper Rechnungen eine Nummer erstellen.&amp;quot;);&lt;br /&gt;
  exit();&lt;br /&gt;
}&lt;br /&gt;
$configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); &lt;br /&gt;
$padRender = $modules-&amp;gt;get(&amp;quot;PadRender&amp;quot;);&lt;br /&gt;
$padInvoices = $modules-&amp;gt;get(&amp;quot;PadInvoices&amp;quot;); //needed for order prefix&lt;br /&gt;
$prefix = $padInvoices-&amp;gt;getPrefix();&lt;br /&gt;
//$padProcess = $modules-&amp;gt;get(&amp;quot;PadProcess&amp;quot;);&lt;br /&gt;
// logo &lt;br /&gt;
$logo = $configpage-&amp;gt;site_brandmark;&lt;br /&gt;
$logoUrl = $logo-&amp;gt;first()-&amp;gt;httpUrl;&lt;br /&gt;
//bd($order,&amp;#039;order&amp;#039;);&lt;br /&gt;
// Customer Data&lt;br /&gt;
$customerAddress = &amp;#039;&amp;#039;;&lt;br /&gt;
$customerAddress .= $order-&amp;gt;pad_firstname . &amp;quot; &amp;quot; . $order-&amp;gt;pad_lastname.&amp;#039;&amp;lt;br&amp;gt;&amp;#039;;&lt;br /&gt;
if ($order-&amp;gt;pad_address) $customerAddress .= $order-&amp;gt;pad_address . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
if ($order-&amp;gt;pad_address_cont) $customerAddress .= $order-&amp;gt;pad_address_cont . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
if ($order-&amp;gt;pad_city || $order-&amp;gt;pad_postcode) {&lt;br /&gt;
  if ($order-&amp;gt;pad_postcode) $customerAddress .= $order-&amp;gt;pad_postcode . &amp;quot; &amp;quot;;&lt;br /&gt;
  $customerAddress .=  $order-&amp;gt;pad_city;&lt;br /&gt;
} &lt;br /&gt;
// Company Data&lt;br /&gt;
$companyAddress = nl2br($configpage-&amp;gt;company_information);&lt;br /&gt;
&lt;br /&gt;
// Products Table&lt;br /&gt;
$t = $padRender-&amp;gt;getPadTemplate(&amp;quot;order-products-table.php&amp;quot;);&lt;br /&gt;
$t-&amp;gt;set(&amp;quot;order&amp;quot;, $order);&lt;br /&gt;
$productsTable = $t-&amp;gt;render();&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;meta title=&amp;quot;Rechnung&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&amp;lt;?= __(&amp;quot;Invoice&amp;quot;) ?&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;style&amp;gt;&lt;br /&gt;
      /* LETTER A4 Styles (oriented at DIN 5008) */&lt;br /&gt;
      body{&lt;br /&gt;
        font-family: sans-serif;&lt;br /&gt;
        font-size: 10pt;&lt;br /&gt;
      }&lt;br /&gt;
      div {&lt;br /&gt;
        box-sizing: border-box;&lt;br /&gt;
        /*border: 1px solid pink;*/&lt;br /&gt;
      }&lt;br /&gt;
      .small {&lt;br /&gt;
        font-size: 9pt;&lt;br /&gt;
      }&lt;br /&gt;
      table{&lt;br /&gt;
        border-collapse: collapse;&lt;br /&gt;
        font-size: 10pt;&lt;br /&gt;
      }&lt;br /&gt;
      td{&lt;br /&gt;
        border-top: 1px solid #999;&lt;br /&gt;
      }&lt;br /&gt;
      #header{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 0;&lt;br /&gt;
        left:0;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
      }&lt;br /&gt;
      #logo{&lt;br /&gt;
        padding-top:0.7cm;&lt;br /&gt;
        width: 3cm;&lt;br /&gt;
      }&lt;br /&gt;
      #anschrift{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 4.5cm;&lt;br /&gt;
        left: 2cm;&lt;br /&gt;
        height: 4.5cm;&lt;br /&gt;
        width: 8.5cm;&lt;br /&gt;
        padding-left: 0.5cm;&lt;br /&gt;
      }&lt;br /&gt;
      #vermerkzone{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 0;&lt;br /&gt;
        left: 0;&lt;br /&gt;
        height: 1.77cm;&lt;br /&gt;
        width: 8.5cm;&lt;br /&gt;
        padding-top: 0.5rem;&lt;br /&gt;
      }&lt;br /&gt;
      #anschriftzone{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 1.77cm;&lt;br /&gt;
        left: 0;&lt;br /&gt;
        width: 8.5cm;&lt;br /&gt;
        height: 2.73cm;&lt;br /&gt;
      }&lt;br /&gt;
      #informationsblock{&lt;br /&gt;
        font-size: 10pt;&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 5cm;&lt;br /&gt;
        right: 1cm;&lt;br /&gt;
        width: 7.5cm;&lt;br /&gt;
        height: auto;&lt;br /&gt;
      }&lt;br /&gt;
      #datum{&lt;br /&gt;
        position: relative;&lt;br /&gt;
        text-align: right;&lt;br /&gt;
        padding: 2rem 0 2rem 0;&lt;br /&gt;
      }&lt;br /&gt;
      #rechnungsnummer{&lt;br /&gt;
        position: relative;&lt;br /&gt;
        text-align: left;&lt;br /&gt;
        margin-top: 1rem;&lt;br /&gt;
      }&lt;br /&gt;
      #textblock{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 10.1cm;&lt;br /&gt;
        left: 2.5cm;&lt;br /&gt;
        right: 2cm;&lt;br /&gt;
        height: auto;&lt;br /&gt;
      }&lt;br /&gt;
      #betreff{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 2rem;&lt;br /&gt;
      }&lt;br /&gt;
      #text{&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        margin-top: 1rem;&lt;br /&gt;
      }&lt;br /&gt;
      #rechtstexte{&lt;br /&gt;
        position: relative;&lt;br /&gt;
        padding-top: 1rem;&lt;br /&gt;
      }&lt;br /&gt;
      #footer{&lt;br /&gt;
        text-align: center;&lt;br /&gt;
        font-size: 9pt;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div id=&amp;quot;header&amp;quot; class=&amp;quot;section&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;img id=&amp;quot;logo&amp;quot; src=&amp;quot;&amp;lt;?=$logoUrl?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div id=&amp;quot;anschrift&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;vermerkzone&amp;quot; class=&amp;quot;small&amp;quot; &amp;gt;&lt;br /&gt;
        &amp;lt;div style=&amp;quot;margin-top: 2rem; border-bottom: 1px solid black; position: relative;&amp;quot;&amp;gt;&lt;br /&gt;
        Oßwald &amp;amp; Schlegel GbR, Uhlandstr.3, 72820 Sonnenbühl&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;anschriftzone&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;?=$customerAddress?&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div id=&amp;quot;informationsblock&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;?=$companyAddress?&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;rechnungsnummer&amp;quot;&amp;gt;UStID: DE378376036&amp;lt;br&amp;gt;Rechnungsnummer: &amp;lt;?=$prefix.$order-&amp;gt;invoice_id?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div id=&amp;quot;textblock&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;betreff&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;datum&amp;quot;&amp;gt;&amp;lt;?=date(&amp;#039;d.m.Y&amp;#039;)?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;strong&amp;gt;RECHNUNG&amp;lt;/strong&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;text&amp;quot;&amp;gt;     &lt;br /&gt;
        &amp;lt;?=$productsTable?&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;rechtstexte&amp;quot;&amp;gt;&lt;br /&gt;
          Es wird gemäß §19 Abs. 1 Umsatzsteuergesetz keine Umsatzsteuer erhoben (Kleinunternehmerregelung).&amp;lt;br&amp;gt;&lt;br /&gt;
          Leistungsdatum = Rechnungsdatum&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;htmlpagefooter name=&amp;quot;InvoiceFooter&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;footer&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;strong&amp;gt;Oßwald &amp;amp; Schlegel GbR | Geschenke vom Lande&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Volksbank Ermstal-Alb eG | IBAN: DE09 6409 1200 05 71 2200 02 | BIC: GENODES1MTZ | Kontoinhaber: Stephan Schlegel&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/htmlpagefooter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;sethtmlpagefooter name=&amp;quot;InvoiceFooter&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weitere Beispiele ==&lt;br /&gt;
=== Aus Modul in Datei schreiben ===&lt;br /&gt;
Beispiel aus dem Modul EasyOffice (eigenes Modul)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$filename = $p-&amp;gt;invoice_number_external.&amp;#039;.pdf&amp;#039;;&lt;br /&gt;
$path = wire()-&amp;gt;config-&amp;gt;paths-&amp;gt;siteModules.&amp;#039;EasyOffice/pdf/&amp;#039;.$filename;&lt;br /&gt;
$mpdf-&amp;gt;output($path,&amp;#039;F&amp;#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.136.109.36</name></author>
	</entry>
</feed>