<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.stephanschlegel.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=84.157.23.32</id>
	<title>Wikizone - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.stephanschlegel.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=84.157.23.32"/>
	<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Spezial:Beitr%C3%A4ge/84.157.23.32"/>
	<updated>2026-05-06T16:45:54Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Template_from_Scratch&amp;diff=24105</id>
		<title>Processwire - Template from Scratch</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Template_from_Scratch&amp;diff=24105"/>
		<updated>2019-10-23T08:29:44Z</updated>

		<summary type="html">&lt;p&gt;84.157.23.32: /* Seitentemplates - delayed output */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wir erstellt man in Processwire ein Template ? So gehts.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Processwire - Themes / Templates&lt;br /&gt;
* Module: http://modules.processwire.com/&lt;br /&gt;
* Cheatsheet für Variablen: http://www.processwire.com/api/cheatsheet&lt;br /&gt;
* Variablen erklärt: http://processwire.com/api/variables/&lt;br /&gt;
&lt;br /&gt;
[[ProcessWire - Snippets]]&lt;br /&gt;
&lt;br /&gt;
Tipp: Module lassen sich unter &amp;#039;&amp;#039;&amp;#039;Module &amp;gt; Neu&amp;#039;&amp;#039;&amp;#039; direkt importieren wenn man den Modulklassennamen angibt.&lt;br /&gt;
== Processwire installieren ==&lt;br /&gt;
* Install&lt;br /&gt;
** Installer laufen lassen, als Option Blank Template wählen.&lt;br /&gt;
** Backend Template&lt;br /&gt;
*** Reno Modul installieren (ist schon drin, muss nur aktiviert werden)&lt;br /&gt;
** Language Support&lt;br /&gt;
*** Language Support Module installieren&lt;br /&gt;
*** Language in Setup anlegen (German)&lt;br /&gt;
*** Language Pack für Core hochladen&lt;br /&gt;
== Wichtige Module installieren ==&lt;br /&gt;
* Markup Simple Navigation Modul installieren (Klassenname: MarkupSimpleNavigation)&lt;br /&gt;
== Template / Theme erstellen ==&lt;br /&gt;
=== Basisstruktur im Templateordner ===&lt;br /&gt;
Diese ist schon angelegt, wenn man das blank Template am Anfang auswählt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts&lt;br /&gt;
/styles&lt;br /&gt;
/errors &lt;br /&gt;
home.php&lt;br /&gt;
basic-page.php &lt;br /&gt;
admin.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Seitentemplates anlegen - einfache Variante ===&lt;br /&gt;
Ein Template kann z.b. so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;basic-page.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php include(&amp;#039;./head.inc&amp;#039;); // include header markup ?&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;&amp;lt;?php echo $page-&amp;gt;title; ?&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;?php include(&amp;#039;./foot.inc&amp;#039;); // include footer markup ?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;head.inc&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&amp;lt;?php echo $page-&amp;gt;title; ?&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;foot.inc&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im Backend kann man unter Setup &amp;gt; Templates neue Templates anlegen, die man dann wiederum Seiten zuweisen kann. Processwire sucht dann im Templatesverzeichnis nach dem passenden Dateinamen.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Processwire kann alle möglichen Seiten ausgeben, also auch JSON oder XML&lt;br /&gt;
=== Seitentemplates - delayed output ===&lt;br /&gt;
Dies ist die Default vorgehensweise in Processwire für komplexere Seiten. Hierbei werden die Templateinhalte in Einzelschritten geladen:&lt;br /&gt;
 _init.php -&amp;gt; myTemplate.php -&amp;gt; _main.php&lt;br /&gt;
myTemplate.php enthält den spezifischen Seiteninhalt, speichert diesen in Variablen und übergibt das Ganze an _main.php&lt;br /&gt;
&lt;br /&gt;
Damit Processwire die genannten Dateien so wie oben verarbeitet, müssen sie in der config.php registriert sein:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Prepend template file&lt;br /&gt;
 *&lt;br /&gt;
 * PHP file in /site/templates/ that will be loaded before each page&amp;#039;s template file.&lt;br /&gt;
 * Example: _init.php&lt;br /&gt;
 *&lt;br /&gt;
 * @var string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
$config-&amp;gt;prependTemplateFile = &amp;#039;_init.php&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Append template file&lt;br /&gt;
 *&lt;br /&gt;
 * PHP file in /site/templates/ that will be loaded after each page&amp;#039;s template file.&lt;br /&gt;
 * Example: _main.php&lt;br /&gt;
 *&lt;br /&gt;
 * @var string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
$config-&amp;gt;appendTemplateFile = &amp;#039;_main.php&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
basic-page.php:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $content = $page-&amp;gt;body . $page-&amp;gt;video;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
_main.php:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    include(&amp;quot;./head.inc&amp;quot;);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div id=&amp;quot;page&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;header class=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;a id=&amp;quot;logo&amp;quot; href=&amp;quot;&amp;lt;?php echo $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;h1&amp;gt;&lt;br /&gt;
                &amp;lt;?php echo $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;title; ?&amp;gt;&lt;br /&gt;
            &amp;lt;/h1&amp;gt;&lt;br /&gt;
        &amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;aside&amp;gt;&lt;br /&gt;
        &amp;lt;nav&amp;gt;&lt;br /&gt;
            &amp;lt;?php&lt;br /&gt;
                // echo nav links&lt;br /&gt;
                $children = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;children;&lt;br /&gt;
                foreach($children as $child){       &lt;br /&gt;
                    echo &amp;#039;&amp;lt;a name=&amp;quot;&amp;#039;.$child-&amp;gt;title.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;#039;.$class.&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;#039;;&lt;br /&gt;
                }&lt;br /&gt;
            ?&amp;gt;&lt;br /&gt;
        &amp;lt;/nav&amp;gt;&lt;br /&gt;
    &amp;lt;/aside&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;content-container cf&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;content current-content&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;?php&lt;br /&gt;
                // add content to page from template file&lt;br /&gt;
                echo $content;&lt;br /&gt;
            ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    include(&amp;quot;./foot.inc&amp;quot;);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
_main.php enthält also die generelle Struktur und die Seitentemplates die spezifischen Inhalte. Man kann das allerdings auch besser aufbauen als oben.&lt;br /&gt;
&lt;br /&gt;
=== Markup Regions ===&lt;br /&gt;
 https://processwire.com/docs/front-end/output/markup-regions/&lt;br /&gt;
Setzt man in der config.php&lt;br /&gt;
 $config-&amp;gt;useMarkupRegions;&lt;br /&gt;
Sucht ProcessWire nach id Attributen (oder den Attributen pw-id oder data-pw-id) im Markup. Diese merkt sich PW dann als MarkupRegions. Wenn ein nachfolgendes Template die gleiche id nutzt wird diese Region ersetzt. In der Regel wird man in der _main.php die Basis Definition machen und in den Inhaltstemplates, kann man dann die Regions ersetzten. So kann man auch schön Teile einer Seite mit einem Inhaltstemplate ersetzen und den Rest gleich lassen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;_main.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;page&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;?php include($headerMarkup); ?&amp;gt;&lt;br /&gt;
  &amp;lt;main id=&amp;quot;main&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Hauptinhalt&amp;lt;/p&amp;gt;  &lt;br /&gt;
  &amp;lt;/main&amp;gt;&lt;br /&gt;
  &amp;lt;?php include($footerMarkup); ?&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;basic-page.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;main id=&amp;quot;main&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;?=page()-&amp;gt;body?&amp;gt;&lt;br /&gt;
&amp;lt;/main&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fazit: Kann sehr praktisch sein und erleichtert die Ausgabe je nach Arbeitsweise. Zeigt aber eine geringfügig schlechtere Performance und ist evtl. für manche Aufgaben die sehr dynamisch mit Daten umgehen nicht so gut geeignet.&lt;br /&gt;
&lt;br /&gt;
=== AJAX Loading ===&lt;br /&gt;
Mit der delayed Technik kann man jetzt auch nur Teile der Seite laden. So hat man niemals eine weiße Seite. So wollen wir vorgehen:&lt;br /&gt;
* Wir laden die neuen Inhalte in einen HTML Container &lt;br /&gt;
* Neue Inhalte werden gelanden und an vorhandenen Inhalte angehängt&lt;br /&gt;
* Dann machen wir einen animierten Seitenübergang und löschen die alten Inhalte&lt;br /&gt;
&lt;br /&gt;
Processwire stellt eine $ajax Variable zur Verfügung die wir nutzen können um zu prüfen, ob ein AJAX Request vorliegt. Wenn nicht können wir die komplette Seite austauschen. &lt;br /&gt;
&lt;br /&gt;
So könnte das aussehen (_main.php):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// include page structure if not an ajax request&lt;br /&gt;
if(!$ajax):&lt;br /&gt;
    include(&amp;quot;./head.inc&amp;quot;);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div id=&amp;quot;page&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;header class=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;a id=&amp;quot;logo&amp;quot; href=&amp;quot;&amp;lt;?php echo $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;h1&amp;gt;&lt;br /&gt;
            &amp;lt;?php echo $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;title; ?&amp;gt;&lt;br /&gt;
            &amp;lt;/h1&amp;gt;&lt;br /&gt;
        &amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;/header&amp;gt;&lt;br /&gt;
    &amp;lt;aside&amp;gt;&lt;br /&gt;
        &amp;lt;nav&amp;gt;&lt;br /&gt;
        &amp;lt;?php&lt;br /&gt;
        // nav content here &lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
        &amp;lt;/nav&amp;gt;&lt;br /&gt;
    &amp;lt;/aside&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;content-container cf&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;content current-content&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;?php endif; // end if ajax ?&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
        &amp;lt;?php&lt;br /&gt;
        // if ajax then only return $content&lt;br /&gt;
        echo $content;&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
        &amp;lt;?php if(!$ajax): ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    include(&amp;quot;./foot.inc&amp;quot;);&lt;br /&gt;
endif; // end if ajax&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AJAX über jQuery ===&lt;br /&gt;
Um das AJAX Loading der Inhalte zu realisieren nutzen wir &amp;#039;&amp;#039;&amp;#039;jQuery&amp;#039;&amp;#039;&amp;#039;. Dies notwendigen Funktionen binden wir über die &amp;#039;&amp;#039;main.js&amp;#039;&amp;#039; ein und laden das ganze in der &amp;#039;&amp;#039;foot.inc&amp;#039;&amp;#039; . &lt;br /&gt;
&lt;br /&gt;
foot.inc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;footer&amp;quot; class=&amp;quot;footer&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;&amp;amp;copy; &amp;lt;?php echo $homepage-&amp;gt;site_title .&amp;#039; &amp;#039;. Date(&amp;#039;Y&amp;#039;); ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;?php echo $footer; ?&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!--/#page--&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // If the page is editable, then output a link that takes us straight to the page edit screen:&lt;br /&gt;
  if($page-&amp;gt;editable()) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;a class=&amp;#039;nav&amp;#039; id=&amp;#039;editpage&amp;#039; href=&amp;#039;{$config-&amp;gt;urls-&amp;gt;admin}page/edit/?id={$page-&amp;gt;id}&amp;#039;&amp;gt;Edit&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
?&amp;gt;&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;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
main.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$(function() {&lt;br /&gt;
 &lt;br /&gt;
    var href;&lt;br /&gt;
    var title;&lt;br /&gt;
 &lt;br /&gt;
    $(&amp;#039;body&amp;#039;).on(&amp;#039;click&amp;#039;,&amp;#039;a.ajax-link&amp;#039;,function(e) { // nav link clicked&lt;br /&gt;
 &lt;br /&gt;
        href = $(this).attr(&amp;quot;href&amp;quot;);&lt;br /&gt;
        title = $(this).attr(&amp;quot;name&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        // load content via AJAX&lt;br /&gt;
        loadContent(href);&lt;br /&gt;
 &lt;br /&gt;
        // prevent click and reload&lt;br /&gt;
        e.preventDefault();&lt;br /&gt;
    });&lt;br /&gt;
 &lt;br /&gt;
    function loadContent(url){ // Load content&lt;br /&gt;
 &lt;br /&gt;
        // variable for page data&lt;br /&gt;
        $pageData = &amp;#039;&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
        // send Ajax request&lt;br /&gt;
        $.ajax({&lt;br /&gt;
            type: &amp;quot;POST&amp;quot;,&lt;br /&gt;
            url: url,&lt;br /&gt;
            data: { ajax: true },&lt;br /&gt;
            success: function(data,status){&lt;br /&gt;
                $pageData = data;&lt;br /&gt;
            }&lt;br /&gt;
        }).done(function(){ // when finished and successful&lt;br /&gt;
 &lt;br /&gt;
            // construct new content&lt;br /&gt;
            $pageData = &amp;#039;&amp;lt;div class=&amp;quot;content no-opacity ajax&amp;quot;&amp;gt;&amp;#039; + $pageData + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
            // add content to page&lt;br /&gt;
            $(&amp;#039;.content-container&amp;#039;).append($pageData);&lt;br /&gt;
 &lt;br /&gt;
            // remove old content&lt;br /&gt;
            $(&amp;#039;.content.current-content&amp;#039;).remove();&lt;br /&gt;
 &lt;br /&gt;
            // show new content and clean up classes&lt;br /&gt;
            $(this).removeClass(&amp;#039;no-opacity&amp;#039;).removeClass(&amp;#039;ajax&amp;#039;).addClass(&amp;#039;current-content&amp;#039;);&lt;br /&gt;
             &lt;br /&gt;
        }); // end of ajax().done()&lt;br /&gt;
    } // end of loadContent()&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Extras ====&lt;br /&gt;
Außerdem möchten wir ein paar nützliche Sachen einbinden:&lt;br /&gt;
* Animierter Seitenübergang&lt;br /&gt;
* Reinitialisieren der Skripte nach dem Seitenübergang (Lightboxen, Slideshows etc..)&lt;br /&gt;
* Already Loaded Check - wenn ein User geklickt hat soll ein erneuter Klick nicht den Ladevorgang neu starten.&lt;br /&gt;
* Browser History - wir nutzen html5 history um die richtigen Inhalte zu laden wenn der User den Backbutton nutzt. Sonst würde die letzte komplette Seite geladen, statt nur der letzen ausgetauschten Inhalte.&lt;br /&gt;
&lt;br /&gt;
So sieht main.js am Ende aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$(function() {&lt;br /&gt;
&lt;br /&gt;
	// fitvids for responsivce videos&lt;br /&gt;
	$(&amp;quot;.content .video&amp;quot;).fitVids();&lt;br /&gt;
&lt;br /&gt;
	// light box&lt;br /&gt;
	$(&amp;#039;.gallery&amp;#039;).Chocolat();&lt;br /&gt;
&lt;br /&gt;
	// flexslider&lt;br /&gt;
	$(&amp;#039;.flexslider&amp;#039;).flexslider({&lt;br /&gt;
		pauseOnHover: true,&lt;br /&gt;
		controlNav: false,&lt;br /&gt;
		prevText: &amp;quot;&amp;quot;,&lt;br /&gt;
		nextText: &amp;quot;&amp;quot;,&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
	*   HTML5 pushstate and ajax content&lt;br /&gt;
	*/&lt;br /&gt;
&lt;br /&gt;
	var href;&lt;br /&gt;
	var title;&lt;br /&gt;
&lt;br /&gt;
  	$(&amp;#039;body&amp;#039;).on(&amp;#039;click&amp;#039;,&amp;#039;a.ajax-link&amp;#039;,function(e) { // nav link clicked&lt;br /&gt;
&lt;br /&gt;
    	// check to see it contents already accessed&lt;br /&gt;
    	if($(this).hasClass(&amp;#039;current&amp;#039;)){&lt;br /&gt;
&lt;br /&gt;
        	console.log(&amp;#039;current page&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
			// prevent click through&lt;br /&gt;
			e.preventDefault();&lt;br /&gt;
			// exist click function (dont load new content)&lt;br /&gt;
        	return true;&lt;br /&gt;
    	}&lt;br /&gt;
&lt;br /&gt;
      	$(&amp;#039;.current&amp;#039;).removeClass(&amp;#039;current&amp;#039;); // remove .current from active link&lt;br /&gt;
		$(&amp;#039;.parent&amp;#039;).removeClass(&amp;#039;parent&amp;#039;); // remove .current from active link&lt;br /&gt;
      	$(this).addClass(&amp;#039;current&amp;#039;); // add .current&lt;br /&gt;
&lt;br /&gt;
		var parent = $(this).attr(&amp;#039;parent&amp;#039;);&lt;br /&gt;
		if(parent){ // if link page has parent nav&lt;br /&gt;
			$(&amp;#039;nav a[name=&amp;quot;&amp;#039;+parent+&amp;#039;&amp;quot;]&amp;#039;).addClass(&amp;#039;parent&amp;#039;); // add .current&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// add progress spinner on cursor&lt;br /&gt;
      	$(&amp;#039;body&amp;#039;).css(&amp;#039;cursor&amp;#039;,&amp;#039;progress&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		// remove cusor spinner&lt;br /&gt;
		var pointerTimeout = setTimeout(function () {&lt;br /&gt;
			$(&amp;#039;body&amp;#039;).css(&amp;#039;cursor&amp;#039;,&amp;#039;auto&amp;#039;); // progress spinner on cursor&lt;br /&gt;
		}, 1000);&lt;br /&gt;
&lt;br /&gt;
      	href = $(this).attr(&amp;quot;href&amp;quot;);&lt;br /&gt;
      	title = $(this).attr(&amp;quot;name&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		// load content via AJAX&lt;br /&gt;
      	loadContent(href);&lt;br /&gt;
&lt;br /&gt;
		// add new url to html5 history&lt;br /&gt;
      	history.pushState(&amp;#039;&amp;#039;, +href, href); // push url to history&lt;br /&gt;
&lt;br /&gt;
		// change title to new page&lt;br /&gt;
      	$(&amp;#039;title&amp;#039;).html(title);&lt;br /&gt;
&lt;br /&gt;
		// send GA pageview&lt;br /&gt;
      	ga(&amp;#039;send&amp;#039;, &amp;#039;pageview&amp;#039;, href);&lt;br /&gt;
&lt;br /&gt;
		// prevent click and reload&lt;br /&gt;
    	e.preventDefault();&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
    // for back / forwards browser navigation&lt;br /&gt;
    var toggleHistoryVisitNum = 0;&lt;br /&gt;
    function toggleHistory(){&lt;br /&gt;
        window.onpopstate = function(event) {&lt;br /&gt;
            if(window.location.hash == &amp;quot;&amp;quot;){&lt;br /&gt;
                loadContent(location.pathname);&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
	function loadContent(url){ // Load content&lt;br /&gt;
&lt;br /&gt;
		// variable for page data&lt;br /&gt;
    	$pageData = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		// send Ajax request&lt;br /&gt;
    	$.ajax({&lt;br /&gt;
	        type: &amp;quot;POST&amp;quot;,&lt;br /&gt;
	        url: url,&lt;br /&gt;
	        data: { ajax: true },&lt;br /&gt;
	        success: function(data,status){&lt;br /&gt;
				$pageData = data;&lt;br /&gt;
      		}&lt;br /&gt;
    	}).done(function(){ // when finished and successful&lt;br /&gt;
&lt;br /&gt;
			// construct new content&lt;br /&gt;
      		$pageData = &amp;#039;&amp;lt;div class=&amp;quot;content no-opacity ajax&amp;quot;&amp;gt;&amp;#039; + $pageData + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
			// add content to page&lt;br /&gt;
			$(&amp;#039;.content-container&amp;#039;).append($pageData);&lt;br /&gt;
&lt;br /&gt;
			// animate the requested content&lt;br /&gt;
	      	$(&amp;#039;.content.current-content&amp;#039;).animate({&lt;br /&gt;
				// animate out old content&lt;br /&gt;
	        	opacity: 0&lt;br /&gt;
	      	}, 400, function(){&lt;br /&gt;
&lt;br /&gt;
				$(&amp;#039;.content.current-content&amp;#039;).slideUp(400);&lt;br /&gt;
&lt;br /&gt;
	          	// content animation finished&lt;br /&gt;
	          	$(&amp;#039;.content.ajax&amp;#039;).animate({&lt;br /&gt;
					// animate in new content&lt;br /&gt;
	            	opacity: 1&lt;br /&gt;
	          	}, 400, function(){&lt;br /&gt;
&lt;br /&gt;
					// remove old content&lt;br /&gt;
		            $(&amp;#039;.content.current-content&amp;#039;).remove();&lt;br /&gt;
&lt;br /&gt;
					// show new content and clean up classes&lt;br /&gt;
		            $(this).removeClass(&amp;#039;no-opacity&amp;#039;).removeClass(&amp;#039;ajax&amp;#039;).addClass(&amp;#039;current-content&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
					/*&lt;br /&gt;
					* run js functions for new content&lt;br /&gt;
					*/&lt;br /&gt;
&lt;br /&gt;
					// fitvids for responsivce videos&lt;br /&gt;
					$(&amp;quot;.content .video&amp;quot;).fitVids();&lt;br /&gt;
&lt;br /&gt;
					// light box&lt;br /&gt;
					$(&amp;#039;.gallery&amp;#039;).Chocolat();&lt;br /&gt;
&lt;br /&gt;
	          	});&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
	      	// toggle use of back and forward buttons on browser&lt;br /&gt;
	      	if(!toggleHistoryVisitNum){&lt;br /&gt;
	        	toggleHistory();&lt;br /&gt;
	      	}&lt;br /&gt;
&lt;br /&gt;
			// keep track of number of Ajax requests&lt;br /&gt;
			toggleHistoryVisitNum++;&lt;br /&gt;
&lt;br /&gt;
    	}); // end of ajax().done()&lt;br /&gt;
  	} // end of loadContent()&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Im Beispiel laden wir direkt HTML Inhalte, man könnte aber auch JSON laden (z.b. mit Mustache JS: https://mustache.github.io/#demo ) um die Ladezeiten weiter zu verkürzen.&lt;/div&gt;</summary>
		<author><name>84.157.23.32</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Git&amp;diff=24104</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Git&amp;diff=24104"/>
		<updated>2019-10-22T12:34:33Z</updated>

		<summary type="html">&lt;p&gt;84.157.23.32: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git [ɡɪt] ist eine freie Software zur verteilten Versionsverwaltung von Dateien, die durch Linus Torvalds initiiert wurde.&lt;br /&gt;
== Links ==&lt;br /&gt;
 https://git-scm.com/&lt;br /&gt;
 https://www.youtube.com/watch?v=elh1y6laO8I Schönes Beginner Tutorial&lt;br /&gt;
 https://git-scm.com/book/de/v2 //Ausführliches freies eBook&lt;br /&gt;
 https://de.wikipedia.org/wiki/Git&lt;br /&gt;
 [[GitHub]] - GitHub ist ein Onlinedienst, der Software-Entwicklungsprojekte auf seinen Servern bereitstellt (Filehosting). Namensgebend war das Versionsverwaltungssystem Git.&lt;br /&gt;
 https://www.youtube.com/watch?v=IfGVC_nPWzU NodeJS mit Github (noch nicht gecheckt)&lt;br /&gt;
&lt;br /&gt;
== Was ist Git ? ==&lt;br /&gt;
Git ist ein verteiltes Versionsverwaltungssystem. Wenn man etwas alleine oder im Team programmiert, kann man alle Änderungen nachträglich verfolgen, Rückgängig machen, Varianten erstellen (Branches) Varianten zu einer neuen Version verschmelzen (merge) etc. &lt;br /&gt;
&lt;br /&gt;
Git kann aber auch für andere Textdateien verwendet werden (z.B. Songtexte verwalten)&lt;br /&gt;
&lt;br /&gt;
Git hat u.a. folgende Eigenschaften&lt;br /&gt;
* Nicht lineare Entwicklung&lt;br /&gt;
** Branching und Merging - Werkzeuge zum Erstellen von Codevarianten und verschmelzen von mehreren zu einem neuen.&lt;br /&gt;
* Kein zentraler Server&lt;br /&gt;
** Nutzer haben lokale Kopien des Repository inkl Versionsgeschichte (history)&lt;br /&gt;
* Datentransfer zwischen Repositories&lt;br /&gt;
** Git kann verschiedene Protokolle nutzen (file, http(s), ssh, ftp, git)&lt;br /&gt;
** file:// kann für den lokalen Transfer auf dem Rechner genutzt werden&lt;br /&gt;
** git:// wird oft für Lesezugriffe (für fetch und clone) genutzt&lt;br /&gt;
** ssh:// wird oft für Schreibzugriffe im Netz genutzt.&lt;br /&gt;
* Sicherheit der History&lt;br /&gt;
** Über einen Hashbaum wird sichergestellt, dass die Versionsgeschichte nachträglich nicht geändert werden kann.&lt;br /&gt;
* Versionierung über alle Dateien. &lt;br /&gt;
** Bei Gib bekommen bei der Änderung einer Datei alle Dateien im Projekt eine neue Versionsnummer. &lt;br /&gt;
&lt;br /&gt;
== Git Quickstart ==&lt;br /&gt;
Als Beispiel legen wir ein Verzeichnis legen wir einen Ordner mit dem Namen Songtexte an und erstellen zwei Dateien mit Songtexten. Z.B.&lt;br /&gt;
 azzurro.txt&lt;br /&gt;
 we-are-the-champions.txt&lt;br /&gt;
&lt;br /&gt;
=== Installation von git ===&lt;br /&gt;
Über https://git-scm.com laden und installieren&lt;br /&gt;
&lt;br /&gt;
=== Projekt mit Git verwalten ===&lt;br /&gt;
Wichtig für Git ist die Kommandozeile. Es gibt auch GUIs aber man sollte die Commandline Befehle einigermaßen beherrschen.&lt;br /&gt;
* Terminal öffnen und in das Projektverzeichnis wechseln&lt;br /&gt;
 git init .&lt;br /&gt;
Erzeugt im aktuellen Verzeichnis (aktuell = .) einen .git Ordner. Dieser ist das Repository in dem alle Änderungen gespeichert werden. Das aktuelle Verzeichnis ist dein Workspace. Dort kannst du ganz normal arbeiten. &lt;br /&gt;
==== Git Status ====&lt;br /&gt;
Mit&lt;br /&gt;
 git status&lt;br /&gt;
Schauen wir welche Änderungen es im Verzeichnis gibt, die noch nicht von git erfasst bzw. versioniert sind. Das sind im Moment noch alle.&lt;br /&gt;
==== Dateien im Repository Tracken und Versionieren - ADD &amp;amp; COMMIT ====&lt;br /&gt;
Mit add kann man git dazu bringen Dateiverläufe zu verfolgen (tracken) und mit commit kann man Versionsstände dieser Dateien festhalten.&lt;br /&gt;
 git add azzurro.txt we-are-the-champions.txt&lt;br /&gt;
oder auch mit Jokern&lt;br /&gt;
 git add *.*&lt;br /&gt;
Wenn man jetzt den Status abruft zeigt git an, das die Dateien getrackt werden aber noch neu und nicht commited sind.&lt;br /&gt;
&lt;br /&gt;
==== Änderungen verwalten ====&lt;br /&gt;
Hat man etwas im Projekt verändert sieht man mit einem erneuten git status welche Dateien sich verändert haben und mit git diff zeigt git einem die genauen Änderungen an.&lt;br /&gt;
 git status&lt;br /&gt;
 git diff&lt;br /&gt;
Passt alles können wir die Datei wieder fürs committen adden und dann den Commit durchführen&lt;br /&gt;
 git add azzurro.txt&lt;br /&gt;
 git commit&lt;br /&gt;
&lt;br /&gt;
==== Datei auf den letzen Stand zurücksetzen ====&lt;br /&gt;
Sehen wir mit unserem git diff, dass wir Änderungen gemacht haben die wir nicht wollen, können wir die Datei auf den letzen Versionsstand zurücksetzen:&lt;br /&gt;
 git checkout we-are-the-champions.txt&lt;br /&gt;
&lt;br /&gt;
==== Git User Profildaten Konfigurieren ====&lt;br /&gt;
Nicht schön im Beispiel: Git hat als User einen automatisch aus dem Mac Nutzerprofil generierten Namen erzeugt. Man kann aber auch selbst einen globalen Usernamen mit dazugehöriger E-Mail erzeugen:&lt;br /&gt;
 git config --global user.name &amp;quot;Stephan Schlegel&amp;quot;&lt;br /&gt;
 git config --global user.email dev@stephanschlegel.de&lt;br /&gt;
&lt;br /&gt;
==== Editor konfigurieren ====&lt;br /&gt;
Der Editor der von Git aufgerufen wird ist nicht jedermanns sache. Möchte man Ihn ändern gibt es zwei Wege entweder über das User Config File direkt oder üer das Terminal. Hier der zweite Weg:&lt;br /&gt;
&lt;br /&gt;
Terminal:&lt;br /&gt;
 git config --global core.editor &amp;quot;nano&amp;quot;&lt;br /&gt;
Konfiguriert nano als Standard Editor&lt;br /&gt;
&lt;br /&gt;
Wenn der Editor ein externes Fenster öffnet und nicht im Terminal ausgeführt wird, muss man git sagen es soll warten bis der Editor gespeichert und das File geschlossen hat. Sonst gibt es beim Commit eine Fehlermeldung, das keine Message vom Editor kam. Dazu nutzen wir die -w Option.&lt;br /&gt;
 git config --global core.editor &amp;quot;atom -w&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Wichtige Befehle ==&lt;br /&gt;
=== Repository anlegen ===&lt;br /&gt;
 git init . &lt;br /&gt;
=== Status ===&lt;br /&gt;
 git status&lt;br /&gt;
 git status -s #shortversion&lt;br /&gt;
=== Dateien Tracken / Stagen ===&lt;br /&gt;
 git add myfile.ext&lt;br /&gt;
 git&lt;br /&gt;
=== Dateien Unstagen ===&lt;br /&gt;
 git checkout myfile.ext&lt;br /&gt;
=== Unterschiede anschauen ===&lt;br /&gt;
 # diff der unstaged Änderungen (noch nicht für commit vorgemerkt)&lt;br /&gt;
 git diff&lt;br /&gt;
 # diff der staged Änderungen&lt;br /&gt;
 git diff --staged&lt;br /&gt;
 git diff --cached&lt;br /&gt;
&lt;br /&gt;
=== Commit (Versionieren)===&lt;br /&gt;
 git commit&lt;br /&gt;
 # mit inline Message&lt;br /&gt;
 git commit -m &amp;quot;Kommentar zum Kommit&amp;quot;&lt;br /&gt;
 # Ohne Staging alle Änderungen kommitten (add überspringen)&lt;br /&gt;
 git commit -a -m &amp;quot;Kommentar&amp;quot;&lt;br /&gt;
 # Kommentar neu setzen (es dürfen keine Änderungen seit dem letzten Commit passiert sein)&lt;br /&gt;
 git commit --amend&lt;br /&gt;
 # Datei zum Commit nachreihen wenn vergessen&lt;br /&gt;
 $ git commit -m &amp;#039;initial commit&amp;#039;&lt;br /&gt;
 $ git add meineVergesseneDatei.txt&lt;br /&gt;
 $ git commit --amend&lt;br /&gt;
&lt;br /&gt;
=== Dateien aus dem Repository löschen ===&lt;br /&gt;
* Datei löschen reicht nicht. Datei muss aus dem Staging Bereich gelöscht werden und dann committed werden. Das geschieht mit git rm&lt;br /&gt;
 git rm meineDatei.txt&lt;br /&gt;
 git status&lt;br /&gt;
* Datei behalten aber aus dem Tracking entfernen&lt;br /&gt;
 git rm --cached meineDatei.txt&lt;br /&gt;
* Dateien mit Ending .xyz entfernen&lt;br /&gt;
 #alle Logdateien aus dem Verzeichnis /log entfernen (beachte \)&lt;br /&gt;
 git rm log/\.log&lt;br /&gt;
 # Alle Dateien endend mit Tilde löschen&lt;br /&gt;
 git rm \*~&lt;br /&gt;
&lt;br /&gt;
=== Dateien verschieben ===&lt;br /&gt;
Git verfolgt keine Verschiebungen, es gibt aber einen move Befehl. Im Prinzip macht git dann aber eine Kopie und löscht die alte Datei - mv ist also ein Shortcut.&lt;br /&gt;
 mv README.md README&lt;br /&gt;
&lt;br /&gt;
=== History ===&lt;br /&gt;
 git log&lt;br /&gt;
 # Unterschiede (hier max 2)anzeigen&lt;br /&gt;
 git log -p -2&lt;br /&gt;
 # Mit Statistik (gekürzt)&lt;br /&gt;
 git log --stat&lt;br /&gt;
 # Formatiert ausgeben (div Formate möglich)&lt;br /&gt;
 log --pretty=oneline&lt;br /&gt;
 # Eigenes Format&lt;br /&gt;
 git log --pretty=format:&amp;quot;%h - %an, %ar : %s&amp;quot;&lt;br /&gt;
 # Formatoptionen anzeigen:&lt;br /&gt;
 git log --pretty=format&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
 git config --global user.name &amp;quot;Stephan Schlegel&amp;quot;&lt;br /&gt;
 git config --global user.email dev@stephanschlegel.de&lt;br /&gt;
 git config --global core.editor &amp;quot;nano&amp;quot;&lt;br /&gt;
 git config --global core.editor &amp;quot;atom -w&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== .gitignore ==&lt;br /&gt;
In einer .gitignore Datei kann man mit Suchmustern regeln, welche Dateien vom Repository ignoriert werden sollen. &lt;br /&gt;
&lt;br /&gt;
Beispiele für Regeln:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ignore Files ending wich the tilde (often used for temporary Files&lt;br /&gt;
*~&lt;br /&gt;
&lt;br /&gt;
# ignore all .a files&lt;br /&gt;
*.a&lt;br /&gt;
&lt;br /&gt;
# ignore files ending with .o or .a (objects archives)&lt;br /&gt;
*.[oa]&lt;br /&gt;
&lt;br /&gt;
# but do track lib.a, even though you&amp;#039;re ignoring .a files above&lt;br /&gt;
!lib.a&lt;br /&gt;
&lt;br /&gt;
# only ignore the TODO file in the current directory, not subdir/TODO&lt;br /&gt;
/TODO&lt;br /&gt;
&lt;br /&gt;
# ignore all files in any directory named build&lt;br /&gt;
build/&lt;br /&gt;
&lt;br /&gt;
# ignore doc/notes.txt, but not doc/server/arch.txt&lt;br /&gt;
doc/*.txt&lt;br /&gt;
&lt;br /&gt;
# ignore all .pdf files in the doc/ directory and any of its subdirectories&lt;br /&gt;
doc/**/*.pdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Online Dienstleister ==&lt;br /&gt;
 Github&lt;br /&gt;
 Bitbucket&lt;br /&gt;
 Gitlab&lt;/div&gt;</summary>
		<author><name>84.157.23.32</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Git&amp;diff=24103</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Git&amp;diff=24103"/>
		<updated>2019-10-22T11:36:23Z</updated>

		<summary type="html">&lt;p&gt;84.157.23.32: /* Dateien aus dem Repository löschen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git [ɡɪt] ist eine freie Software zur verteilten Versionsverwaltung von Dateien, die durch Linus Torvalds initiiert wurde.&lt;br /&gt;
== Links ==&lt;br /&gt;
 https://git-scm.com/&lt;br /&gt;
 https://www.youtube.com/watch?v=elh1y6laO8I Schönes Beginner Tutorial&lt;br /&gt;
 https://git-scm.com/book/de/v2 //Ausführliches freies eBook&lt;br /&gt;
 https://de.wikipedia.org/wiki/Git&lt;br /&gt;
 [[GitHub]] - GitHub ist ein Onlinedienst, der Software-Entwicklungsprojekte auf seinen Servern bereitstellt (Filehosting). Namensgebend war das Versionsverwaltungssystem Git. &lt;br /&gt;
&lt;br /&gt;
== Was ist Git ? ==&lt;br /&gt;
Git ist ein verteiltes Versionsverwaltungssystem. Wenn man etwas alleine oder im Team programmiert, kann man alle Änderungen nachträglich verfolgen, Rückgängig machen, Varianten erstellen (Branches) Varianten zu einer neuen Version verschmelzen (merge) etc. &lt;br /&gt;
&lt;br /&gt;
Git kann aber auch für andere Textdateien verwendet werden (z.B. Songtexte verwalten)&lt;br /&gt;
&lt;br /&gt;
Git hat u.a. folgende Eigenschaften&lt;br /&gt;
* Nicht lineare Entwicklung&lt;br /&gt;
** Branching und Merging - Werkzeuge zum Erstellen von Codevarianten und verschmelzen von mehreren zu einem neuen.&lt;br /&gt;
* Kein zentraler Server&lt;br /&gt;
** Nutzer haben lokale Kopien des Repository inkl Versionsgeschichte (history)&lt;br /&gt;
* Datentransfer zwischen Repositories&lt;br /&gt;
** Git kann verschiedene Protokolle nutzen (file, http(s), ssh, ftp, git)&lt;br /&gt;
** file:// kann für den lokalen Transfer auf dem Rechner genutzt werden&lt;br /&gt;
** git:// wird oft für Lesezugriffe (für fetch und clone) genutzt&lt;br /&gt;
** ssh:// wird oft für Schreibzugriffe im Netz genutzt.&lt;br /&gt;
* Sicherheit der History&lt;br /&gt;
** Über einen Hashbaum wird sichergestellt, dass die Versionsgeschichte nachträglich nicht geändert werden kann.&lt;br /&gt;
* Versionierung über alle Dateien. &lt;br /&gt;
** Bei Gib bekommen bei der Änderung einer Datei alle Dateien im Projekt eine neue Versionsnummer. &lt;br /&gt;
&lt;br /&gt;
== Git Quickstart ==&lt;br /&gt;
Als Beispiel legen wir ein Verzeichnis legen wir einen Ordner mit dem Namen Songtexte an und erstellen zwei Dateien mit Songtexten. Z.B.&lt;br /&gt;
 azzurro.txt&lt;br /&gt;
 we-are-the-champions.txt&lt;br /&gt;
&lt;br /&gt;
=== Installation von git ===&lt;br /&gt;
Über https://git-scm.com laden und installieren&lt;br /&gt;
&lt;br /&gt;
=== Projekt mit Git verwalten ===&lt;br /&gt;
Wichtig für Git ist die Kommandozeile. Es gibt auch GUIs aber man sollte die Commandline Befehle einigermaßen beherrschen.&lt;br /&gt;
* Terminal öffnen und in das Projektverzeichnis wechseln&lt;br /&gt;
 git init .&lt;br /&gt;
Erzeugt im aktuellen Verzeichnis (aktuell = .) einen .git Ordner. Dieser ist das Repository in dem alle Änderungen gespeichert werden. Das aktuelle Verzeichnis ist dein Workspace. Dort kannst du ganz normal arbeiten. &lt;br /&gt;
==== Git Status ====&lt;br /&gt;
Mit&lt;br /&gt;
 git status&lt;br /&gt;
Schauen wir welche Änderungen es im Verzeichnis gibt, die noch nicht von git erfasst bzw. versioniert sind. Das sind im Moment noch alle.&lt;br /&gt;
==== Dateien im Repository Tracken und Versionieren - ADD &amp;amp; COMMIT ====&lt;br /&gt;
Mit add kann man git dazu bringen Dateiverläufe zu verfolgen (tracken) und mit commit kann man Versionsstände dieser Dateien festhalten.&lt;br /&gt;
 git add azzurro.txt we-are-the-champions.txt&lt;br /&gt;
oder auch mit Jokern&lt;br /&gt;
 git add *.*&lt;br /&gt;
Wenn man jetzt den Status abruft zeigt git an, das die Dateien getrackt werden aber noch neu und nicht commited sind.&lt;br /&gt;
&lt;br /&gt;
==== Änderungen verwalten ====&lt;br /&gt;
Hat man etwas im Projekt verändert sieht man mit einem erneuten git status welche Dateien sich verändert haben und mit git diff zeigt git einem die genauen Änderungen an.&lt;br /&gt;
 git status&lt;br /&gt;
 git diff&lt;br /&gt;
Passt alles können wir die Datei wieder fürs committen adden und dann den Commit durchführen&lt;br /&gt;
 git add azzurro.txt&lt;br /&gt;
 git commit&lt;br /&gt;
&lt;br /&gt;
==== Datei auf den letzen Stand zurücksetzen ====&lt;br /&gt;
Sehen wir mit unserem git diff, dass wir Änderungen gemacht haben die wir nicht wollen, können wir die Datei auf den letzen Versionsstand zurücksetzen:&lt;br /&gt;
 git checkout we-are-the-champions.txt&lt;br /&gt;
&lt;br /&gt;
==== Git User Profildaten Konfigurieren ====&lt;br /&gt;
Nicht schön im Beispiel: Git hat als User einen automatisch aus dem Mac Nutzerprofil generierten Namen erzeugt. Man kann aber auch selbst einen globalen Usernamen mit dazugehöriger E-Mail erzeugen:&lt;br /&gt;
 git config --global user.name &amp;quot;Stephan Schlegel&amp;quot;&lt;br /&gt;
 git config --global user.email dev@stephanschlegel.de&lt;br /&gt;
&lt;br /&gt;
==== Editor konfigurieren ====&lt;br /&gt;
Der Editor der von Git aufgerufen wird ist nicht jedermanns sache. Möchte man Ihn ändern gibt es zwei Wege entweder über das User Config File direkt oder üer das Terminal. Hier der zweite Weg:&lt;br /&gt;
&lt;br /&gt;
Terminal:&lt;br /&gt;
 git config --global core.editor &amp;quot;nano&amp;quot;&lt;br /&gt;
Konfiguriert nano als Standard Editor&lt;br /&gt;
&lt;br /&gt;
Wenn der Editor ein externes Fenster öffnet und nicht im Terminal ausgeführt wird, muss man git sagen es soll warten bis der Editor gespeichert und das File geschlossen hat. Sonst gibt es beim Commit eine Fehlermeldung, das keine Message vom Editor kam. Dazu nutzen wir die -w Option.&lt;br /&gt;
 git config --global core.editor &amp;quot;atom -w&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Wichtige Befehle ==&lt;br /&gt;
=== Repository anlegen ===&lt;br /&gt;
 git init . &lt;br /&gt;
=== Status ===&lt;br /&gt;
 git status&lt;br /&gt;
 git status -s #shortversion&lt;br /&gt;
=== Dateien Tracken / Stagen ===&lt;br /&gt;
 git add myfile.ext&lt;br /&gt;
 git&lt;br /&gt;
=== Dateien Unstagen ===&lt;br /&gt;
 git checkout myfile.ext&lt;br /&gt;
=== Unterschiede anschauen ===&lt;br /&gt;
 # diff der unstaged Änderungen (noch nicht für commit vorgemerkt)&lt;br /&gt;
 git diff&lt;br /&gt;
 # diff der staged Änderungen&lt;br /&gt;
 git diff --staged&lt;br /&gt;
 git diff --cached&lt;br /&gt;
&lt;br /&gt;
=== Commit (Versionieren)===&lt;br /&gt;
 git commit&lt;br /&gt;
 # mit inline Message&lt;br /&gt;
 git commit -m &amp;quot;Kommentar zum Kommit&amp;quot;&lt;br /&gt;
 # Ohne Staging alle Änderungen kommitten (add überspringen)&lt;br /&gt;
 git commit -a -m &amp;quot;Kommentar&amp;quot;&lt;br /&gt;
 # Kommentar neu setzen (es dürfen keine Änderungen seit dem letzten Commit passiert sein)&lt;br /&gt;
 git commit --amend&lt;br /&gt;
 # Datei zum Commit nachreihen wenn vergessen&lt;br /&gt;
 $ git commit -m &amp;#039;initial commit&amp;#039;&lt;br /&gt;
 $ git add meineVergesseneDatei.txt&lt;br /&gt;
 $ git commit --amend&lt;br /&gt;
&lt;br /&gt;
=== Dateien aus dem Repository löschen ===&lt;br /&gt;
* Datei löschen reicht nicht. Datei muss aus dem Staging Bereich gelöscht werden und dann committed werden. Das geschieht mit git rm&lt;br /&gt;
 git rm meineDatei.txt&lt;br /&gt;
 git status&lt;br /&gt;
* Datei behalten aber aus dem Tracking entfernen&lt;br /&gt;
 git rm --cached meineDatei.txt&lt;br /&gt;
* Dateien mit Ending .xyz entfernen&lt;br /&gt;
 #alle Logdateien aus dem Verzeichnis /log entfernen (beachte \)&lt;br /&gt;
 git rm log/\.log&lt;br /&gt;
 # Alle Dateien endend mit Tilde löschen&lt;br /&gt;
 git rm \*~&lt;br /&gt;
&lt;br /&gt;
=== Dateien verschieben ===&lt;br /&gt;
Git verfolgt keine Verschiebungen, es gibt aber einen move Befehl. Im Prinzip macht git dann aber eine Kopie und löscht die alte Datei - mv ist also ein Shortcut.&lt;br /&gt;
 mv README.md README&lt;br /&gt;
&lt;br /&gt;
=== History ===&lt;br /&gt;
 git log&lt;br /&gt;
 # Unterschiede (hier max 2)anzeigen&lt;br /&gt;
 git log -p -2&lt;br /&gt;
 # Mit Statistik (gekürzt)&lt;br /&gt;
 git log --stat&lt;br /&gt;
 # Formatiert ausgeben (div Formate möglich)&lt;br /&gt;
 log --pretty=oneline&lt;br /&gt;
 # Eigenes Format&lt;br /&gt;
 git log --pretty=format:&amp;quot;%h - %an, %ar : %s&amp;quot;&lt;br /&gt;
 # Formatoptionen anzeigen:&lt;br /&gt;
 git log --pretty=format&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
 git config --global user.name &amp;quot;Stephan Schlegel&amp;quot;&lt;br /&gt;
 git config --global user.email dev@stephanschlegel.de&lt;br /&gt;
 git config --global core.editor &amp;quot;nano&amp;quot;&lt;br /&gt;
 git config --global core.editor &amp;quot;atom -w&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== .gitignore ==&lt;br /&gt;
In einer .gitignore Datei kann man mit Suchmustern regeln, welche Dateien vom Repository ignoriert werden sollen. &lt;br /&gt;
&lt;br /&gt;
Beispiele für Regeln:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ignore Files ending wich the tilde (often used for temporary Files&lt;br /&gt;
*~&lt;br /&gt;
&lt;br /&gt;
# ignore all .a files&lt;br /&gt;
*.a&lt;br /&gt;
&lt;br /&gt;
# ignore files ending with .o or .a (objects archives)&lt;br /&gt;
*.[oa]&lt;br /&gt;
&lt;br /&gt;
# but do track lib.a, even though you&amp;#039;re ignoring .a files above&lt;br /&gt;
!lib.a&lt;br /&gt;
&lt;br /&gt;
# only ignore the TODO file in the current directory, not subdir/TODO&lt;br /&gt;
/TODO&lt;br /&gt;
&lt;br /&gt;
# ignore all files in any directory named build&lt;br /&gt;
build/&lt;br /&gt;
&lt;br /&gt;
# ignore doc/notes.txt, but not doc/server/arch.txt&lt;br /&gt;
doc/*.txt&lt;br /&gt;
&lt;br /&gt;
# ignore all .pdf files in the doc/ directory and any of its subdirectories&lt;br /&gt;
doc/**/*.pdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Online Dienstleister ==&lt;br /&gt;
 Github&lt;br /&gt;
 Bitbucket&lt;br /&gt;
 Gitlab&lt;/div&gt;</summary>
		<author><name>84.157.23.32</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Git&amp;diff=24102</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Git&amp;diff=24102"/>
		<updated>2019-10-22T11:30:21Z</updated>

		<summary type="html">&lt;p&gt;84.157.23.32: /* Commit (Versionieren) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git [ɡɪt] ist eine freie Software zur verteilten Versionsverwaltung von Dateien, die durch Linus Torvalds initiiert wurde.&lt;br /&gt;
== Links ==&lt;br /&gt;
 https://git-scm.com/&lt;br /&gt;
 https://www.youtube.com/watch?v=elh1y6laO8I Schönes Beginner Tutorial&lt;br /&gt;
 https://git-scm.com/book/de/v2 //Ausführliches freies eBook&lt;br /&gt;
 https://de.wikipedia.org/wiki/Git&lt;br /&gt;
 [[GitHub]] - GitHub ist ein Onlinedienst, der Software-Entwicklungsprojekte auf seinen Servern bereitstellt (Filehosting). Namensgebend war das Versionsverwaltungssystem Git. &lt;br /&gt;
&lt;br /&gt;
== Was ist Git ? ==&lt;br /&gt;
Git ist ein verteiltes Versionsverwaltungssystem. Wenn man etwas alleine oder im Team programmiert, kann man alle Änderungen nachträglich verfolgen, Rückgängig machen, Varianten erstellen (Branches) Varianten zu einer neuen Version verschmelzen (merge) etc. &lt;br /&gt;
&lt;br /&gt;
Git kann aber auch für andere Textdateien verwendet werden (z.B. Songtexte verwalten)&lt;br /&gt;
&lt;br /&gt;
Git hat u.a. folgende Eigenschaften&lt;br /&gt;
* Nicht lineare Entwicklung&lt;br /&gt;
** Branching und Merging - Werkzeuge zum Erstellen von Codevarianten und verschmelzen von mehreren zu einem neuen.&lt;br /&gt;
* Kein zentraler Server&lt;br /&gt;
** Nutzer haben lokale Kopien des Repository inkl Versionsgeschichte (history)&lt;br /&gt;
* Datentransfer zwischen Repositories&lt;br /&gt;
** Git kann verschiedene Protokolle nutzen (file, http(s), ssh, ftp, git)&lt;br /&gt;
** file:// kann für den lokalen Transfer auf dem Rechner genutzt werden&lt;br /&gt;
** git:// wird oft für Lesezugriffe (für fetch und clone) genutzt&lt;br /&gt;
** ssh:// wird oft für Schreibzugriffe im Netz genutzt.&lt;br /&gt;
* Sicherheit der History&lt;br /&gt;
** Über einen Hashbaum wird sichergestellt, dass die Versionsgeschichte nachträglich nicht geändert werden kann.&lt;br /&gt;
* Versionierung über alle Dateien. &lt;br /&gt;
** Bei Gib bekommen bei der Änderung einer Datei alle Dateien im Projekt eine neue Versionsnummer. &lt;br /&gt;
&lt;br /&gt;
== Git Quickstart ==&lt;br /&gt;
Als Beispiel legen wir ein Verzeichnis legen wir einen Ordner mit dem Namen Songtexte an und erstellen zwei Dateien mit Songtexten. Z.B.&lt;br /&gt;
 azzurro.txt&lt;br /&gt;
 we-are-the-champions.txt&lt;br /&gt;
&lt;br /&gt;
=== Installation von git ===&lt;br /&gt;
Über https://git-scm.com laden und installieren&lt;br /&gt;
&lt;br /&gt;
=== Projekt mit Git verwalten ===&lt;br /&gt;
Wichtig für Git ist die Kommandozeile. Es gibt auch GUIs aber man sollte die Commandline Befehle einigermaßen beherrschen.&lt;br /&gt;
* Terminal öffnen und in das Projektverzeichnis wechseln&lt;br /&gt;
 git init .&lt;br /&gt;
Erzeugt im aktuellen Verzeichnis (aktuell = .) einen .git Ordner. Dieser ist das Repository in dem alle Änderungen gespeichert werden. Das aktuelle Verzeichnis ist dein Workspace. Dort kannst du ganz normal arbeiten. &lt;br /&gt;
==== Git Status ====&lt;br /&gt;
Mit&lt;br /&gt;
 git status&lt;br /&gt;
Schauen wir welche Änderungen es im Verzeichnis gibt, die noch nicht von git erfasst bzw. versioniert sind. Das sind im Moment noch alle.&lt;br /&gt;
==== Dateien im Repository Tracken und Versionieren - ADD &amp;amp; COMMIT ====&lt;br /&gt;
Mit add kann man git dazu bringen Dateiverläufe zu verfolgen (tracken) und mit commit kann man Versionsstände dieser Dateien festhalten.&lt;br /&gt;
 git add azzurro.txt we-are-the-champions.txt&lt;br /&gt;
oder auch mit Jokern&lt;br /&gt;
 git add *.*&lt;br /&gt;
Wenn man jetzt den Status abruft zeigt git an, das die Dateien getrackt werden aber noch neu und nicht commited sind.&lt;br /&gt;
&lt;br /&gt;
==== Änderungen verwalten ====&lt;br /&gt;
Hat man etwas im Projekt verändert sieht man mit einem erneuten git status welche Dateien sich verändert haben und mit git diff zeigt git einem die genauen Änderungen an.&lt;br /&gt;
 git status&lt;br /&gt;
 git diff&lt;br /&gt;
Passt alles können wir die Datei wieder fürs committen adden und dann den Commit durchführen&lt;br /&gt;
 git add azzurro.txt&lt;br /&gt;
 git commit&lt;br /&gt;
&lt;br /&gt;
==== Datei auf den letzen Stand zurücksetzen ====&lt;br /&gt;
Sehen wir mit unserem git diff, dass wir Änderungen gemacht haben die wir nicht wollen, können wir die Datei auf den letzen Versionsstand zurücksetzen:&lt;br /&gt;
 git checkout we-are-the-champions.txt&lt;br /&gt;
&lt;br /&gt;
==== Git User Profildaten Konfigurieren ====&lt;br /&gt;
Nicht schön im Beispiel: Git hat als User einen automatisch aus dem Mac Nutzerprofil generierten Namen erzeugt. Man kann aber auch selbst einen globalen Usernamen mit dazugehöriger E-Mail erzeugen:&lt;br /&gt;
 git config --global user.name &amp;quot;Stephan Schlegel&amp;quot;&lt;br /&gt;
 git config --global user.email dev@stephanschlegel.de&lt;br /&gt;
&lt;br /&gt;
==== Editor konfigurieren ====&lt;br /&gt;
Der Editor der von Git aufgerufen wird ist nicht jedermanns sache. Möchte man Ihn ändern gibt es zwei Wege entweder über das User Config File direkt oder üer das Terminal. Hier der zweite Weg:&lt;br /&gt;
&lt;br /&gt;
Terminal:&lt;br /&gt;
 git config --global core.editor &amp;quot;nano&amp;quot;&lt;br /&gt;
Konfiguriert nano als Standard Editor&lt;br /&gt;
&lt;br /&gt;
Wenn der Editor ein externes Fenster öffnet und nicht im Terminal ausgeführt wird, muss man git sagen es soll warten bis der Editor gespeichert und das File geschlossen hat. Sonst gibt es beim Commit eine Fehlermeldung, das keine Message vom Editor kam. Dazu nutzen wir die -w Option.&lt;br /&gt;
 git config --global core.editor &amp;quot;atom -w&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Wichtige Befehle ==&lt;br /&gt;
=== Repository anlegen ===&lt;br /&gt;
 git init . &lt;br /&gt;
=== Status ===&lt;br /&gt;
 git status&lt;br /&gt;
 git status -s #shortversion&lt;br /&gt;
=== Dateien Tracken / Stagen ===&lt;br /&gt;
 git add myfile.ext&lt;br /&gt;
 git&lt;br /&gt;
=== Dateien Unstagen ===&lt;br /&gt;
 git checkout myfile.ext&lt;br /&gt;
=== Unterschiede anschauen ===&lt;br /&gt;
 # diff der unstaged Änderungen (noch nicht für commit vorgemerkt)&lt;br /&gt;
 git diff&lt;br /&gt;
 # diff der staged Änderungen&lt;br /&gt;
 git diff --staged&lt;br /&gt;
 git diff --cached&lt;br /&gt;
&lt;br /&gt;
=== Commit (Versionieren)===&lt;br /&gt;
 git commit&lt;br /&gt;
 # mit inline Message&lt;br /&gt;
 git commit -m &amp;quot;Kommentar zum Kommit&amp;quot;&lt;br /&gt;
 # Ohne Staging alle Änderungen kommitten (add überspringen)&lt;br /&gt;
 git commit -a -m &amp;quot;Kommentar&amp;quot;&lt;br /&gt;
 # Kommentar neu setzen (es dürfen keine Änderungen seit dem letzten Commit passiert sein)&lt;br /&gt;
 git commit --amend&lt;br /&gt;
 # Datei zum Commit nachreihen wenn vergessen&lt;br /&gt;
 $ git commit -m &amp;#039;initial commit&amp;#039;&lt;br /&gt;
 $ git add meineVergesseneDatei.txt&lt;br /&gt;
 $ git commit --amend&lt;br /&gt;
&lt;br /&gt;
=== Dateien aus dem Repository löschen ===&lt;br /&gt;
* Datei löschen reicht nicht. Datei muss aus dem Staging Bereich gelöscht werden und dann committed werden. Das geschieht mit git rm&lt;br /&gt;
 git rm meineDatei.txt&lt;br /&gt;
 git status&lt;br /&gt;
* Datei behalten aber aus dem Tracking entfernen&lt;br /&gt;
 git rm -cached meineDatei.txt&lt;br /&gt;
* Dateien mit Ending .xyz entfernen&lt;br /&gt;
 #alle Logdateien aus dem Verzeichnis /log entfernen (beachte \)&lt;br /&gt;
 git rm log/\.log&lt;br /&gt;
 # Alle Dateien endend mit Tilde löschen&lt;br /&gt;
 git rm \*~&lt;br /&gt;
&lt;br /&gt;
=== Dateien verschieben ===&lt;br /&gt;
Git verfolgt keine Verschiebungen, es gibt aber einen move Befehl. Im Prinzip macht git dann aber eine Kopie und löscht die alte Datei - mv ist also ein Shortcut.&lt;br /&gt;
 mv README.md README&lt;br /&gt;
&lt;br /&gt;
=== History ===&lt;br /&gt;
 git log&lt;br /&gt;
 # Unterschiede (hier max 2)anzeigen&lt;br /&gt;
 git log -p -2&lt;br /&gt;
 # Mit Statistik (gekürzt)&lt;br /&gt;
 git log --stat&lt;br /&gt;
 # Formatiert ausgeben (div Formate möglich)&lt;br /&gt;
 log --pretty=oneline&lt;br /&gt;
 # Eigenes Format&lt;br /&gt;
 git log --pretty=format:&amp;quot;%h - %an, %ar : %s&amp;quot;&lt;br /&gt;
 # Formatoptionen anzeigen:&lt;br /&gt;
 git log --pretty=format&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
 git config --global user.name &amp;quot;Stephan Schlegel&amp;quot;&lt;br /&gt;
 git config --global user.email dev@stephanschlegel.de&lt;br /&gt;
 git config --global core.editor &amp;quot;nano&amp;quot;&lt;br /&gt;
 git config --global core.editor &amp;quot;atom -w&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== .gitignore ==&lt;br /&gt;
In einer .gitignore Datei kann man mit Suchmustern regeln, welche Dateien vom Repository ignoriert werden sollen. &lt;br /&gt;
&lt;br /&gt;
Beispiele für Regeln:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ignore Files ending wich the tilde (often used for temporary Files&lt;br /&gt;
*~&lt;br /&gt;
&lt;br /&gt;
# ignore all .a files&lt;br /&gt;
*.a&lt;br /&gt;
&lt;br /&gt;
# ignore files ending with .o or .a (objects archives)&lt;br /&gt;
*.[oa]&lt;br /&gt;
&lt;br /&gt;
# but do track lib.a, even though you&amp;#039;re ignoring .a files above&lt;br /&gt;
!lib.a&lt;br /&gt;
&lt;br /&gt;
# only ignore the TODO file in the current directory, not subdir/TODO&lt;br /&gt;
/TODO&lt;br /&gt;
&lt;br /&gt;
# ignore all files in any directory named build&lt;br /&gt;
build/&lt;br /&gt;
&lt;br /&gt;
# ignore doc/notes.txt, but not doc/server/arch.txt&lt;br /&gt;
doc/*.txt&lt;br /&gt;
&lt;br /&gt;
# ignore all .pdf files in the doc/ directory and any of its subdirectories&lt;br /&gt;
doc/**/*.pdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Online Dienstleister ==&lt;br /&gt;
 Github&lt;br /&gt;
 Bitbucket&lt;br /&gt;
 Gitlab&lt;/div&gt;</summary>
		<author><name>84.157.23.32</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Git&amp;diff=24101</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Git&amp;diff=24101"/>
		<updated>2019-10-22T11:03:09Z</updated>

		<summary type="html">&lt;p&gt;84.157.23.32: /* Unterschiede anschauen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git [ɡɪt] ist eine freie Software zur verteilten Versionsverwaltung von Dateien, die durch Linus Torvalds initiiert wurde.&lt;br /&gt;
== Links ==&lt;br /&gt;
 https://git-scm.com/&lt;br /&gt;
 https://www.youtube.com/watch?v=elh1y6laO8I Schönes Beginner Tutorial&lt;br /&gt;
 https://git-scm.com/book/de/v2 //Ausführliches freies eBook&lt;br /&gt;
 https://de.wikipedia.org/wiki/Git&lt;br /&gt;
 [[GitHub]] - GitHub ist ein Onlinedienst, der Software-Entwicklungsprojekte auf seinen Servern bereitstellt (Filehosting). Namensgebend war das Versionsverwaltungssystem Git. &lt;br /&gt;
&lt;br /&gt;
== Was ist Git ? ==&lt;br /&gt;
Git ist ein verteiltes Versionsverwaltungssystem. Wenn man etwas alleine oder im Team programmiert, kann man alle Änderungen nachträglich verfolgen, Rückgängig machen, Varianten erstellen (Branches) Varianten zu einer neuen Version verschmelzen (merge) etc. &lt;br /&gt;
&lt;br /&gt;
Git kann aber auch für andere Textdateien verwendet werden (z.B. Songtexte verwalten)&lt;br /&gt;
&lt;br /&gt;
Git hat u.a. folgende Eigenschaften&lt;br /&gt;
* Nicht lineare Entwicklung&lt;br /&gt;
** Branching und Merging - Werkzeuge zum Erstellen von Codevarianten und verschmelzen von mehreren zu einem neuen.&lt;br /&gt;
* Kein zentraler Server&lt;br /&gt;
** Nutzer haben lokale Kopien des Repository inkl Versionsgeschichte (history)&lt;br /&gt;
* Datentransfer zwischen Repositories&lt;br /&gt;
** Git kann verschiedene Protokolle nutzen (file, http(s), ssh, ftp, git)&lt;br /&gt;
** file:// kann für den lokalen Transfer auf dem Rechner genutzt werden&lt;br /&gt;
** git:// wird oft für Lesezugriffe (für fetch und clone) genutzt&lt;br /&gt;
** ssh:// wird oft für Schreibzugriffe im Netz genutzt.&lt;br /&gt;
* Sicherheit der History&lt;br /&gt;
** Über einen Hashbaum wird sichergestellt, dass die Versionsgeschichte nachträglich nicht geändert werden kann.&lt;br /&gt;
* Versionierung über alle Dateien. &lt;br /&gt;
** Bei Gib bekommen bei der Änderung einer Datei alle Dateien im Projekt eine neue Versionsnummer. &lt;br /&gt;
&lt;br /&gt;
== Git Quickstart ==&lt;br /&gt;
Als Beispiel legen wir ein Verzeichnis legen wir einen Ordner mit dem Namen Songtexte an und erstellen zwei Dateien mit Songtexten. Z.B.&lt;br /&gt;
 azzurro.txt&lt;br /&gt;
 we-are-the-champions.txt&lt;br /&gt;
&lt;br /&gt;
=== Installation von git ===&lt;br /&gt;
Über https://git-scm.com laden und installieren&lt;br /&gt;
&lt;br /&gt;
=== Projekt mit Git verwalten ===&lt;br /&gt;
Wichtig für Git ist die Kommandozeile. Es gibt auch GUIs aber man sollte die Commandline Befehle einigermaßen beherrschen.&lt;br /&gt;
* Terminal öffnen und in das Projektverzeichnis wechseln&lt;br /&gt;
 git init .&lt;br /&gt;
Erzeugt im aktuellen Verzeichnis (aktuell = .) einen .git Ordner. Dieser ist das Repository in dem alle Änderungen gespeichert werden. Das aktuelle Verzeichnis ist dein Workspace. Dort kannst du ganz normal arbeiten. &lt;br /&gt;
==== Git Status ====&lt;br /&gt;
Mit&lt;br /&gt;
 git status&lt;br /&gt;
Schauen wir welche Änderungen es im Verzeichnis gibt, die noch nicht von git erfasst bzw. versioniert sind. Das sind im Moment noch alle.&lt;br /&gt;
==== Dateien im Repository Tracken und Versionieren - ADD &amp;amp; COMMIT ====&lt;br /&gt;
Mit add kann man git dazu bringen Dateiverläufe zu verfolgen (tracken) und mit commit kann man Versionsstände dieser Dateien festhalten.&lt;br /&gt;
 git add azzurro.txt we-are-the-champions.txt&lt;br /&gt;
oder auch mit Jokern&lt;br /&gt;
 git add *.*&lt;br /&gt;
Wenn man jetzt den Status abruft zeigt git an, das die Dateien getrackt werden aber noch neu und nicht commited sind.&lt;br /&gt;
&lt;br /&gt;
==== Änderungen verwalten ====&lt;br /&gt;
Hat man etwas im Projekt verändert sieht man mit einem erneuten git status welche Dateien sich verändert haben und mit git diff zeigt git einem die genauen Änderungen an.&lt;br /&gt;
 git status&lt;br /&gt;
 git diff&lt;br /&gt;
Passt alles können wir die Datei wieder fürs committen adden und dann den Commit durchführen&lt;br /&gt;
 git add azzurro.txt&lt;br /&gt;
 git commit&lt;br /&gt;
&lt;br /&gt;
==== Datei auf den letzen Stand zurücksetzen ====&lt;br /&gt;
Sehen wir mit unserem git diff, dass wir Änderungen gemacht haben die wir nicht wollen, können wir die Datei auf den letzen Versionsstand zurücksetzen:&lt;br /&gt;
 git checkout we-are-the-champions.txt&lt;br /&gt;
&lt;br /&gt;
==== Git User Profildaten Konfigurieren ====&lt;br /&gt;
Nicht schön im Beispiel: Git hat als User einen automatisch aus dem Mac Nutzerprofil generierten Namen erzeugt. Man kann aber auch selbst einen globalen Usernamen mit dazugehöriger E-Mail erzeugen:&lt;br /&gt;
 git config --global user.name &amp;quot;Stephan Schlegel&amp;quot;&lt;br /&gt;
 git config --global user.email dev@stephanschlegel.de&lt;br /&gt;
&lt;br /&gt;
==== Editor konfigurieren ====&lt;br /&gt;
Der Editor der von Git aufgerufen wird ist nicht jedermanns sache. Möchte man Ihn ändern gibt es zwei Wege entweder über das User Config File direkt oder üer das Terminal. Hier der zweite Weg:&lt;br /&gt;
&lt;br /&gt;
Terminal:&lt;br /&gt;
 git config --global core.editor &amp;quot;nano&amp;quot;&lt;br /&gt;
Konfiguriert nano als Standard Editor&lt;br /&gt;
&lt;br /&gt;
Wenn der Editor ein externes Fenster öffnet und nicht im Terminal ausgeführt wird, muss man git sagen es soll warten bis der Editor gespeichert und das File geschlossen hat. Sonst gibt es beim Commit eine Fehlermeldung, das keine Message vom Editor kam. Dazu nutzen wir die -w Option.&lt;br /&gt;
 git config --global core.editor &amp;quot;atom -w&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Wichtige Befehle ==&lt;br /&gt;
=== Repository anlegen ===&lt;br /&gt;
 git init . &lt;br /&gt;
=== Status ===&lt;br /&gt;
 git status&lt;br /&gt;
 git status -s #shortversion&lt;br /&gt;
=== Dateien Tracken / Stagen ===&lt;br /&gt;
 git add myfile.ext&lt;br /&gt;
 git&lt;br /&gt;
=== Dateien Unstagen ===&lt;br /&gt;
 git checkout myfile.ext&lt;br /&gt;
=== Unterschiede anschauen ===&lt;br /&gt;
 # diff der unstaged Änderungen (noch nicht für commit vorgemerkt)&lt;br /&gt;
 git diff&lt;br /&gt;
 # diff der staged Änderungen&lt;br /&gt;
 git diff --staged&lt;br /&gt;
 git diff --cached&lt;br /&gt;
&lt;br /&gt;
=== Commit (Versionieren)===&lt;br /&gt;
 git commit&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
 git config --global user.name &amp;quot;Stephan Schlegel&amp;quot;&lt;br /&gt;
 git config --global user.email dev@stephanschlegel.de&lt;br /&gt;
 git config --global core.editor &amp;quot;nano&amp;quot;&lt;br /&gt;
 git config --global core.editor &amp;quot;atom -w&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== .gitignore ==&lt;br /&gt;
In einer .gitignore Datei kann man mit Suchmustern regeln, welche Dateien vom Repository ignoriert werden sollen. &lt;br /&gt;
&lt;br /&gt;
Beispiele für Regeln:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ignore Files ending wich the tilde (often used for temporary Files&lt;br /&gt;
*~&lt;br /&gt;
&lt;br /&gt;
# ignore all .a files&lt;br /&gt;
*.a&lt;br /&gt;
&lt;br /&gt;
# ignore files ending with .o or .a (objects archives)&lt;br /&gt;
*.[oa]&lt;br /&gt;
&lt;br /&gt;
# but do track lib.a, even though you&amp;#039;re ignoring .a files above&lt;br /&gt;
!lib.a&lt;br /&gt;
&lt;br /&gt;
# only ignore the TODO file in the current directory, not subdir/TODO&lt;br /&gt;
/TODO&lt;br /&gt;
&lt;br /&gt;
# ignore all files in any directory named build&lt;br /&gt;
build/&lt;br /&gt;
&lt;br /&gt;
# ignore doc/notes.txt, but not doc/server/arch.txt&lt;br /&gt;
doc/*.txt&lt;br /&gt;
&lt;br /&gt;
# ignore all .pdf files in the doc/ directory and any of its subdirectories&lt;br /&gt;
doc/**/*.pdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Online Dienstleister ==&lt;br /&gt;
 Github&lt;br /&gt;
 Bitbucket&lt;br /&gt;
 Gitlab&lt;/div&gt;</summary>
		<author><name>84.157.23.32</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Git&amp;diff=24100</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Git&amp;diff=24100"/>
		<updated>2019-10-22T10:35:47Z</updated>

		<summary type="html">&lt;p&gt;84.157.23.32: /* Wichtige Befehle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git [ɡɪt] ist eine freie Software zur verteilten Versionsverwaltung von Dateien, die durch Linus Torvalds initiiert wurde.&lt;br /&gt;
== Links ==&lt;br /&gt;
 https://git-scm.com/&lt;br /&gt;
 https://www.youtube.com/watch?v=elh1y6laO8I Schönes Beginner Tutorial&lt;br /&gt;
 https://git-scm.com/book/de/v2 //Ausführliches freies eBook&lt;br /&gt;
 https://de.wikipedia.org/wiki/Git&lt;br /&gt;
 [[GitHub]] - GitHub ist ein Onlinedienst, der Software-Entwicklungsprojekte auf seinen Servern bereitstellt (Filehosting). Namensgebend war das Versionsverwaltungssystem Git. &lt;br /&gt;
&lt;br /&gt;
== Was ist Git ? ==&lt;br /&gt;
Git ist ein verteiltes Versionsverwaltungssystem. Wenn man etwas alleine oder im Team programmiert, kann man alle Änderungen nachträglich verfolgen, Rückgängig machen, Varianten erstellen (Branches) Varianten zu einer neuen Version verschmelzen (merge) etc. &lt;br /&gt;
&lt;br /&gt;
Git kann aber auch für andere Textdateien verwendet werden (z.B. Songtexte verwalten)&lt;br /&gt;
&lt;br /&gt;
Git hat u.a. folgende Eigenschaften&lt;br /&gt;
* Nicht lineare Entwicklung&lt;br /&gt;
** Branching und Merging - Werkzeuge zum Erstellen von Codevarianten und verschmelzen von mehreren zu einem neuen.&lt;br /&gt;
* Kein zentraler Server&lt;br /&gt;
** Nutzer haben lokale Kopien des Repository inkl Versionsgeschichte (history)&lt;br /&gt;
* Datentransfer zwischen Repositories&lt;br /&gt;
** Git kann verschiedene Protokolle nutzen (file, http(s), ssh, ftp, git)&lt;br /&gt;
** file:// kann für den lokalen Transfer auf dem Rechner genutzt werden&lt;br /&gt;
** git:// wird oft für Lesezugriffe (für fetch und clone) genutzt&lt;br /&gt;
** ssh:// wird oft für Schreibzugriffe im Netz genutzt.&lt;br /&gt;
* Sicherheit der History&lt;br /&gt;
** Über einen Hashbaum wird sichergestellt, dass die Versionsgeschichte nachträglich nicht geändert werden kann.&lt;br /&gt;
* Versionierung über alle Dateien. &lt;br /&gt;
** Bei Gib bekommen bei der Änderung einer Datei alle Dateien im Projekt eine neue Versionsnummer. &lt;br /&gt;
&lt;br /&gt;
== Git Quickstart ==&lt;br /&gt;
Als Beispiel legen wir ein Verzeichnis legen wir einen Ordner mit dem Namen Songtexte an und erstellen zwei Dateien mit Songtexten. Z.B.&lt;br /&gt;
 azzurro.txt&lt;br /&gt;
 we-are-the-champions.txt&lt;br /&gt;
&lt;br /&gt;
=== Installation von git ===&lt;br /&gt;
Über https://git-scm.com laden und installieren&lt;br /&gt;
&lt;br /&gt;
=== Projekt mit Git verwalten ===&lt;br /&gt;
Wichtig für Git ist die Kommandozeile. Es gibt auch GUIs aber man sollte die Commandline Befehle einigermaßen beherrschen.&lt;br /&gt;
* Terminal öffnen und in das Projektverzeichnis wechseln&lt;br /&gt;
 git init .&lt;br /&gt;
Erzeugt im aktuellen Verzeichnis (aktuell = .) einen .git Ordner. Dieser ist das Repository in dem alle Änderungen gespeichert werden. Das aktuelle Verzeichnis ist dein Workspace. Dort kannst du ganz normal arbeiten. &lt;br /&gt;
==== Git Status ====&lt;br /&gt;
Mit&lt;br /&gt;
 git status&lt;br /&gt;
Schauen wir welche Änderungen es im Verzeichnis gibt, die noch nicht von git erfasst bzw. versioniert sind. Das sind im Moment noch alle.&lt;br /&gt;
==== Dateien im Repository Tracken und Versionieren - ADD &amp;amp; COMMIT ====&lt;br /&gt;
Mit add kann man git dazu bringen Dateiverläufe zu verfolgen (tracken) und mit commit kann man Versionsstände dieser Dateien festhalten.&lt;br /&gt;
 git add azzurro.txt we-are-the-champions.txt&lt;br /&gt;
oder auch mit Jokern&lt;br /&gt;
 git add *.*&lt;br /&gt;
Wenn man jetzt den Status abruft zeigt git an, das die Dateien getrackt werden aber noch neu und nicht commited sind.&lt;br /&gt;
&lt;br /&gt;
==== Änderungen verwalten ====&lt;br /&gt;
Hat man etwas im Projekt verändert sieht man mit einem erneuten git status welche Dateien sich verändert haben und mit git diff zeigt git einem die genauen Änderungen an.&lt;br /&gt;
 git status&lt;br /&gt;
 git diff&lt;br /&gt;
Passt alles können wir die Datei wieder fürs committen adden und dann den Commit durchführen&lt;br /&gt;
 git add azzurro.txt&lt;br /&gt;
 git commit&lt;br /&gt;
&lt;br /&gt;
==== Datei auf den letzen Stand zurücksetzen ====&lt;br /&gt;
Sehen wir mit unserem git diff, dass wir Änderungen gemacht haben die wir nicht wollen, können wir die Datei auf den letzen Versionsstand zurücksetzen:&lt;br /&gt;
 git checkout we-are-the-champions.txt&lt;br /&gt;
&lt;br /&gt;
==== Git User Profildaten Konfigurieren ====&lt;br /&gt;
Nicht schön im Beispiel: Git hat als User einen automatisch aus dem Mac Nutzerprofil generierten Namen erzeugt. Man kann aber auch selbst einen globalen Usernamen mit dazugehöriger E-Mail erzeugen:&lt;br /&gt;
 git config --global user.name &amp;quot;Stephan Schlegel&amp;quot;&lt;br /&gt;
 git config --global user.email dev@stephanschlegel.de&lt;br /&gt;
&lt;br /&gt;
==== Editor konfigurieren ====&lt;br /&gt;
Der Editor der von Git aufgerufen wird ist nicht jedermanns sache. Möchte man Ihn ändern gibt es zwei Wege entweder über das User Config File direkt oder üer das Terminal. Hier der zweite Weg:&lt;br /&gt;
&lt;br /&gt;
Terminal:&lt;br /&gt;
 git config --global core.editor &amp;quot;nano&amp;quot;&lt;br /&gt;
Konfiguriert nano als Standard Editor&lt;br /&gt;
&lt;br /&gt;
Wenn der Editor ein externes Fenster öffnet und nicht im Terminal ausgeführt wird, muss man git sagen es soll warten bis der Editor gespeichert und das File geschlossen hat. Sonst gibt es beim Commit eine Fehlermeldung, das keine Message vom Editor kam. Dazu nutzen wir die -w Option.&lt;br /&gt;
 git config --global core.editor &amp;quot;atom -w&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Wichtige Befehle ==&lt;br /&gt;
=== Repository anlegen ===&lt;br /&gt;
 git init . &lt;br /&gt;
=== Status ===&lt;br /&gt;
 git status&lt;br /&gt;
 git status -s #shortversion&lt;br /&gt;
=== Dateien Tracken / Stagen ===&lt;br /&gt;
 git add myfile.ext&lt;br /&gt;
 git&lt;br /&gt;
=== Dateien Unstagen ===&lt;br /&gt;
 git checkout myfile.ext&lt;br /&gt;
=== Unterschiede anschauen ===&lt;br /&gt;
 # diff der unstaged Änderungen&lt;br /&gt;
 git diff&lt;br /&gt;
 # diff der staged Änderungen&lt;br /&gt;
 git diff --staged&lt;br /&gt;
=== Commit (Versionieren)===&lt;br /&gt;
 git commit&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
 git config --global user.name &amp;quot;Stephan Schlegel&amp;quot;&lt;br /&gt;
 git config --global user.email dev@stephanschlegel.de&lt;br /&gt;
 git config --global core.editor &amp;quot;nano&amp;quot;&lt;br /&gt;
 git config --global core.editor &amp;quot;atom -w&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== .gitignore ==&lt;br /&gt;
In einer .gitignore Datei kann man mit Suchmustern regeln, welche Dateien vom Repository ignoriert werden sollen. &lt;br /&gt;
&lt;br /&gt;
Beispiele für Regeln:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ignore Files ending wich the tilde (often used for temporary Files&lt;br /&gt;
*~&lt;br /&gt;
&lt;br /&gt;
# ignore all .a files&lt;br /&gt;
*.a&lt;br /&gt;
&lt;br /&gt;
# ignore files ending with .o or .a (objects archives)&lt;br /&gt;
*.[oa]&lt;br /&gt;
&lt;br /&gt;
# but do track lib.a, even though you&amp;#039;re ignoring .a files above&lt;br /&gt;
!lib.a&lt;br /&gt;
&lt;br /&gt;
# only ignore the TODO file in the current directory, not subdir/TODO&lt;br /&gt;
/TODO&lt;br /&gt;
&lt;br /&gt;
# ignore all files in any directory named build&lt;br /&gt;
build/&lt;br /&gt;
&lt;br /&gt;
# ignore doc/notes.txt, but not doc/server/arch.txt&lt;br /&gt;
doc/*.txt&lt;br /&gt;
&lt;br /&gt;
# ignore all .pdf files in the doc/ directory and any of its subdirectories&lt;br /&gt;
doc/**/*.pdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Online Dienstleister ==&lt;br /&gt;
 Github&lt;br /&gt;
 Bitbucket&lt;br /&gt;
 Gitlab&lt;/div&gt;</summary>
		<author><name>84.157.23.32</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Git&amp;diff=24099</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Git&amp;diff=24099"/>
		<updated>2019-10-22T10:32:26Z</updated>

		<summary type="html">&lt;p&gt;84.157.23.32: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git [ɡɪt] ist eine freie Software zur verteilten Versionsverwaltung von Dateien, die durch Linus Torvalds initiiert wurde.&lt;br /&gt;
== Links ==&lt;br /&gt;
 https://git-scm.com/&lt;br /&gt;
 https://www.youtube.com/watch?v=elh1y6laO8I Schönes Beginner Tutorial&lt;br /&gt;
 https://git-scm.com/book/de/v2 //Ausführliches freies eBook&lt;br /&gt;
 https://de.wikipedia.org/wiki/Git&lt;br /&gt;
 [[GitHub]] - GitHub ist ein Onlinedienst, der Software-Entwicklungsprojekte auf seinen Servern bereitstellt (Filehosting). Namensgebend war das Versionsverwaltungssystem Git. &lt;br /&gt;
&lt;br /&gt;
== Was ist Git ? ==&lt;br /&gt;
Git ist ein verteiltes Versionsverwaltungssystem. Wenn man etwas alleine oder im Team programmiert, kann man alle Änderungen nachträglich verfolgen, Rückgängig machen, Varianten erstellen (Branches) Varianten zu einer neuen Version verschmelzen (merge) etc. &lt;br /&gt;
&lt;br /&gt;
Git kann aber auch für andere Textdateien verwendet werden (z.B. Songtexte verwalten)&lt;br /&gt;
&lt;br /&gt;
Git hat u.a. folgende Eigenschaften&lt;br /&gt;
* Nicht lineare Entwicklung&lt;br /&gt;
** Branching und Merging - Werkzeuge zum Erstellen von Codevarianten und verschmelzen von mehreren zu einem neuen.&lt;br /&gt;
* Kein zentraler Server&lt;br /&gt;
** Nutzer haben lokale Kopien des Repository inkl Versionsgeschichte (history)&lt;br /&gt;
* Datentransfer zwischen Repositories&lt;br /&gt;
** Git kann verschiedene Protokolle nutzen (file, http(s), ssh, ftp, git)&lt;br /&gt;
** file:// kann für den lokalen Transfer auf dem Rechner genutzt werden&lt;br /&gt;
** git:// wird oft für Lesezugriffe (für fetch und clone) genutzt&lt;br /&gt;
** ssh:// wird oft für Schreibzugriffe im Netz genutzt.&lt;br /&gt;
* Sicherheit der History&lt;br /&gt;
** Über einen Hashbaum wird sichergestellt, dass die Versionsgeschichte nachträglich nicht geändert werden kann.&lt;br /&gt;
* Versionierung über alle Dateien. &lt;br /&gt;
** Bei Gib bekommen bei der Änderung einer Datei alle Dateien im Projekt eine neue Versionsnummer. &lt;br /&gt;
&lt;br /&gt;
== Git Quickstart ==&lt;br /&gt;
Als Beispiel legen wir ein Verzeichnis legen wir einen Ordner mit dem Namen Songtexte an und erstellen zwei Dateien mit Songtexten. Z.B.&lt;br /&gt;
 azzurro.txt&lt;br /&gt;
 we-are-the-champions.txt&lt;br /&gt;
&lt;br /&gt;
=== Installation von git ===&lt;br /&gt;
Über https://git-scm.com laden und installieren&lt;br /&gt;
&lt;br /&gt;
=== Projekt mit Git verwalten ===&lt;br /&gt;
Wichtig für Git ist die Kommandozeile. Es gibt auch GUIs aber man sollte die Commandline Befehle einigermaßen beherrschen.&lt;br /&gt;
* Terminal öffnen und in das Projektverzeichnis wechseln&lt;br /&gt;
 git init .&lt;br /&gt;
Erzeugt im aktuellen Verzeichnis (aktuell = .) einen .git Ordner. Dieser ist das Repository in dem alle Änderungen gespeichert werden. Das aktuelle Verzeichnis ist dein Workspace. Dort kannst du ganz normal arbeiten. &lt;br /&gt;
==== Git Status ====&lt;br /&gt;
Mit&lt;br /&gt;
 git status&lt;br /&gt;
Schauen wir welche Änderungen es im Verzeichnis gibt, die noch nicht von git erfasst bzw. versioniert sind. Das sind im Moment noch alle.&lt;br /&gt;
==== Dateien im Repository Tracken und Versionieren - ADD &amp;amp; COMMIT ====&lt;br /&gt;
Mit add kann man git dazu bringen Dateiverläufe zu verfolgen (tracken) und mit commit kann man Versionsstände dieser Dateien festhalten.&lt;br /&gt;
 git add azzurro.txt we-are-the-champions.txt&lt;br /&gt;
oder auch mit Jokern&lt;br /&gt;
 git add *.*&lt;br /&gt;
Wenn man jetzt den Status abruft zeigt git an, das die Dateien getrackt werden aber noch neu und nicht commited sind.&lt;br /&gt;
&lt;br /&gt;
==== Änderungen verwalten ====&lt;br /&gt;
Hat man etwas im Projekt verändert sieht man mit einem erneuten git status welche Dateien sich verändert haben und mit git diff zeigt git einem die genauen Änderungen an.&lt;br /&gt;
 git status&lt;br /&gt;
 git diff&lt;br /&gt;
Passt alles können wir die Datei wieder fürs committen adden und dann den Commit durchführen&lt;br /&gt;
 git add azzurro.txt&lt;br /&gt;
 git commit&lt;br /&gt;
&lt;br /&gt;
==== Datei auf den letzen Stand zurücksetzen ====&lt;br /&gt;
Sehen wir mit unserem git diff, dass wir Änderungen gemacht haben die wir nicht wollen, können wir die Datei auf den letzen Versionsstand zurücksetzen:&lt;br /&gt;
 git checkout we-are-the-champions.txt&lt;br /&gt;
&lt;br /&gt;
==== Git User Profildaten Konfigurieren ====&lt;br /&gt;
Nicht schön im Beispiel: Git hat als User einen automatisch aus dem Mac Nutzerprofil generierten Namen erzeugt. Man kann aber auch selbst einen globalen Usernamen mit dazugehöriger E-Mail erzeugen:&lt;br /&gt;
 git config --global user.name &amp;quot;Stephan Schlegel&amp;quot;&lt;br /&gt;
 git config --global user.email dev@stephanschlegel.de&lt;br /&gt;
&lt;br /&gt;
==== Editor konfigurieren ====&lt;br /&gt;
Der Editor der von Git aufgerufen wird ist nicht jedermanns sache. Möchte man Ihn ändern gibt es zwei Wege entweder über das User Config File direkt oder üer das Terminal. Hier der zweite Weg:&lt;br /&gt;
&lt;br /&gt;
Terminal:&lt;br /&gt;
 git config --global core.editor &amp;quot;nano&amp;quot;&lt;br /&gt;
Konfiguriert nano als Standard Editor&lt;br /&gt;
&lt;br /&gt;
Wenn der Editor ein externes Fenster öffnet und nicht im Terminal ausgeführt wird, muss man git sagen es soll warten bis der Editor gespeichert und das File geschlossen hat. Sonst gibt es beim Commit eine Fehlermeldung, das keine Message vom Editor kam. Dazu nutzen wir die -w Option.&lt;br /&gt;
 git config --global core.editor &amp;quot;atom -w&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Wichtige Befehle ==&lt;br /&gt;
=== Repository anlegen ===&lt;br /&gt;
 git init . &lt;br /&gt;
=== Status ===&lt;br /&gt;
 git status&lt;br /&gt;
 git status -s #shortversion&lt;br /&gt;
=== Dateien Tracken / Stagen ===&lt;br /&gt;
 git add myfile.ext&lt;br /&gt;
 git&lt;br /&gt;
=== Dateien Unstagen ===&lt;br /&gt;
 git checkout myfile.ext&lt;br /&gt;
=== Commit (Versionieren)===&lt;br /&gt;
 git commit&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
 git config --global user.name &amp;quot;Stephan Schlegel&amp;quot;&lt;br /&gt;
 git config --global user.email dev@stephanschlegel.de&lt;br /&gt;
 git config --global core.editor &amp;quot;nano&amp;quot;&lt;br /&gt;
 git config --global core.editor &amp;quot;atom -w&amp;quot;&lt;br /&gt;
== .gitignore ==&lt;br /&gt;
In einer .gitignore Datei kann man mit Suchmustern regeln, welche Dateien vom Repository ignoriert werden sollen. &lt;br /&gt;
&lt;br /&gt;
Beispiele für Regeln:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ignore Files ending wich the tilde (often used for temporary Files&lt;br /&gt;
*~&lt;br /&gt;
&lt;br /&gt;
# ignore all .a files&lt;br /&gt;
*.a&lt;br /&gt;
&lt;br /&gt;
# ignore files ending with .o or .a (objects archives)&lt;br /&gt;
*.[oa]&lt;br /&gt;
&lt;br /&gt;
# but do track lib.a, even though you&amp;#039;re ignoring .a files above&lt;br /&gt;
!lib.a&lt;br /&gt;
&lt;br /&gt;
# only ignore the TODO file in the current directory, not subdir/TODO&lt;br /&gt;
/TODO&lt;br /&gt;
&lt;br /&gt;
# ignore all files in any directory named build&lt;br /&gt;
build/&lt;br /&gt;
&lt;br /&gt;
# ignore doc/notes.txt, but not doc/server/arch.txt&lt;br /&gt;
doc/*.txt&lt;br /&gt;
&lt;br /&gt;
# ignore all .pdf files in the doc/ directory and any of its subdirectories&lt;br /&gt;
doc/**/*.pdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Online Dienstleister ==&lt;br /&gt;
 Github&lt;br /&gt;
 Bitbucket&lt;br /&gt;
 Gitlab&lt;/div&gt;</summary>
		<author><name>84.157.23.32</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GitHub&amp;diff=24098</id>
		<title>GitHub</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GitHub&amp;diff=24098"/>
		<updated>2019-10-22T09:56:57Z</updated>

		<summary type="html">&lt;p&gt;84.157.23.32: Die Seite wurde neu angelegt: „Todo“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Todo&lt;/div&gt;</summary>
		<author><name>84.157.23.32</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=PostCSS&amp;diff=24071</id>
		<title>PostCSS</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=PostCSS&amp;diff=24071"/>
		<updated>2019-10-01T07:03:34Z</updated>

		<summary type="html">&lt;p&gt;84.157.23.32: Die Seite wurde neu angelegt: „ https://postcss.org/  https://www.sitepoint.com/an-introduction-to-postcss/  https://github.com/pirxpilot/postcss-cli  https://cssdb.org/  PostCSS möchte die…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://postcss.org/&lt;br /&gt;
 https://www.sitepoint.com/an-introduction-to-postcss/&lt;br /&gt;
 https://github.com/pirxpilot/postcss-cli&lt;br /&gt;
 https://cssdb.org/&lt;br /&gt;
&lt;br /&gt;
PostCSS möchte die Lesbarkeit und einfacheres Schreiben von CSS Code ermöglichen. Es kann Polyfills für ältere Browser erzeugen und ermöglicht wie Sass oder Less vereinfachtes Schreiben, Variablen etc. Die Funktionalität lässt sich mit Plugins erweitern. Es gibt z.B. Autoprefixer für -moz etc. Erweiterungen. &lt;br /&gt;
&lt;br /&gt;
Es unterscheidet sich von Präprozessoren wie Sass oder Less durch eben diese Erweiterbarkeit, ist also eher eine CSS-Toolbox.&lt;/div&gt;</summary>
		<author><name>84.157.23.32</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Cookies&amp;diff=24070</id>
		<title>ProcessWire - Cookies</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Cookies&amp;diff=24070"/>
		<updated>2019-09-30T06:59:20Z</updated>

		<summary type="html">&lt;p&gt;84.157.23.32: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Siehe auch&lt;br /&gt;
 https://processwire.com/blog/posts/pw-3.0.141/#expanded-cookie-support-in-core&lt;br /&gt;
 [[ProcessWire - $input Variable]]&lt;/div&gt;</summary>
		<author><name>84.157.23.32</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Themes_/_Templates&amp;diff=24069</id>
		<title>Processwire - Themes / Templates</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Themes_/_Templates&amp;diff=24069"/>
		<updated>2019-09-30T06:57:15Z</updated>

		<summary type="html">&lt;p&gt;84.157.23.32: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
Siehe auch &lt;br /&gt;
* [[Processwire - Templates Grundausstattung]] (Best Practice)&lt;br /&gt;
* [[ProcessWire - Field Rendering]]&lt;br /&gt;
* [[ProcessWire - Skeleton Template]]&lt;br /&gt;
* [[Processwire - Template from Scratch]]&lt;br /&gt;
* https://processwire.com/blog/posts/pw-3.0.141/#processwire-system-urls-paths-now-more-customizable (Interessant für vo Backend wählbare Themes)&lt;br /&gt;
&lt;br /&gt;
== Template Strategien ==&lt;br /&gt;
 https://processwire.com/docs/tutorials/how-to-structure-your-template-files/&lt;br /&gt;
&lt;br /&gt;
Es gibt in ProcessWire im Wesentlichen drei grundlegende Stragegien um HTML Inhalte auszugeben:&lt;br /&gt;
* Direct Output&lt;br /&gt;
* Delayed Output&lt;br /&gt;
* Markup Regions ([[ProcessWire - Markup Regions]])&lt;br /&gt;
&lt;br /&gt;
=== Direct Output ===&lt;br /&gt;
Die Inhalte im Template werden direkt als Markup ausgegeben.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&amp;lt;?php echo $page-&amp;gt;title; ?&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;&amp;lt;?php echo $page-&amp;gt;title; ?&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;?php echo $page-&amp;gt;body; ?&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Direct Output mit Includes ====&lt;br /&gt;
Teile die man oft benötigt kann man in andere Dateien verlagern. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
include(&amp;quot;./head.inc&amp;quot;);&lt;br /&gt;
echo $page-&amp;gt;body;&lt;br /&gt;
include(&amp;quot;./foot.inc&amp;quot;); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Direct Output mit automatic inclusion ====&lt;br /&gt;
==== Automatic Inclusion ====&lt;br /&gt;
Über die ProcessWire Konfiguration prependTemplateFile und appendTemplateFile kann man automatisch bestimmte Templates einbinden .&lt;br /&gt;
In der config.php definiert man:&lt;br /&gt;
 $config-&amp;gt;prependTemplateFile = &amp;#039;head.inc&amp;#039;;&lt;br /&gt;
 $config-&amp;gt;appendTemplateFile = &amp;#039;foot.inc&amp;#039;;&lt;br /&gt;
Dann kann man im Template einfach schreiben:&lt;br /&gt;
 echo $page-&amp;gt;body;&lt;br /&gt;
head.inc und foot.inc werden automatisch hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
=== Delayed Output ===&lt;br /&gt;
Mit Delayed Output meint man, dass beim Rendering Teile des Inhalts zunächst in Variablen gespeichert werden. Am Ende wenn alle Teilbereiche gerendert sind werden die Inhalte zusammengefügt (delayed)&lt;br /&gt;
&lt;br /&gt;
basic-page.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$headline = $page-&amp;gt;get(&amp;quot;headline|title&amp;quot;);&lt;br /&gt;
$bodycopy = $page-&amp;gt;body;&lt;br /&gt;
$sidebar = $page-&amp;gt;sidebar;&lt;br /&gt;
include(&amp;quot;./main.inc&amp;quot;); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In main.inc werden die Variablen dann verwendet&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&amp;lt;?php echo $headline; ?&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;#039;bodycopy&amp;#039;&amp;gt;&lt;br /&gt;
      &amp;lt;h1&amp;gt;&amp;lt;?php echo $headline; ?&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
      &amp;lt;?php echo $bodycopy; ?&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;#039;sidebar&amp;#039;&amp;gt;&lt;br /&gt;
      &amp;lt;?php echo $sidebar; ?&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Delayed Output mit automatic inclusions ====&lt;br /&gt;
Oft (aber nicht immer) bietet sich auch an Teile automatisch zu inkludieren. &lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Markup Regions ===&lt;br /&gt;
Kombiniert die Vorteile der vorigen Strategien. Werden per Include (oder über die Funktionen für das Delayed Output) Template Dateien verknüpft, werden die Inhalte gleichnamiger id Container ersetzt oder mit Hilfe von pw- Klassen kombiniert bzw. bearbeitet.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Tipps ==&lt;br /&gt;
Es gibt verschiedene Orte wo man Teilrenderings vornehmen kann. Wenn man sich keine Strategie zurechtlegt kann man schnell die Übersicht verlieren. Hier ein paar Vorschläge:&lt;br /&gt;
* Partials im partials Ordner sind für einfache Dinge geeignet und gerade beim Entwurf sehr schnell. Hier lege ich Codeblöcke an die direkt (per echo oder direkt als HTMl) ausgegeben werden. Es gibt keine Rückgaben über return. Partials sind Views. Also auf Funktionen weitgehend verzichten. Ausnahmen sind z.B. foreach Schleifen auf Felder (zumindest solange ohne Template Engine gearbeitet wird).&lt;br /&gt;
* Partials Dateien enden auf .inc&lt;br /&gt;
* In Komplexeren Projekten sollte auf sauberer Model View Controller Trennung geachtet werden.&lt;br /&gt;
* Layoutblöcke für Redakteure kommen z.B. in den Field Bereich. Hier kann man die Renderreihenfolge von PW ausnutzen.&lt;br /&gt;
&lt;br /&gt;
== Datei Strategien ==&lt;br /&gt;
Wo legt man am Besten Dateien und Ordner an.&lt;br /&gt;
=== Basic Theme ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
templates/&lt;br /&gt;
  _func.inc (wenn benötigt)&lt;br /&gt;
  home.php&lt;br /&gt;
  basic_page.php&lt;br /&gt;
templates/partials&lt;br /&gt;
  foot.inc&lt;br /&gt;
  head.inc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Layout Blocks (BEST PRACTICE)===&lt;br /&gt;
Dies ist meine (Steffs) selbstentwickelte Strategie um vielfältige Inhalte auch einem nicht Programmierer im Backend zu ermöglichen und sie dann im Frontend auszugeben.) &lt;br /&gt;
Anstatt den Templates fest definierte Seitenbereiche zuzuordnen und für jedes Layout ein Template zu erzeugen, kann es sinnvoll sein in &amp;#039;&amp;#039;&amp;#039;Layout-Blöcken&amp;#039;&amp;#039;&amp;#039; zu denken. also einzelne Gestaltungsbausteine, die der User auswählen kann und aus denen sich die Seite aufbaut. &lt;br /&gt;
&lt;br /&gt;
Um dies umzusetzen bietet sich der &amp;#039;&amp;#039;&amp;#039;Feldtyp RepeaterMatrix&amp;#039;&amp;#039;&amp;#039; an, der beim den ProField Modul mit dabei ist. Als Alternative würde vielleicht &lt;br /&gt;
 [[ProcessWire - Layout Blöcke mit RepeaterMatrix]]&lt;br /&gt;
 [[Processwire - Flexible Content Type]]&lt;br /&gt;
&lt;br /&gt;
== Rendering Strategien ==&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
http://blog.mauriziobonani.com/processwire-basic-website-workflow-part-2/&lt;br /&gt;
=== Render Funktionen ===&lt;br /&gt;
https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// New Functions in 3.x &lt;br /&gt;
render()&lt;br /&gt;
renderValue()&lt;br /&gt;
&lt;br /&gt;
// Functions for 2.x or for easy snippet inclusion (also possible with render&lt;br /&gt;
wireRenderFile() // mostly used for delayed output&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
// i.e.&lt;br /&gt;
// returns the output of snippets/contactform.php&lt;br /&gt;
// the second argument is optional and will be passed to &lt;br /&gt;
// the called file as multiple variables with the name of the key&lt;br /&gt;
// also all api varables are available by default&lt;br /&gt;
&lt;br /&gt;
wireRenderFile(&amp;quot;snippets/contactform&amp;quot;, array(&amp;quot;stuff&amp;quot; =&amp;gt; $something ));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Delayed Output and Advanced Templates ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ordnerstruktur&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
templates/&lt;br /&gt;
  _func.inc&lt;br /&gt;
  _init.inc&lt;br /&gt;
  _main.inc&lt;br /&gt;
templates/partials&lt;br /&gt;
  foot.inc&lt;br /&gt;
  head.inc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;config.php&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&lt;br /&gt;
...&lt;br /&gt;
$config-&amp;gt;debug = false;&lt;br /&gt;
$config-&amp;gt;sessionFingerprint = true;&lt;br /&gt;
$config-&amp;gt;prependTemplateFile = &amp;#039;_init.php&amp;#039;;&lt;br /&gt;
$config-&amp;gt;appendTemplateFile = &amp;#039;_main.php&amp;#039;;&lt;br /&gt;
$config-&amp;gt;imageSizerOptions = array(&lt;br /&gt;
	&amp;#039;upscaling&amp;#039; =&amp;gt; true, // upscale if necessary to reach target size?&lt;br /&gt;
	&amp;#039;cropping&amp;#039; =&amp;gt; true, // crop if necessary to reach target size?&lt;br /&gt;
	&amp;#039;autoRotation&amp;#039; =&amp;gt; true, // automatically correct orientation?&lt;br /&gt;
	&amp;#039;sharpening&amp;#039; =&amp;gt; &amp;#039;soft&amp;#039;, // sharpening: none | soft | medium | strong&lt;br /&gt;
	&amp;#039;quality&amp;#039; =&amp;gt; 90, // quality: 1-100 where higher is better but bigger&lt;br /&gt;
	);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AJAX Driven Theme ===&lt;br /&gt;
config.php&lt;br /&gt;
 // if ajax request set&lt;br /&gt;
 $ajax = $input-&amp;gt;post-&amp;gt;ajax;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Markup Regions ===&lt;br /&gt;
Seit Version 3.0 die neueste Rendering Strategie. Hier werden Divs mit ids automatisch zu editierbaren Bereichen, die mit passenden Feldern im Backend befüllt werden.&lt;br /&gt;
&lt;br /&gt;
[[Processwire - Markup Regions]]&lt;br /&gt;
&lt;br /&gt;
== Syntax und Konventionen ==&lt;br /&gt;
&lt;br /&gt;
== Module ==&lt;br /&gt;
[[Processwire - Writing Modules]]&lt;br /&gt;
=== Recommended Modules ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FormBuilder (kostenpflichtig) - FormBuilder&lt;br /&gt;
ProFields (kostenpflichtig) - https://processwire.com/talk/store/product/10-profields/&lt;br /&gt;
Hanna Code (wie bei Wordpress) 	- TextformatterHannaCode&lt;br /&gt;
Map Marker (google Maps) - FieldtypeMapMarker&lt;br /&gt;
Simple Navigation - MarkupSimpleNavigation&lt;br /&gt;
AIOM - All In One Minify - AllInOneMinify&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Grundausstattung ==&lt;br /&gt;
Siehe [[Processwire - Templates Grundausstattung]]&lt;br /&gt;
&lt;br /&gt;
== Tipps und Tricks ==&lt;br /&gt;
=== Templates in Backend-Auswahl verstecken ===&lt;br /&gt;
Manche Templates tauchen in der Auswahl der Redakteure auf obwohl es eigentlich nur Teiltemplates sind. Z.B. für eine Matrix.&lt;br /&gt;
Benennt man sie mit einem &amp;#039;&amp;#039;&amp;#039;Underscore am Anfang _NameDesTemplates&amp;#039;&amp;#039;&amp;#039; tauchen sie nicht mehr in der Auswahlliste auf.&lt;/div&gt;</summary>
		<author><name>84.157.23.32</name></author>
	</entry>
</feed>