<?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=95.208.116.48</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=95.208.116.48"/>
	<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Spezial:Beitr%C3%A4ge/95.208.116.48"/>
	<updated>2026-05-06T14:37:20Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26285</id>
		<title>Microsoft Exchange &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26285"/>
		<updated>2022-10-28T15:58:51Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: /* Teilen des Eigenen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Exchange / Office 365 / Microsoft 365 ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
== Geteilte Postfächer ==&lt;br /&gt;
 https://support.microsoft.com/en-us/office/open-and-use-a-shared-mailbox-in-outlook-d94a8e9e-21f1-4240-808b-de9c9c088afd?wt.mc_id=365admincsh&amp;amp;ui=en-us&amp;amp;rs=en-us&amp;amp;ad=us&lt;br /&gt;
 https://www.youtube.com/watch?v=p3JDq7BHM_Y&lt;br /&gt;
&lt;br /&gt;
=== Anlegen ===&lt;br /&gt;
 Admin &amp;gt; Postfächer &amp;gt; Freigegebenes Postfach hinzufügen&lt;br /&gt;
 Rechte zuweisen &lt;br /&gt;
 Es wird auch ein User erzeugt &amp;gt; Direkten Zugriff Blocken &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== In der Outlook Mac Desktop Version hinzufügen ===&lt;br /&gt;
 Konten &amp;gt; Einstellungen &amp;gt; Erweitert&lt;br /&gt;
&lt;br /&gt;
== Geteilte Kontakte ==&lt;br /&gt;
Entweder eigenes teilen oder gemeinsames über Admin anlegen.&lt;br /&gt;
=== Teilen des Eigenen ===&lt;br /&gt;
 Rechtsklick &amp;gt; Ordnerberechtigungen&lt;br /&gt;
 Standardrechte vergeben falls andere Bearbeiten sollen.&lt;br /&gt;
 Freigeben &amp;gt; Kontakte freigeben&lt;br /&gt;
 Einladungs-E-Mail verschicken&lt;br /&gt;
&lt;br /&gt;
=== Server Variante ===&lt;br /&gt;
 Mindestens ein Postfach für öffentliche Ordner erstellen.&lt;br /&gt;
 https://learn.microsoft.com/de-de/exchange/collaboration/public-folders/create-public-folder-mailboxes?view=exchserver-2019&lt;br /&gt;
 New-Mailbox -PublicFolder -Name &amp;lt;Name&amp;gt;&lt;br /&gt;
 New-Mailbox -PublicFolder -Name &amp;quot;Master Hierarchy&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Erste wird automatisch ein primäres. Danach werden Sekundäre angelegt.&lt;br /&gt;
&lt;br /&gt;
== Alte E-Mails archivieren ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gruppen ==&lt;br /&gt;
Es gibt verschiedene Varianten. Entweder einfache Verteiler oder Gruppen für Teamzusammenarbeit, geteilte Kalender...&lt;br /&gt;
 https://support.microsoft.com/de/office/b565caa1-5c40-40ef-9915-60fdb2d97fa2?WT.mc_id=365AdminCSH_inproduct&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Outlook Ordner in der falschen Sprache ===&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/incorrect-folder-names&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/only-subset-items-synchronized&lt;br /&gt;
&lt;br /&gt;
Methode 1&lt;br /&gt;
&lt;br /&gt;
    Beenden Sie Outlook.&lt;br /&gt;
    Ausführen Outlook.exe /resetfolders.&lt;br /&gt;
    Ausführen Outlook.exe /resetfoldernames.&lt;br /&gt;
&lt;br /&gt;
Methode 2&lt;br /&gt;
 In Outlook WebApp Sprache zweimal umstellen&lt;br /&gt;
&lt;br /&gt;
Methode 3 - Admin Cmdlet&lt;br /&gt;
 set-MailboxRegionalConfiguration -id &amp;lt;alias&amp;gt; -LocalizeDefaultFolderName:$true -Language &amp;lt;Language_code_to_switch_to&amp;gt; -DateFormat &amp;lt;your_preferred_DateFormat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anzeigefehler nach Kopieren von Ordnern ===&lt;br /&gt;
 https://www.anleitungen.rrze.fau.de/e-mail/exchange/beheben-des-fehlers-beim-kopieren-von-ordnern-in-outlook/&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26284</id>
		<title>Microsoft Exchange &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26284"/>
		<updated>2022-10-28T15:57:24Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: /* Geteiltes Adressbuch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Exchange / Office 365 / Microsoft 365 ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
== Geteilte Postfächer ==&lt;br /&gt;
 https://support.microsoft.com/en-us/office/open-and-use-a-shared-mailbox-in-outlook-d94a8e9e-21f1-4240-808b-de9c9c088afd?wt.mc_id=365admincsh&amp;amp;ui=en-us&amp;amp;rs=en-us&amp;amp;ad=us&lt;br /&gt;
 https://www.youtube.com/watch?v=p3JDq7BHM_Y&lt;br /&gt;
&lt;br /&gt;
=== Anlegen ===&lt;br /&gt;
 Admin &amp;gt; Postfächer &amp;gt; Freigegebenes Postfach hinzufügen&lt;br /&gt;
 Rechte zuweisen &lt;br /&gt;
 Es wird auch ein User erzeugt &amp;gt; Direkten Zugriff Blocken &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== In der Outlook Mac Desktop Version hinzufügen ===&lt;br /&gt;
 Konten &amp;gt; Einstellungen &amp;gt; Erweitert&lt;br /&gt;
&lt;br /&gt;
== Geteilte Kontakte ==&lt;br /&gt;
Entweder eigenes teilen oder gemeinsames über Admin anlegen.&lt;br /&gt;
=== Teilen des Eigenen ===&lt;br /&gt;
 Rechtsklick &amp;gt; Freigeben&lt;br /&gt;
 Standardrechte vergeben falls andere Bearbeiten sollen.&lt;br /&gt;
 Einladungs-E-Mail verschicken&lt;br /&gt;
&lt;br /&gt;
=== Server Variante ===&lt;br /&gt;
 Mindestens ein Postfach für öffentliche Ordner erstellen.&lt;br /&gt;
 https://learn.microsoft.com/de-de/exchange/collaboration/public-folders/create-public-folder-mailboxes?view=exchserver-2019&lt;br /&gt;
 New-Mailbox -PublicFolder -Name &amp;lt;Name&amp;gt;&lt;br /&gt;
 New-Mailbox -PublicFolder -Name &amp;quot;Master Hierarchy&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das Erste wird automatisch ein primäres. Danach werden Sekundäre angelegt.&lt;br /&gt;
&lt;br /&gt;
== Alte E-Mails archivieren ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gruppen ==&lt;br /&gt;
Es gibt verschiedene Varianten. Entweder einfache Verteiler oder Gruppen für Teamzusammenarbeit, geteilte Kalender...&lt;br /&gt;
 https://support.microsoft.com/de/office/b565caa1-5c40-40ef-9915-60fdb2d97fa2?WT.mc_id=365AdminCSH_inproduct&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Outlook Ordner in der falschen Sprache ===&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/incorrect-folder-names&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/only-subset-items-synchronized&lt;br /&gt;
&lt;br /&gt;
Methode 1&lt;br /&gt;
&lt;br /&gt;
    Beenden Sie Outlook.&lt;br /&gt;
    Ausführen Outlook.exe /resetfolders.&lt;br /&gt;
    Ausführen Outlook.exe /resetfoldernames.&lt;br /&gt;
&lt;br /&gt;
Methode 2&lt;br /&gt;
 In Outlook WebApp Sprache zweimal umstellen&lt;br /&gt;
&lt;br /&gt;
Methode 3 - Admin Cmdlet&lt;br /&gt;
 set-MailboxRegionalConfiguration -id &amp;lt;alias&amp;gt; -LocalizeDefaultFolderName:$true -Language &amp;lt;Language_code_to_switch_to&amp;gt; -DateFormat &amp;lt;your_preferred_DateFormat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anzeigefehler nach Kopieren von Ordnern ===&lt;br /&gt;
 https://www.anleitungen.rrze.fau.de/e-mail/exchange/beheben-des-fehlers-beim-kopieren-von-ordnern-in-outlook/&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26283</id>
		<title>Microsoft Exchange &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26283"/>
		<updated>2022-10-28T15:53:27Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Exchange / Office 365 / Microsoft 365 ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
== Geteilte Postfächer ==&lt;br /&gt;
 https://support.microsoft.com/en-us/office/open-and-use-a-shared-mailbox-in-outlook-d94a8e9e-21f1-4240-808b-de9c9c088afd?wt.mc_id=365admincsh&amp;amp;ui=en-us&amp;amp;rs=en-us&amp;amp;ad=us&lt;br /&gt;
 https://www.youtube.com/watch?v=p3JDq7BHM_Y&lt;br /&gt;
&lt;br /&gt;
=== Anlegen ===&lt;br /&gt;
 Admin &amp;gt; Postfächer &amp;gt; Freigegebenes Postfach hinzufügen&lt;br /&gt;
 Rechte zuweisen &lt;br /&gt;
 Es wird auch ein User erzeugt &amp;gt; Direkten Zugriff Blocken &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== In der Outlook Mac Desktop Version hinzufügen ===&lt;br /&gt;
 Konten &amp;gt; Einstellungen &amp;gt; Erweitert&lt;br /&gt;
&lt;br /&gt;
== Geteiltes Adressbuch ==&lt;br /&gt;
 Mindestens ein Postfach für öffentliche Ordner erstellen.&lt;br /&gt;
 https://learn.microsoft.com/de-de/exchange/collaboration/public-folders/create-public-folder-mailboxes?view=exchserver-2019&lt;br /&gt;
 New-Mailbox -PublicFolder -Name &amp;lt;Name&amp;gt;&lt;br /&gt;
 New-Mailbox -PublicFolder -Name &amp;quot;Master Hierarchy&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das erste wird automatisch ein primäres. Danach werden Sekundäre angelegt.&lt;br /&gt;
&lt;br /&gt;
== Alte E-Mails archivieren ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gruppen ==&lt;br /&gt;
Es gibt verschiedene Varianten. Entweder einfache Verteiler oder Gruppen für Teamzusammenarbeit, geteilte Kalender...&lt;br /&gt;
 https://support.microsoft.com/de/office/b565caa1-5c40-40ef-9915-60fdb2d97fa2?WT.mc_id=365AdminCSH_inproduct&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Outlook Ordner in der falschen Sprache ===&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/incorrect-folder-names&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/only-subset-items-synchronized&lt;br /&gt;
&lt;br /&gt;
Methode 1&lt;br /&gt;
&lt;br /&gt;
    Beenden Sie Outlook.&lt;br /&gt;
    Ausführen Outlook.exe /resetfolders.&lt;br /&gt;
    Ausführen Outlook.exe /resetfoldernames.&lt;br /&gt;
&lt;br /&gt;
Methode 2&lt;br /&gt;
 In Outlook WebApp Sprache zweimal umstellen&lt;br /&gt;
&lt;br /&gt;
Methode 3 - Admin Cmdlet&lt;br /&gt;
 set-MailboxRegionalConfiguration -id &amp;lt;alias&amp;gt; -LocalizeDefaultFolderName:$true -Language &amp;lt;Language_code_to_switch_to&amp;gt; -DateFormat &amp;lt;your_preferred_DateFormat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anzeigefehler nach Kopieren von Ordnern ===&lt;br /&gt;
 https://www.anleitungen.rrze.fau.de/e-mail/exchange/beheben-des-fehlers-beim-kopieren-von-ordnern-in-outlook/&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Outlook&amp;diff=26282</id>
		<title>Outlook</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Outlook&amp;diff=26282"/>
		<updated>2022-10-28T15:46:25Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: Die Seite wurde neu angelegt: „== Adressbuch ==  https://www.outlook-stuff.com/tipps-tricks/outlook/626-das-outlook-adressbuch-und-die-kontaktablage.html?showall=1&amp;amp;start=0“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Adressbuch ==&lt;br /&gt;
 https://www.outlook-stuff.com/tipps-tricks/outlook/626-das-outlook-adressbuch-und-die-kontaktablage.html?showall=1&amp;amp;start=0&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26281</id>
		<title>Microsoft Exchange &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26281"/>
		<updated>2022-10-28T05:19:32Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: /* Probleme lösen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Exchange / Office 365 / Microsoft 365 ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
== Geteilte Postfächer ==&lt;br /&gt;
 https://support.microsoft.com/en-us/office/open-and-use-a-shared-mailbox-in-outlook-d94a8e9e-21f1-4240-808b-de9c9c088afd?wt.mc_id=365admincsh&amp;amp;ui=en-us&amp;amp;rs=en-us&amp;amp;ad=us&lt;br /&gt;
 https://www.youtube.com/watch?v=p3JDq7BHM_Y&lt;br /&gt;
&lt;br /&gt;
=== Anlegen ===&lt;br /&gt;
 Admin &amp;gt; Postfächer &amp;gt; Freigegebenes Postfach hinzufügen&lt;br /&gt;
 Rechte zuweisen &lt;br /&gt;
 Es wird auch ein User erzeugt &amp;gt; Direkten Zugriff Blocken &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== In der Outlook Mac Desktop Version hinzufügen ===&lt;br /&gt;
 Konten &amp;gt; Einstellungen &amp;gt; Erweitert&lt;br /&gt;
&lt;br /&gt;
== Geteiltes Adressbuch ==&lt;br /&gt;
 Mindestens ein Postfach für öffentliche Ordner erstellen.&lt;br /&gt;
 https://learn.microsoft.com/de-de/exchange/collaboration/public-folders/create-public-folder-mailboxes?view=exchserver-2019&lt;br /&gt;
 New-Mailbox -PublicFolder -Name &amp;lt;Name&amp;gt;&lt;br /&gt;
 New-Mailbox -PublicFolder -Name &amp;quot;Master Hierarchy&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das erste wird automatisch ein primäres. Danach werden Sekundäre angelegt.&lt;br /&gt;
&lt;br /&gt;
== Gruppen ==&lt;br /&gt;
Es gibt verschiedene Varianten. Entweder einfache Verteiler oder Gruppen für Teamzusammenarbeit, geteilte Kalender...&lt;br /&gt;
 https://support.microsoft.com/de/office/b565caa1-5c40-40ef-9915-60fdb2d97fa2?WT.mc_id=365AdminCSH_inproduct&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Outlook Ordner in der falschen Sprache ===&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/incorrect-folder-names&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/only-subset-items-synchronized&lt;br /&gt;
&lt;br /&gt;
Methode 1&lt;br /&gt;
&lt;br /&gt;
    Beenden Sie Outlook.&lt;br /&gt;
    Ausführen Outlook.exe /resetfolders.&lt;br /&gt;
    Ausführen Outlook.exe /resetfoldernames.&lt;br /&gt;
&lt;br /&gt;
Methode 2&lt;br /&gt;
 In Outlook WebApp Sprache zweimal umstellen&lt;br /&gt;
&lt;br /&gt;
Methode 3 - Admin Cmdlet&lt;br /&gt;
 set-MailboxRegionalConfiguration -id &amp;lt;alias&amp;gt; -LocalizeDefaultFolderName:$true -Language &amp;lt;Language_code_to_switch_to&amp;gt; -DateFormat &amp;lt;your_preferred_DateFormat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anzeigefehler nach Kopieren von Ordnern ===&lt;br /&gt;
 https://www.anleitungen.rrze.fau.de/e-mail/exchange/beheben-des-fehlers-beim-kopieren-von-ordnern-in-outlook/&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26280</id>
		<title>Microsoft Exchange &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26280"/>
		<updated>2022-10-27T14:00:22Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: /* Geteiltes Adressbuch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Exchange / Office 365 / Microsoft 365 ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
== Geteilte Postfächer ==&lt;br /&gt;
 https://support.microsoft.com/en-us/office/open-and-use-a-shared-mailbox-in-outlook-d94a8e9e-21f1-4240-808b-de9c9c088afd?wt.mc_id=365admincsh&amp;amp;ui=en-us&amp;amp;rs=en-us&amp;amp;ad=us&lt;br /&gt;
 https://www.youtube.com/watch?v=p3JDq7BHM_Y&lt;br /&gt;
&lt;br /&gt;
=== Anlegen ===&lt;br /&gt;
 Admin &amp;gt; Postfächer &amp;gt; Freigegebenes Postfach hinzufügen&lt;br /&gt;
 Rechte zuweisen &lt;br /&gt;
 Es wird auch ein User erzeugt &amp;gt; Direkten Zugriff Blocken &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== In der Outlook Mac Desktop Version hinzufügen ===&lt;br /&gt;
 Konten &amp;gt; Einstellungen &amp;gt; Erweitert&lt;br /&gt;
&lt;br /&gt;
== Geteiltes Adressbuch ==&lt;br /&gt;
 Mindestens ein Postfach für öffentliche Ordner erstellen.&lt;br /&gt;
 https://learn.microsoft.com/de-de/exchange/collaboration/public-folders/create-public-folder-mailboxes?view=exchserver-2019&lt;br /&gt;
 New-Mailbox -PublicFolder -Name &amp;lt;Name&amp;gt;&lt;br /&gt;
 New-Mailbox -PublicFolder -Name &amp;quot;Master Hierarchy&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das erste wird automatisch ein primäres. Danach werden Sekundäre angelegt.&lt;br /&gt;
&lt;br /&gt;
== Gruppen ==&lt;br /&gt;
Es gibt verschiedene Varianten. Entweder einfache Verteiler oder Gruppen für Teamzusammenarbeit, geteilte Kalender...&lt;br /&gt;
 https://support.microsoft.com/de/office/b565caa1-5c40-40ef-9915-60fdb2d97fa2?WT.mc_id=365AdminCSH_inproduct&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Outlook Ordner in der falschen Sprache ===&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/incorrect-folder-names&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/only-subset-items-synchronized&lt;br /&gt;
&lt;br /&gt;
Methode 1&lt;br /&gt;
&lt;br /&gt;
    Beenden Sie Outlook.&lt;br /&gt;
    Ausführen Outlook.exe /resetfolders.&lt;br /&gt;
    Ausführen Outlook.exe /resetfoldernames.&lt;br /&gt;
&lt;br /&gt;
Methode 2&lt;br /&gt;
 In Outlook WebApp Sprache zweimal umstellen&lt;br /&gt;
&lt;br /&gt;
Methode 3 - Admin Cmdlet&lt;br /&gt;
 set-MailboxRegionalConfiguration -id &amp;lt;alias&amp;gt; -LocalizeDefaultFolderName:$true -Language &amp;lt;Language_code_to_switch_to&amp;gt; -DateFormat &amp;lt;your_preferred_DateFormat&amp;gt;&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26279</id>
		<title>Microsoft Exchange &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26279"/>
		<updated>2022-10-27T12:36:00Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: /* Geteilte Postfächer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Exchange / Office 365 / Microsoft 365 ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
== Geteilte Postfächer ==&lt;br /&gt;
 https://support.microsoft.com/en-us/office/open-and-use-a-shared-mailbox-in-outlook-d94a8e9e-21f1-4240-808b-de9c9c088afd?wt.mc_id=365admincsh&amp;amp;ui=en-us&amp;amp;rs=en-us&amp;amp;ad=us&lt;br /&gt;
 https://www.youtube.com/watch?v=p3JDq7BHM_Y&lt;br /&gt;
&lt;br /&gt;
=== Anlegen ===&lt;br /&gt;
 Admin &amp;gt; Postfächer &amp;gt; Freigegebenes Postfach hinzufügen&lt;br /&gt;
 Rechte zuweisen &lt;br /&gt;
 Es wird auch ein User erzeugt &amp;gt; Direkten Zugriff Blocken &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== In der Outlook Mac Desktop Version hinzufügen ===&lt;br /&gt;
 Konten &amp;gt; Einstellungen &amp;gt; Erweitert&lt;br /&gt;
&lt;br /&gt;
== Geteiltes Adressbuch ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gruppen ==&lt;br /&gt;
Es gibt verschiedene Varianten. Entweder einfache Verteiler oder Gruppen für Teamzusammenarbeit, geteilte Kalender...&lt;br /&gt;
 https://support.microsoft.com/de/office/b565caa1-5c40-40ef-9915-60fdb2d97fa2?WT.mc_id=365AdminCSH_inproduct&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Outlook Ordner in der falschen Sprache ===&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/incorrect-folder-names&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/only-subset-items-synchronized&lt;br /&gt;
&lt;br /&gt;
Methode 1&lt;br /&gt;
&lt;br /&gt;
    Beenden Sie Outlook.&lt;br /&gt;
    Ausführen Outlook.exe /resetfolders.&lt;br /&gt;
    Ausführen Outlook.exe /resetfoldernames.&lt;br /&gt;
&lt;br /&gt;
Methode 2&lt;br /&gt;
 In Outlook WebApp Sprache zweimal umstellen&lt;br /&gt;
&lt;br /&gt;
Methode 3 - Admin Cmdlet&lt;br /&gt;
 set-MailboxRegionalConfiguration -id &amp;lt;alias&amp;gt; -LocalizeDefaultFolderName:$true -Language &amp;lt;Language_code_to_switch_to&amp;gt; -DateFormat &amp;lt;your_preferred_DateFormat&amp;gt;&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26278</id>
		<title>Microsoft Exchange &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26278"/>
		<updated>2022-10-27T12:24:55Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: /* Geteilte Postfächer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Exchange / Office 365 / Microsoft 365 ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
== Geteilte Postfächer ==&lt;br /&gt;
 https://support.microsoft.com/en-us/office/open-and-use-a-shared-mailbox-in-outlook-d94a8e9e-21f1-4240-808b-de9c9c088afd?wt.mc_id=365admincsh&amp;amp;ui=en-us&amp;amp;rs=en-us&amp;amp;ad=us&lt;br /&gt;
=== Anlegen ===&lt;br /&gt;
 Admin &amp;gt; Postfächer &amp;gt; Freigegebenes Postfach hinzufügen&lt;br /&gt;
 Rechte zuweisen &lt;br /&gt;
 Es wird auch ein User erzeugt &amp;gt; Direkten Zugriff Blocken &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== In der Outlook Mac Desktop Version hinzufügen ===&lt;br /&gt;
 Konten &amp;gt; Einstellungen &amp;gt; Erweitert&lt;br /&gt;
&lt;br /&gt;
== Geteiltes Adressbuch ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gruppen ==&lt;br /&gt;
Es gibt verschiedene Varianten. Entweder einfache Verteiler oder Gruppen für Teamzusammenarbeit, geteilte Kalender...&lt;br /&gt;
 https://support.microsoft.com/de/office/b565caa1-5c40-40ef-9915-60fdb2d97fa2?WT.mc_id=365AdminCSH_inproduct&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Outlook Ordner in der falschen Sprache ===&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/incorrect-folder-names&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/only-subset-items-synchronized&lt;br /&gt;
&lt;br /&gt;
Methode 1&lt;br /&gt;
&lt;br /&gt;
    Beenden Sie Outlook.&lt;br /&gt;
    Ausführen Outlook.exe /resetfolders.&lt;br /&gt;
    Ausführen Outlook.exe /resetfoldernames.&lt;br /&gt;
&lt;br /&gt;
Methode 2&lt;br /&gt;
 In Outlook WebApp Sprache zweimal umstellen&lt;br /&gt;
&lt;br /&gt;
Methode 3 - Admin Cmdlet&lt;br /&gt;
 set-MailboxRegionalConfiguration -id &amp;lt;alias&amp;gt; -LocalizeDefaultFolderName:$true -Language &amp;lt;Language_code_to_switch_to&amp;gt; -DateFormat &amp;lt;your_preferred_DateFormat&amp;gt;&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26277</id>
		<title>Microsoft Exchange &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26277"/>
		<updated>2022-10-27T12:11:08Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: /* Geteilte Postfächer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Exchange / Office 365 / Microsoft 365 ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
== Geteilte Postfächer ==&lt;br /&gt;
 https://support.microsoft.com/en-us/office/open-and-use-a-shared-mailbox-in-outlook-d94a8e9e-21f1-4240-808b-de9c9c088afd?wt.mc_id=365admincsh&amp;amp;ui=en-us&amp;amp;rs=en-us&amp;amp;ad=us&lt;br /&gt;
=== Anlegen ===&lt;br /&gt;
 Admin &amp;gt; Postfächer &amp;gt; Freigegebenes Postfach hinzufügen&lt;br /&gt;
 &lt;br /&gt;
=== Zuteilen ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== In der Outlook Mac Desktop Version hinzufügen ===&lt;br /&gt;
 Konten &amp;gt; Einstellungen &amp;gt; Erweitert&lt;br /&gt;
&lt;br /&gt;
== Geteiltes Adressbuch ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gruppen ==&lt;br /&gt;
Es gibt verschiedene Varianten. Entweder einfache Verteiler oder Gruppen für Teamzusammenarbeit, geteilte Kalender...&lt;br /&gt;
 https://support.microsoft.com/de/office/b565caa1-5c40-40ef-9915-60fdb2d97fa2?WT.mc_id=365AdminCSH_inproduct&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Outlook Ordner in der falschen Sprache ===&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/incorrect-folder-names&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/only-subset-items-synchronized&lt;br /&gt;
&lt;br /&gt;
Methode 1&lt;br /&gt;
&lt;br /&gt;
    Beenden Sie Outlook.&lt;br /&gt;
    Ausführen Outlook.exe /resetfolders.&lt;br /&gt;
    Ausführen Outlook.exe /resetfoldernames.&lt;br /&gt;
&lt;br /&gt;
Methode 2&lt;br /&gt;
 In Outlook WebApp Sprache zweimal umstellen&lt;br /&gt;
&lt;br /&gt;
Methode 3 - Admin Cmdlet&lt;br /&gt;
 set-MailboxRegionalConfiguration -id &amp;lt;alias&amp;gt; -LocalizeDefaultFolderName:$true -Language &amp;lt;Language_code_to_switch_to&amp;gt; -DateFormat &amp;lt;your_preferred_DateFormat&amp;gt;&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26276</id>
		<title>Microsoft Exchange &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26276"/>
		<updated>2022-10-27T12:02:53Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: /* Outlook Ordner in der falschen Sprache */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Exchange / Office 365 / Microsoft 365 ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
== Geteilte Postfächer ==&lt;br /&gt;
=== Anlegen ===&lt;br /&gt;
 Admin &amp;gt; Postfächer &amp;gt; Freigegebenes Postfach hinzufügen&lt;br /&gt;
 &lt;br /&gt;
=== Zuteilen ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== In der Outlook Mac Desktop Version hinzufügen ===&lt;br /&gt;
 Konten &amp;gt; Einstellungen &amp;gt; Erweitert&lt;br /&gt;
&lt;br /&gt;
== Geteiltes Adressbuch ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gruppen ==&lt;br /&gt;
Es gibt verschiedene Varianten. Entweder einfache Verteiler oder Gruppen für Teamzusammenarbeit, geteilte Kalender...&lt;br /&gt;
 https://support.microsoft.com/de/office/b565caa1-5c40-40ef-9915-60fdb2d97fa2?WT.mc_id=365AdminCSH_inproduct&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Outlook Ordner in der falschen Sprache ===&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/incorrect-folder-names&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/only-subset-items-synchronized&lt;br /&gt;
&lt;br /&gt;
Methode 1&lt;br /&gt;
&lt;br /&gt;
    Beenden Sie Outlook.&lt;br /&gt;
    Ausführen Outlook.exe /resetfolders.&lt;br /&gt;
    Ausführen Outlook.exe /resetfoldernames.&lt;br /&gt;
&lt;br /&gt;
Methode 2&lt;br /&gt;
 In Outlook WebApp Sprache zweimal umstellen&lt;br /&gt;
&lt;br /&gt;
Methode 3 - Admin Cmdlet&lt;br /&gt;
 set-MailboxRegionalConfiguration -id &amp;lt;alias&amp;gt; -LocalizeDefaultFolderName:$true -Language &amp;lt;Language_code_to_switch_to&amp;gt; -DateFormat &amp;lt;your_preferred_DateFormat&amp;gt;&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26275</id>
		<title>Microsoft Exchange &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26275"/>
		<updated>2022-10-27T11:53:08Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Exchange / Office 365 / Microsoft 365 ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
== Geteilte Postfächer ==&lt;br /&gt;
=== Anlegen ===&lt;br /&gt;
 Admin &amp;gt; Postfächer &amp;gt; Freigegebenes Postfach hinzufügen&lt;br /&gt;
 &lt;br /&gt;
=== Zuteilen ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== In der Outlook Mac Desktop Version hinzufügen ===&lt;br /&gt;
 Konten &amp;gt; Einstellungen &amp;gt; Erweitert&lt;br /&gt;
&lt;br /&gt;
== Geteiltes Adressbuch ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gruppen ==&lt;br /&gt;
Es gibt verschiedene Varianten. Entweder einfache Verteiler oder Gruppen für Teamzusammenarbeit, geteilte Kalender...&lt;br /&gt;
 https://support.microsoft.com/de/office/b565caa1-5c40-40ef-9915-60fdb2d97fa2?WT.mc_id=365AdminCSH_inproduct&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Outlook Ordner in der falschen Sprache ===&lt;br /&gt;
 https://learn.microsoft.com/de-de/outlook/troubleshoot/user-interface/incorrect-folder-names&lt;br /&gt;
Methode 1&lt;br /&gt;
&lt;br /&gt;
    Beenden Sie Outlook.&lt;br /&gt;
    Ausführen Outlook.exe /resetfolders.&lt;br /&gt;
    Ausführen Outlook.exe /resetfoldernames.&lt;br /&gt;
&lt;br /&gt;
Methode 2&lt;br /&gt;
 In Outlook WebApp Sprache zweimal umstellen&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Mac_-_Powershell_und_Exchange_Online&amp;diff=26274</id>
		<title>Mac - Powershell und Exchange Online</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Mac_-_Powershell_und_Exchange_Online&amp;diff=26274"/>
		<updated>2022-10-27T10:37:21Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: /* Verbindung zu Exchange Online herstellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Siehe auch &lt;br /&gt;
 [[Cmdlets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Auf Exchange Online unter macOS mit der PowerShell zugreifen ==&lt;br /&gt;
 https://bodo-schoenfeld.de/auf-exchange-online-unter-macos-mit-der-powershell-zugreifen/&lt;br /&gt;
31. August 2021 von Bodo Schönfeld&lt;br /&gt;
&lt;br /&gt;
Auf Exchange Online, Bestandteil vom Microsoft Office 365, kann mit der PowerShell zugegriffen werden. Da die PowerShell bereits seit einiger Zeit auch auf einem Mac-System (und auch unter Linux) installiert werden kann, ist der Zugriff auf Exchange Online nicht nur Windows-Nutzern vorbehalten. Dieses Tutorial erklärt welche Schritte hierfür erforderlich sind.&lt;br /&gt;
PowerShell installieren&lt;br /&gt;
&lt;br /&gt;
Standardmäßig steht die PowerShell nur unter Windows zur Verfügung. Mac- und Linux-Nutzer müssen sie erst installieren. Die erforderlichen Installationsdateien finden sich auf der offiziellen Projektseite bei Github. Zum Zeitpunkt der Erstellung dieses Tutorials liegen nur Binaries für Intel-Macs vor. Eine finale Version für Macs mit Apples M1-Chips ist aber in Arbeit und dürfte alsbald veröffentlicht werden. Es gibt bereits eine Preview-Version.&lt;br /&gt;
&lt;br /&gt;
Noch einfacher geht die Installation es mit dem Paketmanager Homebrew. Falls er noch nicht auf Eurem System sein sollte, könnt Ihr dies nachholen, indem Ihr die Homebrew-Seite aufruft, die dortige Anweisung kopierte und im Terminal ausführt.&lt;br /&gt;
&lt;br /&gt;
Sobald Homebrew auf dem Mac vorhanden ist, reicht für die Installation der PowerShell das Ausführen folgender Anweisung aus:&lt;br /&gt;
&lt;br /&gt;
 $ brew install --cask powershell&lt;br /&gt;
&lt;br /&gt;
Ob die PowerShell einwandfrei installiert wurde, kann mit der Ausführung von&lt;br /&gt;
&lt;br /&gt;
 $ pwsh&lt;br /&gt;
 PS /Users/bodo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
überprüft werden. Es sollte dann die PowerShell-Eingabeaufforderung erscheinen. Mit&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
kann die PowerShell wieder beendet werden. Wird ein Upgrade auf eine neuere PowerShell-Version erforderlich, hilft folgende Anweisung weiter:&lt;br /&gt;
&lt;br /&gt;
 $ brew upgrade powershell --cask&lt;br /&gt;
&lt;br /&gt;
Ein Hinweis für Windows-Systeme: Wie oben erwähnt, ist unter Windows die PowerShell bereits vorinstalliert, allerdings in einer alten Version. Wie zusätzlich eine aktuelle Version installiert werden kann, wird in diesem Artikel erklärt (siehe Link).&lt;br /&gt;
&lt;br /&gt;
== EXO V2-Modul und PSWSMan installieren ==&lt;br /&gt;
&lt;br /&gt;
Des Weiteren wird das &amp;#039;&amp;#039;&amp;#039;EXO V2-Modul&amp;#039;&amp;#039;&amp;#039; benötigt, dass entweder für alle oder nur für den aktuellen Nutzer installiert werden kann:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;In der Powershell:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Install-Module -Name ExchangeOnlineManagement&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
 Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser&lt;br /&gt;
&lt;br /&gt;
Die Aktualisierung dieses Moduls erfolgt mit&lt;br /&gt;
&lt;br /&gt;
 Update-Module -Name ExchangeOnlineManagement&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
 Update-Module -Name ExchangeOnlineManagement -Scope CurrentUser&lt;br /&gt;
&lt;br /&gt;
Die Deinstallation für alle oder den aktuellen Nutzer wird mit folgender Anweisung durchgeführt:&lt;br /&gt;
&lt;br /&gt;
 Uninstall-Module -Name ExchangeOnlineManagement&lt;br /&gt;
&lt;br /&gt;
Sofern nicht bereist vorhanden, wird außerdem das Modul PSWSMan benötigt:&lt;br /&gt;
&lt;br /&gt;
 Install-Module -Name PSWSMan&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht der bereits installierten Module erhält man übrigens mit folgendem Befehl:&lt;br /&gt;
&lt;br /&gt;
 Get-InstalledModule&lt;br /&gt;
&lt;br /&gt;
== Verbindung zu Exchange Online herstellen ==&lt;br /&gt;
&lt;br /&gt;
Damit sind alle Voraussetzungen für den Zugriff auf Exchange Online erfüllt. Um eine Verbindung herzustellen, ist jetzt folgendes einzugeben:&lt;br /&gt;
&lt;br /&gt;
 Connect-ExchangeOnline -UserPrincipalName &amp;lt;E-Mail-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies führt dazu, dass ein Browser-Fenster geöffnet wird, in dem die Zugangsdaten einzugeben sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch folgende Anweisung verwendet werden:&lt;br /&gt;
&lt;br /&gt;
 Connect-ExchangeOnline -InlineCredential&lt;br /&gt;
 PowerShell credential request&lt;br /&gt;
 Enter your credentials.&lt;br /&gt;
 User: &amp;lt;E-Mail-Adresse&amp;gt;Password for user &amp;lt;E-Mail-Adresse&amp;gt;: ****************&lt;br /&gt;
&lt;br /&gt;
In diesem Fall öffnet sich kein Browser-Fenster. Stattdessen werden die Zugangsdaten jetzt direkt in der Shell eingegeben. Erscheint keine Fehlermeldung, war der Login erfolgreich.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
&lt;br /&gt;
 Disconnect-ExchangeOnline&lt;br /&gt;
&lt;br /&gt;
kann die Verbindung wieder getrennt werden.&lt;br /&gt;
Nach der Verbindungsherstellung&lt;br /&gt;
&lt;br /&gt;
Einmal mit Exchange Online verbunden, können verschiedene Anweisungen eingegeben werden. Eine Übersicht der vorhandenen Befehle erscheint direkt nach dem Login. Dort findet sich beispielsweise  &lt;br /&gt;
&lt;br /&gt;
 Get-Mailbox&lt;br /&gt;
&lt;br /&gt;
, ein Befehl, der alle vorhandenen Accounts anzeigt.&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Mac_-_Powershell_und_Exchange_Online&amp;diff=26273</id>
		<title>Mac - Powershell und Exchange Online</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Mac_-_Powershell_und_Exchange_Online&amp;diff=26273"/>
		<updated>2022-10-27T10:31:22Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: /* EXO V2-Modul und PSWSMan installieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Siehe auch &lt;br /&gt;
 [[Cmdlets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Auf Exchange Online unter macOS mit der PowerShell zugreifen ==&lt;br /&gt;
 https://bodo-schoenfeld.de/auf-exchange-online-unter-macos-mit-der-powershell-zugreifen/&lt;br /&gt;
31. August 2021 von Bodo Schönfeld&lt;br /&gt;
&lt;br /&gt;
Auf Exchange Online, Bestandteil vom Microsoft Office 365, kann mit der PowerShell zugegriffen werden. Da die PowerShell bereits seit einiger Zeit auch auf einem Mac-System (und auch unter Linux) installiert werden kann, ist der Zugriff auf Exchange Online nicht nur Windows-Nutzern vorbehalten. Dieses Tutorial erklärt welche Schritte hierfür erforderlich sind.&lt;br /&gt;
PowerShell installieren&lt;br /&gt;
&lt;br /&gt;
Standardmäßig steht die PowerShell nur unter Windows zur Verfügung. Mac- und Linux-Nutzer müssen sie erst installieren. Die erforderlichen Installationsdateien finden sich auf der offiziellen Projektseite bei Github. Zum Zeitpunkt der Erstellung dieses Tutorials liegen nur Binaries für Intel-Macs vor. Eine finale Version für Macs mit Apples M1-Chips ist aber in Arbeit und dürfte alsbald veröffentlicht werden. Es gibt bereits eine Preview-Version.&lt;br /&gt;
&lt;br /&gt;
Noch einfacher geht die Installation es mit dem Paketmanager Homebrew. Falls er noch nicht auf Eurem System sein sollte, könnt Ihr dies nachholen, indem Ihr die Homebrew-Seite aufruft, die dortige Anweisung kopierte und im Terminal ausführt.&lt;br /&gt;
&lt;br /&gt;
Sobald Homebrew auf dem Mac vorhanden ist, reicht für die Installation der PowerShell das Ausführen folgender Anweisung aus:&lt;br /&gt;
&lt;br /&gt;
 $ brew install --cask powershell&lt;br /&gt;
&lt;br /&gt;
Ob die PowerShell einwandfrei installiert wurde, kann mit der Ausführung von&lt;br /&gt;
&lt;br /&gt;
 $ pwsh&lt;br /&gt;
 PS /Users/bodo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
überprüft werden. Es sollte dann die PowerShell-Eingabeaufforderung erscheinen. Mit&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
kann die PowerShell wieder beendet werden. Wird ein Upgrade auf eine neuere PowerShell-Version erforderlich, hilft folgende Anweisung weiter:&lt;br /&gt;
&lt;br /&gt;
 $ brew upgrade powershell --cask&lt;br /&gt;
&lt;br /&gt;
Ein Hinweis für Windows-Systeme: Wie oben erwähnt, ist unter Windows die PowerShell bereits vorinstalliert, allerdings in einer alten Version. Wie zusätzlich eine aktuelle Version installiert werden kann, wird in diesem Artikel erklärt (siehe Link).&lt;br /&gt;
&lt;br /&gt;
== EXO V2-Modul und PSWSMan installieren ==&lt;br /&gt;
&lt;br /&gt;
Des Weiteren wird das &amp;#039;&amp;#039;&amp;#039;EXO V2-Modul&amp;#039;&amp;#039;&amp;#039; benötigt, dass entweder für alle oder nur für den aktuellen Nutzer installiert werden kann:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;In der Powershell:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Install-Module -Name ExchangeOnlineManagement&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
 Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser&lt;br /&gt;
&lt;br /&gt;
Die Aktualisierung dieses Moduls erfolgt mit&lt;br /&gt;
&lt;br /&gt;
 Update-Module -Name ExchangeOnlineManagement&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
 Update-Module -Name ExchangeOnlineManagement -Scope CurrentUser&lt;br /&gt;
&lt;br /&gt;
Die Deinstallation für alle oder den aktuellen Nutzer wird mit folgender Anweisung durchgeführt:&lt;br /&gt;
&lt;br /&gt;
 Uninstall-Module -Name ExchangeOnlineManagement&lt;br /&gt;
&lt;br /&gt;
Sofern nicht bereist vorhanden, wird außerdem das Modul PSWSMan benötigt:&lt;br /&gt;
&lt;br /&gt;
 Install-Module -Name PSWSMan&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht der bereits installierten Module erhält man übrigens mit folgendem Befehl:&lt;br /&gt;
&lt;br /&gt;
 Get-InstalledModule&lt;br /&gt;
&lt;br /&gt;
== Verbindung zu Exchange Online herstellen ==&lt;br /&gt;
&lt;br /&gt;
Damit sind alle Voraussetzungen für den Zugriff auf Exchange Online erfüllt. Um eine Verbindung herzustellen, ist jetzt folgendes einzugeben:&lt;br /&gt;
&lt;br /&gt;
Connect-ExchangeOnline -UserPrincipalName &amp;lt;E-Mail-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies führt dazu, dass ein Browser-Fenster geöffnet wird, in dem die Zugangsdaten einzugeben sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch folgende Anweisung verwendet werden:&lt;br /&gt;
&lt;br /&gt;
 Connect-ExchangeOnline -InlineCredential&lt;br /&gt;
 PowerShell credential request&lt;br /&gt;
 Enter your credentials.&lt;br /&gt;
 User: &amp;lt;E-Mail-Adresse&amp;gt;Password for user &amp;lt;E-Mail-Adresse&amp;gt;: ****************&lt;br /&gt;
&lt;br /&gt;
In diesem Fall öffnet sich kein Browser-Fenster. Stattdessen werden die Zugangsdaten jetzt direkt in der Shell eingegeben. Erscheint keine Fehlermeldung, war der Login erfolgreich.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
&lt;br /&gt;
 Disconnect-ExchangeOnline&lt;br /&gt;
&lt;br /&gt;
kann die Verbindung wieder getrennt werden.&lt;br /&gt;
Nach der Verbindungsherstellung&lt;br /&gt;
&lt;br /&gt;
Einmal mit Exchange Online verbunden, können verschiedene Anweisungen eingegeben werden. Eine Übersicht der vorhandenen Befehle erscheint direkt nach dem Login. Dort findet sich beispielsweise  &lt;br /&gt;
&lt;br /&gt;
 Get-Mailbox&lt;br /&gt;
&lt;br /&gt;
, ein Befehl, der alle vorhandenen Accounts anzeigt.&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Mac_-_Powershell_und_Exchange_Online&amp;diff=26272</id>
		<title>Mac - Powershell und Exchange Online</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Mac_-_Powershell_und_Exchange_Online&amp;diff=26272"/>
		<updated>2022-10-27T10:27:52Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Siehe auch &lt;br /&gt;
 [[Cmdlets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Auf Exchange Online unter macOS mit der PowerShell zugreifen ==&lt;br /&gt;
 https://bodo-schoenfeld.de/auf-exchange-online-unter-macos-mit-der-powershell-zugreifen/&lt;br /&gt;
31. August 2021 von Bodo Schönfeld&lt;br /&gt;
&lt;br /&gt;
Auf Exchange Online, Bestandteil vom Microsoft Office 365, kann mit der PowerShell zugegriffen werden. Da die PowerShell bereits seit einiger Zeit auch auf einem Mac-System (und auch unter Linux) installiert werden kann, ist der Zugriff auf Exchange Online nicht nur Windows-Nutzern vorbehalten. Dieses Tutorial erklärt welche Schritte hierfür erforderlich sind.&lt;br /&gt;
PowerShell installieren&lt;br /&gt;
&lt;br /&gt;
Standardmäßig steht die PowerShell nur unter Windows zur Verfügung. Mac- und Linux-Nutzer müssen sie erst installieren. Die erforderlichen Installationsdateien finden sich auf der offiziellen Projektseite bei Github. Zum Zeitpunkt der Erstellung dieses Tutorials liegen nur Binaries für Intel-Macs vor. Eine finale Version für Macs mit Apples M1-Chips ist aber in Arbeit und dürfte alsbald veröffentlicht werden. Es gibt bereits eine Preview-Version.&lt;br /&gt;
&lt;br /&gt;
Noch einfacher geht die Installation es mit dem Paketmanager Homebrew. Falls er noch nicht auf Eurem System sein sollte, könnt Ihr dies nachholen, indem Ihr die Homebrew-Seite aufruft, die dortige Anweisung kopierte und im Terminal ausführt.&lt;br /&gt;
&lt;br /&gt;
Sobald Homebrew auf dem Mac vorhanden ist, reicht für die Installation der PowerShell das Ausführen folgender Anweisung aus:&lt;br /&gt;
&lt;br /&gt;
 $ brew install --cask powershell&lt;br /&gt;
&lt;br /&gt;
Ob die PowerShell einwandfrei installiert wurde, kann mit der Ausführung von&lt;br /&gt;
&lt;br /&gt;
 $ pwsh&lt;br /&gt;
 PS /Users/bodo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
überprüft werden. Es sollte dann die PowerShell-Eingabeaufforderung erscheinen. Mit&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
kann die PowerShell wieder beendet werden. Wird ein Upgrade auf eine neuere PowerShell-Version erforderlich, hilft folgende Anweisung weiter:&lt;br /&gt;
&lt;br /&gt;
 $ brew upgrade powershell --cask&lt;br /&gt;
&lt;br /&gt;
Ein Hinweis für Windows-Systeme: Wie oben erwähnt, ist unter Windows die PowerShell bereits vorinstalliert, allerdings in einer alten Version. Wie zusätzlich eine aktuelle Version installiert werden kann, wird in diesem Artikel erklärt (siehe Link).&lt;br /&gt;
&lt;br /&gt;
== EXO V2-Modul und PSWSMan installieren ==&lt;br /&gt;
&lt;br /&gt;
Des Weiteren wird das &amp;#039;&amp;#039;&amp;#039;EXO V2-Modul&amp;#039;&amp;#039;&amp;#039; benötigt, dass entweder für alle oder nur für den aktuellen Nutzer installiert werden kann:&lt;br /&gt;
&lt;br /&gt;
 Install-Module -Name ExchangeOnlineManagement&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
 Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser&lt;br /&gt;
&lt;br /&gt;
Die Aktualisierung dieses Moduls erfolgt mit&lt;br /&gt;
&lt;br /&gt;
 Update-Module -Name ExchangeOnlineManagement&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
 Update-Module -Name ExchangeOnlineManagement -Scope CurrentUser&lt;br /&gt;
&lt;br /&gt;
Die Deinstallation für alle oder den aktuellen Nutzer wird mit folgender Anweisung durchgeführt:&lt;br /&gt;
&lt;br /&gt;
 Uninstall-Module -Name ExchangeOnlineManagement&lt;br /&gt;
&lt;br /&gt;
Sofern nicht bereist vorhanden, wird außerdem das Modul PSWSMan benötigt:&lt;br /&gt;
&lt;br /&gt;
 Install-Module -Name PSWSMan&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht der bereits installierten Module erhält man übrigens mit folgendem Befehl:&lt;br /&gt;
&lt;br /&gt;
 Get-InstalledModule&lt;br /&gt;
&lt;br /&gt;
== Verbindung zu Exchange Online herstellen ==&lt;br /&gt;
&lt;br /&gt;
Damit sind alle Voraussetzungen für den Zugriff auf Exchange Online erfüllt. Um eine Verbindung herzustellen, ist jetzt folgendes einzugeben:&lt;br /&gt;
&lt;br /&gt;
Connect-ExchangeOnline -UserPrincipalName &amp;lt;E-Mail-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies führt dazu, dass ein Browser-Fenster geöffnet wird, in dem die Zugangsdaten einzugeben sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch folgende Anweisung verwendet werden:&lt;br /&gt;
&lt;br /&gt;
 Connect-ExchangeOnline -InlineCredential&lt;br /&gt;
 PowerShell credential request&lt;br /&gt;
 Enter your credentials.&lt;br /&gt;
 User: &amp;lt;E-Mail-Adresse&amp;gt;Password for user &amp;lt;E-Mail-Adresse&amp;gt;: ****************&lt;br /&gt;
&lt;br /&gt;
In diesem Fall öffnet sich kein Browser-Fenster. Stattdessen werden die Zugangsdaten jetzt direkt in der Shell eingegeben. Erscheint keine Fehlermeldung, war der Login erfolgreich.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
&lt;br /&gt;
 Disconnect-ExchangeOnline&lt;br /&gt;
&lt;br /&gt;
kann die Verbindung wieder getrennt werden.&lt;br /&gt;
Nach der Verbindungsherstellung&lt;br /&gt;
&lt;br /&gt;
Einmal mit Exchange Online verbunden, können verschiedene Anweisungen eingegeben werden. Eine Übersicht der vorhandenen Befehle erscheint direkt nach dem Login. Dort findet sich beispielsweise  &lt;br /&gt;
&lt;br /&gt;
 Get-Mailbox&lt;br /&gt;
&lt;br /&gt;
, ein Befehl, der alle vorhandenen Accounts anzeigt.&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Cmdlets&amp;diff=26271</id>
		<title>Cmdlets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Cmdlets&amp;diff=26271"/>
		<updated>2022-10-27T10:17:28Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: Die Seite wurde neu angelegt: „ https://www.youtube.com/watch?v=Xa-xIhZ0bFQ“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://www.youtube.com/watch?v=Xa-xIhZ0bFQ&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Mac_-_Powershell_und_Exchange_Online&amp;diff=26270</id>
		<title>Mac - Powershell und Exchange Online</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Mac_-_Powershell_und_Exchange_Online&amp;diff=26270"/>
		<updated>2022-10-27T10:17:20Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Siehe auch &lt;br /&gt;
 [[Cmdlets]]&lt;br /&gt;
&lt;br /&gt;
 https://bodo-schoenfeld.de/auf-exchange-online-unter-macos-mit-der-powershell-zugreifen/&lt;br /&gt;
&lt;br /&gt;
Auf Exchange Online unter macOS mit der PowerShell zugreifen&lt;br /&gt;
31. August 2021 von Bodo Schönfeld&lt;br /&gt;
&lt;br /&gt;
Auf Exchange Online, Bestandteil vom Microsoft Office 365, kann mit der PowerShell zugegriffen werden. Da die PowerShell bereits seit einiger Zeit auch auf einem Mac-System (und auch unter Linux) installiert werden kann, ist der Zugriff auf Exchange Online nicht nur Windows-Nutzern vorbehalten. Dieses Tutorial erklärt welche Schritte hierfür erforderlich sind.&lt;br /&gt;
PowerShell installieren&lt;br /&gt;
&lt;br /&gt;
Standardmäßig steht die PowerShell nur unter Windows zur Verfügung. Mac- und Linux-Nutzer müssen sie erst installieren. Die erforderlichen Installationsdateien finden sich auf der offiziellen Projektseite bei Github. Zum Zeitpunkt der Erstellung dieses Tutorials liegen nur Binaries für Intel-Macs vor. Eine finale Version für Macs mit Apples M1-Chips ist aber in Arbeit und dürfte alsbald veröffentlicht werden. Es gibt bereits eine Preview-Version.&lt;br /&gt;
&lt;br /&gt;
Noch einfacher geht die Installation es mit dem Paketmanager Homebrew. Falls er noch nicht auf Eurem System sein sollte, könnt Ihr dies nachholen, indem Ihr die Homebrew-Seite aufruft, die dortige Anweisung kopierte und im Terminal ausführt.&lt;br /&gt;
&lt;br /&gt;
Sobald Homebrew auf dem Mac vorhanden ist, reicht für die Installation der PowerShell das Ausführen folgender Anweisung aus:&lt;br /&gt;
&lt;br /&gt;
 $ brew install --cask powershell&lt;br /&gt;
&lt;br /&gt;
Ob die PowerShell einwandfrei installiert wurde, kann mit der Ausführung von&lt;br /&gt;
&lt;br /&gt;
 $ pwsh&lt;br /&gt;
 PS /Users/bodo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
überprüft werden. Es sollte dann die PowerShell-Eingabeaufforderung erscheinen. Mit&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
kann die PowerShell wieder beendet werden. Wird ein Upgrade auf eine neuere PowerShell-Version erforderlich, hilft folgende Anweisung weiter:&lt;br /&gt;
&lt;br /&gt;
 $ brew upgrade powershell --cask&lt;br /&gt;
&lt;br /&gt;
Ein Hinweis für Windows-Systeme: Wie oben erwähnt, ist unter Windows die PowerShell bereits vorinstalliert, allerdings in einer alten Version. Wie zusätzlich eine aktuelle Version installiert werden kann, wird in diesem Artikel erklärt.&lt;br /&gt;
&lt;br /&gt;
== EXO V2-Modul und PSWSMan installieren ==&lt;br /&gt;
&lt;br /&gt;
Des Weiteren wird das &amp;#039;&amp;#039;&amp;#039;EXO V2-Modul&amp;#039;&amp;#039;&amp;#039; benötigt, dass entweder für alle oder nur für den aktuellen Nutzer installiert werden kann:&lt;br /&gt;
&lt;br /&gt;
 Install-Module -Name ExchangeOnlineManagement&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
 Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser&lt;br /&gt;
&lt;br /&gt;
Die Aktualisierung dieses Moduls erfolgt mit&lt;br /&gt;
&lt;br /&gt;
 Update-Module -Name ExchangeOnlineManagement&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
 Update-Module -Name ExchangeOnlineManagement -Scope CurrentUser&lt;br /&gt;
&lt;br /&gt;
Die Deinstallation für alle oder den aktuellen Nutzer wird mit folgender Anweisung durchgeführt:&lt;br /&gt;
&lt;br /&gt;
 Uninstall-Module -Name ExchangeOnlineManagement&lt;br /&gt;
&lt;br /&gt;
Sofern nicht bereist vorhanden, wird außerdem das Modul PSWSMan benötigt:&lt;br /&gt;
&lt;br /&gt;
 Install-Module -Name PSWSMan&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht der bereits installierten Module erhält man übrigens mit folgendem Befehl:&lt;br /&gt;
&lt;br /&gt;
 Get-InstalledModule&lt;br /&gt;
&lt;br /&gt;
== Verbindung zu Exchange Online herstellen ==&lt;br /&gt;
&lt;br /&gt;
Damit sind alle Voraussetzungen für den Zugriff auf Exchange Online erfüllt. Um eine Verbindung herzustellen, ist jetzt folgendes einzugeben:&lt;br /&gt;
&lt;br /&gt;
Connect-ExchangeOnline -UserPrincipalName &amp;lt;E-Mail-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies führt dazu, dass ein Browser-Fenster geöffnet wird, in dem die Zugangsdaten einzugeben sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch folgende Anweisung verwendet werden:&lt;br /&gt;
&lt;br /&gt;
 Connect-ExchangeOnline -InlineCredential&lt;br /&gt;
 PowerShell credential request&lt;br /&gt;
 Enter your credentials.&lt;br /&gt;
 User: &amp;lt;E-Mail-Adresse&amp;gt;Password for user &amp;lt;E-Mail-Adresse&amp;gt;: ****************&lt;br /&gt;
&lt;br /&gt;
In diesem Fall öffnet sich kein Browser-Fenster. Stattdessen werden die Zugangsdaten jetzt direkt in der Shell eingegeben. Erscheint keine Fehlermeldung, war der Login erfolgreich.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
&lt;br /&gt;
 Disconnect-ExchangeOnline&lt;br /&gt;
&lt;br /&gt;
kann die Verbindung wieder getrennt werden.&lt;br /&gt;
Nach der Verbindungsherstellung&lt;br /&gt;
&lt;br /&gt;
Einmal mit Exchange Online verbunden, können verschiedene Anweisungen eingegeben werden. Eine Übersicht der vorhandenen Befehle erscheint direkt nach dem Login. Dort findet sich beispielsweise  &lt;br /&gt;
&lt;br /&gt;
 Get-Mailbox&lt;br /&gt;
&lt;br /&gt;
, ein Befehl, der alle vorhandenen Accounts anzeigt.&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Mac_-_Powershell_und_Exchange_Online&amp;diff=26269</id>
		<title>Mac - Powershell und Exchange Online</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Mac_-_Powershell_und_Exchange_Online&amp;diff=26269"/>
		<updated>2022-10-27T06:30:54Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: /* Verbindung zu Exchange Online herstellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 https://bodo-schoenfeld.de/auf-exchange-online-unter-macos-mit-der-powershell-zugreifen/&lt;br /&gt;
&lt;br /&gt;
Auf Exchange Online unter macOS mit der PowerShell zugreifen&lt;br /&gt;
31. August 2021 von Bodo Schönfeld&lt;br /&gt;
&lt;br /&gt;
Auf Exchange Online, Bestandteil vom Microsoft Office 365, kann mit der PowerShell zugegriffen werden. Da die PowerShell bereits seit einiger Zeit auch auf einem Mac-System (und auch unter Linux) installiert werden kann, ist der Zugriff auf Exchange Online nicht nur Windows-Nutzern vorbehalten. Dieses Tutorial erklärt welche Schritte hierfür erforderlich sind.&lt;br /&gt;
PowerShell installieren&lt;br /&gt;
&lt;br /&gt;
Standardmäßig steht die PowerShell nur unter Windows zur Verfügung. Mac- und Linux-Nutzer müssen sie erst installieren. Die erforderlichen Installationsdateien finden sich auf der offiziellen Projektseite bei Github. Zum Zeitpunkt der Erstellung dieses Tutorials liegen nur Binaries für Intel-Macs vor. Eine finale Version für Macs mit Apples M1-Chips ist aber in Arbeit und dürfte alsbald veröffentlicht werden. Es gibt bereits eine Preview-Version.&lt;br /&gt;
&lt;br /&gt;
Noch einfacher geht die Installation es mit dem Paketmanager Homebrew. Falls er noch nicht auf Eurem System sein sollte, könnt Ihr dies nachholen, indem Ihr die Homebrew-Seite aufruft, die dortige Anweisung kopierte und im Terminal ausführt.&lt;br /&gt;
&lt;br /&gt;
Sobald Homebrew auf dem Mac vorhanden ist, reicht für die Installation der PowerShell das Ausführen folgender Anweisung aus:&lt;br /&gt;
&lt;br /&gt;
 $ brew install --cask powershell&lt;br /&gt;
&lt;br /&gt;
Ob die PowerShell einwandfrei installiert wurde, kann mit der Ausführung von&lt;br /&gt;
&lt;br /&gt;
 $ pwsh&lt;br /&gt;
 PS /Users/bodo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
überprüft werden. Es sollte dann die PowerShell-Eingabeaufforderung erscheinen. Mit&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
kann die PowerShell wieder beendet werden. Wird ein Upgrade auf eine neuere PowerShell-Version erforderlich, hilft folgende Anweisung weiter:&lt;br /&gt;
&lt;br /&gt;
 $ brew upgrade powershell --cask&lt;br /&gt;
&lt;br /&gt;
Ein Hinweis für Windows-Systeme: Wie oben erwähnt, ist unter Windows die PowerShell bereits vorinstalliert, allerdings in einer alten Version. Wie zusätzlich eine aktuelle Version installiert werden kann, wird in diesem Artikel erklärt.&lt;br /&gt;
&lt;br /&gt;
== EXO V2-Modul und PSWSMan installieren ==&lt;br /&gt;
&lt;br /&gt;
Des Weiteren wird das &amp;#039;&amp;#039;&amp;#039;EXO V2-Modul&amp;#039;&amp;#039;&amp;#039; benötigt, dass entweder für alle oder nur für den aktuellen Nutzer installiert werden kann:&lt;br /&gt;
&lt;br /&gt;
 Install-Module -Name ExchangeOnlineManagement&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
 Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser&lt;br /&gt;
&lt;br /&gt;
Die Aktualisierung dieses Moduls erfolgt mit&lt;br /&gt;
&lt;br /&gt;
 Update-Module -Name ExchangeOnlineManagement&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
 Update-Module -Name ExchangeOnlineManagement -Scope CurrentUser&lt;br /&gt;
&lt;br /&gt;
Die Deinstallation für alle oder den aktuellen Nutzer wird mit folgender Anweisung durchgeführt:&lt;br /&gt;
&lt;br /&gt;
 Uninstall-Module -Name ExchangeOnlineManagement&lt;br /&gt;
&lt;br /&gt;
Sofern nicht bereist vorhanden, wird außerdem das Modul PSWSMan benötigt:&lt;br /&gt;
&lt;br /&gt;
 Install-Module -Name PSWSMan&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht der bereits installierten Module erhält man übrigens mit folgendem Befehl:&lt;br /&gt;
&lt;br /&gt;
 Get-InstalledModule&lt;br /&gt;
&lt;br /&gt;
== Verbindung zu Exchange Online herstellen ==&lt;br /&gt;
&lt;br /&gt;
Damit sind alle Voraussetzungen für den Zugriff auf Exchange Online erfüllt. Um eine Verbindung herzustellen, ist jetzt folgendes einzugeben:&lt;br /&gt;
&lt;br /&gt;
Connect-ExchangeOnline -UserPrincipalName &amp;lt;E-Mail-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies führt dazu, dass ein Browser-Fenster geöffnet wird, in dem die Zugangsdaten einzugeben sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch folgende Anweisung verwendet werden:&lt;br /&gt;
&lt;br /&gt;
 Connect-ExchangeOnline -InlineCredential&lt;br /&gt;
 PowerShell credential request&lt;br /&gt;
 Enter your credentials.&lt;br /&gt;
 User: &amp;lt;E-Mail-Adresse&amp;gt;Password for user &amp;lt;E-Mail-Adresse&amp;gt;: ****************&lt;br /&gt;
&lt;br /&gt;
In diesem Fall öffnet sich kein Browser-Fenster. Stattdessen werden die Zugangsdaten jetzt direkt in der Shell eingegeben. Erscheint keine Fehlermeldung, war der Login erfolgreich.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
&lt;br /&gt;
 Disconnect-ExchangeOnline&lt;br /&gt;
&lt;br /&gt;
kann die Verbindung wieder getrennt werden.&lt;br /&gt;
Nach der Verbindungsherstellung&lt;br /&gt;
&lt;br /&gt;
Einmal mit Exchange Online verbunden, können verschiedene Anweisungen eingegeben werden. Eine Übersicht der vorhandenen Befehle erscheint direkt nach dem Login. Dort findet sich beispielsweise  &lt;br /&gt;
&lt;br /&gt;
 Get-Mailbox&lt;br /&gt;
&lt;br /&gt;
, ein Befehl, der alle vorhandenen Accounts anzeigt.&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Mac_-_Powershell_und_Exchange_Online&amp;diff=26268</id>
		<title>Mac - Powershell und Exchange Online</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Mac_-_Powershell_und_Exchange_Online&amp;diff=26268"/>
		<updated>2022-10-27T06:30:21Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: Die Seite wurde neu angelegt: „  https://bodo-schoenfeld.de/auf-exchange-online-unter-macos-mit-der-powershell-zugreifen/  Auf Exchange Online unter macOS mit der PowerShell zugreifen 31. Au…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 https://bodo-schoenfeld.de/auf-exchange-online-unter-macos-mit-der-powershell-zugreifen/&lt;br /&gt;
&lt;br /&gt;
Auf Exchange Online unter macOS mit der PowerShell zugreifen&lt;br /&gt;
31. August 2021 von Bodo Schönfeld&lt;br /&gt;
&lt;br /&gt;
Auf Exchange Online, Bestandteil vom Microsoft Office 365, kann mit der PowerShell zugegriffen werden. Da die PowerShell bereits seit einiger Zeit auch auf einem Mac-System (und auch unter Linux) installiert werden kann, ist der Zugriff auf Exchange Online nicht nur Windows-Nutzern vorbehalten. Dieses Tutorial erklärt welche Schritte hierfür erforderlich sind.&lt;br /&gt;
PowerShell installieren&lt;br /&gt;
&lt;br /&gt;
Standardmäßig steht die PowerShell nur unter Windows zur Verfügung. Mac- und Linux-Nutzer müssen sie erst installieren. Die erforderlichen Installationsdateien finden sich auf der offiziellen Projektseite bei Github. Zum Zeitpunkt der Erstellung dieses Tutorials liegen nur Binaries für Intel-Macs vor. Eine finale Version für Macs mit Apples M1-Chips ist aber in Arbeit und dürfte alsbald veröffentlicht werden. Es gibt bereits eine Preview-Version.&lt;br /&gt;
&lt;br /&gt;
Noch einfacher geht die Installation es mit dem Paketmanager Homebrew. Falls er noch nicht auf Eurem System sein sollte, könnt Ihr dies nachholen, indem Ihr die Homebrew-Seite aufruft, die dortige Anweisung kopierte und im Terminal ausführt.&lt;br /&gt;
&lt;br /&gt;
Sobald Homebrew auf dem Mac vorhanden ist, reicht für die Installation der PowerShell das Ausführen folgender Anweisung aus:&lt;br /&gt;
&lt;br /&gt;
 $ brew install --cask powershell&lt;br /&gt;
&lt;br /&gt;
Ob die PowerShell einwandfrei installiert wurde, kann mit der Ausführung von&lt;br /&gt;
&lt;br /&gt;
 $ pwsh&lt;br /&gt;
 PS /Users/bodo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
überprüft werden. Es sollte dann die PowerShell-Eingabeaufforderung erscheinen. Mit&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
kann die PowerShell wieder beendet werden. Wird ein Upgrade auf eine neuere PowerShell-Version erforderlich, hilft folgende Anweisung weiter:&lt;br /&gt;
&lt;br /&gt;
 $ brew upgrade powershell --cask&lt;br /&gt;
&lt;br /&gt;
Ein Hinweis für Windows-Systeme: Wie oben erwähnt, ist unter Windows die PowerShell bereits vorinstalliert, allerdings in einer alten Version. Wie zusätzlich eine aktuelle Version installiert werden kann, wird in diesem Artikel erklärt.&lt;br /&gt;
&lt;br /&gt;
== EXO V2-Modul und PSWSMan installieren ==&lt;br /&gt;
&lt;br /&gt;
Des Weiteren wird das &amp;#039;&amp;#039;&amp;#039;EXO V2-Modul&amp;#039;&amp;#039;&amp;#039; benötigt, dass entweder für alle oder nur für den aktuellen Nutzer installiert werden kann:&lt;br /&gt;
&lt;br /&gt;
 Install-Module -Name ExchangeOnlineManagement&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
 Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser&lt;br /&gt;
&lt;br /&gt;
Die Aktualisierung dieses Moduls erfolgt mit&lt;br /&gt;
&lt;br /&gt;
 Update-Module -Name ExchangeOnlineManagement&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
 Update-Module -Name ExchangeOnlineManagement -Scope CurrentUser&lt;br /&gt;
&lt;br /&gt;
Die Deinstallation für alle oder den aktuellen Nutzer wird mit folgender Anweisung durchgeführt:&lt;br /&gt;
&lt;br /&gt;
 Uninstall-Module -Name ExchangeOnlineManagement&lt;br /&gt;
&lt;br /&gt;
Sofern nicht bereist vorhanden, wird außerdem das Modul PSWSMan benötigt:&lt;br /&gt;
&lt;br /&gt;
 Install-Module -Name PSWSMan&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht der bereits installierten Module erhält man übrigens mit folgendem Befehl:&lt;br /&gt;
&lt;br /&gt;
 Get-InstalledModule&lt;br /&gt;
&lt;br /&gt;
== Verbindung zu Exchange Online herstellen ==&lt;br /&gt;
&lt;br /&gt;
Damit sind alle Voraussetzungen für den Zugriff auf Exchange Online erfüllt. Um eine Verbindung herzustellen, ist jetzt folgendes einzugeben:&lt;br /&gt;
&lt;br /&gt;
Connect-ExchangeOnline -UserPrincipalName &amp;lt;E-Mail-Adresse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies führt dazu, dass ein Browser-Fenster geöffnet wird, in dem die Zugangsdaten einzugeben sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch folgende Anweisung verwendet werden:&lt;br /&gt;
&lt;br /&gt;
 Connect-ExchangeOnline -InlineCredential&lt;br /&gt;
 PowerShell credential request&lt;br /&gt;
 Enter your credentials.&lt;br /&gt;
 User: &amp;lt;E-Mail-Adresse&lt;br /&gt;
 &amp;gt;Password for user &amp;lt;E-Mail-Adresse&amp;gt;: ****************&lt;br /&gt;
&lt;br /&gt;
In diesem Fall öffnet sich kein Browser-Fenster. Stattdessen werden die Zugangsdaten jetzt direkt in der Shell eingegeben. Erscheint keine Fehlermeldung, war der Login erfolgreich.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
&lt;br /&gt;
 Disconnect-ExchangeOnline&lt;br /&gt;
&lt;br /&gt;
kann die Verbindung wieder getrennt werden.&lt;br /&gt;
Nach der Verbindungsherstellung&lt;br /&gt;
&lt;br /&gt;
Einmal mit Exchange Online verbunden, können verschiedene Anweisungen eingegeben werden. Eine Übersicht der vorhandenen Befehle erscheint direkt nach dem Login. Dort findet sich beispielsweise  &lt;br /&gt;
&lt;br /&gt;
 Get-Mailbox&lt;br /&gt;
&lt;br /&gt;
, ein Befehl, der alle vorhandenen Accounts anzeigt.&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26267</id>
		<title>Microsoft Exchange &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26267"/>
		<updated>2022-10-26T00:54:42Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Exchange / Office 365 / Microsoft 365 ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
== Geteilte Postfächer ==&lt;br /&gt;
=== Anlegen ===&lt;br /&gt;
 Admin &amp;gt; Postfächer &amp;gt; Freigegebenes Postfach hinzufügen&lt;br /&gt;
 &lt;br /&gt;
=== Zuteilen ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== In der Outlook Mac Desktop Version hinzufügen ===&lt;br /&gt;
 Konten &amp;gt; Einstellungen &amp;gt; Erweitert&lt;br /&gt;
&lt;br /&gt;
== Geteiltes Adressbuch ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gruppen ==&lt;br /&gt;
Es gibt verschiedene Varianten. Entweder einfache Verteiler oder Gruppen für Teamzusammenarbeit, geteilte Kalender...&lt;br /&gt;
 https://support.microsoft.com/de/office/b565caa1-5c40-40ef-9915-60fdb2d97fa2?WT.mc_id=365AdminCSH_inproduct&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26266</id>
		<title>Microsoft Exchange &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26266"/>
		<updated>2022-10-26T00:23:21Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: /* Geteilte Postfächer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Online Exchange ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
== Geteilte Postfächer ==&lt;br /&gt;
=== Anlegen ===&lt;br /&gt;
 Admin &amp;gt; Postfächer &amp;gt; Freigegebenes Postfach hinzufügen&lt;br /&gt;
 &lt;br /&gt;
=== Zuteilen ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== In der Outlook Mac Desktop Version hinzufügen ===&lt;br /&gt;
 Konten &amp;gt; Einstellungen &amp;gt; Erweitert&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26265</id>
		<title>Microsoft Exchange &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26265"/>
		<updated>2022-10-26T00:10:01Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: /* In der Outlook Mac Desktop Version hinzufügen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Online Exchange ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
== Geteilte Postfächer ==&lt;br /&gt;
=== In der Outlook Mac Desktop Version hinzufügen ===&lt;br /&gt;
 https://noprob.it/knowhow/freigegebenes-postfach-zu-outlook-for-mac-hinzufuegen/&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26264</id>
		<title>Microsoft Exchange &amp; Co</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_Exchange_%26_Co&amp;diff=26264"/>
		<updated>2022-10-26T00:09:46Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: Die Seite wurde neu angelegt: „== Online Exchange ==  == Links ==  == Geteilte Postfächer == === In der Outlook Mac Desktop Version hinzufügen ===“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Online Exchange ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
== Geteilte Postfächer ==&lt;br /&gt;
=== In der Outlook Mac Desktop Version hinzufügen ===&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=E-Mail_mit_HTML-Signatur_und_Bild&amp;diff=26263</id>
		<title>E-Mail mit HTML-Signatur und Bild</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=E-Mail_mit_HTML-Signatur_und_Bild&amp;diff=26263"/>
		<updated>2022-10-25T06:58:49Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: /* Bild konvertieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bild anhängen oder einbetten? ==&lt;br /&gt;
Besser einbetten und dafür nach Base64 konvertieren -&amp;gt; wird nicht als externer Inhalt wahrgenommen.&lt;br /&gt;
&lt;br /&gt;
== Bild konvertieren ==&lt;br /&gt;
 http://best-web-design-tools.com/field/data-uri/&lt;br /&gt;
&lt;br /&gt;
Vorher unbedingt Grafik optimieren.&lt;br /&gt;
&lt;br /&gt;
Ergebnis etwa so:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;img src=&amp;quot;data:image/png;base64,iVBORw0[...base64code...]SuQmCC&amp;quot; alt=&amp;quot;BauArt Logo&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HTML-Signatur in Outlook ==&lt;br /&gt;
&lt;br /&gt;
Neue Signatur anlegen&lt;br /&gt;
&lt;br /&gt;
Windows Explorer zu folgendem Pfad:&lt;br /&gt;
 C:\Users\*BENUTZERNAME*\AppData\Roaming\Microsoft\Signatures&lt;br /&gt;
Hier finden Sie 3 Dateien und einen Windows Ordner, der den Namen der neu angelegten Signatur enthält.&lt;br /&gt;
&lt;br /&gt;
Bearbeiten Sie nun die „*SIGNATURNAME*.htm“-Datei mit einem Editor (rechtsklick – öffnen mit - Editor). &lt;br /&gt;
Hier können Sie nun HTML-Befehle in die Signatur einpflegen.&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=E-Mail_mit_HTML-Signatur_und_Bild&amp;diff=26262</id>
		<title>E-Mail mit HTML-Signatur und Bild</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=E-Mail_mit_HTML-Signatur_und_Bild&amp;diff=26262"/>
		<updated>2022-10-25T06:57:31Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: Die Seite wurde neu angelegt: „== Bild anhängen oder einbetten? == Besser einbetten und dafür nach Base64 konvertieren -&amp;gt; wird nicht als externer Inhalt wahrgenommen.  == Bild konvertieren…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bild anhängen oder einbetten? ==&lt;br /&gt;
Besser einbetten und dafür nach Base64 konvertieren -&amp;gt; wird nicht als externer Inhalt wahrgenommen.&lt;br /&gt;
&lt;br /&gt;
== Bild konvertieren ==&lt;br /&gt;
 http://best-web-design-tools.com/field/data-uri/&lt;br /&gt;
&lt;br /&gt;
Vorher unbedingt Grafik optimieren.&lt;br /&gt;
&lt;br /&gt;
== HTML-Signatur in Outlook ==&lt;br /&gt;
&lt;br /&gt;
Neue Signatur anlegen&lt;br /&gt;
&lt;br /&gt;
Windows Explorer zu folgendem Pfad:&lt;br /&gt;
 C:\Users\*BENUTZERNAME*\AppData\Roaming\Microsoft\Signatures&lt;br /&gt;
Hier finden Sie 3 Dateien und einen Windows Ordner, der den Namen der neu angelegten Signatur enthält.&lt;br /&gt;
&lt;br /&gt;
Bearbeiten Sie nun die „*SIGNATURNAME*.htm“-Datei mit einem Editor (rechtsklick – öffnen mit - Editor). &lt;br /&gt;
Hier können Sie nun HTML-Befehle in die Signatur einpflegen.&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Front_Page_Editing&amp;diff=26261</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=26261"/>
		<updated>2022-10-24T13:32:27Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: /* Front End Page Editor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Front End Page Editor - PageFrontEdit == &lt;br /&gt;
https://processwire.com/docs/front-end/front-end-editing/&lt;br /&gt;
&lt;br /&gt;
Auch genannt: Frontend-Editing oder Frontpage Edit oder Frontend-Editor&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;
=== Editor funktioniert nicht immer===&lt;br /&gt;
Die Edit Tags werden aus dem Code entfernt aber man kann nicht doppelklicken.&lt;br /&gt;
&lt;br /&gt;
Prüfen ob du mit einer anderen Domain (z.B. ohne www.) angelmeldet bist. Der Editor funktioniert bei mir nur wenn man in der exakt selben Domain ist.&lt;br /&gt;
&lt;br /&gt;
== Kopierschnipsel ==&lt;br /&gt;
 &amp;lt;edit field=&amp;quot;body&amp;quot;&amp;gt;&amp;#039;.$page-&amp;gt;body.&amp;#039;&amp;lt;/edit&amp;gt;&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>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Php_-_E-Mail_Link_mit_Url_Encoding&amp;diff=26260</id>
		<title>Php - E-Mail Link mit Url Encoding</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Php_-_E-Mail_Link_mit_Url_Encoding&amp;diff=26260"/>
		<updated>2022-10-21T18:31:17Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ProcessWire E-Mail Link mit URL Encoding &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$exposeLink = &amp;#039;&amp;#039;;&lt;br /&gt;
$expose_body = rawurlencode(&amp;#039;Liebes BauArt Team, &amp;#039;.chr(10).chr(10).&amp;#039;ich möchte gerne ein Exposé für dieses Objekt anfordern: &amp;#039;.chr(10).$page-&amp;gt;httpUrl);&lt;br /&gt;
$expose_subject = rawurlencode(&amp;#039;Exposé &amp;#039;.$page-&amp;gt;title);&lt;br /&gt;
if(!$page-&amp;gt;opt_2){&lt;br /&gt;
    $exposeLink = &amp;#039;                    &lt;br /&gt;
    &amp;lt;div class=&amp;quot;expose-link&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;a href=&amp;quot;mailto:&amp;#039;.$configpage-&amp;gt;contact_email.&amp;#039;?subject=&amp;#039;.$expose_subject.&amp;#039;&amp;amp;body=&amp;#039;.$expose_body.&amp;#039;&amp;quot; class=&amp;quot;btn flat-btn&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;Exposé anfordern&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Php_-_E-Mail_Link_mit_Url_Encoding&amp;diff=26259</id>
		<title>Php - E-Mail Link mit Url Encoding</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Php_-_E-Mail_Link_mit_Url_Encoding&amp;diff=26259"/>
		<updated>2022-10-21T18:31:05Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: Die Seite wurde neu angelegt: „ProcessWire E-Mail Link mit URL Encoding   &amp;lt;syntaxhighlight=&amp;quot;php&amp;quot;&amp;gt; $exposeLink = &amp;#039;&amp;#039;; $expose_body = rawurlencode(&amp;#039;Liebes BauArt Team, &amp;#039;.chr(10).chr(10).&amp;#039;ich m…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ProcessWire E-Mail Link mit URL Encoding &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$exposeLink = &amp;#039;&amp;#039;;&lt;br /&gt;
$expose_body = rawurlencode(&amp;#039;Liebes BauArt Team, &amp;#039;.chr(10).chr(10).&amp;#039;ich möchte gerne ein Exposé für dieses Objekt anfordern: &amp;#039;.chr(10).$page-&amp;gt;httpUrl);&lt;br /&gt;
$expose_subject = rawurlencode(&amp;#039;Exposé &amp;#039;.$page-&amp;gt;title);&lt;br /&gt;
if(!$page-&amp;gt;opt_2){&lt;br /&gt;
    $exposeLink = &amp;#039;                    &lt;br /&gt;
    &amp;lt;div class=&amp;quot;expose-link&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;a href=&amp;quot;mailto:&amp;#039;.$configpage-&amp;gt;contact_email.&amp;#039;?subject=&amp;#039;.$expose_subject.&amp;#039;&amp;amp;body=&amp;#039;.$expose_body.&amp;#039;&amp;quot; class=&amp;quot;btn flat-btn&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;Exposé anfordern&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=WhatsApp_Link_erstellen&amp;diff=26258</id>
		<title>WhatsApp Link erstellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=WhatsApp_Link_erstellen&amp;diff=26258"/>
		<updated>2022-10-21T15:28:48Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: Die Seite wurde neu angelegt: „== Eigenen WhatsApp-Link erstellen ==  Der unkomplizierteste Weg erfolgt über deine &amp;#039;&amp;#039;&amp;#039;Telefonnummer im internationalen Format&amp;#039;&amp;#039;&amp;#039;. Lasse bei der Angabe deiner…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Eigenen WhatsApp-Link erstellen ==&lt;br /&gt;
&lt;br /&gt;
Der unkomplizierteste Weg erfolgt über deine &amp;#039;&amp;#039;&amp;#039;Telefonnummer im internationalen Format&amp;#039;&amp;#039;&amp;#039;. Lasse bei der Angabe deiner Nummer Nullen, Klammern, Leerzeichen und Bindestriche aus.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiele:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 Richtig: https://wa.me/+491XXXXXXXXXX&lt;br /&gt;
&lt;br /&gt;
=== Eigenen WhatsApp-Link mit Nachricht erstellen ===&lt;br /&gt;
&lt;br /&gt;
Du kannst zusätzlich eine vorgefertigte Nachricht erstellen, die dann automatisch im Textfeld des Chats angezeigt wird. Das Schema sieht so aus:&lt;br /&gt;
 https://wa.me/whatsapptelefonnummer/?text=urlcodiertertext&lt;br /&gt;
 so ersetzt du dabei „whatsapptelefonnummer“ mit deiner vollständigen Rufnummer (im internationalen Format) und „urlcodiertext“ mit deiner gewünschten Nachricht in URL-Kodierung. Hast du alles richtig gemacht, sollte der Link am Ende in etwa so aussehen:&lt;br /&gt;
&lt;br /&gt;
    https://wa.me/+491XXXXXXXXXX?text=Ich%20bin%20sehr%20an%20deinem%20Auto%20interessiert&lt;br /&gt;
&lt;br /&gt;
Um einen Link nur mit einer vorgefertigten Nachricht zu erstellen, benutze https://wa.me/?text=urlcodiertertext.&lt;br /&gt;
&lt;br /&gt;
    https://wa.me/?text=Ich%20wollte%20wegen%20der%20Wohnung%20nachfragen&lt;br /&gt;
&lt;br /&gt;
Klickst du nun auf den erstellten WhatsApp-Link, wird eine Liste der Kontakte angezeigt, an die du deine Nachricht verschicken kannst.&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Puppeteer_-_NodeJS_Scraping&amp;diff=26257</id>
		<title>Puppeteer - NodeJS Scraping</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Puppeteer_-_NodeJS_Scraping&amp;diff=26257"/>
		<updated>2022-10-17T10:57:43Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: /* Bilder und Screenshots */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Puppeteer ==&lt;br /&gt;
Puppeteer Hauptseite.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 https://pptr.dev/&lt;br /&gt;
 https://www.youtube.com/watch?v=CngYXf9aeg8&amp;amp;list=PLGreOtbNU07rDURvnQpDaT3XokxlranUQ&lt;br /&gt;
 https://blog.risingstack.com/pdf-from-html-node-js-puppeteer/&lt;br /&gt;
 https://advancedweb.hu/how-to-speed-up-puppeteer-scraping-with-parallelization/&lt;br /&gt;
 https://jsoverson.medium.com/using-chrome-devtools-protocol-with-puppeteer-737a1300bac0 *&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
 https://www.youtube.com/watch?v=Sag-Hz9jJNg&lt;br /&gt;
Voraussetzung: VisualStudioCode, NodeJS installiert&lt;br /&gt;
&lt;br /&gt;
Ordner erstellen und NodeJS Projekt starten&lt;br /&gt;
&lt;br /&gt;
Terminal&lt;br /&gt;
 npm init -y&lt;br /&gt;
 npm install puppeteer&lt;br /&gt;
&lt;br /&gt;
Installiert auch Chromium. Schau mal in die package.json&lt;br /&gt;
&lt;br /&gt;
Als Basis kommt fast immer ein Konstrukt ähnlich dem folgenden zum Einsatz. Im Wesentlichen passiert folgendes:&lt;br /&gt;
&lt;br /&gt;
index.js erstellen. Puppeteer laden mit asynchroner Funktion. Diese Funktion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const puppeteer = require(&amp;quot;puppeteer&amp;quot;); //pup&lt;br /&gt;
(async () =&amp;gt; {&lt;br /&gt;
  const browser = await puppeteer.launch({headless: true}); // open a new browser - headless (default) or with displaying&lt;br /&gt;
  const page = await browser.newPage();  // open a new tab&lt;br /&gt;
  await page.goto(&amp;quot;https://schlegel.media/&amp;quot;); // navigate to a url&lt;br /&gt;
  // do s.th.&lt;br /&gt;
  await browser.close(); // close the browser&lt;br /&gt;
}) ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel Screenshot von Seite anfertigen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const puppeteer = require(&amp;quot;puppeteer&amp;quot;);&lt;br /&gt;
(async () =&amp;gt; {&lt;br /&gt;
  const browser = await puppeteer.launch({headless: false}) // launch can launch headless or with displaying&lt;br /&gt;
  const page = await browser.newPage() // open new tab in browser&lt;br /&gt;
  await page.goto(&amp;quot;https://schlegel.media&amp;quot;)&lt;br /&gt;
  await page.screenshot({path: &amp;quot;screenshot.png&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
  await browser.close()&lt;br /&gt;
}) ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Starten mit&lt;br /&gt;
 node index.js&lt;br /&gt;
&lt;br /&gt;
== Beispiel Skripte ==&lt;br /&gt;
Hinweis: Da die Skripte in diesem Setup keine ES Module sind, gab es bei mir Probleme in Node wenn man die Strichpunkte weglässt.&lt;br /&gt;
&lt;br /&gt;
=== DOM Elemente scrapen mit evaluate ===&lt;br /&gt;
Zum Scrapen bietet sich die evaluate Funk&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const puppeteer = require(&amp;quot;puppeteer&amp;quot;)&lt;br /&gt;
(async () =&amp;gt; {&lt;br /&gt;
  const browser = await puppeteer.launch({headless: false}) // launch can launch headless or with displaying&lt;br /&gt;
  const page = await browser.newPage() // open new tab in browser&lt;br /&gt;
  await page.goto(&amp;quot;https://schlegel.media&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
  const grabSlogan = await page.evaluate( () =&amp;gt; {&lt;br /&gt;
    const slogan = document.querySelector(&amp;quot;.uk-text-lead&amp;quot;)&lt;br /&gt;
    //return slogan.innerHTML // with html tags&lt;br /&gt;
    return slogan.innerText // only the text&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
  console.log(grabSlogan)&lt;br /&gt;
  await browser.close()&lt;br /&gt;
}) ()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// grab multiple elements&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//... wie oben&lt;br /&gt;
  const grabList = await page.evaluate( () =&amp;gt; {&lt;br /&gt;
    const listTags = document.querySelectorAll(&amp;quot;.uk-nav-default li&amp;quot;)&lt;br /&gt;
    let listItems = []&lt;br /&gt;
    listTags.forEach((tag) =&amp;gt; {&lt;br /&gt;
      listItems.push(tag.innerText)&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    return listItems&lt;br /&gt;
  })&lt;br /&gt;
  console.log(grabList)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Komplexere DOM-Zugriffe&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const puppeteer = require(&amp;quot;puppeteer&amp;quot;);&lt;br /&gt;
(async () =&amp;gt; {&lt;br /&gt;
  const browser = await puppeteer.launch({headless: false}); // launch can launch headless or with displaying&lt;br /&gt;
  const page = await browser.newPage(); // open new tab in browser&lt;br /&gt;
  await page.goto(&amp;quot;https://quotes.toscrape.com/&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  const grab = await page.evaluate( () =&amp;gt; {&lt;br /&gt;
    let arrElements = [];&lt;br /&gt;
    const quotes = document.querySelectorAll(&amp;quot;.quote&amp;quot;);&lt;br /&gt;
    quotes.forEach( (quote) =&amp;gt; {&lt;br /&gt;
      const quoteSpans = quote.querySelectorAll(&amp;quot;span&amp;quot;);&lt;br /&gt;
      const quoteText = quoteSpans[0].innerHTML;&lt;br /&gt;
      const quoteAuthor = quoteSpans[1].querySelector(&amp;quot;small&amp;quot;).innerHTML;&lt;br /&gt;
      arrElements.push({&amp;#039;quote&amp;#039;: quoteText, &amp;#039;author&amp;#039;: quoteAuthor});&lt;br /&gt;
    });&lt;br /&gt;
    return arrElements;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  console.log(grab);&lt;br /&gt;
  await browser.close();&lt;br /&gt;
}) ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== User actions simulieren ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const puppeteer = require(&amp;quot;puppeteer&amp;quot;);&lt;br /&gt;
(async () =&amp;gt; {&lt;br /&gt;
  const browser = await puppeteer.launch({headless: false}); // launch can launch headless or with displaying&lt;br /&gt;
  const page = await browser.newPage(); // open new tab in browser&lt;br /&gt;
  await page.goto(&amp;quot;https://quotes.toscrape.com/&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  await page.click(&amp;#039;a[href=&amp;quot;/login&amp;quot;]&amp;#039;); // click login link&lt;br /&gt;
  await page.type(&amp;#039;#username&amp;#039;,&amp;#039;myUserName&amp;#039;,{delay:300});&lt;br /&gt;
  await page.type(&amp;#039;#password&amp;#039;,&amp;#039;mySecret&amp;#039;);&lt;br /&gt;
  await page.click(&amp;#039;input[type=&amp;quot;submit&amp;quot;]&amp;#039;);&lt;br /&gt;
  //await browser.close();&lt;br /&gt;
}) ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Computed Styles von DOM Elementen auslesen ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Styles eines DOM Elements&amp;#039;&amp;#039;&amp;#039; finden. Hier nutzen wir mal die $eval Funktion. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const puppeteer = require(&amp;quot;puppeteer&amp;quot;);&lt;br /&gt;
(async () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
  const browser = await puppeteer.launch({headless: true}); // launch can launch headless or with displaying&lt;br /&gt;
  const page = await browser.newPage(); // open new tab in browser&lt;br /&gt;
  await page.goto(&amp;quot;https://schlegel.media/&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // get styles of element&lt;br /&gt;
  const myStyles = await page.$eval(&amp;#039;body&amp;#039;, el =&amp;gt; getComputedStyle(el).getPropertyValue(&amp;#039;font-family&amp;#039;)&lt;br /&gt;
  );&lt;br /&gt;
  console.log(myStyles);&lt;br /&gt;
&lt;br /&gt;
  await browser.close();&lt;br /&gt;
}) ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: Handle Functions sind nicht so performant aber eher menschenähnlich. Bei einem Klick würde der Browser tatsächlich die Maus bewegen statt einfach einen Klick Event zu senden.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Evaluate Version&amp;#039;&amp;#039;&amp;#039; - besser zu debuggen Unterschiede in der Ausführung. Siehe: https://stackoverflow.com/questions/55664420/page-evaluate-vs-puppeteer-methods&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const puppeteer = require(&amp;quot;puppeteer&amp;quot;);&lt;br /&gt;
(async () =&amp;gt; {&lt;br /&gt;
  const browser = await puppeteer.launch({headless: true}); // launch can launch headless or with displaying&lt;br /&gt;
  const page = await browser.newPage(); // open new tab in browser&lt;br /&gt;
  await page.goto(&amp;quot;https://schlegel.media/&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // get styles of element&lt;br /&gt;
  const getStyles = await page.evaluate( () =&amp;gt;{&lt;br /&gt;
    const el = document.querySelector(&amp;#039;body&amp;#039;);&lt;br /&gt;
    const myStyle = getComputedStyle(el).getPropertyValue(&amp;#039;font-family&amp;#039;);&lt;br /&gt;
    return myStyle&lt;br /&gt;
  });&lt;br /&gt;
  console.log(getStyles);&lt;br /&gt;
&lt;br /&gt;
  await browser.close();&lt;br /&gt;
}) ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;So kann man alle Styles auslesen:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const puppeteer = require(&amp;quot;puppeteer&amp;quot;);&lt;br /&gt;
(async () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
  const browser = await puppeteer.launch({headless: true}); // launch can launch headless or with displaying&lt;br /&gt;
  const page = await browser.newPage(); // open new tab in browser&lt;br /&gt;
  await page.goto(&amp;quot;https://schlegel.media/&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // get styles of element&lt;br /&gt;
  const getStyles = await page.evaluate( () =&amp;gt;{&lt;br /&gt;
    const el = document.querySelector(&amp;#039;p&amp;#039;);&lt;br /&gt;
    //const myStyle = getComputedStyle(el).getPropertyValue(&amp;#039;font-family&amp;#039;); // get a specific style&lt;br /&gt;
    const stylesObject = getComputedStyle(el);&lt;br /&gt;
    const myStyles = {};&lt;br /&gt;
    for (const prop in stylesObject) {&lt;br /&gt;
      if(stylesObject.hasOwnProperty(prop)){ // filter out &lt;br /&gt;
        myStyles[prop] = stylesObject[prop];&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    //return myStyle;&lt;br /&gt;
    return myStyles;&lt;br /&gt;
  });&lt;br /&gt;
  console.log(getStyles);&lt;br /&gt;
&lt;br /&gt;
  await browser.close();&lt;br /&gt;
}) ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PDF generieren ===&lt;br /&gt;
Siehe auch &lt;br /&gt;
 https://blog.risingstack.com/pdf-from-html-node-js-puppeteer/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const puppeteer = require(&amp;quot;puppeteer&amp;quot;);&lt;br /&gt;
(async () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
  const browser = await puppeteer.launch({headless: true}); // launch can launch headless or with displaying&lt;br /&gt;
  const page = await browser.newPage(); // open new tab in browser&lt;br /&gt;
  await page.goto(&amp;quot;https://schlegel.media/&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // print pdf&lt;br /&gt;
  await page.pdf({&lt;br /&gt;
    path: &amp;quot;myWebsite.pdf&amp;quot;, // mandatory - rest ist optional&lt;br /&gt;
    format: &amp;#039;A4&amp;#039;, // default is letter&lt;br /&gt;
    margin: {&lt;br /&gt;
      top: &amp;#039;100px&amp;#039;,&lt;br /&gt;
      bottom: &amp;#039;100px&amp;#039;&lt;br /&gt;
    },&lt;br /&gt;
    printBackground: true,&lt;br /&gt;
    displayHeaderFooter: true,&lt;br /&gt;
    headerTemplate: `&amp;lt;p style=&amp;quot;font-size: 10px; font-family: Arial, Helvetica, sans-serif; margin: 0 auto;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;title&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;`,&lt;br /&gt;
    footerTemplate: `&amp;lt;p style=&amp;quot;font-size:10px; font-family: Arial, Helvetica, sans-serif; margin: 0 auto;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;pageNumber&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; of &amp;lt;span class=&amp;quot;totalPages&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;`&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
  await browser.close();&lt;br /&gt;
}) ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Crawl multiple pages ===&lt;br /&gt;
 https://stackoverflow.com/questions/46293216/crawling-multiple-urls-in-a-loop-using-puppeteer&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
page.setDefaultNavigationTimeout(0); // prevent timeout after 30s.&lt;br /&gt;
//...&lt;br /&gt;
urls = [&amp;#039;url&amp;#039;,&amp;#039;url&amp;#039;,&amp;#039;url&amp;#039;...]&lt;br /&gt;
&lt;br /&gt;
for (let i = 0; i &amp;lt; urls.length; i++) {&lt;br /&gt;
    const url = urls[i];&lt;br /&gt;
    await page.goto(`${url}`);&lt;br /&gt;
    await page.waitForNavigation({ waitUntil: &amp;#039;networkidle2&amp;#039; });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Input- und Output-Files ===&lt;br /&gt;
 https://github.com/Zrce/puppeteer-coverage-report-test/blob/master/index.js&lt;br /&gt;
 https://stackoverflow.com/questions/59981135/puppeteer-iterate-over-a-csv-file-and-screenshot-for-each-row&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSV Datei mit URLs abarbeiten - seriell/parallel&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
[[Puppeteer - CSV Datei sequentiell / parallel a abarbeiten (Beispiel)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bilder und Screenshots ===&lt;br /&gt;
==== Screenshots in pdf einbetten ====&lt;br /&gt;
* Voraussetzung sind diese Flags für den Filezugriff: &amp;#039;&amp;#039;--allow-file-access-from-files, --enable-local-file-accesses&amp;#039;&amp;#039;&lt;br /&gt;
* Screenshot anfertigen&lt;br /&gt;
* Base64 codieren&lt;br /&gt;
* Einbetten&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Bilder aus DOM speichern und in pdf umwandeln ====&lt;br /&gt;
 https://stackoverflow.com/questions/59677228/convert-screenshot-to-pdf-in-puppeteer&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 await page.goto(&amp;#039;https://www.chromestatus.com/samples&amp;#039;, {waitUntil: &amp;#039;networkidle0&amp;#039;});&lt;br /&gt;
&lt;br /&gt;
    async function screenshotDOMElement(opts = {}) {&lt;br /&gt;
        const padding = &amp;#039;padding&amp;#039; in opts ? opts.padding : 0;&lt;br /&gt;
        const path = &amp;#039;path&amp;#039; in opts ? opts.path : null;&lt;br /&gt;
        const selector = opts.selector;&lt;br /&gt;
&lt;br /&gt;
        if (!selector)&lt;br /&gt;
            throw Error(&amp;#039;Please provide a selector.&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        const rect = await page.evaluate(selector =&amp;gt; {&lt;br /&gt;
            const element = document.querySelector(selector);&lt;br /&gt;
            if (!element)&lt;br /&gt;
                return null;&lt;br /&gt;
            const {x, y, width, height} = element.getBoundingClientRect();&lt;br /&gt;
            return {left: x, top: y, width, height, id: element.id};&lt;br /&gt;
        }, selector);&lt;br /&gt;
&lt;br /&gt;
        if (!rect)&lt;br /&gt;
            throw Error(`Could not find element that matches selector: ${selector}.`);&lt;br /&gt;
&lt;br /&gt;
        return await page.screenshot({&lt;br /&gt;
            path,&lt;br /&gt;
            clip: {&lt;br /&gt;
                x: rect.left - padding,&lt;br /&gt;
                y: rect.top - padding,&lt;br /&gt;
                width: rect.width + padding * 2,&lt;br /&gt;
                height: rect.height + padding * 2&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    await screenshotDOMElement({&lt;br /&gt;
        path: &amp;#039;element.png&amp;#039;,&lt;br /&gt;
        selector: &amp;#039;header aside&amp;#039;,&lt;br /&gt;
        padding: 16&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    browser.close();&lt;br /&gt;
    captureDomTOoPDF();&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function captureDomTOoPDF(){&lt;br /&gt;
    (async () =&amp;gt; {&lt;br /&gt;
        const browser = await puppeteer.launch({args: [&amp;#039;--allow-file-access-from-files&amp;#039;, &amp;#039;--enable-local-file-accesses&amp;#039;]});&lt;br /&gt;
        const page = await browser.newPage();&lt;br /&gt;
        const image = &amp;#039;data:image/png;base64,&amp;#039; + base64Encode(&amp;#039;element.png&amp;#039;);&lt;br /&gt;
        await page.goto(image, {waitUntil: &amp;#039;networkidle0&amp;#039;});&lt;br /&gt;
        await page.pdf({path: &amp;#039;output.pdf&amp;#039;, format: &amp;#039;A4&amp;#039;});&lt;br /&gt;
    &lt;br /&gt;
        await browser.close();&lt;br /&gt;
        console.log(&amp;quot;done&amp;quot;);&lt;br /&gt;
    })();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zertifikate und Puppeteer ===&lt;br /&gt;
 [[Puppeteer - Zertifikate handeln]]&lt;br /&gt;
&lt;br /&gt;
=== Network Request Control ===&lt;br /&gt;
 https://github.com/puppeteer/puppeteer/blob/main/examples/block-images.js&lt;br /&gt;
 [[Puppeteer - RequestInterception]]&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Puppeteer_-_NodeJS_Scraping&amp;diff=26256</id>
		<title>Puppeteer - NodeJS Scraping</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Puppeteer_-_NodeJS_Scraping&amp;diff=26256"/>
		<updated>2022-10-17T10:54:41Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: /* Beispiel Skripte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Puppeteer ==&lt;br /&gt;
Puppeteer Hauptseite.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 https://pptr.dev/&lt;br /&gt;
 https://www.youtube.com/watch?v=CngYXf9aeg8&amp;amp;list=PLGreOtbNU07rDURvnQpDaT3XokxlranUQ&lt;br /&gt;
 https://blog.risingstack.com/pdf-from-html-node-js-puppeteer/&lt;br /&gt;
 https://advancedweb.hu/how-to-speed-up-puppeteer-scraping-with-parallelization/&lt;br /&gt;
 https://jsoverson.medium.com/using-chrome-devtools-protocol-with-puppeteer-737a1300bac0 *&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
 https://www.youtube.com/watch?v=Sag-Hz9jJNg&lt;br /&gt;
Voraussetzung: VisualStudioCode, NodeJS installiert&lt;br /&gt;
&lt;br /&gt;
Ordner erstellen und NodeJS Projekt starten&lt;br /&gt;
&lt;br /&gt;
Terminal&lt;br /&gt;
 npm init -y&lt;br /&gt;
 npm install puppeteer&lt;br /&gt;
&lt;br /&gt;
Installiert auch Chromium. Schau mal in die package.json&lt;br /&gt;
&lt;br /&gt;
Als Basis kommt fast immer ein Konstrukt ähnlich dem folgenden zum Einsatz. Im Wesentlichen passiert folgendes:&lt;br /&gt;
&lt;br /&gt;
index.js erstellen. Puppeteer laden mit asynchroner Funktion. Diese Funktion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const puppeteer = require(&amp;quot;puppeteer&amp;quot;); //pup&lt;br /&gt;
(async () =&amp;gt; {&lt;br /&gt;
  const browser = await puppeteer.launch({headless: true}); // open a new browser - headless (default) or with displaying&lt;br /&gt;
  const page = await browser.newPage();  // open a new tab&lt;br /&gt;
  await page.goto(&amp;quot;https://schlegel.media/&amp;quot;); // navigate to a url&lt;br /&gt;
  // do s.th.&lt;br /&gt;
  await browser.close(); // close the browser&lt;br /&gt;
}) ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel Screenshot von Seite anfertigen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const puppeteer = require(&amp;quot;puppeteer&amp;quot;);&lt;br /&gt;
(async () =&amp;gt; {&lt;br /&gt;
  const browser = await puppeteer.launch({headless: false}) // launch can launch headless or with displaying&lt;br /&gt;
  const page = await browser.newPage() // open new tab in browser&lt;br /&gt;
  await page.goto(&amp;quot;https://schlegel.media&amp;quot;)&lt;br /&gt;
  await page.screenshot({path: &amp;quot;screenshot.png&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
  await browser.close()&lt;br /&gt;
}) ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Starten mit&lt;br /&gt;
 node index.js&lt;br /&gt;
&lt;br /&gt;
== Beispiel Skripte ==&lt;br /&gt;
Hinweis: Da die Skripte in diesem Setup keine ES Module sind, gab es bei mir Probleme in Node wenn man die Strichpunkte weglässt.&lt;br /&gt;
&lt;br /&gt;
=== DOM Elemente scrapen mit evaluate ===&lt;br /&gt;
Zum Scrapen bietet sich die evaluate Funk&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const puppeteer = require(&amp;quot;puppeteer&amp;quot;)&lt;br /&gt;
(async () =&amp;gt; {&lt;br /&gt;
  const browser = await puppeteer.launch({headless: false}) // launch can launch headless or with displaying&lt;br /&gt;
  const page = await browser.newPage() // open new tab in browser&lt;br /&gt;
  await page.goto(&amp;quot;https://schlegel.media&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
  const grabSlogan = await page.evaluate( () =&amp;gt; {&lt;br /&gt;
    const slogan = document.querySelector(&amp;quot;.uk-text-lead&amp;quot;)&lt;br /&gt;
    //return slogan.innerHTML // with html tags&lt;br /&gt;
    return slogan.innerText // only the text&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
  console.log(grabSlogan)&lt;br /&gt;
  await browser.close()&lt;br /&gt;
}) ()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// grab multiple elements&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//... wie oben&lt;br /&gt;
  const grabList = await page.evaluate( () =&amp;gt; {&lt;br /&gt;
    const listTags = document.querySelectorAll(&amp;quot;.uk-nav-default li&amp;quot;)&lt;br /&gt;
    let listItems = []&lt;br /&gt;
    listTags.forEach((tag) =&amp;gt; {&lt;br /&gt;
      listItems.push(tag.innerText)&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    return listItems&lt;br /&gt;
  })&lt;br /&gt;
  console.log(grabList)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Komplexere DOM-Zugriffe&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const puppeteer = require(&amp;quot;puppeteer&amp;quot;);&lt;br /&gt;
(async () =&amp;gt; {&lt;br /&gt;
  const browser = await puppeteer.launch({headless: false}); // launch can launch headless or with displaying&lt;br /&gt;
  const page = await browser.newPage(); // open new tab in browser&lt;br /&gt;
  await page.goto(&amp;quot;https://quotes.toscrape.com/&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  const grab = await page.evaluate( () =&amp;gt; {&lt;br /&gt;
    let arrElements = [];&lt;br /&gt;
    const quotes = document.querySelectorAll(&amp;quot;.quote&amp;quot;);&lt;br /&gt;
    quotes.forEach( (quote) =&amp;gt; {&lt;br /&gt;
      const quoteSpans = quote.querySelectorAll(&amp;quot;span&amp;quot;);&lt;br /&gt;
      const quoteText = quoteSpans[0].innerHTML;&lt;br /&gt;
      const quoteAuthor = quoteSpans[1].querySelector(&amp;quot;small&amp;quot;).innerHTML;&lt;br /&gt;
      arrElements.push({&amp;#039;quote&amp;#039;: quoteText, &amp;#039;author&amp;#039;: quoteAuthor});&lt;br /&gt;
    });&lt;br /&gt;
    return arrElements;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  console.log(grab);&lt;br /&gt;
  await browser.close();&lt;br /&gt;
}) ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== User actions simulieren ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const puppeteer = require(&amp;quot;puppeteer&amp;quot;);&lt;br /&gt;
(async () =&amp;gt; {&lt;br /&gt;
  const browser = await puppeteer.launch({headless: false}); // launch can launch headless or with displaying&lt;br /&gt;
  const page = await browser.newPage(); // open new tab in browser&lt;br /&gt;
  await page.goto(&amp;quot;https://quotes.toscrape.com/&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  await page.click(&amp;#039;a[href=&amp;quot;/login&amp;quot;]&amp;#039;); // click login link&lt;br /&gt;
  await page.type(&amp;#039;#username&amp;#039;,&amp;#039;myUserName&amp;#039;,{delay:300});&lt;br /&gt;
  await page.type(&amp;#039;#password&amp;#039;,&amp;#039;mySecret&amp;#039;);&lt;br /&gt;
  await page.click(&amp;#039;input[type=&amp;quot;submit&amp;quot;]&amp;#039;);&lt;br /&gt;
  //await browser.close();&lt;br /&gt;
}) ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Computed Styles von DOM Elementen auslesen ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Styles eines DOM Elements&amp;#039;&amp;#039;&amp;#039; finden. Hier nutzen wir mal die $eval Funktion. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const puppeteer = require(&amp;quot;puppeteer&amp;quot;);&lt;br /&gt;
(async () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
  const browser = await puppeteer.launch({headless: true}); // launch can launch headless or with displaying&lt;br /&gt;
  const page = await browser.newPage(); // open new tab in browser&lt;br /&gt;
  await page.goto(&amp;quot;https://schlegel.media/&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // get styles of element&lt;br /&gt;
  const myStyles = await page.$eval(&amp;#039;body&amp;#039;, el =&amp;gt; getComputedStyle(el).getPropertyValue(&amp;#039;font-family&amp;#039;)&lt;br /&gt;
  );&lt;br /&gt;
  console.log(myStyles);&lt;br /&gt;
&lt;br /&gt;
  await browser.close();&lt;br /&gt;
}) ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: Handle Functions sind nicht so performant aber eher menschenähnlich. Bei einem Klick würde der Browser tatsächlich die Maus bewegen statt einfach einen Klick Event zu senden.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Evaluate Version&amp;#039;&amp;#039;&amp;#039; - besser zu debuggen Unterschiede in der Ausführung. Siehe: https://stackoverflow.com/questions/55664420/page-evaluate-vs-puppeteer-methods&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const puppeteer = require(&amp;quot;puppeteer&amp;quot;);&lt;br /&gt;
(async () =&amp;gt; {&lt;br /&gt;
  const browser = await puppeteer.launch({headless: true}); // launch can launch headless or with displaying&lt;br /&gt;
  const page = await browser.newPage(); // open new tab in browser&lt;br /&gt;
  await page.goto(&amp;quot;https://schlegel.media/&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // get styles of element&lt;br /&gt;
  const getStyles = await page.evaluate( () =&amp;gt;{&lt;br /&gt;
    const el = document.querySelector(&amp;#039;body&amp;#039;);&lt;br /&gt;
    const myStyle = getComputedStyle(el).getPropertyValue(&amp;#039;font-family&amp;#039;);&lt;br /&gt;
    return myStyle&lt;br /&gt;
  });&lt;br /&gt;
  console.log(getStyles);&lt;br /&gt;
&lt;br /&gt;
  await browser.close();&lt;br /&gt;
}) ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;So kann man alle Styles auslesen:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const puppeteer = require(&amp;quot;puppeteer&amp;quot;);&lt;br /&gt;
(async () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
  const browser = await puppeteer.launch({headless: true}); // launch can launch headless or with displaying&lt;br /&gt;
  const page = await browser.newPage(); // open new tab in browser&lt;br /&gt;
  await page.goto(&amp;quot;https://schlegel.media/&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // get styles of element&lt;br /&gt;
  const getStyles = await page.evaluate( () =&amp;gt;{&lt;br /&gt;
    const el = document.querySelector(&amp;#039;p&amp;#039;);&lt;br /&gt;
    //const myStyle = getComputedStyle(el).getPropertyValue(&amp;#039;font-family&amp;#039;); // get a specific style&lt;br /&gt;
    const stylesObject = getComputedStyle(el);&lt;br /&gt;
    const myStyles = {};&lt;br /&gt;
    for (const prop in stylesObject) {&lt;br /&gt;
      if(stylesObject.hasOwnProperty(prop)){ // filter out &lt;br /&gt;
        myStyles[prop] = stylesObject[prop];&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    //return myStyle;&lt;br /&gt;
    return myStyles;&lt;br /&gt;
  });&lt;br /&gt;
  console.log(getStyles);&lt;br /&gt;
&lt;br /&gt;
  await browser.close();&lt;br /&gt;
}) ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PDF generieren ===&lt;br /&gt;
Siehe auch &lt;br /&gt;
 https://blog.risingstack.com/pdf-from-html-node-js-puppeteer/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const puppeteer = require(&amp;quot;puppeteer&amp;quot;);&lt;br /&gt;
(async () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
  const browser = await puppeteer.launch({headless: true}); // launch can launch headless or with displaying&lt;br /&gt;
  const page = await browser.newPage(); // open new tab in browser&lt;br /&gt;
  await page.goto(&amp;quot;https://schlegel.media/&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // print pdf&lt;br /&gt;
  await page.pdf({&lt;br /&gt;
    path: &amp;quot;myWebsite.pdf&amp;quot;, // mandatory - rest ist optional&lt;br /&gt;
    format: &amp;#039;A4&amp;#039;, // default is letter&lt;br /&gt;
    margin: {&lt;br /&gt;
      top: &amp;#039;100px&amp;#039;,&lt;br /&gt;
      bottom: &amp;#039;100px&amp;#039;&lt;br /&gt;
    },&lt;br /&gt;
    printBackground: true,&lt;br /&gt;
    displayHeaderFooter: true,&lt;br /&gt;
    headerTemplate: `&amp;lt;p style=&amp;quot;font-size: 10px; font-family: Arial, Helvetica, sans-serif; margin: 0 auto;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;title&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;`,&lt;br /&gt;
    footerTemplate: `&amp;lt;p style=&amp;quot;font-size:10px; font-family: Arial, Helvetica, sans-serif; margin: 0 auto;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;pageNumber&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; of &amp;lt;span class=&amp;quot;totalPages&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;`&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
  await browser.close();&lt;br /&gt;
}) ();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Crawl multiple pages ===&lt;br /&gt;
 https://stackoverflow.com/questions/46293216/crawling-multiple-urls-in-a-loop-using-puppeteer&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
page.setDefaultNavigationTimeout(0); // prevent timeout after 30s.&lt;br /&gt;
//...&lt;br /&gt;
urls = [&amp;#039;url&amp;#039;,&amp;#039;url&amp;#039;,&amp;#039;url&amp;#039;...]&lt;br /&gt;
&lt;br /&gt;
for (let i = 0; i &amp;lt; urls.length; i++) {&lt;br /&gt;
    const url = urls[i];&lt;br /&gt;
    await page.goto(`${url}`);&lt;br /&gt;
    await page.waitForNavigation({ waitUntil: &amp;#039;networkidle2&amp;#039; });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Input- und Output-Files ===&lt;br /&gt;
 https://github.com/Zrce/puppeteer-coverage-report-test/blob/master/index.js&lt;br /&gt;
 https://stackoverflow.com/questions/59981135/puppeteer-iterate-over-a-csv-file-and-screenshot-for-each-row&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSV Datei mit URLs abarbeiten - seriell/parallel&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
[[Puppeteer - CSV Datei sequentiell / parallel a abarbeiten (Beispiel)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bilder und Screenshots ===&lt;br /&gt;
==== Bilder aus DOM speichern und in pdf umwandeln ====&lt;br /&gt;
 https://stackoverflow.com/questions/59677228/convert-screenshot-to-pdf-in-puppeteer&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 await page.goto(&amp;#039;https://www.chromestatus.com/samples&amp;#039;, {waitUntil: &amp;#039;networkidle0&amp;#039;});&lt;br /&gt;
&lt;br /&gt;
    async function screenshotDOMElement(opts = {}) {&lt;br /&gt;
        const padding = &amp;#039;padding&amp;#039; in opts ? opts.padding : 0;&lt;br /&gt;
        const path = &amp;#039;path&amp;#039; in opts ? opts.path : null;&lt;br /&gt;
        const selector = opts.selector;&lt;br /&gt;
&lt;br /&gt;
        if (!selector)&lt;br /&gt;
            throw Error(&amp;#039;Please provide a selector.&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        const rect = await page.evaluate(selector =&amp;gt; {&lt;br /&gt;
            const element = document.querySelector(selector);&lt;br /&gt;
            if (!element)&lt;br /&gt;
                return null;&lt;br /&gt;
            const {x, y, width, height} = element.getBoundingClientRect();&lt;br /&gt;
            return {left: x, top: y, width, height, id: element.id};&lt;br /&gt;
        }, selector);&lt;br /&gt;
&lt;br /&gt;
        if (!rect)&lt;br /&gt;
            throw Error(`Could not find element that matches selector: ${selector}.`);&lt;br /&gt;
&lt;br /&gt;
        return await page.screenshot({&lt;br /&gt;
            path,&lt;br /&gt;
            clip: {&lt;br /&gt;
                x: rect.left - padding,&lt;br /&gt;
                y: rect.top - padding,&lt;br /&gt;
                width: rect.width + padding * 2,&lt;br /&gt;
                height: rect.height + padding * 2&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    await screenshotDOMElement({&lt;br /&gt;
        path: &amp;#039;element.png&amp;#039;,&lt;br /&gt;
        selector: &amp;#039;header aside&amp;#039;,&lt;br /&gt;
        padding: 16&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    browser.close();&lt;br /&gt;
    captureDomTOoPDF();&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function captureDomTOoPDF(){&lt;br /&gt;
    (async () =&amp;gt; {&lt;br /&gt;
        const browser = await puppeteer.launch({args: [&amp;#039;--allow-file-access-from-files&amp;#039;, &amp;#039;--enable-local-file-accesses&amp;#039;]});&lt;br /&gt;
        const page = await browser.newPage();&lt;br /&gt;
        const image = &amp;#039;data:image/png;base64,&amp;#039; + base64Encode(&amp;#039;element.png&amp;#039;);&lt;br /&gt;
        await page.goto(image, {waitUntil: &amp;#039;networkidle0&amp;#039;});&lt;br /&gt;
        await page.pdf({path: &amp;#039;output.pdf&amp;#039;, format: &amp;#039;A4&amp;#039;});&lt;br /&gt;
    &lt;br /&gt;
        await browser.close();&lt;br /&gt;
        console.log(&amp;quot;done&amp;quot;);&lt;br /&gt;
    })();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Zertifikate und Puppeteer ===&lt;br /&gt;
 [[Puppeteer - Zertifikate handeln]]&lt;br /&gt;
&lt;br /&gt;
=== Network Request Control ===&lt;br /&gt;
 https://github.com/puppeteer/puppeteer/blob/main/examples/block-images.js&lt;br /&gt;
 [[Puppeteer - RequestInterception]]&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=PhpMyAdmin&amp;diff=26255</id>
		<title>PhpMyAdmin</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=PhpMyAdmin&amp;diff=26255"/>
		<updated>2022-10-04T09:55:05Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Passwort für DB setzen ==&lt;br /&gt;
Die config datei heisst &amp;quot;config.inc.php&amp;quot; im phpmyadmin Ordner&lt;br /&gt;
$cfg[&amp;#039;Servers&amp;#039;][$i][&amp;#039;password&amp;#039;] = &amp;#039;&amp;#039;; // MySQL password eintragen :)&lt;br /&gt;
&lt;br /&gt;
== Adminer - Alternative für phpMyAdmin ==&lt;br /&gt;
Wenn bei einem Hosting phpMyAdmin nicht vorhanden ist kann man das kleine aber effiziente Adminer nutzen.&lt;br /&gt;
 https://www.adminer.org/de/&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_passwortgesch%C3%BCtzter_Bereich&amp;diff=26254</id>
		<title>ProcessWire - passwortgeschützter Bereich</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_passwortgesch%C3%BCtzter_Bereich&amp;diff=26254"/>
		<updated>2022-09-30T19:32:33Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://processwire.com/talk/topic/107-custom-login/&lt;br /&gt;
&lt;br /&gt;
Es gibt Module dafür, aber man kann auch mit Bordmitteln gut arbeiten und ist evtl. flexibler.&lt;br /&gt;
&lt;br /&gt;
Je nachdem was man möchte sind unterschiedliche Ansätze sinnvoll.&lt;br /&gt;
* Seiten schützen&lt;br /&gt;
* Teile von Seiten schützen&lt;br /&gt;
* Was soll passieren wenn man eine geschützte Seite ohne Anmeldung aufruft (Login Form, Redirect...)&lt;br /&gt;
* Login im Seitentemplate oder als Inhaltselement&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
== Strategie ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;User:&amp;#039;&amp;#039;&amp;#039; Um eine Seite zu schützen kann man die Anmeldung eines Users abfragen. Im einfachsten Fall kann man einen User mit der Gruppe &amp;quot;guest&amp;quot; anlegen und den Link Teilen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Login:&amp;#039;&amp;#039;&amp;#039; Ein Frontendformular ist hier schicker als das BE Formular. Zusätzlich oder auch alleine kann man z.b. das PageProtector Modul nehmen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Seite nur angemeldeten Usern zeigen:&amp;#039;&amp;#039;&amp;#039; Dazu kann man in der Templateausgabe einfach abfragen ob ein User angemeldet ist und ansonsten nichts ausgeben.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dateien:&amp;#039;&amp;#039;&amp;#039; Zu überlegen ist ob man den direkten Download noch unterbinden möchte. Stichwort Protected Files. Das ist in ProcessWire von Haus aus möglich.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel Login / Logoutformular als Layout Block mit Redirect&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
/**&lt;br /&gt;
 * fe-login.php provides a login form &lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$sectionClasses = &amp;#039;uk-section fe-login&amp;#039;;&lt;br /&gt;
$forPage = getForPage($page); // parent page of the repeater matrix&lt;br /&gt;
$loginForm = &amp;#039;&lt;br /&gt;
&amp;lt;form action=&amp;quot;./&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;login uk-grid uk-child-width-1-3@s&amp;quot; uk-grid&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;input class=&amp;quot;uk-input&amp;quot; type=&amp;quot;text&amp;quot; id=&amp;quot;user&amp;quot; name=&amp;quot;user&amp;quot; placeholder=&amp;quot;Benutzername&amp;quot;/&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;input class=&amp;quot;uk-input&amp;quot; type=&amp;quot;password&amp;quot; id=&amp;quot;pass&amp;quot; name=&amp;quot;pass&amp;quot; placeholder=&amp;quot;Passwort&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;input class=&amp;quot;uk-input uk-button uk-button-primary&amp;quot; type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;Login&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
$logoutForm = &amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;login logout&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Angemeldet als &amp;#039;.$user-&amp;gt;name.&amp;#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;a class=&amp;quot;uk-button uk-button-primary&amp;quot; href=&amp;quot;?logout=1&amp;quot;&amp;gt;Abmelden&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
if($page-&amp;gt;link){&lt;br /&gt;
  // Redirect available&lt;br /&gt;
  try {&lt;br /&gt;
    $linkPage = $pages-&amp;gt;get($page-&amp;gt;link);&lt;br /&gt;
  } catch (\Throwable $th) {&lt;br /&gt;
    //throw $th;&lt;br /&gt;
    $linkPage = $forPage-&amp;gt;path;&lt;br /&gt;
  }&lt;br /&gt;
}else{&lt;br /&gt;
  $linkPage = $forPage-&amp;gt;path;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// JUST CLICKED LOGGED OUT &amp;gt; LOGOUT &amp;amp; RELOAD PAGE&lt;br /&gt;
if($input-&amp;gt;get-&amp;gt;logout == 1) {&lt;br /&gt;
  $session-&amp;gt;logout();&lt;br /&gt;
  $session-&amp;gt;redirect($forPage-&amp;gt;path);&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
// NOT LOGGED IN &lt;br /&gt;
if(!$user-&amp;gt;isLoggedin()){&lt;br /&gt;
  &lt;br /&gt;
  // FRESH LOGIN &amp;gt; check credentials&lt;br /&gt;
  if($input-&amp;gt;post-&amp;gt;user &amp;amp;&amp;amp; $input-&amp;gt;post-&amp;gt;pass) {&lt;br /&gt;
    $user = $sanitizer-&amp;gt;username($input-&amp;gt;post-&amp;gt;user);&lt;br /&gt;
    $pass = $input-&amp;gt;post-&amp;gt;pass;&lt;br /&gt;
    if($session-&amp;gt;login($user, $pass)) {&lt;br /&gt;
      // LOGIN SUCCESS&lt;br /&gt;
      $session-&amp;gt;redirect($linkPage-&amp;gt;path);&lt;br /&gt;
    } else {&lt;br /&gt;
      // LOGIN FAILED&lt;br /&gt;
      $out .= &amp;#039;&amp;lt;p class=&amp;quot;uk-alert&amp;quot;&amp;gt;Anmeldung ungültig.&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
  } else {&lt;br /&gt;
  // PRESENT LOGIN FORM&lt;br /&gt;
    $out .= $loginForm;&lt;br /&gt;
  }&lt;br /&gt;
} else {&lt;br /&gt;
  // LOGGED IN &amp;gt; SHOW LOGOUT FORM&lt;br /&gt;
  $out .= $logoutForm;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$sectionClasses = &amp;#039;fe-login&amp;#039;;&lt;br /&gt;
$out = &amp;#039;&amp;lt;div class=&amp;quot;uk-container&amp;quot;&amp;gt;&amp;#039;.$out.&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
//bd($forPage-&amp;gt;loginForm,&amp;#039;forPage loginform&amp;#039;);&lt;br /&gt;
$out = renderSection($page,$out,$sectionClasses);&lt;br /&gt;
return $out;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_passwortgesch%C3%BCtzter_Bereich&amp;diff=26253</id>
		<title>ProcessWire - passwortgeschützter Bereich</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_passwortgesch%C3%BCtzter_Bereich&amp;diff=26253"/>
		<updated>2022-09-30T18:47:20Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: Die Seite wurde neu angelegt: „ https://processwire.com/talk/topic/107-custom-login/  Es gibt Module dafür, aber man kann auch mit Bordmitteln gut arbeiten und ist evtl. flexibler.  Je nach…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://processwire.com/talk/topic/107-custom-login/&lt;br /&gt;
&lt;br /&gt;
Es gibt Module dafür, aber man kann auch mit Bordmitteln gut arbeiten und ist evtl. flexibler.&lt;br /&gt;
&lt;br /&gt;
Je nachdem was man möchte sind unterschiedliche Ansätze sinnvoll.&lt;br /&gt;
* Seiten schützen&lt;br /&gt;
* Teile von Seiten schützen&lt;br /&gt;
* Was soll passieren wenn man eine geschützte Seite ohne Anmeldung aufruft (Login Form, Redirect...)&lt;br /&gt;
* Login im Seitentemplate oder als Inhaltselement&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_User_Login_/_Logout&amp;diff=26252</id>
		<title>ProcessWire - User Login / Logout</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_User_Login_/_Logout&amp;diff=26252"/>
		<updated>2022-09-30T18:27:39Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[ProcessWire - passwortgeschützter Bereich]]&lt;br /&gt;
 Login Throttle Error: https://processwire.com/talk/topic/107-custom-login/?page=2#comment-58627&lt;br /&gt;
 AJAX Login / Logout https://processwire.com/talk/topic/107-custom-login/?page=2#comment-66005&lt;br /&gt;
 Login / Logout Module https://processwire.com/talk/topic/9811-frontenduser-login-logout-and-register-users-members/&lt;br /&gt;
&lt;br /&gt;
Beispiel: Einfacher Logout&lt;br /&gt;
In _main.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Handle Logout Parameter (before any output)&lt;br /&gt;
if($input-&amp;gt;get-&amp;gt;logout == 1) {&lt;br /&gt;
  $session-&amp;gt;logout();&lt;br /&gt;
  $session-&amp;gt;redirect(&amp;quot;./&amp;quot;); // start them on a fresh page, or redirect to another&lt;br /&gt;
}&lt;br /&gt;
//... &lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  if($user-&amp;gt;isLoggedin()) { // user is logged in&lt;br /&gt;
    //echo &amp;quot;&amp;lt;a href=&amp;#039;{$config-&amp;gt;urls-&amp;gt;admin}login/logout/&amp;#039;&amp;gt;Logout ($user-&amp;gt;name)&amp;lt;/a&amp;gt;&amp;quot;; // logout and go to normal pw backend login page&lt;br /&gt;
    echo &amp;quot;&amp;lt;a href=&amp;#039;{$homepage-&amp;gt;url}?logout=1&amp;#039;&amp;gt;Logout ($user-&amp;gt;name)&amp;lt;/a&amp;gt;&amp;quot;; // logout and go to homepage (needs handling of logout parameter see top)&lt;br /&gt;
  } else {&lt;br /&gt;
    // if user not logged in, show a login link&lt;br /&gt;
    //echo &amp;quot;&amp;lt;a href=&amp;#039;{$config-&amp;gt;urls-&amp;gt;admin}&amp;#039;&amp;gt;∆&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
      echo &amp;quot;&amp;amp;nbsp;&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  // output an &amp;quot;Edit&amp;quot; link if this page happens to be editable by the current user&lt;br /&gt;
  if($page-&amp;gt;editable()) echo &amp;quot;&amp;amp;nbsp;&amp;lt;span class=&amp;#039;edit&amp;#039;&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;editUrl&amp;#039;&amp;gt;Seite bearbeiten&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Frontend passwortgeschützter interner Bereich für Besucher ==&lt;br /&gt;
Du benötigst&lt;br /&gt;
* mindestens eine Usergruppe mit User&lt;br /&gt;
* die Loginseite redirectet User ohne Backendberechtigungen immer auf das Frontend.&lt;br /&gt;
* Dateien vor direktem Download schützen. ProcessWire bietet hierfür eine integrierte Funktionalität: [[Web_-_Protecting_Files#ProcessWire_-_Dateien_sch.C3.BCtzen|https://wiki.stephanschlegel.de/index.php?title=Web_-_Protecting_Files#ProcessWire_-_Dateien_sch.C3.BCtzen]]&lt;br /&gt;
&lt;br /&gt;
== PageProtector Module ==&lt;br /&gt;
Von Adrian&lt;br /&gt;
 https://processwire.com/modules/page-protector/&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Snippets&amp;diff=26251</id>
		<title>ProcessWire - Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Snippets&amp;diff=26251"/>
		<updated>2022-09-30T14:33:10Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: /* Parent von Repeater oder RepeaterMatrix finden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier findest du ein paar Basis Snippets. Codebeispiele zu Feldern findest du z.B. über die Seiten zu den Field Types.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
 [[ProcessWire - Module Snippets]]&lt;br /&gt;
 [[ProcessWire - Navigation Snippets]]&lt;br /&gt;
 [[ProcessWire - Debugging Snippets]]&lt;br /&gt;
 [[ProcessWire - Selectors]]&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
=== Bild in Template einbinden ===&lt;br /&gt;
 &amp;lt;img src=&amp;quot;&amp;lt;?php echo $config-&amp;gt;urls-&amp;gt;templates?&amp;gt;img/menu.png&amp;quot; alt=&amp;quot;Home&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Link zu Seite ===&lt;br /&gt;
 &amp;lt;a href=&amp;quot;&amp;lt;?php echo $pages-&amp;gt;get(&amp;#039;/kontakt/&amp;#039;)-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
=== Wert aus Textfeld ===&lt;br /&gt;
 &amp;lt;div class=&amp;quot;&amp;lt;? echo $page-&amp;gt;get(&amp;quot;content_class&amp;quot;)?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
=== Umfassende Renderfunktion zum wiederverwenden ===&lt;br /&gt;
Hier immer wieder aktualisiert. Todo Option für srcset.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * render image tag from imageobject&lt;br /&gt;
 * @todo add srcset version,add ukimage version, other attributes&lt;br /&gt;
 * @todo attributes as object or string&lt;br /&gt;
 * @param Object Image&lt;br /&gt;
 * @param Int width&lt;br /&gt;
 * @return String&lt;br /&gt;
 */&lt;br /&gt;
function renderImage($image,$w=200,$options=array()){&lt;br /&gt;
  if(!$image instanceof \ProcessWire\Pageimage) return &amp;#039;&amp;#039;;&lt;br /&gt;
  $defaults = array(&lt;br /&gt;
    &amp;#039;resizeHeight&amp;#039; =&amp;gt; false, // use height instead of width to resize&lt;br /&gt;
    &amp;#039;srcset&amp;#039; =&amp;gt; false, // todo&lt;br /&gt;
    &amp;#039;uikit&amp;#039; =&amp;gt; false, // todo&lt;br /&gt;
    &amp;#039;aspect&amp;#039; =&amp;gt; false,&lt;br /&gt;
    &amp;#039;noResize&amp;#039; =&amp;gt; false,&lt;br /&gt;
    &amp;#039;classes&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, // classes as string&lt;br /&gt;
		&amp;#039;attributes&amp;#039; =&amp;gt; false, // attributes as array(attr=&amp;gt;val) or string&lt;br /&gt;
		&amp;#039;title&amp;#039; =&amp;gt; true, // add title tag based on image description&lt;br /&gt;
		&amp;#039;alt&amp;#039; =&amp;gt; true, // add alt tag based on image description&lt;br /&gt;
  );&lt;br /&gt;
  $options = array_merge($defaults,$options);&lt;br /&gt;
	$attributes = array();&lt;br /&gt;
	$strAttr = &amp;#039;&amp;#039;;&lt;br /&gt;
  $classMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// ATTRIBUTES&lt;br /&gt;
  $attributesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	if( $options[&amp;#039;attributes&amp;#039;] ){&lt;br /&gt;
		bd( gettype( $options[&amp;#039;attributes&amp;#039;] ) );&lt;br /&gt;
		if( gettype($options[&amp;#039;attributes&amp;#039;] ) == &amp;#039;string&amp;#039;) $strAttr = (string)$options[&amp;#039;attributes&amp;#039;];&lt;br /&gt;
		else if( gettype($options[&amp;#039;attributes&amp;#039;]) == &amp;#039;array&amp;#039; ){&lt;br /&gt;
			foreach( (array)$options[&amp;#039;attributes&amp;#039;] as $k =&amp;gt; $a ){&lt;br /&gt;
				$attributes[$k] = $a;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;alt&amp;#039;] &amp;amp;&amp;amp; $image-&amp;gt;description) $attributes[&amp;#039;alt&amp;#039;] = $image-&amp;gt;description;&lt;br /&gt;
	if($options[&amp;#039;title&amp;#039;] &amp;amp;&amp;amp; $image-&amp;gt;description) $attributes[&amp;#039;title&amp;#039;] = $image-&amp;gt;description;&lt;br /&gt;
	$attributesMarkup = implode(&amp;#039; &amp;#039;, $attributes);&lt;br /&gt;
	if($strAttr) $attributesMarkup .= &amp;quot; $strAttr&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
  if($options[&amp;#039;classes&amp;#039;]) $classMarkup = &amp;#039; class=&amp;quot;&amp;#039;.$options[&amp;#039;classes&amp;#039;].&amp;#039;&amp;quot;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;resizeHeight&amp;#039;]){&lt;br /&gt;
    $i = $image-&amp;gt;height($w);&lt;br /&gt;
  }else if($options[&amp;#039;aspect&amp;#039;]){&lt;br /&gt;
    $i = $image-&amp;gt;size($w, intval( $w / $options[&amp;#039;aspect&amp;#039;]) );&lt;br /&gt;
  }else if($options[&amp;#039;noResize&amp;#039;]){&lt;br /&gt;
    // Todo&lt;br /&gt;
&lt;br /&gt;
  }else{&lt;br /&gt;
    $i = $image-&amp;gt;width($w);&lt;br /&gt;
  } &lt;br /&gt;
	$out = &amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;.$i-&amp;gt;url.&amp;#039;&amp;quot; &amp;#039;.$classMarkup.$attributesMarkup.&amp;#039;&amp;gt;&amp;#039;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Image Manipulation ===&lt;br /&gt;
ImageMagick, Externe Bilder laden, Bilder Vorrendern...&lt;br /&gt;
[[Processwire - Advanced Image Manipulation]]&lt;br /&gt;
&lt;br /&gt;
=== Praktische Renderfunktionen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Image Function&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * get background-position style via focus point if available&lt;br /&gt;
 * mainly used in other functions&lt;br /&gt;
 * @param Pageimage PW image object&lt;br /&gt;
 * @return Array containing background-position&lt;br /&gt;
 */&lt;br /&gt;
function getFocusStyles($image){&lt;br /&gt;
	// Focal Points if available&lt;br /&gt;
	$imageStyles = array();&lt;br /&gt;
	if($image-&amp;gt;focus){&lt;br /&gt;
		$focus=$image-&amp;gt;focus();&lt;br /&gt;
		//var_dump($focus);&lt;br /&gt;
		$imageStyles[] = &amp;#039;background-position:&amp;#039;.number_format($focus[&amp;quot;left&amp;quot;],1,&amp;quot;.&amp;quot;,&amp;quot;&amp;quot;) .&amp;#039;% &amp;#039;.number_format($focus[&amp;quot;top&amp;quot;],1,&amp;quot;.&amp;quot;,&amp;quot;&amp;quot;).&amp;#039;%;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	return $imageStyles;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * get background-image styles and create image&lt;br /&gt;
 * @todo - make image set instead of single image&lt;br /&gt;
 * @param Pageimage&lt;br /&gt;
 * @param Int Image width&lt;br /&gt;
 * @param String background-size attribute (cover, contain...)&lt;br /&gt;
 * @return array &lt;br /&gt;
 */&lt;br /&gt;
function getBgImageStyles($image, $w = 800,$options = array()){&lt;br /&gt;
  $defaults = array(&lt;br /&gt;
    &amp;#039;size&amp;#039; =&amp;gt; &amp;#039;cover&amp;#039;,&lt;br /&gt;
    &amp;#039;noResize&amp;#039; =&amp;gt; false&lt;br /&gt;
  );&lt;br /&gt;
  $options = array_merge($defaults,$options);&lt;br /&gt;
  &lt;br /&gt;
	if($image){&lt;br /&gt;
		$styles = array();&lt;br /&gt;
    if ($options[&amp;#039;noResize&amp;#039;]) $myImage = $image;&lt;br /&gt;
    else $myImage = $image-&amp;gt;width($w);&lt;br /&gt;
		$styles[] = &amp;quot;background-image: url($myImage-&amp;gt;url);&amp;quot;;&lt;br /&gt;
		$styles[] = &amp;#039;background-size: &amp;#039;.$options[&amp;#039;size&amp;#039;].&amp;#039;; background-repeat: no-repeat;&amp;#039;;&lt;br /&gt;
		$styles = array_merge( $styles, getFocusStyles($myImage) );&lt;br /&gt;
		return $styles;&lt;br /&gt;
	} else return array();&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * render image tag from imageobject&lt;br /&gt;
 * @todo add srcset version, add description, add ukimage version, other attributes&lt;br /&gt;
 * @param Object Image&lt;br /&gt;
 * @param Int width&lt;br /&gt;
 * @return String&lt;br /&gt;
 */&lt;br /&gt;
function renderImage($image,$w=200,$options=array()){&lt;br /&gt;
  if(!$image instanceof \ProcessWire\Pageimage) return &amp;#039;&amp;#039;;&lt;br /&gt;
  $defaults = array(&lt;br /&gt;
    &amp;#039;resizeHeight&amp;#039; =&amp;gt; false, // use height instead of width to resize&lt;br /&gt;
    &amp;#039;srcset&amp;#039; =&amp;gt; false, // todo&lt;br /&gt;
    &amp;#039;uikit&amp;#039; =&amp;gt; false, // todo&lt;br /&gt;
    &amp;#039;aspect&amp;#039; =&amp;gt; false,&lt;br /&gt;
    &amp;#039;noResize&amp;#039; =&amp;gt; false&lt;br /&gt;
  );&lt;br /&gt;
  $options = array_merge($defaults,$options);&lt;br /&gt;
	if($options[&amp;#039;resizeHeight&amp;#039;]){&lt;br /&gt;
    $i = $image-&amp;gt;height($w);&lt;br /&gt;
  }else if($options[&amp;#039;aspect&amp;#039;]){&lt;br /&gt;
    $i = $image-&amp;gt;size($w, intval( $w / $options[&amp;#039;aspect&amp;#039;]) );&lt;br /&gt;
  }else if($options[&amp;#039;noResize&amp;#039;]){&lt;br /&gt;
    // Todo&lt;br /&gt;
  &lt;br /&gt;
  }else{&lt;br /&gt;
    $i = $image-&amp;gt;width($w);&lt;br /&gt;
  } &lt;br /&gt;
	$out = &amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;.$i-&amp;gt;url.&amp;#039;&amp;quot; alt=&amp;quot;&amp;#039;.$i-&amp;gt;description.&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/php&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einzelbild einfügen ===&lt;br /&gt;
&lt;br /&gt;
==== Maximale Breite oder maximale Höhe je nach Orientierung ====&lt;br /&gt;
 $thumburl = $image-&amp;gt;width &amp;gt; $image-&amp;gt;height ? $image-&amp;gt;size(450,0)-&amp;gt;url : $image-&amp;gt;size(0,320);&lt;br /&gt;
&lt;br /&gt;
==== Maximale Breite und maximale Höhe berücksichtigen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$mW = 180;&lt;br /&gt;
$mH = 80;&lt;br /&gt;
$thumbUrl = ($mH / $image-&amp;gt;height) &amp;gt; ($mW / $image-&amp;gt;width) ? $image-&amp;gt;size($mW,0)-&amp;gt;url : $image-&amp;gt;size(0,$mH)-&amp;gt;url;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Bild aus Backend als Hintergrund einfügen====&lt;br /&gt;
(Feldname hier: &amp;#039;&amp;#039;main_image&amp;#039;&amp;#039;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if($page-&amp;gt;main_image){$image = $page-&amp;gt;main_image-&amp;gt;size(640,960);}&lt;br /&gt;
else $image = NULL;&lt;br /&gt;
...&lt;br /&gt;
if($image){&lt;br /&gt;
  echo &amp;quot;&lt;br /&gt;
  &amp;lt;div class=&amp;#039;a-3-4 team-image&amp;#039; style=&amp;#039;background-image:url({$image-&amp;gt;url})&amp;#039;&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;{$myContent}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== n-tes Bild einfügen ===&lt;br /&gt;
 $page-&amp;gt;images-&amp;gt;eq(1); // second image&lt;br /&gt;
&lt;br /&gt;
=== Mehrere Bilder aus dem Backend ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$myImages=&amp;#039;&amp;#039;;&lt;br /&gt;
if(count($page-&amp;gt;images)) {&lt;br /&gt;
  foreach($page-&amp;gt;images as $image) {&lt;br /&gt;
    $myImages .=  &amp;#039;&amp;lt;img class=&amp;quot;img-responsive&amp;quot; src=&amp;quot;&amp;#039;.$image-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
}   &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel 2&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
echo $page-&amp;gt;images-&amp;gt;implode(function($item) {&lt;br /&gt;
  $large = $item-&amp;gt;size(1200,800);&lt;br /&gt;
  $thumb = $item-&amp;gt;size(400,300);&lt;br /&gt;
  return &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;$large-&amp;gt;url&amp;#039;&amp;gt;&amp;lt;img src=&amp;#039;$thumb-&amp;gt;url&amp;#039; alt=&amp;#039;$item-&amp;gt;description&amp;#039;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}, array(&amp;#039;prepend&amp;#039; =&amp;gt; &amp;#039;&amp;lt;ul&amp;gt;&amp;#039;, &amp;#039;append&amp;#039; =&amp;gt; &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;));  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Einfache Galerie ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$gallery = &amp;#039;&amp;lt;div class=&amp;quot;gallery&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
$images = $page-&amp;gt;gallery;&lt;br /&gt;
&lt;br /&gt;
// add thumbnail to gallery&lt;br /&gt;
if(count($page-&amp;gt;thumbnail)){&lt;br /&gt;
    $gallery .= &amp;#039;&amp;lt;a class=&amp;quot;chocolat-image gallery-item&amp;quot; href=&amp;quot;&amp;#039;.$page-&amp;gt;thumbnail-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&amp;#039;. $page-&amp;gt;thumbnail-&amp;gt;getThumb(&amp;#039;thumbnail&amp;#039;) .&amp;#039;&amp;quot; title=&amp;quot;&amp;#039;. $image-&amp;gt;description .&amp;#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
foreach($images as $image){&lt;br /&gt;
    $gallery .= &amp;#039;&amp;lt;a class=&amp;quot;chocolat-image gallery-item&amp;quot; href=&amp;quot;&amp;#039;.$image-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&amp;#039;. $image-&amp;gt;getThumb(&amp;#039;thumbnail&amp;#039;) .&amp;#039;&amp;quot; title=&amp;quot;&amp;#039;. $image-&amp;gt;description .&amp;#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
$gallery .= &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Slider mit Processwire ===&lt;br /&gt;
[[Processwire - Slider]]&lt;br /&gt;
&lt;br /&gt;
== Videos ==&lt;br /&gt;
[[Processwire - Working with Video]]&lt;br /&gt;
&lt;br /&gt;
== File Uploads ==&lt;br /&gt;
[[ProcessWire - Uploads]]&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
[[ProcessWire - Navigation Snippets]]&lt;br /&gt;
&lt;br /&gt;
== Seiten ==&lt;br /&gt;
http://processwire.com/api/variables/pages/&lt;br /&gt;
=== Inhalt einer Seite mit $page-&amp;gt;get() ===&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Visit us at:  &amp;lt;?php  &lt;br /&gt;
$contact = $pages-&amp;gt;get(&amp;quot;/about/contact/&amp;quot;);&lt;br /&gt;
echo $contact-&amp;gt;address;&lt;br /&gt;
?&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Kürzer:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Visit us at: &amp;lt;?=$pages-&amp;gt;get(&amp;quot;/about/contact/&amp;quot;)-&amp;gt;address?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Seiten Filtern find() ===&lt;br /&gt;
==== &amp;quot;Featured&amp;quot; Checkbox im Backend angehakt ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt; &amp;lt;?php &lt;br /&gt;
$features = $pages-&amp;gt;find(&amp;quot;featured=1&amp;quot;);&lt;br /&gt;
foreach($features as $feature)&lt;br /&gt;
   echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{$feature-&amp;gt;url}&amp;#039;&amp;gt;{$feature-&amp;gt;title}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt; &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Limitierte Ausgabe, Sortieren und in Unterverzeichnis ====&lt;br /&gt;
 $pages-&amp;gt;find(&amp;quot;parent=/about/press/, featured=1, limit=3, sort=-date&amp;quot;);&lt;br /&gt;
oder&lt;br /&gt;
 $pages-&amp;gt;get(&amp;quot;/about/press/&amp;quot;)-&amp;gt;children(&amp;quot;featured=1, limit=3, sort=-date&amp;quot;);&lt;br /&gt;
Finde in Kategorie&lt;br /&gt;
 $pages-&amp;gt;get(&amp;quot;/about/press/&amp;quot;)-&amp;gt;find(&amp;quot;featured=1, limit=3, sort=-date&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
==== Seiten mit Template xyz ====&lt;br /&gt;
 $pages-&amp;gt;find(&amp;quot;template=press_release, featured=1, limit=3, sort=-date&amp;quot;);&lt;br /&gt;
Ausführliches Beispiel mit Ausgabe&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt; &amp;lt;?php &lt;br /&gt;
$features = $pages-&amp;gt;find(&amp;quot;template=press_release, featured=1, limit=3, sort=-date&amp;quot;);&lt;br /&gt;
foreach($features as $feature) {&lt;br /&gt;
  echo &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .&lt;br /&gt;
    &amp;quot;&amp;lt;h3&amp;gt;&amp;lt;a href=&amp;#039;{$feature-&amp;gt;url}&amp;#039;&amp;gt;{$feature-&amp;gt;title}&amp;lt;/a&amp;gt;&amp;lt;/h3&amp;gt;&amp;quot; .&lt;br /&gt;
    &amp;quot;&amp;lt;span class=&amp;#039;date&amp;#039;&amp;gt;{$feature-&amp;gt;date}&amp;lt;/span&amp;gt;&amp;quot; .&lt;br /&gt;
    &amp;quot;&amp;lt;p&amp;gt;{$feature-&amp;gt;summary}&amp;lt;/p&amp;gt;&amp;quot; .&lt;br /&gt;
    &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;; &lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Felder ==&lt;br /&gt;
=== Label zu Feldes und Subfeldern ausgeben ===&lt;br /&gt;
Beispiel mit dem Combo Profield. Das Prinzip funktioniert bei allen Feldern.&lt;br /&gt;
 https://processwire.com/talk/topic/26183-getting-label-of-combo-subfield/#comment-217749&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$field = $fields-&amp;gt;get(&amp;#039;your_combo_field_name&amp;#039;);&lt;br /&gt;
$settings = $field-&amp;gt;getComboSettings();&lt;br /&gt;
$subfield = $settings-&amp;gt;getSubfield(&amp;#039;your_subfield_name&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// get label in current user language&lt;br /&gt;
$label = $subfield-&amp;gt;getLabel();&lt;br /&gt;
&lt;br /&gt;
// to get in a language other than current user language&lt;br /&gt;
$label = $subfield-&amp;gt;getLabel(&amp;#039;de&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// to get localized description&lt;br /&gt;
$description = $subfield-&amp;gt;getDescription();&lt;br /&gt;
&lt;br /&gt;
// to get localized notes&lt;br /&gt;
$notes = $subfield-&amp;gt;getNotes();&lt;br /&gt;
&lt;br /&gt;
// also note you can use getLanguageValue&lt;br /&gt;
$label = $subfield-&amp;gt;getLanguageValue(&amp;#039;de&amp;#039;, &amp;#039;label&amp;#039;); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Label eines Felds ausgeben ===&lt;br /&gt;
Geht über das Feld-Objekt.&lt;br /&gt;
 echo $fields-&amp;gt;get(&amp;quot;body&amp;quot;)-&amp;gt;label;&lt;br /&gt;
&lt;br /&gt;
=== Ist ein Feld leer ? ===&lt;br /&gt;
 if($page-&amp;gt;summary_de) { ... }&lt;br /&gt;
 // check whitespace&lt;br /&gt;
 if(trim($page-&amp;gt;summary_de)) { ... }&lt;br /&gt;
&lt;br /&gt;
=== Datumsfelder formatieren ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// aus Datumsfeldern&lt;br /&gt;
echo date(&amp;quot;Y-m-d&amp;quot;, $page-&amp;gt;getUnformatted(&amp;quot;closing&amp;quot;)); &lt;br /&gt;
&lt;br /&gt;
// aus Unix Timestamp mit Vanilla PHP&lt;br /&gt;
echo date(&amp;quot;Y-m-d&amp;quot;, $news-&amp;gt;created);&lt;br /&gt;
&lt;br /&gt;
setlocale(LC_TIME, &amp;quot;de_DE.utf8&amp;quot;);&lt;br /&gt;
$weekday = strftime ( &amp;#039;%A&amp;#039; , $page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;) );&lt;br /&gt;
$date = date(&amp;quot;d.m.Y&amp;quot;, $page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel aus ProcessWire Blog&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
setlocale(LC_ALL, array(&amp;#039;de_DE&amp;#039;,&amp;#039;de_DE.iso88591&amp;#039;,&amp;#039;de_DE.iso885915@euro&amp;#039;,&amp;#039;de_DE.utf8&amp;#039;,&amp;#039;de_DE@euro&amp;#039;));&lt;br /&gt;
$date = $page-&amp;gt;date ? date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;)) : date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;getUnformatted(&amp;quot;createdStr&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Optionen eines Select Felds ausgeben (fieldtypeOptions)===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$options = $fieldtypes-&amp;gt;get(&amp;#039;FieldtypeOptions&amp;#039;)-&amp;gt;getOptions(&amp;#039;YOURFIELDNAME&amp;#039;); &lt;br /&gt;
foreach($options as $option) {&lt;br /&gt;
  echo $option-&amp;gt;id;&lt;br /&gt;
  echo $option-&amp;gt;value;&lt;br /&gt;
  echo $option-&amp;gt;title; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parent von Repeater oder RepeaterMatrix finden ===&lt;br /&gt;
Nutzt man ein Repeater Feld muss man manchmal die Seite herausfinden in der das Feld enthalten ist. Hierfür gibt es die Funktion getForPage().&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if( get_class($myPage) == &amp;#039;ProcessWire\RepeaterMatrixPage&amp;#039; || get_class($myPage) == &amp;#039;ProcessWire\RepeaterPage&amp;#039;) {&lt;br /&gt;
            $forPage = $myPage-&amp;gt;getForPage();&lt;br /&gt;
            //var_dump( $myPage-&amp;gt;getForPage());&lt;br /&gt;
            return $myPage = getImagePage($forPage);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls man Repeater in Repeatern hat kann man auch eine rekursive Funktion nutzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if (!function_exists(&amp;#039;getForPage&amp;#039;)) {&lt;br /&gt;
    &lt;br /&gt;
  function getForPage($myPage, $level=1){&lt;br /&gt;
      // if in repeater or repeaterMatrix find the first parent ProcessWire\Page Page&lt;br /&gt;
      $maxLevel=5;&lt;br /&gt;
      if( get_class($myPage) == &amp;#039;ProcessWire\RepeaterMatrixPage&amp;#039; || get_class($myPage) == &amp;#039;ProcessWire\RepeaterPage&amp;#039;) {&lt;br /&gt;
          $level +=1;&lt;br /&gt;
          if($level &amp;gt; $maxLevel) return false;&lt;br /&gt;
          $forPage = $myPage-&amp;gt;getForPage();&lt;br /&gt;
          //var_dump( $myPage-&amp;gt;getForPage());&lt;br /&gt;
          //echo(&amp;quot;&amp;lt;p&amp;gt;next Level: &amp;quot;.get_class($forPage).&amp;quot;&amp;lt;/p&amp;gt;&amp;quot;);&lt;br /&gt;
          return $myPage = getForPage($forPage);&lt;br /&gt;
         &lt;br /&gt;
      }else if( get_class($myPage) == &amp;#039;ProcessWire\Page&amp;#039;){&lt;br /&gt;
          &lt;br /&gt;
          return $myPage;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Searchbar ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	&amp;lt;!-- search form--&amp;gt;&lt;br /&gt;
	&amp;lt;form class=&amp;#039;search&amp;#039; action=&amp;#039;&amp;lt;?php echo $pages-&amp;gt;get(&amp;#039;template=search&amp;#039;)-&amp;gt;url; ?&amp;gt;&amp;#039; method=&amp;#039;get&amp;#039;&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;#039;text&amp;#039; name=&amp;#039;q&amp;#039; placeholder=&amp;#039;Search&amp;#039; value=&amp;#039;&amp;lt;?php echo $sanitizer-&amp;gt;entities($input-&amp;gt;whitelist(&amp;#039;q&amp;#039;)); ?&amp;gt;&amp;#039; /&amp;gt;&lt;br /&gt;
		&amp;lt;button type=&amp;#039;submit&amp;#039; name=&amp;#039;submit&amp;#039;&amp;gt;Search&amp;lt;/button&amp;gt;&lt;br /&gt;
	&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Create Admin User ==&lt;br /&gt;
=== Reset Password - Passwort zurücksetzen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require &amp;quot;index.php&amp;quot;;&lt;br /&gt;
$admin = $users-&amp;gt;get(&amp;#039;admin1&amp;#039;); // or whatever your username is&lt;br /&gt;
$admin-&amp;gt;setAndSave(&amp;#039;pass&amp;#039;, &amp;#039;geheim&amp;#039;);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 https://processwire-recipes.com/recipes/resetting-admin-password-via-api/&lt;br /&gt;
Problem&lt;br /&gt;
For some reason, you have managed to lock yourself out of a site you are currently developing.&lt;br /&gt;
&lt;br /&gt;
Solution&lt;br /&gt;
Paste the following into a file (e.g. &amp;quot;reset.php&amp;quot;) in the root folder of the site, then run it.&lt;br /&gt;
&lt;br /&gt;
ProcessWire version &amp;gt;= 2.6.9&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
require &amp;quot;index.php&amp;quot;;&lt;br /&gt;
$admin = $users-&amp;gt;get(&amp;#039;admin&amp;#039;); // or whatever your username is&lt;br /&gt;
$admin-&amp;gt;setAndSave(&amp;#039;pass&amp;#039;, &amp;#039;yo123456&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ProcessWire version &amp;lt; 2.6.9&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
require &amp;quot;index.php&amp;quot;;&lt;br /&gt;
$admin = wire(&amp;#039;users&amp;#039;)-&amp;gt;get(&amp;#039;admin&amp;#039;);&lt;br /&gt;
$admin-&amp;gt;setOutputFormatting(false);&lt;br /&gt;
$admin-&amp;gt;set(&amp;#039;pass&amp;#039;, &amp;#039;yo12345&amp;#039;);&lt;br /&gt;
$admin-&amp;gt;save(&amp;#039;pass&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Editor Link / Login Logout Link ==&lt;br /&gt;
_main.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;editor&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  if($user-&amp;gt;isLoggedin()) {&lt;br /&gt;
    // if user is logged in, show a logout link&lt;br /&gt;
    echo &amp;quot;&amp;lt;a href=&amp;#039;{$config-&amp;gt;urls-&amp;gt;admin}login/logout/&amp;#039;&amp;gt;Logout ($user-&amp;gt;name)&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
  } else {&lt;br /&gt;
    // if user not logged in, show a login link&lt;br /&gt;
    echo &amp;quot;&amp;lt;a href=&amp;#039;{$config-&amp;gt;urls-&amp;gt;admin}&amp;#039;&amp;gt;∆&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  // output an &amp;quot;Edit&amp;quot; link if this page happens to be editable by the current user&lt;br /&gt;
  if($page-&amp;gt;editable()) echo &amp;quot;&amp;lt;li class=&amp;#039;edit nav&amp;#039;&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;editUrl&amp;#039;&amp;gt;Edit&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[ProcessWire - User Login / Logout]]&lt;br /&gt;
&lt;br /&gt;
== Conditions ==&lt;br /&gt;
=== Bedingungen durch Oder Operator in Feldern ===&lt;br /&gt;
Wenn das eine Feld leer ist nimm das nächste...&lt;br /&gt;
 $t = $page-&amp;gt;get(&amp;quot;long_title|title&amp;quot;);&lt;br /&gt;
=== Conditions für Navigation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// If the page has children, then render navigation to them under the body.&lt;br /&gt;
// See the _func.php for the renderNav example function.&lt;br /&gt;
if($page-&amp;gt;hasChildren) {&lt;br /&gt;
	$content .= renderNav($page-&amp;gt;children);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// if the rootParent (section) page has more than 1 child, then render &lt;br /&gt;
// section navigation in the sidebar&lt;br /&gt;
if($page-&amp;gt;rootParent-&amp;gt;hasChildren &amp;gt; 1) {&lt;br /&gt;
	$sidebar = renderNavTree($page-&amp;gt;rootParent, 3) . $page-&amp;gt;sidebar; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== $page Object ==&lt;br /&gt;
Siehe auch [[ProcessWire - Page Object]]&lt;br /&gt;
=== Zugriff auf $page in Funktionen ===&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function getTitle() {&lt;br /&gt;
    $page = wire(&amp;quot;page&amp;quot;);&lt;br /&gt;
    $t = $page-&amp;gt;title;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
oder einfach übergeben.&lt;br /&gt;
=== Variablen zu Render-Datei senden ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// you can send vars (here item count)&lt;br /&gt;
// use this inside the field rendering script&lt;br /&gt;
// ie. $page-&amp;gt;_n&lt;br /&gt;
$page-&amp;gt;set(&amp;#039;_n&amp;#039;,$n);&lt;br /&gt;
$page-&amp;gt;set(&amp;#039;_type&amp;#039;,$item-&amp;gt;type); &lt;br /&gt;
$out .= $item-&amp;gt;render();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Copy and Paste ==&lt;br /&gt;
=== Einfache Datumssteuerung ===&lt;br /&gt;
Setzt Felder date_begin und date_end voraus.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Date check&lt;br /&gt;
$dateValid = true;&lt;br /&gt;
$now = time();&lt;br /&gt;
$start = 0;&lt;br /&gt;
$end = 0;&lt;br /&gt;
if($page-&amp;gt;date_begin){&lt;br /&gt;
  $start = strtotime( $page-&amp;gt;date_begin(&amp;#039;Y-m-d&amp;#039;) . &amp;quot; 00:00:00&amp;quot;);&lt;br /&gt;
  if( !($now &amp;gt;= $start) ) $dateValid = false;&lt;br /&gt;
}&lt;br /&gt;
if($page-&amp;gt;date_end){&lt;br /&gt;
  $end = strtotime( $page-&amp;gt;date_end(&amp;#039;Y-m-d&amp;#039;) . &amp;quot; 23:59:59&amp;quot;);&lt;br /&gt;
  if( ($now &amp;gt; $end) ) $dateValid = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!$dateValid) return &amp;#039;&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copyright / Published Date ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$published_date = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;created);&lt;br /&gt;
&amp;lt;?= &amp;#039;&amp;amp;copy;&amp;#039;.$published_date ?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Stylesheets und Skripte mit AIOM ===&lt;br /&gt;
 &amp;lt;script src=&amp;quot;&amp;lt;?php echo AIOM::JS(array(&amp;#039;scripts/jquery-2.2.4.min.js&amp;#039;,&amp;#039;scripts/jquery.chocolat.js&amp;#039;,&amp;#039;scripts/jquery.fitvids.js&amp;#039;,&amp;#039;scripts/jquery.flexslider-min.js&amp;#039;, &amp;#039;scripts/main.js&amp;#039;)); ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
 &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;&amp;lt;?php echo AIOM::CSS(&amp;#039;styles/main.less&amp;#039;); ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?php echo $homepage-&amp;gt;site_title .&amp;#039; &amp;#039;. Date(&amp;#039;Y&amp;#039;); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Link zur Seite anhand URL-Pfad ===&lt;br /&gt;
 &amp;lt;?php echo $pages-&amp;gt;get(&amp;#039;/ueber-uns/&amp;#039;)-&amp;gt;url; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Feld einer Seite ===&lt;br /&gt;
 $content_left = $page-&amp;gt;get(&amp;#039;content_left&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
=== Bild ===&lt;br /&gt;
 if($page-&amp;gt;main_image){$image = $page-&amp;gt;main_image-&amp;gt;size(640,960);}&lt;br /&gt;
 else $image = NULL;&lt;br /&gt;
=== Bild von der Homepage ===&lt;br /&gt;
in _init.php&lt;br /&gt;
 $homepage = $pages-&amp;gt;get(&amp;#039;/&amp;#039;);&lt;br /&gt;
im Template&lt;br /&gt;
 if($homepage-&amp;gt;config_logo){$logo = $homepage-&amp;gt;config_logo-&amp;gt;width(280);}&lt;br /&gt;
 else $logo = NULL;&lt;br /&gt;
&lt;br /&gt;
=== Simple Navigation ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;ul class=&amp;#039;nav-list&amp;#039;&amp;gt;&lt;br /&gt;
  &amp;lt;?php&lt;br /&gt;
  // Childrens&lt;br /&gt;
  foreach(($page-&amp;gt;children) as $item) {&lt;br /&gt;
    if($item-&amp;gt;id == $page-&amp;gt;rootParent-&amp;gt;id) {&lt;br /&gt;
      echo &amp;#039;&amp;lt;li class=&amp;quot;current&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
    } else {&lt;br /&gt;
      echo &amp;#039;&amp;lt;li&amp;gt;&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    echo &amp;#039;&amp;lt;a class=&amp;quot;ajax-link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
  ?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Auflistung mit div. Feldern aus Kindseiten ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Publications list template&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
$publications = &amp;#039;&amp;#039;;&lt;br /&gt;
$children = $page-&amp;gt;children;&lt;br /&gt;
foreach($children as $child){&lt;br /&gt;
  $publications .= &amp;#039;&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
  $publications .= &amp;#039;&amp;lt;h2&amp;gt;&amp;lt;a class=&amp;quot;ajax-link&amp;quot; parent=&amp;quot;&amp;#039;. $child-&amp;gt;parent-&amp;gt;title .&amp;#039;&amp;quot; name=&amp;quot;&amp;#039;.$child-&amp;gt;title.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;. $child-&amp;gt;url. &amp;#039;&amp;quot;&amp;gt;&amp;#039;. $child-&amp;gt;title . &amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/h2&amp;gt;&amp;#039;;&lt;br /&gt;
  $publications .= $child-&amp;gt;body;&lt;br /&gt;
  $publications .= &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$content = $page-&amp;gt;body . $publications;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Minigalerie ===&lt;br /&gt;
Thumbnails / Child Pages&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$works = &amp;#039;&amp;lt;div class=&amp;quot;gallery&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
$children = $page-&amp;gt;children;&lt;br /&gt;
foreach($children as $child){&lt;br /&gt;
  $works .= &amp;#039;&amp;lt;a class=&amp;quot;ajax-link&amp;quot; parent=&amp;quot;&amp;#039;. $child-&amp;gt;parent-&amp;gt;title .&amp;#039;&amp;quot; name=&amp;quot;&amp;#039;.$child-&amp;gt;title.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;. $child-&amp;gt;url. &amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
  $works .= &amp;#039;&amp;lt;h2&amp;gt;&amp;#039;. $child-&amp;gt;title . &amp;#039;&amp;lt;/h2&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  if(count($child-&amp;gt;thumbnail)){&lt;br /&gt;
      $works .= &amp;#039;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&amp;#039;. $child-&amp;gt;thumbnail-&amp;gt;getThumb(&amp;#039;thumbnail&amp;#039;) .&amp;#039;&amp;quot; title=&amp;quot;&amp;#039;. $image-&amp;gt;description .&amp;#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  $works .= &amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
$works .= &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$content = $page-&amp;gt;body . $works . &amp;#039;&amp;lt;br/&amp;gt;&amp;#039; . $page-&amp;gt;video;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Page Navigation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// add next button if there is another page next&lt;br /&gt;
if($page-&amp;gt;next-&amp;gt;id){&lt;br /&gt;
    $next = &amp;#039;&amp;lt;div class=&amp;quot;next&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Next:&amp;lt;/i&amp;gt;&amp;amp;nbsp;&amp;lt;a class=&amp;quot;ajax-link&amp;quot; name=&amp;quot;&amp;#039;.$page-&amp;gt;next-&amp;gt;title.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;. $page-&amp;gt;next-&amp;gt;url .&amp;#039;&amp;quot;&amp;gt;&amp;#039;. $page-&amp;gt;next-&amp;gt;title .&amp;#039;&amp;lt;span class=&amp;quot;fa fa-arrow-right&amp;quot;&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$content = &amp;#039;&amp;lt;h2&amp;gt;&amp;#039;. $page-&amp;gt;title . &amp;#039;&amp;lt;/h2&amp;gt;&amp;#039; . $page-&amp;gt;body . &amp;#039;&amp;lt;br/&amp;gt;&amp;lt;div class=&amp;quot;video&amp;quot;&amp;gt;&amp;#039; . $page-&amp;gt;video .&amp;#039;&amp;lt;/div&amp;gt;&amp;#039; . $next;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Simple Gallery with next Page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$gallery = &amp;#039;&amp;lt;div class=&amp;quot;gallery&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
$images = $page-&amp;gt;gallery;&lt;br /&gt;
&lt;br /&gt;
// add thumbnail to gallery&lt;br /&gt;
if(count($page-&amp;gt;thumbnail)){&lt;br /&gt;
    $gallery .= &amp;#039;&amp;lt;a class=&amp;quot;chocolat-image gallery-item&amp;quot; href=&amp;quot;&amp;#039;.$page-&amp;gt;thumbnail-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&amp;#039;. $page-&amp;gt;thumbnail-&amp;gt;getThumb(&amp;#039;thumbnail&amp;#039;) .&amp;#039;&amp;quot; title=&amp;quot;&amp;#039;. $image-&amp;gt;description .&amp;#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
foreach($images as $image){&lt;br /&gt;
    $gallery .= &amp;#039;&amp;lt;a class=&amp;quot;chocolat-image gallery-item&amp;quot; href=&amp;quot;&amp;#039;.$image-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&amp;#039;. $image-&amp;gt;getThumb(&amp;#039;thumbnail&amp;#039;) .&amp;#039;&amp;quot; title=&amp;quot;&amp;#039;. $image-&amp;gt;description .&amp;#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
$gallery .= &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// add next button if there is another page next&lt;br /&gt;
if($page-&amp;gt;next-&amp;gt;id){&lt;br /&gt;
    $next = &amp;#039;&amp;lt;div class=&amp;quot;next&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Next:&amp;lt;/i&amp;gt;&amp;amp;nbsp;&amp;lt;a class=&amp;quot;ajax-link&amp;quot; name=&amp;quot;&amp;#039;.$page-&amp;gt;next-&amp;gt;title.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;. $page-&amp;gt;next-&amp;gt;url .&amp;#039;&amp;quot;&amp;gt;&amp;#039;. $page-&amp;gt;next-&amp;gt;title .&amp;#039;&amp;lt;span class=&amp;quot;fa fa-arrow-right&amp;quot;&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$content = &amp;#039;&amp;lt;h2&amp;gt;&amp;#039;. $page-&amp;gt;title . &amp;#039;&amp;lt;/h2&amp;gt;&amp;#039; . $page-&amp;gt;body . &amp;#039;&amp;lt;br/&amp;gt;&amp;#039; . $gallery . &amp;#039;&amp;lt;br/&amp;gt;&amp;lt;div class=&amp;quot;video&amp;quot;&amp;gt;&amp;#039; . $page-&amp;gt;video .&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;. $next;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Platzhalter-Seite mit Redirect auf erste Unterseite ===&lt;br /&gt;
Möchte man eine Eltern-Seite für das Menü generieren die keinen eigenen Inhalt besitzt sondern nur Unterseiten enthält, kann man ein Template für diese Seite erstellen, dass den User auf die erste Unterseite weiterleitet.&lt;br /&gt;
&lt;br /&gt;
Diese Lösung ist ein regulärer Redirect. Ob das die Beste Lösung ist müßte man mal überlegen. Auf alle Fälle besser als Duplicate Content.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
$root = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
if($page-&amp;gt;numChildren){&lt;br /&gt;
	$session-&amp;gt;redirect($page-&amp;gt;child()-&amp;gt;url);&lt;br /&gt;
} else $session-&amp;gt;redirect($root-&amp;gt;url);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ProcessWire - Debugging Snippets ==&lt;br /&gt;
[[ProcessWire - Debugging Snippets]]&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_User_Login_/_Logout&amp;diff=26250</id>
		<title>ProcessWire - User Login / Logout</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_User_Login_/_Logout&amp;diff=26250"/>
		<updated>2022-09-30T11:56:24Z</updated>

		<summary type="html">&lt;p&gt;95.208.116.48: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Login Throttle Error: https://processwire.com/talk/topic/107-custom-login/?page=2#comment-58627&lt;br /&gt;
* AJAX Login / Logout https://processwire.com/talk/topic/107-custom-login/?page=2#comment-66005&lt;br /&gt;
* Login / Logout Module https://processwire.com/talk/topic/9811-frontenduser-login-logout-and-register-users-members/&lt;br /&gt;
&lt;br /&gt;
Beispiel: Einfacher Logout&lt;br /&gt;
In _main.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Handle Logout Parameter (before any output)&lt;br /&gt;
if($input-&amp;gt;get-&amp;gt;logout == 1) {&lt;br /&gt;
  $session-&amp;gt;logout();&lt;br /&gt;
  $session-&amp;gt;redirect(&amp;quot;./&amp;quot;); // start them on a fresh page, or redirect to another&lt;br /&gt;
}&lt;br /&gt;
//... &lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  if($user-&amp;gt;isLoggedin()) { // user is logged in&lt;br /&gt;
    //echo &amp;quot;&amp;lt;a href=&amp;#039;{$config-&amp;gt;urls-&amp;gt;admin}login/logout/&amp;#039;&amp;gt;Logout ($user-&amp;gt;name)&amp;lt;/a&amp;gt;&amp;quot;; // logout and go to normal pw backend login page&lt;br /&gt;
    echo &amp;quot;&amp;lt;a href=&amp;#039;{$homepage-&amp;gt;url}?logout=1&amp;#039;&amp;gt;Logout ($user-&amp;gt;name)&amp;lt;/a&amp;gt;&amp;quot;; // logout and go to homepage (needs handling of logout parameter see top)&lt;br /&gt;
  } else {&lt;br /&gt;
    // if user not logged in, show a login link&lt;br /&gt;
    //echo &amp;quot;&amp;lt;a href=&amp;#039;{$config-&amp;gt;urls-&amp;gt;admin}&amp;#039;&amp;gt;∆&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
      echo &amp;quot;&amp;amp;nbsp;&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  // output an &amp;quot;Edit&amp;quot; link if this page happens to be editable by the current user&lt;br /&gt;
  if($page-&amp;gt;editable()) echo &amp;quot;&amp;amp;nbsp;&amp;lt;span class=&amp;#039;edit&amp;#039;&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;editUrl&amp;#039;&amp;gt;Seite bearbeiten&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Frontend passwortgeschützter interner Bereich für Besucher ==&lt;br /&gt;
Du benötigst&lt;br /&gt;
* mindestens eine Usergruppe mit User&lt;br /&gt;
* die Loginseite redirectet User ohne Backendberechtigungen immer auf das Frontend.&lt;br /&gt;
* Dateien vor direktem Download schützen. ProcessWire bietet hierfür eine integrierte Funktionalität: [[Web_-_Protecting_Files#ProcessWire_-_Dateien_sch.C3.BCtzen|https://wiki.stephanschlegel.de/index.php?title=Web_-_Protecting_Files#ProcessWire_-_Dateien_sch.C3.BCtzen]]&lt;br /&gt;
&lt;br /&gt;
== PageProtector Module ==&lt;br /&gt;
Von Adrian&lt;br /&gt;
 https://processwire.com/modules/page-protector/&lt;/div&gt;</summary>
		<author><name>95.208.116.48</name></author>
	</entry>
</feed>