<?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=37.49.32.84</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=37.49.32.84"/>
	<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Spezial:Beitr%C3%A4ge/37.49.32.84"/>
	<updated>2026-05-06T14:46:06Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=PHP_-_Zahlen_formatieren&amp;diff=22661</id>
		<title>PHP - Zahlen formatieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=PHP_-_Zahlen_formatieren&amp;diff=22661"/>
		<updated>2017-12-11T14:05:57Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quelle: https://stackoverflow.com/questions/13309212/preg-replace-all-non-numerical-characters-except (2017-12)&lt;br /&gt;
&lt;br /&gt;
You should be able to do it with the following regex:&lt;br /&gt;
&lt;br /&gt;
 [^0-9+]&lt;br /&gt;
In preg_replace():&lt;br /&gt;
&lt;br /&gt;
 $nn = preg_replace(&amp;#039;/[^0-9+]/&amp;#039;, &amp;#039;&amp;#039;, $string);&lt;br /&gt;
== Telefonnummer ==&lt;br /&gt;
=== Entferne alles außer Zahlen und + ===&lt;br /&gt;
Your current regex also keeps a forward-slash, so to keep that functionality:&lt;br /&gt;
&lt;br /&gt;
 $nn = preg_replace(&amp;#039;/[^0-9\/+]/&amp;#039;, &amp;#039;&amp;#039;, $string);&lt;br /&gt;
Sample code with output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$string = &amp;#039;+27 (15) 234-2634&amp;#039;;&lt;br /&gt;
$nn = preg_replace(&amp;quot;/[^0-9+]/&amp;quot;, &amp;quot;&amp;quot;, $string );&lt;br /&gt;
echo $nn . &amp;quot;\n&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Results in:&lt;br /&gt;
&lt;br /&gt;
 +27152342634&lt;br /&gt;
&lt;br /&gt;
UPDATE (keep only first matching +)&lt;br /&gt;
&lt;br /&gt;
Per your latest question-update, you also only want to keep the first + symbol found. To do this, since there may not be a &amp;quot;rule&amp;quot; regarding the location of the first symbol (such as &amp;quot;it has to be the first character in the string), I would suggest using additional methods other than just preg_replace():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$nn = preg_replace(&amp;quot;/[^0-9+]/&amp;quot;, &amp;quot;&amp;quot;, $string);&lt;br /&gt;
if (substr_count($nn, &amp;#039;+&amp;#039;) &amp;gt; 1) {&lt;br /&gt;
    $firstPlus = strpos($nn, &amp;#039;+&amp;#039;) + 1;&lt;br /&gt;
    $nn = substr($nn, 0, $firstPlus) . str_replace(&amp;#039;+&amp;#039;, &amp;#039;&amp;#039;, substr($nn, $firstPlus));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This code will perform the original preg_replace() as normal and then, if there are more than 1 + symbols in the result, it will get a sub-string of the result up to the first +, then perform a string-replacement to replace all remaining + symbols. You could always use a second preg_replace() here too, but to remove only a + symbol it would be overkill.&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a codepad entry for the sample.&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=PHP_-_Zahlen_formatieren&amp;diff=22660</id>
		<title>PHP - Zahlen formatieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=PHP_-_Zahlen_formatieren&amp;diff=22660"/>
		<updated>2017-12-11T14:05:27Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You should be able to do it with the following regex:&lt;br /&gt;
&lt;br /&gt;
 [^0-9+]&lt;br /&gt;
In preg_replace():&lt;br /&gt;
&lt;br /&gt;
 $nn = preg_replace(&amp;#039;/[^0-9+]/&amp;#039;, &amp;#039;&amp;#039;, $string);&lt;br /&gt;
== Telefonnummer ==&lt;br /&gt;
=== Entferne alles außer Zahlen und + ===&lt;br /&gt;
Your current regex also keeps a forward-slash, so to keep that functionality:&lt;br /&gt;
&lt;br /&gt;
 $nn = preg_replace(&amp;#039;/[^0-9\/+]/&amp;#039;, &amp;#039;&amp;#039;, $string);&lt;br /&gt;
Sample code with output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$string = &amp;#039;+27 (15) 234-2634&amp;#039;;&lt;br /&gt;
$nn = preg_replace(&amp;quot;/[^0-9+]/&amp;quot;, &amp;quot;&amp;quot;, $string );&lt;br /&gt;
echo $nn . &amp;quot;\n&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Results in:&lt;br /&gt;
&lt;br /&gt;
 +27152342634&lt;br /&gt;
&lt;br /&gt;
UPDATE (keep only first matching +)&lt;br /&gt;
&lt;br /&gt;
Per your latest question-update, you also only want to keep the first + symbol found. To do this, since there may not be a &amp;quot;rule&amp;quot; regarding the location of the first symbol (such as &amp;quot;it has to be the first character in the string), I would suggest using additional methods other than just preg_replace():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$nn = preg_replace(&amp;quot;/[^0-9+]/&amp;quot;, &amp;quot;&amp;quot;, $string);&lt;br /&gt;
if (substr_count($nn, &amp;#039;+&amp;#039;) &amp;gt; 1) {&lt;br /&gt;
    $firstPlus = strpos($nn, &amp;#039;+&amp;#039;) + 1;&lt;br /&gt;
    $nn = substr($nn, 0, $firstPlus) . str_replace(&amp;#039;+&amp;#039;, &amp;#039;&amp;#039;, substr($nn, $firstPlus));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This code will perform the original preg_replace() as normal and then, if there are more than 1 + symbols in the result, it will get a sub-string of the result up to the first +, then perform a string-replacement to replace all remaining + symbols. You could always use a second preg_replace() here too, but to remove only a + symbol it would be overkill.&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a codepad entry for the sample.&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=PHP_-_Zahlen_formatieren&amp;diff=22659</id>
		<title>PHP - Zahlen formatieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=PHP_-_Zahlen_formatieren&amp;diff=22659"/>
		<updated>2017-12-11T14:05:10Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: Die Seite wurde neu angelegt: „You should be able to do it with the following regex:  [^0-9+] In preg_replace():  $nn = preg_replace(&amp;#039;/[^0-9+]/&amp;#039;, &amp;#039;&amp;#039;, $string); == Telefonnummer == === Entfer…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You should be able to do it with the following regex:&lt;br /&gt;
&lt;br /&gt;
[^0-9+]&lt;br /&gt;
In preg_replace():&lt;br /&gt;
&lt;br /&gt;
$nn = preg_replace(&amp;#039;/[^0-9+]/&amp;#039;, &amp;#039;&amp;#039;, $string);&lt;br /&gt;
== Telefonnummer ==&lt;br /&gt;
=== Entferne alles außer Zahlen und + ===&lt;br /&gt;
Your current regex also keeps a forward-slash, so to keep that functionality:&lt;br /&gt;
&lt;br /&gt;
 $nn = preg_replace(&amp;#039;/[^0-9\/+]/&amp;#039;, &amp;#039;&amp;#039;, $string);&lt;br /&gt;
Sample code with output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$string = &amp;#039;+27 (15) 234-2634&amp;#039;;&lt;br /&gt;
$nn = preg_replace(&amp;quot;/[^0-9+]/&amp;quot;, &amp;quot;&amp;quot;, $string );&lt;br /&gt;
echo $nn . &amp;quot;\n&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Results in:&lt;br /&gt;
&lt;br /&gt;
 +27152342634&lt;br /&gt;
&lt;br /&gt;
UPDATE (keep only first matching +)&lt;br /&gt;
&lt;br /&gt;
Per your latest question-update, you also only want to keep the first + symbol found. To do this, since there may not be a &amp;quot;rule&amp;quot; regarding the location of the first symbol (such as &amp;quot;it has to be the first character in the string), I would suggest using additional methods other than just preg_replace():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$nn = preg_replace(&amp;quot;/[^0-9+]/&amp;quot;, &amp;quot;&amp;quot;, $string);&lt;br /&gt;
if (substr_count($nn, &amp;#039;+&amp;#039;) &amp;gt; 1) {&lt;br /&gt;
    $firstPlus = strpos($nn, &amp;#039;+&amp;#039;) + 1;&lt;br /&gt;
    $nn = substr($nn, 0, $firstPlus) . str_replace(&amp;#039;+&amp;#039;, &amp;#039;&amp;#039;, substr($nn, $firstPlus));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This code will perform the original preg_replace() as normal and then, if there are more than 1 + symbols in the result, it will get a sub-string of the result up to the first +, then perform a string-replacement to replace all remaining + symbols. You could always use a second preg_replace() here too, but to remove only a + symbol it would be overkill.&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a codepad entry for the sample.&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=PHP_-_String_Snippets&amp;diff=22658</id>
		<title>PHP - String Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=PHP_-_String_Snippets&amp;diff=22658"/>
		<updated>2017-12-11T14:01:44Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Siehe auch ==&lt;br /&gt;
[[PHP - Zahlen formatieren]]&lt;br /&gt;
&lt;br /&gt;
== Überflüssige Whitespace entfernen ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$str = &amp;#039;foo   o&amp;#039;;&lt;br /&gt;
$str = preg_replace(&amp;#039;/\s\s+/&amp;#039;, &amp;#039; &amp;#039;, $str);&lt;br /&gt;
// This will be &amp;#039;foo o&amp;#039; now&lt;br /&gt;
echo $str;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Zeilenumbruch einfügen ==&lt;br /&gt;
 string wordwrap ( string $str [, int $width = 75 [, string $break = &amp;quot;\n&amp;quot; [, bool $cut = false ]]] )&lt;br /&gt;
== Text kürzen ==&lt;br /&gt;
=== Text kürzen / HTML entfernen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function truncateText($text, $maxlength = 200) {&lt;br /&gt;
  // truncate to max length&lt;br /&gt;
  $text = substr(strip_tags($text), 0, $maxlength);&lt;br /&gt;
  // check if we&amp;#039;ve truncated to a spot that needs further truncation&lt;br /&gt;
  if(strlen(rtrim($text, &amp;#039; .!?,;&amp;#039;)) == $maxlength) {&lt;br /&gt;
    // truncate to last word &lt;br /&gt;
    $text = substr($text, 0, strrpos($text, &amp;#039; &amp;#039;)); &lt;br /&gt;
  }&lt;br /&gt;
  return trim($text); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Einsatz in Processwire:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$summary = truncateText($page-&amp;gt;body); &lt;br /&gt;
echo &amp;quot;&lt;br /&gt;
  &amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$page-&amp;gt;title&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;p class=&amp;#039;summary&amp;#039;&amp;gt;$summary&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Auf Wortende kürzen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function limit_words($words, $limit, $append = &amp;#039; &amp;amp;hellip;&amp;#039;) {&lt;br /&gt;
  $limit = $limit+1;&lt;br /&gt;
  $words = explode(&amp;#039; &amp;#039;, $words, $limit+1);&lt;br /&gt;
  array_pop($words); // Shorten the array by 1 because that final element will be the sum of all the words after the limit&lt;br /&gt;
  $words = implode(&amp;#039; &amp;#039;, $words) . $append;&lt;br /&gt;
  return $words;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Auf Satzende kürzen ===&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;
function substr_sentence($string, $start=0, $limit=10, $max_char = 600)&lt;br /&gt;
    {&lt;br /&gt;
    /* This functions cuts a long string in sentences.&lt;br /&gt;
    *&lt;br /&gt;
    * substr_sentence($string, $start, $limit);&lt;br /&gt;
    * $string = &amp;#039;A example. By someone that loves PHP. Do you? We do!&amp;#039;;&lt;br /&gt;
    * $start = 0; // we would start at the beginning&lt;br /&gt;
    * $limit = 10; // so, we get 10 sentences (not 10 words or characters!)&lt;br /&gt;
    *&lt;br /&gt;
    * It&amp;#039;s not as substr()) in single characters.&lt;br /&gt;
    * It&amp;#039;s not as substr_words() in single words.&lt;br /&gt;
    * &lt;br /&gt;
    * No more broken lines in a story. The story/article must go on!&lt;br /&gt;
    *&lt;br /&gt;
    * Written by Eddy Erkelens &amp;quot;Zunflappie&amp;quot;&lt;br /&gt;
    * Published on www.mastercode.nl &lt;br /&gt;
    * May be free used and adapted&lt;br /&gt;
    *&lt;br /&gt;
    */&lt;br /&gt;
    &lt;br /&gt;
    // list of sentences-ends. All sentences ends with one of these. For PHP, add the ;&lt;br /&gt;
    $end_characters = array(&lt;br /&gt;
                &amp;#039;. &amp;#039;, &lt;br /&gt;
                &amp;#039;? &amp;#039;,&lt;br /&gt;
                &amp;#039;! &amp;#039;&lt;br /&gt;
                );&lt;br /&gt;
    &lt;br /&gt;
    // put $string in array $parts, necessary evil&lt;br /&gt;
    $parts = array($string);            &lt;br /&gt;
        &lt;br /&gt;
    // foreach interpunctation-mark we will do this loop&lt;br /&gt;
    foreach($end_characters as $end_character)&lt;br /&gt;
        {&lt;br /&gt;
        // go thru each part of the sentences we already have&lt;br /&gt;
        foreach($parts as $part)&lt;br /&gt;
            {&lt;br /&gt;
            // make array with the new sentences&lt;br /&gt;
            $sentences[] = explode($end_character, $part);&lt;br /&gt;
            }&lt;br /&gt;
        &lt;br /&gt;
        // unfortunately explode() removes the end character itself. So, place it back&lt;br /&gt;
        foreach($sentences as $sentence)&lt;br /&gt;
            {&lt;br /&gt;
            // some strange stuff&lt;br /&gt;
            foreach($sentence as $real_sentence)&lt;br /&gt;
                {&lt;br /&gt;
                // empty sentence we do not want&lt;br /&gt;
                if($real_sentence != &amp;#039;&amp;#039;)&lt;br /&gt;
                    {&lt;br /&gt;
                    // if there is already an end-character, dont place another one&lt;br /&gt;
                    if(in_array(substr($real_sentence, -1, 1), $end_characters))&lt;br /&gt;
                        {&lt;br /&gt;
                        // store for next round&lt;br /&gt;
                        $next[] = trim($real_sentence);        &lt;br /&gt;
                        }&lt;br /&gt;
                    else&lt;br /&gt;
                        {&lt;br /&gt;
                        // store for next round and add the removed character&lt;br /&gt;
                        $next[] = trim($real_sentence).$end_character;    &lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
        // store for next round&lt;br /&gt;
        $parts = $next;&lt;br /&gt;
        &lt;br /&gt;
        // unset the remaining and useless stuff&lt;br /&gt;
        unset($sentences, $sentence, $next);&lt;br /&gt;
        }    &lt;br /&gt;
&lt;br /&gt;
	// check for max-char-length&lt;br /&gt;
	$total_chars = 0;&lt;br /&gt;
	$sentence_nr = 0;&lt;br /&gt;
	$sentences = array();&lt;br /&gt;
	&lt;br /&gt;
	// walk thru each member of $part&lt;br /&gt;
	foreach($parts as $part)&lt;br /&gt;
		{&lt;br /&gt;
		// count the string-lenght and add this to $total_chars&lt;br /&gt;
		$total_chars += strlen($part);&lt;br /&gt;
		&lt;br /&gt;
		// if $total-chars not already higher then max-char, add this sentences!&lt;br /&gt;
		if($total_chars &amp;lt; $max_char)&lt;br /&gt;
			{&lt;br /&gt;
			$sentences[] = $part;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
    // return the shortened story as a string&lt;br /&gt;
    return implode(&amp;quot; &amp;quot;, array_slice($sentences, $start, $limit));&lt;br /&gt;
    }&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=PHP_-_Snippets&amp;diff=22657</id>
		<title>PHP - Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=PHP_-_Snippets&amp;diff=22657"/>
		<updated>2017-12-11T14:01:19Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Strings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Navigation aus Unterverzeichnissen und Dateinamen erzeugen ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
function getNavigation($pf=&amp;quot;./&amp;quot;,$arrExcludeNames=array()){&lt;br /&gt;
	$vz = opendir($pf);&lt;br /&gt;
	$arrExcludeNames = array(&amp;quot;css&amp;quot;,&amp;quot;js&amp;quot;,&amp;quot;media&amp;quot;,&amp;quot;readme.txt&amp;quot;,&amp;quot;index.php&amp;quot;);&lt;br /&gt;
	$a = &amp;#039;&amp;#039;;&lt;br /&gt;
	while ($vi = readdir($vz)) {&lt;br /&gt;
		if ($vi != &amp;#039;.&amp;#039; &amp;amp;&amp;amp; $vi != &amp;#039;..&amp;#039; &amp;amp;&amp;amp; !in_array($vi, $arrExcludeNames)) {&lt;br /&gt;
			$a .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$pf.$vi.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$vi.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return $a;&lt;br /&gt;
}&lt;br /&gt;
$arrExcludeNames = array(&amp;quot;css&amp;quot;,&amp;quot;js&amp;quot;,&amp;quot;media&amp;quot;,&amp;quot;readme.txt&amp;quot;,&amp;quot;index.php&amp;quot;);// diese sollen nicht in die Navigation&lt;br /&gt;
$myPath=&amp;quot;./meinVerzeichnis/meinUnterverzeichnis/&amp;quot;&lt;br /&gt;
echo getNavigation($myPath,$arrExcludeNames);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Strings ==&lt;br /&gt;
[[PHP - String Snippets]]&lt;br /&gt;
&lt;br /&gt;
[[PHP - Zahlen formatieren]]&lt;br /&gt;
=== Marker Replacement ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function replace_markers($template,$arrMarkers){&lt;br /&gt;
	// Platzhalter mit den Benutzereingaben ersetzen&lt;br /&gt;
	$sCalib_as_offered = &amp;#039;&amp;lt;p&amp;gt;Request for customized calibration&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
	$sCalib_as_datasheet = &amp;#039;&amp;lt;p&amp;gt;Calibration will be performed based on current specifications as stated in data sheet&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
	$sAdditional_service = &amp;#039;&amp;lt;h3&amp;gt;Only for calibration request&amp;lt;/h3&amp;gt;&amp;lt;strong&amp;gt;End user would like to have additional services:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
	$sCalib_justify = &amp;#039;&amp;lt;p&amp;gt;Standard calibration (ISO) with adjustment (with additional charges)&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
	$sFw_update = &amp;#039;&amp;lt;p&amp;gt;Firmware update (free of charge)&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
	&lt;br /&gt;
	if($arrMarkers[calib_type] == &amp;#039;calib_as_offered&amp;#039;) $template = str_replace( &amp;#039;###CALIB_TYPE###&amp;#039;, $sCalib_as_offered, $template );&lt;br /&gt;
	if($arrMarkers[calib_type] == &amp;#039;calib_as_datasheet&amp;#039;) $template = str_replace( &amp;#039;###CALIB_TYPE###&amp;#039;, $sCalib_as_datasheet, $template );&lt;br /&gt;
	&lt;br /&gt;
	if($arrMarkers[additional_service]) $template = str_replace( &amp;#039;###ADDITIONAL_SERVICE###&amp;#039;, $sAdditional_service, $template);&lt;br /&gt;
	if($arrMarkers[calib_justify]) $template = str_replace( &amp;#039;###CALIB_JUSTIFY###&amp;#039;, $sCalib_justify, $template );&lt;br /&gt;
	else $template = str_replace( &amp;#039;###CALIB_JUSTIFY###&amp;#039;, &amp;#039;&amp;#039;, $template );&lt;br /&gt;
	&lt;br /&gt;
	if($arrMarkers[fw_update]) $template = str_replace( &amp;#039;###FW_UPDATE###&amp;#039;, $sFw_update, $template );&lt;br /&gt;
	else $template = str_replace( &amp;#039;###FW_UPDATE###&amp;#039;, &amp;#039;&amp;#039;, $template );&lt;br /&gt;
	&lt;br /&gt;
    foreach($arrMarkers as $key =&amp;gt; $val){&lt;br /&gt;
    	if($val == &amp;#039;0&amp;#039;)$val = &amp;#039;&amp;#039;;&lt;br /&gt;
    	$val = iconv(&amp;quot;UTF-8&amp;quot;,&amp;quot;UTF-8//IGNORE&amp;quot;,$val);&lt;br /&gt;
    	$template = str_replace( &amp;#039;###&amp;#039;.strtoupper($key).&amp;#039;###&amp;#039;, htmlspecialchars( $val ), $template );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    $template = str_replace( &amp;#039;###FNAME1###&amp;#039;, htmlspecialchars( $arrMarkers[fname1] ), $template );&lt;br /&gt;
    $template = str_replace( &amp;#039;###RMA_NUM###&amp;#039;, $rma_num, $template );&lt;br /&gt;
    $template = str_replace( &amp;#039;###NACHRICHT###&amp;#039;, htmlspecialchars( $nachricht ), $template );&lt;br /&gt;
	//echo $template;&lt;br /&gt;
	return $template;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Clean up POST und GET ==&lt;br /&gt;
Zusätzliche Sicherheit für Post und Get.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function clean($elem) {&lt;br /&gt;
	/* used to add some security to get and post vars */&lt;br /&gt;
	if(!is_array($elem)) &lt;br /&gt;
		$elem = htmlentities($elem,ENT_QUOTES,&amp;quot;UTF-8&amp;quot;); &lt;br /&gt;
    	else &lt;br /&gt;
		foreach ($elem as $key =&amp;gt; $value) &lt;br /&gt;
			$elem[$key] = $this-&amp;gt;clean($value); &lt;br /&gt;
    	return $elem; &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
$_CLEAN[&amp;#039;GET&amp;#039;] = clean($_GET); &lt;br /&gt;
$_CLEAN[&amp;#039;POST&amp;#039;] = clean($_POST);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP Pfade ermitteln ==&lt;br /&gt;
http://stackoverflow.com/questions/4645082/get-absolute-path-of-current-script/26139609#26139609&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$_SERVER[&amp;quot;DOCUMENT_ROOT&amp;quot;] === /home/user/public_html&lt;br /&gt;
$_SERVER[&amp;quot;SERVER_ADDR&amp;quot;]   === 143.34.112.23&lt;br /&gt;
$_SERVER[&amp;#039;HTTP_HOST&amp;#039;]     === example.com (or with WWW)&lt;br /&gt;
$_SERVER[&amp;quot;REQUEST_URI&amp;quot;]   === /folder1/folder2/yourfile.php?var=blabla&lt;br /&gt;
__FILE__                  === /home/user/public_html/folder1/folder2/yourfile.php&lt;br /&gt;
basename(__FILE__)        === yourfile.php&lt;br /&gt;
__DIR__                   === /home/user/public_html/folder1/folder2 [same: dirname(__FILE__)]&lt;br /&gt;
$_SERVER[&amp;quot;QUERY_STRING&amp;quot;]  === var=blabla&lt;br /&gt;
&lt;br /&gt;
$_SERVER[&amp;quot;REQUEST_URI&amp;quot;]   === /folder1/folder2/yourfile.php?var=blabla&lt;br /&gt;
parse_url($_SERVER[&amp;quot;REQUEST_URI&amp;quot;], PHP_URL_PATH)  === /folder1/folder2/yourfile.php &lt;br /&gt;
$_SERVER[&amp;quot;PHP_SELF&amp;quot;]      === /folder1/folder2/yourfile.php&lt;br /&gt;
&lt;br /&gt;
//if &amp;quot;YOURFILE.php&amp;quot; is included in &amp;quot;PARENTFILE.php&amp;quot; , and &amp;quot;PARENTFILE.PHP?abc&amp;quot;   is opened:&lt;br /&gt;
$_SERVER[&amp;quot;PHP_SELF&amp;quot;]       === /parentfile.php&lt;br /&gt;
$_SERVER[&amp;quot;REQUEST_URI&amp;quot;]    === /parentfile.php?abc&lt;br /&gt;
$_SERVER[&amp;quot;SCRIPT_FILENAME&amp;quot;]=== /home/user/public_html/parentfile.php&lt;br /&gt;
str_replace($_SERVER[&amp;quot;DOCUMENT_ROOT&amp;quot;],&amp;#039;&amp;#039;, str_replace(&amp;#039;\\&amp;#039;,&amp;#039;/&amp;#039;,__FILE__ ) )  === /folder1/folder2/yourfile.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IP Adresse Abfragen ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		public static function get_ip() {&lt;br /&gt;
			$REMOTE_ADDR = $_SERVER[&amp;#039;REMOTE_ADDR&amp;#039;];&lt;br /&gt;
			if ( ! empty( $_SERVER[&amp;#039;X_FORWARDED_FOR&amp;#039;] ) ) {&lt;br /&gt;
				$X_FORWARDED_FOR = explode(&amp;#039;,&amp;#039;, $_SERVER[&amp;#039;X_FORWARDED_FOR&amp;#039;] );&lt;br /&gt;
				if ( ! empty( $X_FORWARDED_FOR ) ) {&lt;br /&gt;
					$REMOTE_ADDR = trim( $X_FORWARDED_FOR[0] );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			elseif ( ! empty($_SERVER[&amp;#039;HTTP_X_FORWARDED_FOR&amp;#039;] ) ) {&lt;br /&gt;
				$HTTP_X_FORWARDED_FOR= explode(&amp;#039;,&amp;#039;, $_SERVER[&amp;#039;HTTP_X_FORWARDED_FOR&amp;#039;]);&lt;br /&gt;
				if ( ! empty($HTTP_X_FORWARDED_FOR ) ) {&lt;br /&gt;
					$REMOTE_ADDR = trim($HTTP_X_FORWARDED_FOR[0]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			return preg_replace(&amp;#039;/[^0-9a-f:\., ]/si&amp;#039;, &amp;#039;&amp;#039;, $REMOTE_ADDR);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Uploads ==&lt;br /&gt;
[[PHP - Upload]]&lt;br /&gt;
&lt;br /&gt;
== Odd Even ==&lt;br /&gt;
To determine odd or even it&amp;#039;s faster (than mod) and more efficient to use the bitwise &amp;amp; operator:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$a = 3;&lt;br /&gt;
if ($a &amp;amp; 1) {&lt;br /&gt;
    echo &amp;#039;odd&amp;#039;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;#039;even&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
// returns &amp;#039;odd&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22656</id>
		<title>ProcessWire - Konfigurationsseite erstellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22656"/>
		<updated>2017-12-08T16:20:33Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Farben */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es gibt immer &amp;#039;&amp;#039;&amp;#039;wiederkehrende Einstellungen&amp;#039;&amp;#039;&amp;#039; bzw. Teile die man für die meisten Websites benötigt. Dazu gehört &amp;#039;&amp;#039;&amp;#039;z.B. ein Logo oder eine Footerzeile&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Damit man neue Websites auf Basis von ProcessWire Profilen schnell erstellen kann kann man sich eine &amp;#039;&amp;#039;&amp;#039;Konfigurationsseite&amp;#039;&amp;#039;&amp;#039; erstellen, über die man solche Dinge schnell anpassen kann ohne erst die Templates zu ändern. Wenn nur wenige Dinge angepasst werden sollen kann man die Felder direkt auf der Homepage unterbringen. Für umfangreiche Konfigurationen bietet sich eine eigene Seite an.&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
_init.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); // page to store sitewide used fields&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
myTemplate.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;?= $configpage-&amp;gt;contact_email ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Konfigurationsfelder und Snippets zum Einsatz ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
==== Konfigseite als Variable definieren ====&lt;br /&gt;
 $configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); // page to store sitewide used fields&lt;br /&gt;
&lt;br /&gt;
=== Metatags ===&lt;br /&gt;
==== Site Title ====&lt;br /&gt;
site_title&lt;br /&gt;
&lt;br /&gt;
_init.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$siteTitle = &amp;#039;&amp;#039;;&lt;br /&gt;
if($configpage-&amp;gt;site_title) $siteTitle = $configpage-&amp;gt;site_title;&lt;br /&gt;
$title = $page-&amp;gt;get(&amp;#039;headline|title&amp;#039;); // headline if available, otherwise title&lt;br /&gt;
$titleTag = ($homepage-&amp;gt;id != $page-&amp;gt;id) ? $page-&amp;gt;title .&amp;#039; | &amp;#039;. $siteTitle : $siteTitle;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logo und Brandmark ===&lt;br /&gt;
 site_logo&lt;br /&gt;
 site_brandmark&lt;br /&gt;
&lt;br /&gt;
myTemplate.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Logo&lt;br /&gt;
if(count($configpage-&amp;gt;site_logo)){&lt;br /&gt;
  $siteLogoUrl = $configpage-&amp;gt;site_logo-&amp;gt;height(80)-&amp;gt;url;&lt;br /&gt;
} else $siteLogoUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;/images/logo.png&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// Bildmarke.&lt;br /&gt;
if(count($configpage-&amp;gt;site_mark)){&lt;br /&gt;
  $siteMarkUrl = $configpage-&amp;gt;site_mark-&amp;gt;url;&lt;br /&gt;
} else $siteMarkUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;/images/mark.png&amp;#039;;&lt;br /&gt;
//...&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;!-- ... --&amp;gt;&lt;br /&gt;
&amp;lt;a class=&amp;quot;logo-holder&amp;quot; href=&amp;quot;&amp;lt;?=$root?&amp;gt;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&amp;lt;?= $siteLogoUrl?&amp;gt;&amp;quot; alt=&amp;quot;Home&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Footer Zeile ===&lt;br /&gt;
site_footer&lt;br /&gt;
&lt;br /&gt;
=== Farben ===&lt;br /&gt;
* Hintergrundfarbe&lt;br /&gt;
* Schriftfarbe&lt;br /&gt;
* Linkfarbe&lt;br /&gt;
* LinkHoverfarbe&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
=== Schriften ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Maps ===&lt;br /&gt;
==== myMaps ====&lt;br /&gt;
 map_mid (rapid)&lt;br /&gt;
&lt;br /&gt;
==== Google Map ====&lt;br /&gt;
 map_apikey&lt;br /&gt;
 map_lat&lt;br /&gt;
 map_lon&lt;br /&gt;
&lt;br /&gt;
Adresse aus Kontaktinfos&lt;br /&gt;
&lt;br /&gt;
=== Kontaktinfo ===&lt;br /&gt;
 contact_name&lt;br /&gt;
 contact_address&lt;br /&gt;
 contact_place&lt;br /&gt;
 contact_email&lt;br /&gt;
 // oder&lt;br /&gt;
 contact_email_address&lt;br /&gt;
 contact_email_text&lt;br /&gt;
 contact_phone&lt;br /&gt;
 contact_fax&lt;br /&gt;
 contact_email&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22655</id>
		<title>ProcessWire - Konfigurationsseite erstellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22655"/>
		<updated>2017-12-08T16:19:36Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Logo und Brandmark */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es gibt immer &amp;#039;&amp;#039;&amp;#039;wiederkehrende Einstellungen&amp;#039;&amp;#039;&amp;#039; bzw. Teile die man für die meisten Websites benötigt. Dazu gehört &amp;#039;&amp;#039;&amp;#039;z.B. ein Logo oder eine Footerzeile&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Damit man neue Websites auf Basis von ProcessWire Profilen schnell erstellen kann kann man sich eine &amp;#039;&amp;#039;&amp;#039;Konfigurationsseite&amp;#039;&amp;#039;&amp;#039; erstellen, über die man solche Dinge schnell anpassen kann ohne erst die Templates zu ändern. Wenn nur wenige Dinge angepasst werden sollen kann man die Felder direkt auf der Homepage unterbringen. Für umfangreiche Konfigurationen bietet sich eine eigene Seite an.&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
_init.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); // page to store sitewide used fields&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
myTemplate.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;?= $configpage-&amp;gt;contact_email ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Konfigurationsfelder und Snippets zum Einsatz ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
==== Konfigseite als Variable definieren ====&lt;br /&gt;
 $configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); // page to store sitewide used fields&lt;br /&gt;
&lt;br /&gt;
=== Metatags ===&lt;br /&gt;
==== Site Title ====&lt;br /&gt;
site_title&lt;br /&gt;
&lt;br /&gt;
_init.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$siteTitle = &amp;#039;&amp;#039;;&lt;br /&gt;
if($configpage-&amp;gt;site_title) $siteTitle = $configpage-&amp;gt;site_title;&lt;br /&gt;
$title = $page-&amp;gt;get(&amp;#039;headline|title&amp;#039;); // headline if available, otherwise title&lt;br /&gt;
$titleTag = ($homepage-&amp;gt;id != $page-&amp;gt;id) ? $page-&amp;gt;title .&amp;#039; | &amp;#039;. $siteTitle : $siteTitle;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logo und Brandmark ===&lt;br /&gt;
 site_logo&lt;br /&gt;
 site_brandmark&lt;br /&gt;
&lt;br /&gt;
myTemplate.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// Logo&lt;br /&gt;
if(count($configpage-&amp;gt;site_logo)){&lt;br /&gt;
  $siteLogoUrl = $configpage-&amp;gt;site_logo-&amp;gt;height(80)-&amp;gt;url;&lt;br /&gt;
} else $siteLogoUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;/images/logo.png&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// Bildmarke.&lt;br /&gt;
if(count($configpage-&amp;gt;site_mark)){&lt;br /&gt;
  $siteMarkUrl = $configpage-&amp;gt;site_mark-&amp;gt;url;&lt;br /&gt;
} else $siteMarkUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;/images/mark.png&amp;#039;;&lt;br /&gt;
//...&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;!-- ... --&amp;gt;&lt;br /&gt;
&amp;lt;a class=&amp;quot;logo-holder&amp;quot; href=&amp;quot;&amp;lt;?=$root?&amp;gt;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&amp;lt;?= $siteLogoUrl?&amp;gt;&amp;quot; alt=&amp;quot;Home&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Footer Zeile ===&lt;br /&gt;
site_footer&lt;br /&gt;
&lt;br /&gt;
=== Farben ===&lt;br /&gt;
Hintergrundfarbe&lt;br /&gt;
Schriftfarbe&lt;br /&gt;
Linkfarbe&lt;br /&gt;
LinnkHoverfarbe&lt;br /&gt;
&lt;br /&gt;
=== Schriften ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Maps ===&lt;br /&gt;
==== myMaps ====&lt;br /&gt;
 map_mid (rapid)&lt;br /&gt;
&lt;br /&gt;
==== Google Map ====&lt;br /&gt;
 map_apikey&lt;br /&gt;
 map_lat&lt;br /&gt;
 map_lon&lt;br /&gt;
&lt;br /&gt;
Adresse aus Kontaktinfos&lt;br /&gt;
&lt;br /&gt;
=== Kontaktinfo ===&lt;br /&gt;
 contact_name&lt;br /&gt;
 contact_address&lt;br /&gt;
 contact_place&lt;br /&gt;
 contact_email&lt;br /&gt;
 // oder&lt;br /&gt;
 contact_email_address&lt;br /&gt;
 contact_email_text&lt;br /&gt;
 contact_phone&lt;br /&gt;
 contact_fax&lt;br /&gt;
 contact_email&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22654</id>
		<title>ProcessWire - Konfigurationsseite erstellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22654"/>
		<updated>2017-12-08T16:18:43Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Logo und Brandmark */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es gibt immer &amp;#039;&amp;#039;&amp;#039;wiederkehrende Einstellungen&amp;#039;&amp;#039;&amp;#039; bzw. Teile die man für die meisten Websites benötigt. Dazu gehört &amp;#039;&amp;#039;&amp;#039;z.B. ein Logo oder eine Footerzeile&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Damit man neue Websites auf Basis von ProcessWire Profilen schnell erstellen kann kann man sich eine &amp;#039;&amp;#039;&amp;#039;Konfigurationsseite&amp;#039;&amp;#039;&amp;#039; erstellen, über die man solche Dinge schnell anpassen kann ohne erst die Templates zu ändern. Wenn nur wenige Dinge angepasst werden sollen kann man die Felder direkt auf der Homepage unterbringen. Für umfangreiche Konfigurationen bietet sich eine eigene Seite an.&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
_init.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); // page to store sitewide used fields&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
myTemplate.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;?= $configpage-&amp;gt;contact_email ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Konfigurationsfelder und Snippets zum Einsatz ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
==== Konfigseite als Variable definieren ====&lt;br /&gt;
 $configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); // page to store sitewide used fields&lt;br /&gt;
&lt;br /&gt;
=== Metatags ===&lt;br /&gt;
==== Site Title ====&lt;br /&gt;
site_title&lt;br /&gt;
&lt;br /&gt;
_init.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$siteTitle = &amp;#039;&amp;#039;;&lt;br /&gt;
if($configpage-&amp;gt;site_title) $siteTitle = $configpage-&amp;gt;site_title;&lt;br /&gt;
$title = $page-&amp;gt;get(&amp;#039;headline|title&amp;#039;); // headline if available, otherwise title&lt;br /&gt;
$titleTag = ($homepage-&amp;gt;id != $page-&amp;gt;id) ? $page-&amp;gt;title .&amp;#039; | &amp;#039;. $siteTitle : $siteTitle;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logo und Brandmark ===&lt;br /&gt;
 site_logo&lt;br /&gt;
 site_brandmark&lt;br /&gt;
&lt;br /&gt;
myTemplate.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Logo&lt;br /&gt;
if(count($configpage-&amp;gt;site_logo)){&lt;br /&gt;
  $siteLogoUrl = $configpage-&amp;gt;site_logo-&amp;gt;height(80)-&amp;gt;url;&lt;br /&gt;
} else $siteLogoUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;/images/logo.png&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// Bildmarke&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// ...&lt;br /&gt;
if(count($configpage-&amp;gt;site_mark)){&lt;br /&gt;
  $siteMarkUrl = $configpage-&amp;gt;site_mark-&amp;gt;url;&lt;br /&gt;
} else $siteMarkUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;/images/mark.png&amp;#039;;&lt;br /&gt;
//...&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;a class=&amp;quot;logo-holder&amp;quot; href=&amp;quot;&amp;lt;?=$root?&amp;gt;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&amp;lt;?= $siteLogoUrl?&amp;gt;&amp;quot; alt=&amp;quot;Home&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Footer Zeile ===&lt;br /&gt;
site_footer&lt;br /&gt;
&lt;br /&gt;
=== Farben ===&lt;br /&gt;
Hintergrundfarbe&lt;br /&gt;
Schriftfarbe&lt;br /&gt;
Linkfarbe&lt;br /&gt;
LinnkHoverfarbe&lt;br /&gt;
&lt;br /&gt;
=== Schriften ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Maps ===&lt;br /&gt;
==== myMaps ====&lt;br /&gt;
 map_mid (rapid)&lt;br /&gt;
&lt;br /&gt;
==== Google Map ====&lt;br /&gt;
 map_apikey&lt;br /&gt;
 map_lat&lt;br /&gt;
 map_lon&lt;br /&gt;
&lt;br /&gt;
Adresse aus Kontaktinfos&lt;br /&gt;
&lt;br /&gt;
=== Kontaktinfo ===&lt;br /&gt;
 contact_name&lt;br /&gt;
 contact_address&lt;br /&gt;
 contact_place&lt;br /&gt;
 contact_email&lt;br /&gt;
 // oder&lt;br /&gt;
 contact_email_address&lt;br /&gt;
 contact_email_text&lt;br /&gt;
 contact_phone&lt;br /&gt;
 contact_fax&lt;br /&gt;
 contact_email&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22653</id>
		<title>ProcessWire - Konfigurationsseite erstellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22653"/>
		<updated>2017-12-08T16:16:53Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Konfigurationsfelder und Snippets zum Einsatz */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es gibt immer &amp;#039;&amp;#039;&amp;#039;wiederkehrende Einstellungen&amp;#039;&amp;#039;&amp;#039; bzw. Teile die man für die meisten Websites benötigt. Dazu gehört &amp;#039;&amp;#039;&amp;#039;z.B. ein Logo oder eine Footerzeile&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Damit man neue Websites auf Basis von ProcessWire Profilen schnell erstellen kann kann man sich eine &amp;#039;&amp;#039;&amp;#039;Konfigurationsseite&amp;#039;&amp;#039;&amp;#039; erstellen, über die man solche Dinge schnell anpassen kann ohne erst die Templates zu ändern. Wenn nur wenige Dinge angepasst werden sollen kann man die Felder direkt auf der Homepage unterbringen. Für umfangreiche Konfigurationen bietet sich eine eigene Seite an.&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
_init.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); // page to store sitewide used fields&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
myTemplate.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;?= $configpage-&amp;gt;contact_email ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Konfigurationsfelder und Snippets zum Einsatz ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
==== Konfigseite als Variable definieren ====&lt;br /&gt;
 $configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); // page to store sitewide used fields&lt;br /&gt;
&lt;br /&gt;
=== Metatags ===&lt;br /&gt;
==== Site Title ====&lt;br /&gt;
site_title&lt;br /&gt;
&lt;br /&gt;
_init.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$siteTitle = &amp;#039;&amp;#039;;&lt;br /&gt;
if($configpage-&amp;gt;site_title) $siteTitle = $configpage-&amp;gt;site_title;&lt;br /&gt;
$title = $page-&amp;gt;get(&amp;#039;headline|title&amp;#039;); // headline if available, otherwise title&lt;br /&gt;
$titleTag = ($homepage-&amp;gt;id != $page-&amp;gt;id) ? $page-&amp;gt;title .&amp;#039; | &amp;#039;. $siteTitle : $siteTitle;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logo und Brandmark ===&lt;br /&gt;
 site_logo&lt;br /&gt;
 site_brandmark&lt;br /&gt;
&lt;br /&gt;
myTemplate.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Logo&lt;br /&gt;
if(count($configpage-&amp;gt;site_logo)){&lt;br /&gt;
  $siteLogoUrl = $configpage-&amp;gt;site_logo-&amp;gt;height(80)-&amp;gt;url;&lt;br /&gt;
} else $siteLogoUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;/images/logo.png&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// Bildmarke&lt;br /&gt;
if(count($configpage-&amp;gt;site_mark)){&lt;br /&gt;
  $siteMarkUrl = $configpage-&amp;gt;site_mark-&amp;gt;url;&lt;br /&gt;
} else $siteMarkUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;/images/mark.png&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Footer Zeile ===&lt;br /&gt;
site_footer&lt;br /&gt;
&lt;br /&gt;
=== Farben ===&lt;br /&gt;
Hintergrundfarbe&lt;br /&gt;
Schriftfarbe&lt;br /&gt;
Linkfarbe&lt;br /&gt;
LinnkHoverfarbe&lt;br /&gt;
&lt;br /&gt;
=== Schriften ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Maps ===&lt;br /&gt;
==== myMaps ====&lt;br /&gt;
 map_mid (rapid)&lt;br /&gt;
&lt;br /&gt;
==== Google Map ====&lt;br /&gt;
 map_apikey&lt;br /&gt;
 map_lat&lt;br /&gt;
 map_lon&lt;br /&gt;
&lt;br /&gt;
Adresse aus Kontaktinfos&lt;br /&gt;
&lt;br /&gt;
=== Kontaktinfo ===&lt;br /&gt;
 contact_name&lt;br /&gt;
 contact_address&lt;br /&gt;
 contact_place&lt;br /&gt;
 contact_email&lt;br /&gt;
 // oder&lt;br /&gt;
 contact_email_address&lt;br /&gt;
 contact_email_text&lt;br /&gt;
 contact_phone&lt;br /&gt;
 contact_fax&lt;br /&gt;
 contact_email&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22652</id>
		<title>ProcessWire - Konfigurationsseite erstellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22652"/>
		<updated>2017-12-08T16:12:31Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Site Title */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es gibt immer &amp;#039;&amp;#039;&amp;#039;wiederkehrende Einstellungen&amp;#039;&amp;#039;&amp;#039; bzw. Teile die man für die meisten Websites benötigt. Dazu gehört &amp;#039;&amp;#039;&amp;#039;z.B. ein Logo oder eine Footerzeile&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Damit man neue Websites auf Basis von ProcessWire Profilen schnell erstellen kann kann man sich eine &amp;#039;&amp;#039;&amp;#039;Konfigurationsseite&amp;#039;&amp;#039;&amp;#039; erstellen, über die man solche Dinge schnell anpassen kann ohne erst die Templates zu ändern. Wenn nur wenige Dinge angepasst werden sollen kann man die Felder direkt auf der Homepage unterbringen. Für umfangreiche Konfigurationen bietet sich eine eigene Seite an.&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
_init.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); // page to store sitewide used fields&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
myTemplate.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;?= $configpage-&amp;gt;contact_email ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Konfigurationsfelder und Snippets zum Einsatz ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
==== Konfigseite als Variable definieren ====&lt;br /&gt;
 $configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); // page to store sitewide used fields&lt;br /&gt;
&lt;br /&gt;
=== Metatags ===&lt;br /&gt;
==== Site Title ====&lt;br /&gt;
site_title&lt;br /&gt;
&lt;br /&gt;
_init.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$siteTitle = &amp;#039;&amp;#039;;&lt;br /&gt;
if($configpage-&amp;gt;site_title) $siteTitle = $configpage-&amp;gt;site_title;&lt;br /&gt;
$title = $page-&amp;gt;get(&amp;#039;headline|title&amp;#039;); // headline if available, otherwise title&lt;br /&gt;
$titleTag = ($homepage-&amp;gt;id != $page-&amp;gt;id) ? $page-&amp;gt;title .&amp;#039; | &amp;#039;. $siteTitle : $siteTitle;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logo und Brandmark ===&lt;br /&gt;
site_logo&lt;br /&gt;
&lt;br /&gt;
site_brandmark&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Footer Zeile ===&lt;br /&gt;
site_footer&lt;br /&gt;
&lt;br /&gt;
=== Farben ===&lt;br /&gt;
Hintergrundfarbe&lt;br /&gt;
Schriftfarbe&lt;br /&gt;
Linkfarbe&lt;br /&gt;
LinnkHoverfarbe&lt;br /&gt;
&lt;br /&gt;
=== Schriften ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Maps ===&lt;br /&gt;
==== myMaps ====&lt;br /&gt;
 map_mid (rapid)&lt;br /&gt;
&lt;br /&gt;
==== Google Map ====&lt;br /&gt;
 map_apikey&lt;br /&gt;
 map_lat&lt;br /&gt;
 map_lon&lt;br /&gt;
&lt;br /&gt;
Adresse aus Kontaktinfos&lt;br /&gt;
&lt;br /&gt;
=== Kontaktinfo ===&lt;br /&gt;
 contact_name&lt;br /&gt;
 contact_address&lt;br /&gt;
 contact_place&lt;br /&gt;
 contact_email&lt;br /&gt;
 // oder&lt;br /&gt;
 contact_email_address&lt;br /&gt;
 contact_email_text&lt;br /&gt;
 contact_phone&lt;br /&gt;
 contact_fax&lt;br /&gt;
 contact_email&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22651</id>
		<title>ProcessWire - Konfigurationsseite erstellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22651"/>
		<updated>2017-12-08T16:12:15Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Konfigseite als Variable definieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es gibt immer &amp;#039;&amp;#039;&amp;#039;wiederkehrende Einstellungen&amp;#039;&amp;#039;&amp;#039; bzw. Teile die man für die meisten Websites benötigt. Dazu gehört &amp;#039;&amp;#039;&amp;#039;z.B. ein Logo oder eine Footerzeile&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Damit man neue Websites auf Basis von ProcessWire Profilen schnell erstellen kann kann man sich eine &amp;#039;&amp;#039;&amp;#039;Konfigurationsseite&amp;#039;&amp;#039;&amp;#039; erstellen, über die man solche Dinge schnell anpassen kann ohne erst die Templates zu ändern. Wenn nur wenige Dinge angepasst werden sollen kann man die Felder direkt auf der Homepage unterbringen. Für umfangreiche Konfigurationen bietet sich eine eigene Seite an.&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
_init.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); // page to store sitewide used fields&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
myTemplate.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;?= $configpage-&amp;gt;contact_email ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Konfigurationsfelder und Snippets zum Einsatz ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
==== Konfigseite als Variable definieren ====&lt;br /&gt;
 $configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); // page to store sitewide used fields&lt;br /&gt;
&lt;br /&gt;
=== Metatags ===&lt;br /&gt;
==== Site Title ====&lt;br /&gt;
site_title&lt;br /&gt;
&lt;br /&gt;
_init.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$siteTitle = &amp;#039;&amp;#039;;&lt;br /&gt;
 if($configpage-&amp;gt;site_title) $siteTitle = $configpage-&amp;gt;site_title;&lt;br /&gt;
 $title = $page-&amp;gt;get(&amp;#039;headline|title&amp;#039;); // headline if available, otherwise title&lt;br /&gt;
 $titleTag = ($homepage-&amp;gt;id != $page-&amp;gt;id) ? $page-&amp;gt;title .&amp;#039; | &amp;#039;. $siteTitle : $siteTitle;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Logo und Brandmark ===&lt;br /&gt;
site_logo&lt;br /&gt;
&lt;br /&gt;
site_brandmark&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Footer Zeile ===&lt;br /&gt;
site_footer&lt;br /&gt;
&lt;br /&gt;
=== Farben ===&lt;br /&gt;
Hintergrundfarbe&lt;br /&gt;
Schriftfarbe&lt;br /&gt;
Linkfarbe&lt;br /&gt;
LinnkHoverfarbe&lt;br /&gt;
&lt;br /&gt;
=== Schriften ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Maps ===&lt;br /&gt;
==== myMaps ====&lt;br /&gt;
 map_mid (rapid)&lt;br /&gt;
&lt;br /&gt;
==== Google Map ====&lt;br /&gt;
 map_apikey&lt;br /&gt;
 map_lat&lt;br /&gt;
 map_lon&lt;br /&gt;
&lt;br /&gt;
Adresse aus Kontaktinfos&lt;br /&gt;
&lt;br /&gt;
=== Kontaktinfo ===&lt;br /&gt;
 contact_name&lt;br /&gt;
 contact_address&lt;br /&gt;
 contact_place&lt;br /&gt;
 contact_email&lt;br /&gt;
 // oder&lt;br /&gt;
 contact_email_address&lt;br /&gt;
 contact_email_text&lt;br /&gt;
 contact_phone&lt;br /&gt;
 contact_fax&lt;br /&gt;
 contact_email&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22650</id>
		<title>ProcessWire - Konfigurationsseite erstellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22650"/>
		<updated>2017-12-08T16:11:45Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Konfigurationsfelder und Snippets zum Einsatz */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es gibt immer &amp;#039;&amp;#039;&amp;#039;wiederkehrende Einstellungen&amp;#039;&amp;#039;&amp;#039; bzw. Teile die man für die meisten Websites benötigt. Dazu gehört &amp;#039;&amp;#039;&amp;#039;z.B. ein Logo oder eine Footerzeile&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Damit man neue Websites auf Basis von ProcessWire Profilen schnell erstellen kann kann man sich eine &amp;#039;&amp;#039;&amp;#039;Konfigurationsseite&amp;#039;&amp;#039;&amp;#039; erstellen, über die man solche Dinge schnell anpassen kann ohne erst die Templates zu ändern. Wenn nur wenige Dinge angepasst werden sollen kann man die Felder direkt auf der Homepage unterbringen. Für umfangreiche Konfigurationen bietet sich eine eigene Seite an.&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
_init.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); // page to store sitewide used fields&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
myTemplate.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;?= $configpage-&amp;gt;contact_email ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Konfigurationsfelder und Snippets zum Einsatz ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
==== Konfigseite als Variable definieren ====&lt;br /&gt;
&lt;br /&gt;
=== Metatags ===&lt;br /&gt;
==== Site Title ====&lt;br /&gt;
site_title&lt;br /&gt;
&lt;br /&gt;
_init.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$siteTitle = &amp;#039;&amp;#039;;&lt;br /&gt;
 if($configpage-&amp;gt;site_title) $siteTitle = $configpage-&amp;gt;site_title;&lt;br /&gt;
 $title = $page-&amp;gt;get(&amp;#039;headline|title&amp;#039;); // headline if available, otherwise title&lt;br /&gt;
 $titleTag = ($homepage-&amp;gt;id != $page-&amp;gt;id) ? $page-&amp;gt;title .&amp;#039; | &amp;#039;. $siteTitle : $siteTitle;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Logo und Brandmark ===&lt;br /&gt;
site_logo&lt;br /&gt;
&lt;br /&gt;
site_brandmark&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Footer Zeile ===&lt;br /&gt;
site_footer&lt;br /&gt;
&lt;br /&gt;
=== Farben ===&lt;br /&gt;
Hintergrundfarbe&lt;br /&gt;
Schriftfarbe&lt;br /&gt;
Linkfarbe&lt;br /&gt;
LinnkHoverfarbe&lt;br /&gt;
&lt;br /&gt;
=== Schriften ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Maps ===&lt;br /&gt;
==== myMaps ====&lt;br /&gt;
 map_mid (rapid)&lt;br /&gt;
&lt;br /&gt;
==== Google Map ====&lt;br /&gt;
 map_apikey&lt;br /&gt;
 map_lat&lt;br /&gt;
 map_lon&lt;br /&gt;
&lt;br /&gt;
Adresse aus Kontaktinfos&lt;br /&gt;
&lt;br /&gt;
=== Kontaktinfo ===&lt;br /&gt;
 contact_name&lt;br /&gt;
 contact_address&lt;br /&gt;
 contact_place&lt;br /&gt;
 contact_email&lt;br /&gt;
 // oder&lt;br /&gt;
 contact_email_address&lt;br /&gt;
 contact_email_text&lt;br /&gt;
 contact_phone&lt;br /&gt;
 contact_fax&lt;br /&gt;
 contact_email&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22649</id>
		<title>ProcessWire - Konfigurationsseite erstellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22649"/>
		<updated>2017-12-08T16:07:17Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Kontaktinfo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es gibt immer &amp;#039;&amp;#039;&amp;#039;wiederkehrende Einstellungen&amp;#039;&amp;#039;&amp;#039; bzw. Teile die man für die meisten Websites benötigt. Dazu gehört &amp;#039;&amp;#039;&amp;#039;z.B. ein Logo oder eine Footerzeile&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Damit man neue Websites auf Basis von ProcessWire Profilen schnell erstellen kann kann man sich eine &amp;#039;&amp;#039;&amp;#039;Konfigurationsseite&amp;#039;&amp;#039;&amp;#039; erstellen, über die man solche Dinge schnell anpassen kann ohne erst die Templates zu ändern. Wenn nur wenige Dinge angepasst werden sollen kann man die Felder direkt auf der Homepage unterbringen. Für umfangreiche Konfigurationen bietet sich eine eigene Seite an.&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
_init.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); // page to store sitewide used fields&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
myTemplate.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;?= $configpage-&amp;gt;contact_email ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Konfigurationsfelder und Snippets zum Einsatz ==&lt;br /&gt;
=== Logo und Brandmark ===&lt;br /&gt;
site_logo&lt;br /&gt;
&lt;br /&gt;
site_brandmark&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Footer Zeile ===&lt;br /&gt;
site_footer&lt;br /&gt;
&lt;br /&gt;
=== Farben ===&lt;br /&gt;
Hintergrundfarbe&lt;br /&gt;
Schriftfarbe&lt;br /&gt;
Linkfarbe&lt;br /&gt;
LinnkHoverfarbe&lt;br /&gt;
&lt;br /&gt;
=== Schriften ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Maps ===&lt;br /&gt;
==== myMaps ====&lt;br /&gt;
 map_mid (rapid)&lt;br /&gt;
&lt;br /&gt;
==== Google Map ====&lt;br /&gt;
 map_apikey&lt;br /&gt;
 map_lat&lt;br /&gt;
 map_lon&lt;br /&gt;
&lt;br /&gt;
Adresse aus Kontaktinfos&lt;br /&gt;
&lt;br /&gt;
=== Kontaktinfo ===&lt;br /&gt;
 contact_name&lt;br /&gt;
 contact_address&lt;br /&gt;
 contact_place&lt;br /&gt;
 contact_email&lt;br /&gt;
 // oder&lt;br /&gt;
 contact_email_address&lt;br /&gt;
 contact_email_text&lt;br /&gt;
 contact_phone&lt;br /&gt;
 contact_fax&lt;br /&gt;
 contact_email&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22648</id>
		<title>ProcessWire - Konfigurationsseite erstellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22648"/>
		<updated>2017-12-08T16:06:12Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es gibt immer &amp;#039;&amp;#039;&amp;#039;wiederkehrende Einstellungen&amp;#039;&amp;#039;&amp;#039; bzw. Teile die man für die meisten Websites benötigt. Dazu gehört &amp;#039;&amp;#039;&amp;#039;z.B. ein Logo oder eine Footerzeile&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Damit man neue Websites auf Basis von ProcessWire Profilen schnell erstellen kann kann man sich eine &amp;#039;&amp;#039;&amp;#039;Konfigurationsseite&amp;#039;&amp;#039;&amp;#039; erstellen, über die man solche Dinge schnell anpassen kann ohne erst die Templates zu ändern. Wenn nur wenige Dinge angepasst werden sollen kann man die Felder direkt auf der Homepage unterbringen. Für umfangreiche Konfigurationen bietet sich eine eigene Seite an.&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
_init.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$configpage = $pages-&amp;gt;get(&amp;quot;/site_configuration/&amp;quot;); // page to store sitewide used fields&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
myTemplate.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;?= $configpage-&amp;gt;contact_email ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Konfigurationsfelder und Snippets zum Einsatz ==&lt;br /&gt;
=== Logo und Brandmark ===&lt;br /&gt;
site_logo&lt;br /&gt;
&lt;br /&gt;
site_brandmark&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Footer Zeile ===&lt;br /&gt;
site_footer&lt;br /&gt;
&lt;br /&gt;
=== Farben ===&lt;br /&gt;
Hintergrundfarbe&lt;br /&gt;
Schriftfarbe&lt;br /&gt;
Linkfarbe&lt;br /&gt;
LinnkHoverfarbe&lt;br /&gt;
&lt;br /&gt;
=== Schriften ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Maps ===&lt;br /&gt;
==== myMaps ====&lt;br /&gt;
 map_mid (rapid)&lt;br /&gt;
&lt;br /&gt;
==== Google Map ====&lt;br /&gt;
 map_apikey&lt;br /&gt;
 map_lat&lt;br /&gt;
 map_lon&lt;br /&gt;
&lt;br /&gt;
Adresse aus Kontaktinfos&lt;br /&gt;
&lt;br /&gt;
=== Kontaktinfo ===&lt;br /&gt;
 contact_name&lt;br /&gt;
 contact_address&lt;br /&gt;
 contact_place&lt;br /&gt;
 contact_email&lt;br /&gt;
 contact_phone&lt;br /&gt;
 contact_fax&lt;br /&gt;
 contact_email&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22647</id>
		<title>ProcessWire - Konfigurationsseite erstellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22647"/>
		<updated>2017-12-08T15:57:42Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Maps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es gibt immer &amp;#039;&amp;#039;&amp;#039;wiederkehrende Einstellungen&amp;#039;&amp;#039;&amp;#039; bzw. Teile die man für die meisten Websites benötigt. Dazu gehört &amp;#039;&amp;#039;&amp;#039;z.B. ein Logo oder eine Footerzeile&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Damit man neue Websites auf Basis von ProcessWire Profilen schnell erstellen kann kann man sich eine &amp;#039;&amp;#039;&amp;#039;Konfigurationsseite&amp;#039;&amp;#039;&amp;#039; erstellen, über die man solche Dinge schnell anpassen kann ohne erst die Templates zu ändern. Wenn nur wenige Dinge angepasst werden sollen kann man die Felder direkt auf der Homepage unterbringen. Für umfangreiche Konfigurationen bietet sich eine eigene Seite an.&lt;br /&gt;
&lt;br /&gt;
== Konfigurationsfelder und Snippets zum Einsatz ==&lt;br /&gt;
=== Logo und Brandmark ===&lt;br /&gt;
site_logo&lt;br /&gt;
&lt;br /&gt;
site_brandmark&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Footer Zeile ===&lt;br /&gt;
site_footer&lt;br /&gt;
&lt;br /&gt;
=== Farben ===&lt;br /&gt;
Hintergrundfarbe&lt;br /&gt;
Schriftfarbe&lt;br /&gt;
Linkfarbe&lt;br /&gt;
LinnkHoverfarbe&lt;br /&gt;
&lt;br /&gt;
=== Schriften ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Maps ===&lt;br /&gt;
==== myMaps ====&lt;br /&gt;
 map_mid (rapid)&lt;br /&gt;
&lt;br /&gt;
==== Google Map ====&lt;br /&gt;
 map_apikey&lt;br /&gt;
 map_lat&lt;br /&gt;
 map_lon&lt;br /&gt;
&lt;br /&gt;
Adresse aus Kontaktinfos&lt;br /&gt;
&lt;br /&gt;
=== Kontaktinfo ===&lt;br /&gt;
 contact_name&lt;br /&gt;
 contact_address&lt;br /&gt;
 contact_place&lt;br /&gt;
 contact_email&lt;br /&gt;
 contact_phone&lt;br /&gt;
 contact_fax&lt;br /&gt;
 contact_email&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22646</id>
		<title>ProcessWire - Konfigurationsseite erstellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22646"/>
		<updated>2017-12-08T15:55:47Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Konfigurationsfelder und Snippets zum Einsatz */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es gibt immer &amp;#039;&amp;#039;&amp;#039;wiederkehrende Einstellungen&amp;#039;&amp;#039;&amp;#039; bzw. Teile die man für die meisten Websites benötigt. Dazu gehört &amp;#039;&amp;#039;&amp;#039;z.B. ein Logo oder eine Footerzeile&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Damit man neue Websites auf Basis von ProcessWire Profilen schnell erstellen kann kann man sich eine &amp;#039;&amp;#039;&amp;#039;Konfigurationsseite&amp;#039;&amp;#039;&amp;#039; erstellen, über die man solche Dinge schnell anpassen kann ohne erst die Templates zu ändern. Wenn nur wenige Dinge angepasst werden sollen kann man die Felder direkt auf der Homepage unterbringen. Für umfangreiche Konfigurationen bietet sich eine eigene Seite an.&lt;br /&gt;
&lt;br /&gt;
== Konfigurationsfelder und Snippets zum Einsatz ==&lt;br /&gt;
=== Logo und Brandmark ===&lt;br /&gt;
site_logo&lt;br /&gt;
&lt;br /&gt;
site_brandmark&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Footer Zeile ===&lt;br /&gt;
site_footer&lt;br /&gt;
&lt;br /&gt;
=== Farben ===&lt;br /&gt;
Hintergrundfarbe&lt;br /&gt;
Schriftfarbe&lt;br /&gt;
Linkfarbe&lt;br /&gt;
LinnkHoverfarbe&lt;br /&gt;
&lt;br /&gt;
=== Schriften ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Maps ===&lt;br /&gt;
==== myMaps ====&lt;br /&gt;
mid (rapid)&lt;br /&gt;
&lt;br /&gt;
==== Google Map ====&lt;br /&gt;
Lat, Lon&lt;br /&gt;
&lt;br /&gt;
Adresse aus Kontaktinfos&lt;br /&gt;
&lt;br /&gt;
=== Kontaktinfo ===&lt;br /&gt;
 contact_name&lt;br /&gt;
 contact_address&lt;br /&gt;
 contact_place&lt;br /&gt;
 contact_email&lt;br /&gt;
 contact_phone&lt;br /&gt;
 contact_fax&lt;br /&gt;
 contact_email&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22645</id>
		<title>ProcessWire - Konfigurationsseite erstellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22645"/>
		<updated>2017-12-08T15:36:54Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Maps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es gibt immer &amp;#039;&amp;#039;&amp;#039;wiederkehrende Einstellungen&amp;#039;&amp;#039;&amp;#039; bzw. Teile die man für die meisten Websites benötigt. Dazu gehört &amp;#039;&amp;#039;&amp;#039;z.B. ein Logo oder eine Footerzeile&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Damit man neue Websites auf Basis von ProcessWire Profilen schnell erstellen kann kann man sich eine &amp;#039;&amp;#039;&amp;#039;Konfigurationsseite&amp;#039;&amp;#039;&amp;#039; erstellen, über die man solche Dinge schnell anpassen kann ohne erst die Templates zu ändern. Wenn nur wenige Dinge angepasst werden sollen kann man die Felder direkt auf der Homepage unterbringen. Für umfangreiche Konfigurationen bietet sich eine eigene Seite an.&lt;br /&gt;
&lt;br /&gt;
== Konfigurationsfelder und Snippets zum Einsatz ==&lt;br /&gt;
=== Logo und Brandmark ===&lt;br /&gt;
site_logo&lt;br /&gt;
&lt;br /&gt;
site_brandmark&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Footer Zeile ===&lt;br /&gt;
site_footer&lt;br /&gt;
&lt;br /&gt;
=== Farben ===&lt;br /&gt;
Hintergrundfarbe&lt;br /&gt;
Schriftfarbe&lt;br /&gt;
Linkfarbe&lt;br /&gt;
LinnkHoverfarbe&lt;br /&gt;
&lt;br /&gt;
=== Schriften ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Maps ===&lt;br /&gt;
==== myMaps ===&lt;br /&gt;
mid (rapid)&lt;br /&gt;
&lt;br /&gt;
==== Google Map ====&lt;br /&gt;
Lat, Lon&lt;br /&gt;
&lt;br /&gt;
Adresse aus Kontaktinfos&lt;br /&gt;
&lt;br /&gt;
=== Kontaktinfo ===&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22644</id>
		<title>ProcessWire - Konfigurationsseite erstellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22644"/>
		<updated>2017-12-08T15:35:35Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es gibt immer &amp;#039;&amp;#039;&amp;#039;wiederkehrende Einstellungen&amp;#039;&amp;#039;&amp;#039; bzw. Teile die man für die meisten Websites benötigt. Dazu gehört &amp;#039;&amp;#039;&amp;#039;z.B. ein Logo oder eine Footerzeile&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Damit man neue Websites auf Basis von ProcessWire Profilen schnell erstellen kann kann man sich eine &amp;#039;&amp;#039;&amp;#039;Konfigurationsseite&amp;#039;&amp;#039;&amp;#039; erstellen, über die man solche Dinge schnell anpassen kann ohne erst die Templates zu ändern. Wenn nur wenige Dinge angepasst werden sollen kann man die Felder direkt auf der Homepage unterbringen. Für umfangreiche Konfigurationen bietet sich eine eigene Seite an.&lt;br /&gt;
&lt;br /&gt;
== Konfigurationsfelder und Snippets zum Einsatz ==&lt;br /&gt;
=== Logo und Brandmark ===&lt;br /&gt;
site_logo&lt;br /&gt;
&lt;br /&gt;
site_brandmark&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Footer Zeile ===&lt;br /&gt;
site_footer&lt;br /&gt;
&lt;br /&gt;
=== Farben ===&lt;br /&gt;
Hintergrundfarbe&lt;br /&gt;
Schriftfarbe&lt;br /&gt;
Linkfarbe&lt;br /&gt;
LinnkHoverfarbe&lt;br /&gt;
&lt;br /&gt;
=== Schriften ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Maps ===&lt;br /&gt;
&lt;br /&gt;
=== Kontaktinfo ===&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22643</id>
		<title>ProcessWire - Konfigurationsseite erstellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Konfigurationsseite_erstellen&amp;diff=22643"/>
		<updated>2017-12-08T15:18:26Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: Die Seite wurde neu angelegt: „Es gibt immer wiederkehrende Einstellungen bzw. Teile die man für die meisten Websites benötigt. Dazu gehört z.B. ein Logo oder eine Footerzeile.  Damit man…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es gibt immer wiederkehrende Einstellungen bzw. Teile die man für die meisten Websites benötigt. Dazu gehört z.B. ein Logo oder eine Footerzeile.&lt;br /&gt;
&lt;br /&gt;
Damit man neue Websites auf Basis von ProcessWire Profilen schnell erstellen kann kann man sich eine Konfigurationsseite erstellen, über die man solche Dinge schnell anpassen kann ohne erst die Templates zu ändern. Wenn nur wenige Dinge angepasst werden sollen kann man die Felder direkt auf der Homepage unterbringen. Für umfangreiche Konfigurationen bietet sich eine eigene Seite an.&lt;br /&gt;
&lt;br /&gt;
== Konfigurationsfelder und Snippets zum Einsatz ==&lt;br /&gt;
=== Logo und Brandmark ===&lt;br /&gt;
site_logo&lt;br /&gt;
&lt;br /&gt;
site_brandmark&lt;br /&gt;
&lt;br /&gt;
== Footer Zeile ==&lt;br /&gt;
site_footer&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Templates_Grundausstattung&amp;diff=22642</id>
		<title>Processwire - Templates Grundausstattung</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Templates_Grundausstattung&amp;diff=22642"/>
		<updated>2017-12-08T15:13:07Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TODO &lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[ProcessWire - Konfigurationsseite erstellen]]&lt;br /&gt;
== Module ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Sprache&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Language Support (Core)&lt;br /&gt;
* Defaultsprache benennen wenn nicht Englisch und...&lt;br /&gt;
* Language Pack: [[:File:yellowled-pw-lang-de-v3.0.42-3-g0bbae88.zip]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Feldtypen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Select Options&lt;br /&gt;
* Assisted URL&lt;br /&gt;
* Fieldtype Repeater&lt;br /&gt;
* Fieldtype RepeaterMatrix (Pro Modul) Alternativ evtl. Pagetables o.ä.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Sonstige &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* ImageMagick (Core, falls vom Server unterstützt)&lt;br /&gt;
&lt;br /&gt;
=== Sonstige ===&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;
&lt;br /&gt;
== Felder ==&lt;br /&gt;
=== Felder ===&lt;br /&gt;
* body (manchmal content_main) (Hauptinhalt)&lt;br /&gt;
&lt;br /&gt;
=== Editor Konfiguration ===&lt;br /&gt;
Für Textfelder sinnvoll z.B. beim body Feld&lt;br /&gt;
Konfiguration des Editors&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Optional CSS und JavaScript File für die Konfiguration hinzufügen&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;TODO Beispiele&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* link_to_child (checkbox to link to subpage)&lt;br /&gt;
* summary&lt;br /&gt;
&lt;br /&gt;
== Templates ==&lt;br /&gt;
&lt;br /&gt;
== Benutzer ==&lt;br /&gt;
* Redakteur / Editor mit Zugriff auf Content Seiten&lt;br /&gt;
* evtl. Siteadmin mit Zugriff auf Site Configuration&lt;br /&gt;
* Superadmin = Admin&lt;br /&gt;
&lt;br /&gt;
== Editor ==&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Themes_/_Templates&amp;diff=22641</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=22641"/>
		<updated>2017-12-08T15:12:06Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* 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;
&lt;br /&gt;
== Template Strategien ==&lt;br /&gt;
=== Nützliche 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 Controller View 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;
=== 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 ===&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;
&lt;br /&gt;
[[ProcessWire - Layout Blöcke mit RepeaterMatrix]]&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;
Über prependTemplateFile und appendTemplateFile verarbeitet man die Templates wenn alle Inhalte zusammengesetzt sind.&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;
&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;
=== 3.x Strategie ===&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;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Abstimmung_wordpress&amp;diff=22640</id>
		<title>Abstimmung wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Abstimmung_wordpress&amp;diff=22640"/>
		<updated>2017-11-30T10:18:54Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Quickstart */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;siehe auch [[DEKRA Direkt Blog]]&lt;br /&gt;
Der Blog &amp;#039;&amp;#039;&amp;#039;DEKRA Direkt&amp;#039;&amp;#039;&amp;#039; wird als interner Konzernblog verwendet und soll als Kontaktmittel der Mitarbeiter zur Vorstandsebene dienen. Dazu gibt es unter anderem die DEKRA Direkt Mitarbeiter Umfrage.&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
=== Ablauf 2017 ===&lt;br /&gt;
* Poll anlegen (alten kopieren - Datum Template und Blocking wird nicht kopiert und muß gesetzt werden)&lt;br /&gt;
** View Results auf after Vote&lt;br /&gt;
** Blocking by Cookie&lt;br /&gt;
** Datum (Startdatum aktuell und Ende offen)&lt;br /&gt;
** Template (Kommentar)&lt;br /&gt;
* Testbeitrag anlegen&lt;br /&gt;
** Kategorie Test&lt;br /&gt;
** Später Kategorie ändern&lt;br /&gt;
* Beenden&lt;br /&gt;
** End Datum setzen&lt;br /&gt;
** View Results before Vote&lt;br /&gt;
&lt;br /&gt;
== Todo ==&lt;br /&gt;
* Backendanzeige der Votes ist Buggy&lt;br /&gt;
* Besser zum Testen wäre es wenn die Umfrage zunächst in eine Kategorie Test geht die auf der Startseite nicht dargestellt wird. - OK ist über Plugin realisiert.&lt;br /&gt;
&lt;br /&gt;
Wordpress Extension Yop Poll - verwendet bei Mascha im Blog intern:&lt;br /&gt;
&lt;br /&gt;
== yop poll Anpassungen ==&lt;br /&gt;
=== yop poll Tabellen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
------------                -----------------                 --------------&lt;br /&gt;
yop_polls                   yop_poll_answers                  yop_poll_logs&lt;br /&gt;
------------                -----------------                 --------------&lt;br /&gt;
id          --------------| id               --------------|  id&lt;br /&gt;
name                      |-poll_id                        |  pn&lt;br /&gt;
question                    answer                         |  poll_id&lt;br /&gt;
total_votes                 votes                          |  vote_id&lt;br /&gt;
total_answers               ...                            |- answer_id&lt;br /&gt;
...                                                           --------------&lt;br /&gt;
------------                -----------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----------------------      ----------------------------&lt;br /&gt;
yop_poll_custom_fields      yop_poll_votes_custom_fields&lt;br /&gt;
----------------------      ----------------------------&lt;br /&gt;
id                          id&lt;br /&gt;
poll_id                     poll_id&lt;br /&gt;
custom_field                vote_id&lt;br /&gt;
...                         custom_field_id&lt;br /&gt;
----------------------      user_id&lt;br /&gt;
                            custom_field_value&lt;br /&gt;
                            ----------------------------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da bei einem custom text field bei der fragesstellung nur einzeiliger text möglich war, musst die datei &lt;br /&gt;
 /wp-content/plugins/yop-poll/inc/yop_poll_model.php&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In der datenbank die Tabelle:&lt;br /&gt;
&lt;br /&gt;
 kas_wp_yop_poll_votes_custom_fields&lt;br /&gt;
&lt;br /&gt;
Feld: custom_field_value&lt;br /&gt;
&lt;br /&gt;
von varchar (255) auf Text geändert.&lt;br /&gt;
&lt;br /&gt;
== SQL-Abfragen für Antworten mit Kommentar ==&lt;br /&gt;
=== SQL nur Ergebnisse ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT `id` , `poll_id` , `answer_id` , `ip` , `http_referer` , `vote_date` , `pn`&lt;br /&gt;
FROM `kas_wp_yop_poll_logs`&lt;br /&gt;
WHERE `poll_id` =38&lt;br /&gt;
ORDER BY `answer_id` ASC&lt;br /&gt;
LIMIT 0 , 500&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== SQL Abfrage mit Kommentaren ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alte Abfrage&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT *&lt;br /&gt;
FROM `kas_wp_yop_poll_logs`&lt;br /&gt;
LEFT OUTER JOIN `kas_wp_yop_poll_votes_custom_fields` ON `kas_wp_yop_poll_logs`.`vote_id` = `kas_wp_yop_poll_votes_custom_fields`.`vote_id`&lt;br /&gt;
WHERE `kas_wp_yop_poll_logs`.`poll_id` =13&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Weitere Abfragen ===&lt;br /&gt;
Welche Custom Fields gehören zu welchen Umfrage (Pivot Version)&lt;br /&gt;
&lt;br /&gt;
Dynamische Version (funktioniert noch nicht aber die Richtung dürfte stimmen)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET @sql = NULL;&lt;br /&gt;
SELECT&lt;br /&gt;
  GROUP_CONCAT(DISTINCT&lt;br /&gt;
    CONCAT(&lt;br /&gt;
      &amp;#039;max(case when custom_field = &amp;#039;&amp;#039;&amp;#039;,&lt;br /&gt;
      custom_field,&lt;br /&gt;
      &amp;#039;&amp;#039;&amp;#039; then custom_field end) AS &amp;#039;,&lt;br /&gt;
      custom_field&lt;br /&gt;
    )&lt;br /&gt;
  ) INTO @sql&lt;br /&gt;
FROM kas_wp_yop_poll_custom_fields;&lt;br /&gt;
&lt;br /&gt;
SET @sql = CONCAT(&amp;#039;SELECT poll_id, &amp;#039;, @sql, &amp;#039; &lt;br /&gt;
                  FROM kas_wp_yop_poll_custom_fields &lt;br /&gt;
                  GROUP BY poll_id&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
PREPARE stmt FROM @sql;&lt;br /&gt;
EXECUTE stmt;&lt;br /&gt;
DEALLOCATE PREPARE stmt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Neue Umfrage für DEKRA Connect durchführen ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
Läuft 2 Wochen ab ca. Mitte des Monats. Danach Auswertung und Grafikerstellung.&lt;br /&gt;
==== Updates ====&lt;br /&gt;
 2015-10 - Umfrage nur mit Cookie check -&amp;gt; Mascha möchte keine Userunterbrechung. Später werden die Ergebnisse manuell gereinigt&lt;br /&gt;
&lt;br /&gt;
===== Infos zum Cookie Check =====&lt;br /&gt;
Wenn man mit Cookies kontrolliert, wie wir das im Moment machen, dann testet das Plugin immer ob für eine bestimmte Umfrage schon abgestimmt wurde. &amp;#039;&amp;#039;&amp;#039;Egal ob die Umfrage neu gestartet wurde&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Technisch wird dazu ein Cookie mit der ID der Umfrage hinterlegt. Dieses hat eine &amp;#039;&amp;#039;&amp;#039;Gültigkeitsdauer&amp;#039;&amp;#039;&amp;#039; (kann man einstellen z.B. 14 Tage). Solange das Cookie gültig ist kann man dann nicht mehr abstimmen.&lt;br /&gt;
&lt;br /&gt;
Das bedeutet &amp;#039;&amp;#039;&amp;#039;alle Browser die noch nicht abgestimmt haben können auch abstimmen&amp;#039;&amp;#039;&amp;#039; !&lt;br /&gt;
&lt;br /&gt;
Wenn du nochmal testen willst mußt du die Cookies löschen oder 14 Tage warten.&lt;br /&gt;
&lt;br /&gt;
Nochmal zur Info Vor und Nachteile der anderen Lösungen&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kontrolle über IP&amp;#039;&amp;#039;&amp;#039;: Vorteil recht zuverlässig schwer zu umgehen. Nachteil: wenn Benutzer mit der gleichen IP ankommen kann es sein dass einer nicht abstimmen kann.&lt;br /&gt;
&lt;br /&gt;
* Über die &amp;#039;&amp;#039;&amp;#039;Personalnummer&amp;#039;&amp;#039;&amp;#039; Vorteil: Sehr Zuverlässig. Nachteil: Schlechte User Experience&lt;br /&gt;
&lt;br /&gt;
== Technischer Ablauf ==&lt;br /&gt;
Stand 2017&lt;br /&gt;
* Block by Cookie&lt;br /&gt;
&lt;br /&gt;
Stand März 2015 (obsolete)&lt;br /&gt;
&lt;br /&gt;
* Das Umfrage Plugin im WP ist auf &amp;#039;&amp;#039;&amp;#039;block by Personal Number&amp;#039;&amp;#039;&amp;#039; gestellt. -&amp;gt; Ab 2016 nur noch &amp;#039;&amp;#039;&amp;#039;by Cookie&amp;#039;&amp;#039;&amp;#039;(siehe oben)&lt;br /&gt;
* obsolete -&amp;gt; Ein User kann nur Voten wenn eine id=12345 (Personalnummer) angehängt ist. Ansonsten wird zunächst auf das DEKRA Intranet weiter geleitet (über alert). &lt;br /&gt;
* Dort wird die Personalnummer als id=12345 an den Link angehängt und auf intern-blog.dekra.de/category/dekra-direkt/?id=12345 geleitet Nur wenn eine solche id vorhanden ist kann gevoted werden. Ist nicht supersicher weil die Nummer willkürlich geändert werden kann, nachträgliche Prüfung wäre mit Personalnummern Liste möglich. Verbesserungspotential wäre POST übermittlung, Gültigkeitsprüfung durch PN-Index oder Formel.&lt;br /&gt;
* Hat die id &amp;#039;&amp;#039;&amp;#039;schon gevotet&amp;#039;&amp;#039;&amp;#039; wird nur das Ergebnis angezeigt.&lt;br /&gt;
* Im DEKRA Intranet werden Links an die eine id angehängt werden soll mit dem Parameter &amp;#039;&amp;#039;&amp;#039;?id=public&amp;#039;&amp;#039;&amp;#039; Veröffentlicht. public wird dann automatisch durch die Personalnummer des Mitarbeiters ersetzt, bevor weitergeleitet wird. &lt;br /&gt;
&lt;br /&gt;
=== Umfrage erstellen ===&lt;br /&gt;
* Achtung manchmal kollidiert die Abfrage mit alten Cookies der letzten Umfrage. Genau ist das noch nicht geklärt. Hilfe bringt: &lt;br /&gt;
** dafür sorgen, daß die alte Umfrage nicht mit angezeigt wird&lt;br /&gt;
** Logs löschen&lt;br /&gt;
** Wenn nichts hilft die Stats Reseten (kann sein daß dies nicht nötig ist.)&lt;br /&gt;
&lt;br /&gt;
* 1 oder mehrere (Mascha will meist 3) Umfragen-Dummies erstellen (z.B. eine alte klonen - &amp;#039;&amp;#039;&amp;#039;Vorsicht: Einstellungen für Datum, Template und Blocking&amp;#039;&amp;#039;&amp;#039; werden nicht übernommen)&lt;br /&gt;
* Template: &amp;#039;&amp;#039;&amp;#039;DEKRA Umfrage mit Kommentar&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
** Mit dem Template &amp;#039;&amp;#039;&amp;#039;DEKRA Umfrage mit dynamischem Kommentar&amp;#039;&amp;#039;&amp;#039; kann man zusätzlich noch JavaScript Popups öffnen und auf die gewählte Antwort reagieren (siehe JS im Template)&lt;br /&gt;
** Das Template &amp;#039;&amp;#039;&amp;#039;Umfrage mit mehr Antworten&amp;#039;&amp;#039;&amp;#039; erlaubt mehr als zwei Antwortmöglichkeiten. Die Kommentare werden dann untereinander dargestellt. Das ist zugleich auch das sicherste Template, was die Darstellung angeht.&lt;br /&gt;
* Blocking by auf &amp;#039;&amp;#039;&amp;#039;Personal Number&amp;#039;&amp;#039;&amp;#039; - dadurch wird die Abfrage des id Parameters gestartet. Zum Testen auf don&amp;#039;t Block stellen. Achtung IE hat manchmal Caching Probleme.&lt;br /&gt;
* Start und Enddatum setzen&lt;br /&gt;
* Abstimmung in einen &amp;#039;&amp;#039;&amp;#039;Beitrag in Kategorie Dekra Direkt&amp;#039;&amp;#039;&amp;#039; einpflegen (evtl. erst nach dem Testen) -&amp;gt; Startseite sichtbar&lt;br /&gt;
* Am Ende Umfrage auf &amp;#039;&amp;#039;&amp;#039;nur Antwort&amp;#039;&amp;#039;&amp;#039; !&lt;br /&gt;
* Geo-bit erstellt die Fragen, diese werden von Mascha angepasst und von Ihr in einem Beitrag veröffentlicht.&lt;br /&gt;
* Start der Umfrage durch setzen der Kategorie (todo ob das klappt)&lt;br /&gt;
&lt;br /&gt;
=== Test der Umfrage ===&lt;br /&gt;
* Vorige Tests sind sinnvoll. Ein Test von Geo-bit (einfach id anhängen). Ein Test von Dekra&lt;br /&gt;
=== Ende der Umfrage und Auswertung ===&lt;br /&gt;
Für die Auswertung benötigt Mascha eine &amp;#039;&amp;#039;&amp;#039;Excel-Tabelle&amp;#039;&amp;#039;&amp;#039; in der &amp;#039;&amp;#039;&amp;#039;nach Antworten und sortiert&amp;#039;&amp;#039;&amp;#039; ist. Ebenso die dazugehörigen Kommentare. Doppelte IPs rausschmeißen. Wenn Personalnummerliste vorhanden könnte man hier nach Gültigkeit prüfen.&lt;br /&gt;
* Umfrage mit Datum beenden oder auf Maschas Hinweis, &amp;#039;&amp;#039;&amp;#039;Umfrage auf don&amp;#039;t block&amp;#039;&amp;#039;&amp;#039;, damit die Umleitung auf Dekra nicht mehr aktiv ist, außerdem &amp;#039;&amp;#039;&amp;#039;Enddatum setzen&amp;#039;&amp;#039;&amp;#039; und auf &amp;#039;&amp;#039;&amp;#039;Ergebnis anzeigen nach Enddatum&amp;#039;&amp;#039;&amp;#039;. Endzeit etwas zurücksetzen, da manchmal die Serverzeit um ein paar Stunden differiert.&lt;br /&gt;
* SQL Abfrage (siehe Statement), Export als ods oder csv&lt;br /&gt;
* Doppelte überprüfen&lt;br /&gt;
* Umwandeln in Excel&lt;br /&gt;
* Schaubild aus Numbers&lt;br /&gt;
&lt;br /&gt;
=== Löschen unerwünschter Kommentare ===&lt;br /&gt;
&lt;br /&gt;
In&lt;br /&gt;
 Admin -&amp;gt; Yop poll -&amp;gt; All polls -&amp;gt; meineUmfrage -&amp;gt; votes&lt;br /&gt;
&lt;br /&gt;
hier auswählen und löschen&lt;br /&gt;
&lt;br /&gt;
Problem: die Kommentare werden nicht mehr angezeigt. TODO&lt;br /&gt;
&lt;br /&gt;
=== Anpassungen  am Plugin Yop poll===&lt;br /&gt;
&lt;br /&gt;
 yop-poll =&amp;gt; inc =&amp;gt; admin.php&lt;br /&gt;
&lt;br /&gt;
Hier die DB mit prefix versehen. &amp;quot;kas_&amp;quot;&lt;br /&gt;
 yop-poll =&amp;gt; inc =&amp;gt; yop_poll_model.php&lt;br /&gt;
 yop-poll =&amp;gt; inc =&amp;gt; db_schema.php&lt;br /&gt;
 yop-poll =&amp;gt; js =&amp;gt; yop_poll_public.js&lt;br /&gt;
==== Kommentare ====&lt;br /&gt;
MUSS überarbeitet werden&lt;br /&gt;
 yop_poll_modell.php&lt;br /&gt;
&lt;br /&gt;
 return_poll_html -&amp;gt; &lt;br /&gt;
dort wird der Template Block  		&lt;br /&gt;
 [ANSWER_RESULT_CONTAINER]&lt;br /&gt;
 [/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
mit pregreplace über eine Callback Funktion ersetzt&lt;br /&gt;
 answer_result_callback(m$)&lt;br /&gt;
darin wiederum wird &lt;br /&gt;
 get_poll_comments($poll_id) &lt;br /&gt;
aufgerufen, dieses gibt ein array zurück das dann in HTML umgesetzt wird. Diese Ausgabe erfolbt über die Abfrage von &lt;br /&gt;
 $this-&amp;gt;is_view_poll_results()&lt;br /&gt;
Das bedeutet die Ausgabe erfolgt wenn im Backend die Bedingung für die Ausgabe der Results gesetzt ist (z.B. Results after End Date) Gute erweiterung wäre ein eigener Block für die Comments&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Im Template muß der Block natürlich auch gesetzt sein.&amp;#039;&amp;#039;&amp;#039; (beim entsprechenden Template)&lt;br /&gt;
&lt;br /&gt;
Problem: Die Ausgabe erfolgt nur wenn die Logs der Umfrage nicht gelöscht sind.&lt;br /&gt;
Ausgabe der Kommentare bisher&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT yp.id,yp.name,yp.question,ypa.answer,ypvcf.custom_field_value,ypcf.custom_field,ypl.vote_id FROM kas_wp_yop_polls yp &lt;br /&gt;
JOIN kas_wp_yop_poll_custom_fields ypcf ON (yp.id=ypcf.poll_id) &lt;br /&gt;
JOIN kas_wp_yop_poll_votes_custom_fields ypvcf ON (ypcf.id = ypvcf.custom_field_id)&lt;br /&gt;
JOIN kas_wp_yop_poll_logs ypl ON (ypvcf.vote_id = ypl.vote_id)&lt;br /&gt;
JOIN kas_wp_yop_poll_answers ypa ON (ypl.answer_id = ypa.id)&lt;br /&gt;
WHERE yp.id=[pollID] AND ypl.answer_id=[answerID];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Abfrage wird für jede Antwort (answer_id) ausgeführt. Aus den Logs wird die answer_id geholt. Wenn diese im Log fehlt wird nichts zurückgegeben.&lt;br /&gt;
Wie kann man die Zuordnung Kommentar - answer_id noch herstellen? answer_id und vote_id stehen auch in yop_poll_voters, vote_id steht auch in yop_poll_votes_custom_fields&lt;br /&gt;
Also statt mit wp_yop_poll_logs joint man mit yop_poll_voters.&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT yp.id, yp.name, yp.question, ypa.answer, ypvcf.custom_field_value, ypcf.custom_field, ypv.vote_id&lt;br /&gt;
FROM kas_wp_yop_polls yp&lt;br /&gt;
JOIN kas_wp_yop_poll_custom_fields ypcf ON ( yp.id = ypcf.poll_id )&lt;br /&gt;
JOIN kas_wp_yop_poll_votes_custom_fields ypvcf ON ( ypcf.id = ypvcf.custom_field_id )&lt;br /&gt;
JOIN kas_wp_yop_poll_voters ypv ON ( ypvcf.vote_id = ypv.vote_id )&lt;br /&gt;
JOIN kas_wp_yop_poll_answers ypa ON ( ypv.answer_id = ypa.id )&lt;br /&gt;
WHERE yp.id =50&lt;br /&gt;
AND ypv.answer_id =113&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Yop Poll Templates ==&lt;br /&gt;
Todo - Anpassen um ungenutzte Features zu nutzen (z.B. after End Date schöne Anzeige der Ergebnisse)&lt;br /&gt;
=== DEKRA Umfrage mit Kommentar ===&lt;br /&gt;
Vor Umfrage:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot; style=&amp;quot;display:table-cell;height:130px;vertical-align:middle;&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ul&amp;gt;&lt;br /&gt;
		[ANSWER_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-answer-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			%POLL-ANSWER-CHECK-INPUT% &lt;br /&gt;
			%POLL-ANSWER-LABEL%&lt;br /&gt;
			&amp;lt;span class=&amp;quot;yop-poll-results-text-%POLL-ID%&amp;quot;&amp;gt;%POLL-ANSWER-RESULT-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
             %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
        &amp;lt;/li&amp;gt;&lt;br /&gt;
        [/ANSWER_CONTAINER]&lt;br /&gt;
		[OTHER_ANSWER_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-answer-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			%POLL-OTHER-ANSWER-CHECK-INPUT% &lt;br /&gt;
			%POLL-OTHER-ANSWER-LABEL% &lt;br /&gt;
			&amp;lt;span class=&amp;quot;yop-poll-results-text-%POLL-ID%&amp;quot;&amp;gt;%POLL-ANSWER-RESULT-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
			%POLL-OTHER-ANSWER-TEXT-INPUT% &lt;br /&gt;
            %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
        &amp;lt;/li&amp;gt;&lt;br /&gt;
        [/OTHER_ANSWER_CONTAINER]&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-custom-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ul&amp;gt;&lt;br /&gt;
		[CUSTOM_FIELD_CONTAINER]&lt;br /&gt;
		&amp;lt;li&amp;gt;%POLL-CUSTOM-FIELD-LABEL% %POLL-CUSTOM-FIELD-TEXT-INPUT%&amp;lt;/li&amp;gt;&lt;br /&gt;
		[/CUSTOM_FIELD_CONTAINER]&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;    &lt;br /&gt;
[CAPTCHA_CONTAINER]&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-captcha-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;yop-poll-captcha-image-div&amp;quot; id=&amp;quot;yop-poll-captcha-image-div-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
        %CAPTCHA-IMAGE%&lt;br /&gt;
        &amp;lt;div class=&amp;quot;yop-poll-captcha-helpers-div&amp;quot; id=&amp;quot;yop-poll-captcha-helpers-div-%POLL-ID%&amp;quot;&amp;gt;%RELOAD-CAPTCHA-IMAGE% &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;yop_poll_clear&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    %CAPTCHA-LABEL%&lt;br /&gt;
    &amp;lt;div class=&amp;quot;yop-poll-captcha-input-div&amp;quot; id=&amp;quot;yop-poll-captcha-input-div-%POLL-ID%&amp;quot;&amp;gt;%CAPTCHA-INPUT%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[/CAPTCHA_CONTAINER]&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-vote-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-footer&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-VOTE-BUTTON%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;yop-poll-results-%POLL-ID%&amp;quot;&amp;gt;%POLL-VIEW-RESULT-LINK%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-ANSWERS%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-VOTES%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nach Umfrage&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot; style=&amp;quot;display:table-cell;height:130px;vertical-align:middle;&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;div id=&amp;quot;gb_cust&amp;quot;&amp;gt;VORLÄUFIGES·ERGEBNIS·DER·ABSTIMMUNG&amp;lt;/div&amp;gt;	&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
		[ANSWER_RESULT_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;label class=&amp;quot;pds-feedback-label-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;pds-answer-text-%POLL-ID%&amp;quot;&amp;gt;%POLL-ANSWER-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;pds-feedback-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;span class=&amp;quot;pds-feedback-per-%POLL-ID%&amp;quot;&amp;gt; %POLL-ANSWER-RESULT-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/label&amp;gt;&lt;br /&gt;
			&amp;lt;div&amp;gt;&lt;br /&gt;
             %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
           &amp;lt;/div&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		[/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-vote-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-footer&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-ANSWERS%&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-VOTES%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;yop-poll-back-%POLL-ID%&amp;quot;&amp;gt;%POLL-BACK-TO-VOTE-LINK%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before Start Date&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This poll is about to &amp;lt;br&amp;gt;&lt;br /&gt;
start at %POLL-START-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
and finish at %POLL-END-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After End Date&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;gb_end&amp;quot;&amp;gt;Die Abstimmung ist beendet.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul class=&amp;quot;afterVote&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		[ANSWER_RESULT_CONTAINER]&lt;br /&gt;
		&lt;br /&gt;
		[/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
CSS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#yop-poll-container-%POLL-ID% {&lt;br /&gt;
    background-image: url(&amp;quot;http://intern-blog.dekra.de/wp-content/uploads/2013/02/bg_poll_1.png&amp;quot;);&lt;br /&gt;
/*    border: 5px solid #3F8B43;*/&lt;br /&gt;
background-repeat:no-repeat;&lt;br /&gt;
    color: #555555;&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    padding: 10px;&lt;br /&gt;
    width: 632px;&lt;br /&gt;
/*    height: 300px;*/&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-name-%POLL-ID% {&lt;br /&gt;
	font-size:14px;&lt;br /&gt;
	font-weight:bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-question-%POLL-ID% {&lt;br /&gt;
    color: #000000;&lt;br /&gt;
    font-size: 14pt;&lt;br /&gt;
    font-weight: 500;&lt;br /&gt;
    height: 80px;&lt;br /&gt;
    line-height: 26px;&lt;br /&gt;
    margin: 0 50px 0 0;&lt;br /&gt;
    padding-left: 215px;&lt;br /&gt;
    padding-top: 40px;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    width: 300px;&lt;br /&gt;
margin-bottom: 100px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-answers-%POLL-ID% { &lt;br /&gt;
 }&lt;br /&gt;
#yop-poll-answers-%POLL-ID% ul {&lt;br /&gt;
    list-style: none outside none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: 20px;&lt;br /&gt;
    left: 270px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-answers-%POLL-ID% ul li { &lt;br /&gt;
	font-style:normal;&lt;br /&gt;
	margin-bottom:10px;&lt;br /&gt;
	padding:0px;&lt;br /&gt;
	font-size:12px;&lt;br /&gt;
   width: 190px !important;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-answers-%POLL-ID% ul li input { &lt;br /&gt;
	margin:0px; &lt;br /&gt;
	float:none;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-answers-%POLL-ID% ul li label { &lt;br /&gt;
	margin:0px; &lt;br /&gt;
	font-style:normal; &lt;br /&gt;
	font-weight:bold; &lt;br /&gt;
	font-size:16px; &lt;br /&gt;
	float:none;&lt;br /&gt;
        z-index: 10; &lt;br /&gt;
}&lt;br /&gt;
.yop-poll-results-%POLL-ID% {&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    margin-left: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-custom-%POLL-ID% {  }&lt;br /&gt;
#yop-poll-custom-%POLL-ID% ul {&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 500;&lt;br /&gt;
    left: 270px;&lt;br /&gt;
    list-style: none outside none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: 20px;&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 375px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-custom-%POLL-ID% ul li { &lt;br /&gt;
	padding:0px;&lt;br /&gt;
	margin:0px;	&lt;br /&gt;
	font-size:14px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-container-%POLL-ID% input[type=&amp;#039;text&amp;#039;] { &lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    margin: 10px 0;&lt;br /&gt;
    padding: 2%;&lt;br /&gt;
    text-indent: 2%;&lt;br /&gt;
    width: 92%;&lt;br /&gt;
    border: 1px solid #B9B8B8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-container-%POLL-ID% textarea {&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    margin: 10px 0;&lt;br /&gt;
    padding: 2%;&lt;br /&gt;
    text-indent: 2%;&lt;br /&gt;
    width: 92%;&lt;br /&gt;
    font-family: Verdana;&lt;br /&gt;
    color: #666;&lt;br /&gt;
    border: 1px solid #B9B8B8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-captcha-input-div-%POLL-ID% {&lt;br /&gt;
margin-top:5px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-captcha-helpers-div-%POLL-ID% {&lt;br /&gt;
width:30px;&lt;br /&gt;
float:left;&lt;br /&gt;
margin-left:5px;&lt;br /&gt;
height:0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-captcha-helpers-div-%POLL-ID% img {&lt;br /&gt;
margin-bottom:2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-captcha-image-div-%POLL-ID% {&lt;br /&gt;
margin-bottom:5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop_poll_captcha_image_%POLL-ID% {&lt;br /&gt;
float:left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.yop_poll_clear {&lt;br /&gt;
clear:both;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#yop-poll-vote-%POLL-ID% {&lt;br /&gt;
float:left; &lt;br /&gt;
/*width:100%; */&lt;br /&gt;
padding-left: 270px;&lt;br /&gt;
margin-top: 20px;&lt;br /&gt;
margin-bottom: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
li.yop-poll-li-result-%POLL-ID% {&lt;br /&gt;
/*    margin-top: 50px;*/&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.yop-poll-results-bar-%POLL-ID% { background:#f5f5f5; height:10px;  }&lt;br /&gt;
.yop-poll-results-bar-%POLL-ID% div { background:#555; height:10px; }&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div#yop-poll-vote-%POLL-ID% button { float:left; }&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div#yop-poll-results-%POLL-ID% {&lt;br /&gt;
    float: right;&lt;br /&gt;
    margin-bottom: 20px;&lt;br /&gt;
    margin-top: -20px;&lt;br /&gt;
    width: auto;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div#yop-poll-results-%POLL-ID% a { color:#3F8B43; text-decoration:underline; font-size:12px;}&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div#yop-poll-back-%POLL-ID% a { color:#3F8B43; text-decoration:underline; font-size:12px;}&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div { float:left; width:100%; }&lt;br /&gt;
&lt;br /&gt;
#yop-poll-container-error-%POLL-ID% {&lt;br /&gt;
	font-size:12px;&lt;br /&gt;
	font-style:italic;&lt;br /&gt;
	color:red;&lt;br /&gt;
    left: 290px;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: 270px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.gb-btn {&lt;br /&gt;
    background-image: url(&amp;quot;http://intern-blog.dekra.de/wp-content/uploads/2013/02/bg_button.png&amp;quot;);&lt;br /&gt;
    border: medium none;&lt;br /&gt;
    border-radius: 10px 10px 10px 10px;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    font-size: 1.9em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    height: 40px;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    width: 130px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#gb_cust {&lt;br /&gt;
    color: #999999;&lt;br /&gt;
    font-size: 1.4em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    padding-left: 0px;&lt;br /&gt;
    padding-top: 40px;&lt;br /&gt;
    background-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
.yop-poll-results-bar-%POLL-ID% div{&lt;br /&gt;
    background-image: url(&amp;quot;http://intern-blog.dekra.de/wp-content/uploads/2013/02/bg_button.png&amp;quot;);&lt;br /&gt;
    height: 30px;&lt;br /&gt;
    margin-top: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.yop-poll-results-bar-%POLL-ID% {&lt;br /&gt;
height: 30px;&lt;br /&gt;
width:99%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pds-answer-text-%POLL-ID% {&lt;br /&gt;
font-size: 0.85em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
color: #999;&lt;br /&gt;
/*    margin-top: -10px;*/&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pds-feedback-per-%POLL-ID% {&lt;br /&gt;
   color: #999999;&lt;br /&gt;
    font-size: 1em;&lt;br /&gt;
    margin-left: 5px;&lt;br /&gt;
    margin-top: -25px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.yop_poll_vote_button{&lt;br /&gt;
    background-image: url(&amp;quot;http://intern-blog.dekra.de/wp-content/uploads/2013/02/bg_button.png&amp;quot;);&lt;br /&gt;
    border: medium none;&lt;br /&gt;
    border-radius: 10px 10px 10px 10px;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    font-size: 1.9em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    height: 40px;&lt;br /&gt;
    width: 250px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#gb_end {&lt;br /&gt;
    color: #999999;&lt;br /&gt;
    font-size: 1.4em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    padding-bottom: 100px;&lt;br /&gt;
    padding-left: 250px;&lt;br /&gt;
    padding-top: 130px;&lt;br /&gt;
    background-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-container-%POLL-ID% textarea {&lt;br /&gt;
#max-width: 350px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-container-success-%POLL-ID% {&lt;br /&gt;
	font-size:12px;&lt;br /&gt;
	font-style:italic;&lt;br /&gt;
	color:green;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
JS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function stripBorder_%POLL-ID%(object) {&lt;br /&gt;
	object.each(function() {&lt;br /&gt;
			if( parseInt(jQuery(this).width() ) &amp;gt; 0) {&lt;br /&gt;
				jQuery(this).width( parseInt( jQuery(this).width() ) - parseInt(jQuery(this).css(&amp;quot;border-left-width&amp;quot;)) - parseInt(jQuery(this).css(&amp;quot;border-right-width&amp;quot;)) );&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				jQuery(this).css(&amp;quot;border-left-width&amp;quot;, &amp;#039;0px&amp;#039;);&lt;br /&gt;
				jQuery(this).css(&amp;quot;border-right-width&amp;quot;, &amp;#039;0px&amp;#039;);&lt;br /&gt;
			}&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
function stripPadding_%POLL-ID%(object) {&lt;br /&gt;
	object.each(function() { &lt;br /&gt;
			jQuery(this).width( parseInt( jQuery(this).width() ) - parseInt(jQuery(this).css(&amp;quot;padding-left&amp;quot;)) - parseInt(jQuery(this).css(&amp;quot;padding-left&amp;quot;)) );&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function strip_results_%POLL-ID%() {&lt;br /&gt;
        stripPadding_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop_poll_li_result-%POLL-ID%&amp;quot;) );   &lt;br /&gt;
	stripBorder_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-result-bar-%POLL-ID%&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
jQuery(document).ready(function(e) {&lt;br /&gt;
                if(typeof window.strip_results_%POLL-ID% == &amp;#039;function&amp;#039;) &lt;br /&gt;
			strip_results_%POLL-ID%();&lt;br /&gt;
    &lt;br /&gt;
		if(typeof window.tabulate_answers_%POLL-ID% == &amp;#039;function&amp;#039;) &lt;br /&gt;
			tabulate_answers_%POLL-ID%();&lt;br /&gt;
		&lt;br /&gt;
		if(typeof window.tabulate_results_%POLL-ID% == &amp;#039;function&amp;#039;) &lt;br /&gt;
			tabulate_results_%POLL-ID%();&lt;br /&gt;
		&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
function equalWidth_%POLL-ID%(obj, cols, findWidest ) {&lt;br /&gt;
 findWidest  = typeof findWidest  !== &amp;#039;undefined&amp;#039; ? findWidest  : false;&lt;br /&gt;
    if ( findWidest ) {&lt;br /&gt;
		obj.each(function() {&lt;br /&gt;
				var thisWidth = jQuery(this).width();&lt;br /&gt;
				width = parseInt(thisWidth / cols); &lt;br /&gt;
				jQuery(this).width(width);	&lt;br /&gt;
				jQuery(this).css(&amp;#039;float&amp;#039;, &amp;#039;left&amp;#039;);	&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		var widest = 0;&lt;br /&gt;
		obj.each(function() {&lt;br /&gt;
				var thisWidth = jQuery(this).width();&lt;br /&gt;
				if(thisWidth &amp;gt; widest) {&lt;br /&gt;
					widest = thisWidth; &lt;br /&gt;
				}	&lt;br /&gt;
		});&lt;br /&gt;
		width = parseInt( widest / cols); &lt;br /&gt;
		obj.width(width);	&lt;br /&gt;
		obj.css(&amp;#039;float&amp;#039;, &amp;#039;left&amp;#039;);	&lt;br /&gt;
	}	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function tabulate_answers_%POLL-ID%() {&lt;br /&gt;
	equalWidth_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-li-answer-%POLL-ID%&amp;quot;), %ANSWERS-TABULATED-COLS% );&lt;br /&gt;
        //equalWidth_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-li-answer-%POLL-ID% .yop-poll-results-bar-%POLL-ID% div &amp;quot;), %ANSWERS-TABULATED-COLS%, true );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function tabulate_results_%POLL-ID%() {&lt;br /&gt;
	equalWidth_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-li-result-%POLL-ID%&amp;quot;), %RESULTS-TABULATED-COLS% );&lt;br /&gt;
        //equalWidth_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-li-result-%POLL-ID% .yop-poll-results-bar-%POLL-ID% div &amp;quot;), %RESULTS-TABULATED-COLS%, true );&lt;br /&gt;
}&lt;br /&gt;
			jQuery(document).ready(function(){&lt;br /&gt;
				runOnPollStateChange_%POLL-ID%();&lt;br /&gt;
				});&lt;br /&gt;
&lt;br /&gt;
			function runOnPollStateChange_%POLL-ID%() {};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Dekra Poll Template für ID 2 (altes Template) ===&lt;br /&gt;
Vor Umfrage&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;gb_cust&amp;quot;&amp;gt;STIMMEN SIE JETZT AB !&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;ul&amp;gt;&lt;br /&gt;
    [ANSWER_CONTAINER]&lt;br /&gt;
    &amp;lt;li class=&amp;quot;gb-ac yop-poll-li-answer-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
      %POLL-ANSWER-CHECK-INPUT% &lt;br /&gt;
      %POLL-ANSWER-LABEL%&lt;br /&gt;
      &amp;lt;span class=&amp;quot;yop-poll-results-text-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
        %POLL-ANSWER-RESULT-LABEL%&lt;br /&gt;
      &amp;lt;/span&amp;gt;&lt;br /&gt;
      %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    [/ANSWER_CONTAINER]&lt;br /&gt;
    [OTHER_ANSWER_CONTAINER]&lt;br /&gt;
    &amp;lt;li class=&amp;quot;gb-oac yop-poll-li-answer-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
      %POLL-OTHER-ANSWER-CHECK-INPUT% &lt;br /&gt;
      %POLL-OTHER-ANSWER-LABEL% &lt;br /&gt;
      &amp;lt;span class=&amp;quot;yop-poll-results-text-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
        %POLL-ANSWER-RESULT-LABEL%&lt;br /&gt;
      &amp;lt;/span&amp;gt;&lt;br /&gt;
      %POLL-OTHER-ANSWER-TEXT-INPUT% &lt;br /&gt;
      %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    [/OTHER_ANSWER_CONTAINER]&lt;br /&gt;
  &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[CUSTOM_FIELD_CONTAINER]&lt;br /&gt;
		&amp;lt;li&amp;gt;%POLL-CUSTOM-FIELD-LABEL% %POLL-CUSTOM-FIELD-TEXT-INPUT%&amp;lt;/li&amp;gt;&lt;br /&gt;
		[/CUSTOM_FIELD_CONTAINER]&lt;br /&gt;
[CAPTCHA_CONTAINER]&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-captcha-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;yop-poll-captcha-image-div&amp;quot; id=&amp;quot;yop-poll-captcha-image-div-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
        %CAPTCHA-IMAGE%&lt;br /&gt;
        &amp;lt;div class=&amp;quot;yop-poll-captcha-helpers-div&amp;quot; id=&amp;quot;yop-poll-captcha-helpers-div-%POLL-ID%&amp;quot;&amp;gt;%RELOAD-CAPTCHA-IMAGE% &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;yop_poll_clear&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    %CAPTCHA-LABEL%&lt;br /&gt;
    &amp;lt;div class=&amp;quot;yop-poll-captcha-input-div&amp;quot; id=&amp;quot;yop-poll-captcha-input-div-%POLL-ID%&amp;quot;&amp;gt;%CAPTCHA-INPUT%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[/CAPTCHA_CONTAINER]&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-vote-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-footer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;poll-vote-button&amp;quot;&amp;gt;%POLL-VOTE-BUTTON%&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;%POLL-TOTAL-ANSWERS%&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;%POLL-TOTAL-VOTES%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;gb-storage&amp;quot; gb-poll-id=&amp;quot;%POLL-ID%&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Load check from Dean Edwards/Matthias Miller/John Resig&lt;br /&gt;
&lt;br /&gt;
function init() {&lt;br /&gt;
  if (arguments.callee.done) return;&lt;br /&gt;
  arguments.callee.done = true;&lt;br /&gt;
  if (_timer) clearInterval(_timer);&lt;br /&gt;
&lt;br /&gt;
  jQuery(document).ready(function() {&lt;br /&gt;
    // remove vote button&lt;br /&gt;
    jQuery(&amp;#039;.poll-vote-button&amp;#039;).html(&amp;#039;&amp;#039;);&lt;br /&gt;
    // add Buttons&lt;br /&gt;
    jQuery(&amp;#039;.gb-ac&amp;#039;).each(function(index,domEle){&lt;br /&gt;
      var answer_id;&lt;br /&gt;
      var label;&lt;br /&gt;
      var content;&lt;br /&gt;
      answer_id = jQuery(this).find(&amp;#039;input:first&amp;#039;).val();&lt;br /&gt;
      label = jQuery(this).find(&amp;#039;label:first&amp;#039;).html();&lt;br /&gt;
      content = &amp;#039;&amp;lt;button class=&amp;quot;gb-btn&amp;quot; value=&amp;quot;&amp;#039; + answer_id + &amp;#039;&amp;quot; type=&amp;quot;button&amp;quot;&amp;gt;&amp;#039; + label + &amp;#039;&amp;lt;/button&amp;gt;&amp;#039;;&lt;br /&gt;
      //jQuery(this).append(content);&lt;br /&gt;
      jQuery(this).html(content);&lt;br /&gt;
      //add click handler&lt;br /&gt;
      jQuery(this).find(&amp;#039;button:first&amp;#039;).click(function(){&lt;br /&gt;
        answer_id = jQuery(this).val();&lt;br /&gt;
        poll_id = jQuery(&amp;#039;.gb-storage:first&amp;#039;).attr(&amp;#039;gb-poll-id&amp;#039;);&lt;br /&gt;
        hidden_field = &amp;#039;&amp;lt;input id=&amp;quot;yop-poll-answer-&amp;#039; +answer_id + &amp;#039;&amp;quot; type=&amp;quot;hidden&amp;quot; name=&amp;quot;yop_poll_answer&amp;quot; value=&amp;quot;&amp;#039; + answer_id + &amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
        jQuery(this).after(hidden_field);&lt;br /&gt;
        yop_poll_do_vote(poll_id);&lt;br /&gt;
        return false;&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* for Mozilla/Opera9 */&lt;br /&gt;
if (document.addEventListener) {&lt;br /&gt;
  document.addEventListener(&amp;quot;DOMContentLoaded&amp;quot;, init, false);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* for Internet Explorer */&lt;br /&gt;
/*@cc_on @*/&lt;br /&gt;
/*@if (@_win32)&lt;br /&gt;
  document.write(&amp;quot;&amp;lt;script id=__ie_onload defer src=javascript:void(0)&amp;gt;&amp;lt;\/script&amp;gt;&amp;quot;);&lt;br /&gt;
  var script = document.getElementById(&amp;quot;__ie_onload&amp;quot;);&lt;br /&gt;
  script.onreadystatechange = function() {&lt;br /&gt;
    if (this.readyState == &amp;quot;complete&amp;quot;) {&lt;br /&gt;
      init(); // call the onload handler&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
/*@end @*/&lt;br /&gt;
&lt;br /&gt;
/* for Safari */&lt;br /&gt;
if (/WebKit/i.test(navigator.userAgent)) { // sniff&lt;br /&gt;
  var _timer = setInterval(function() {&lt;br /&gt;
    if (/loaded|complete/.test(document.readyState)) {&lt;br /&gt;
      init(); // call the onload handler&lt;br /&gt;
    }&lt;br /&gt;
  }, 10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* for other browsers */&lt;br /&gt;
window.onload = init;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nach Umfrage&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;gb_cust&amp;quot;&amp;gt;VORLÄUFIGES ERGEBNIS DER ABSTIMMUNG&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;ul&amp;gt;&lt;br /&gt;
		[ANSWER_RESULT_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;label class=&amp;quot;pds-feedback-label-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;pds-answer-text-%POLL-ID%&amp;quot;&amp;gt;%POLL-ANSWER-LABEL%&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;pds-feedback-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
					&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/label&amp;gt;&lt;br /&gt;
			&amp;lt;div&amp;gt;&lt;br /&gt;
             %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
           &amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;pds-feedback-per-%POLL-ID%&amp;quot;&amp;gt; %POLL-ANSWER-RESULT-LABEL%&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/li&amp;gt;&lt;br /&gt;
		[/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-vote-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-footer&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-ANSWERS%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-VOTES%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;!--&amp;lt;div id=&amp;quot;yop-poll-back-%POLL-ID%&amp;quot;&amp;gt;%POLL-BACK-TO-VOTE-LINK%&amp;lt;/div&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before Start Date&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This poll is about to &amp;lt;br&amp;gt;&lt;br /&gt;
start at %POLL-START-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
and finish at %POLL-END-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
After End Date&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This poll is closed!&lt;br /&gt;
Poll activity: &amp;lt;br&amp;gt;&lt;br /&gt;
start_date %POLL-START-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
end_date %POLL-END-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poll Results:&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-1&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ul&amp;gt;&lt;br /&gt;
		[ANSWER_RESULT_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;label class=&amp;quot;pds-feedback-label&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;pds-answer-text&amp;quot;&amp;gt;%POLL-ANSWER-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;pds-feedback-result&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;span class=&amp;quot;pds-feedback-per&amp;quot;&amp;gt; %POLL-ANSWER-RESULT-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/label&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;quot;pds-clear&amp;quot; style=&amp;quot;display: block;clear: both;height:1px;line-height:1px;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
	%POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
		&amp;lt;/li&amp;gt;&lt;br /&gt;
		[/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
%POLL-VOTE-BUTTON%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Generelle Prüfungen ===&lt;br /&gt;
* Custom Text Fields müssen für die Modifizierungen genau Custom Text Field 1	Kommentarund  Custom Text Field 2 Name lauten (Mascha verändert das manchmal)&lt;br /&gt;
 &lt;br /&gt;
=== Kommentare werden am Ende der Umfrage nicht angezeigt ===&lt;br /&gt;
* In der Umfrage muß bei Show results after Poll End Date oder zur Not auch Before Vote gewählt werden&lt;br /&gt;
* Im Template müssen die entsprechenden Felder im Bereich &amp;quot;Template after Poll End&amp;quot; vorhanden sein.&lt;br /&gt;
&lt;br /&gt;
== Change Log ==&lt;br /&gt;
=== Anpassungen für Admin Kommentare ===&lt;br /&gt;
2016-07&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Datenbanktabelle:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
--&lt;br /&gt;
-- Tabellenstruktur für Tabelle `kas_wp_yop_poll_admin_comments`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE IF NOT EXISTS `kas_wp_yop_poll_admin_comments` (&lt;br /&gt;
`id` int(10) unsigned NOT NULL,&lt;br /&gt;
  `vote_id` varchar(128) COLLATE latin1_general_ci NOT NULL,&lt;br /&gt;
  `comment` text COLLATE latin1_general_ci NOT NULL,&lt;br /&gt;
  `poll_id` int(11) NOT NULL&lt;br /&gt;
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=2 ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
db_schema.php Tabelle hinzufügen&lt;br /&gt;
admin.php Tabelle hinzufügen&lt;br /&gt;
yop_poll.php Tabelle hinzufügen&lt;br /&gt;
&lt;br /&gt;
answer_result_replace_callback -&amp;gt; &lt;br /&gt;
get_poll_comments -&amp;gt; admin kommentare dazufügen&lt;br /&gt;
&lt;br /&gt;
2016-06&lt;br /&gt;
Problem: Wenn Logs gelöscht sind werden keine Kommentare mehr angezeigt&lt;br /&gt;
Lösungsansatz. Leeres Ergebnis, weil ein Join über die vote_id zu den Logs geht.&lt;br /&gt;
8.8.13&lt;br /&gt;
&lt;br /&gt;
Hallo Mascha und Clemens,&lt;br /&gt;
&lt;br /&gt;
folgende Funktionalität ist jetzt implementiert:&lt;br /&gt;
&lt;br /&gt;
- Zu einem Hauptbeitrag (Sozusagen 1.Ebene - entspricht dem Post in&lt;br /&gt;
Wordpress) kann ein normaler Benutzer eine Frage stellen.&lt;br /&gt;
- Zu den Fragen (das wäre dann die 2. Ebene) kann jeder Benutzer&lt;br /&gt;
beliebig viele Beiträge machen&lt;br /&gt;
- Benutzer ab Level 7 (Redakteure und Admins) können beliebig viele&lt;br /&gt;
Fragen stellen.&lt;br /&gt;
&lt;br /&gt;
- Labels sind jetzt: &amp;quot;Hinterlasse einen Beitrag&amp;quot; und &amp;quot;Beitrag abschicken&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Grüße,&lt;br /&gt;
&lt;br /&gt;
Stephan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
11&lt;br /&gt;
&lt;br /&gt;
10/2014&lt;br /&gt;
* Kommentare in Spalten sortieren, je nach Antwort&lt;br /&gt;
* CSS Overflow auf auto setzen, damit bei langen Kommentaren ein Scrollbalken kommt. Dafür maximale Höhe für Kommentarausgabe, damit die Felder optisch nicht zu groß werden&lt;br /&gt;
&lt;br /&gt;
2016 - 04&lt;br /&gt;
* Neues Template für mehr Antwortoptionen. Kommentare werden untereinander (nicht in Spalten) dargestellt&lt;br /&gt;
* Einträge bei denen der User die nur den Namen ausfüllen aber nichts im Kommentarfeld schreiben werden nicht mehr angezeigt&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Abstimmung_wordpress&amp;diff=22639</id>
		<title>Abstimmung wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Abstimmung_wordpress&amp;diff=22639"/>
		<updated>2017-11-30T10:14:55Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;siehe auch [[DEKRA Direkt Blog]]&lt;br /&gt;
Der Blog &amp;#039;&amp;#039;&amp;#039;DEKRA Direkt&amp;#039;&amp;#039;&amp;#039; wird als interner Konzernblog verwendet und soll als Kontaktmittel der Mitarbeiter zur Vorstandsebene dienen. Dazu gibt es unter anderem die DEKRA Direkt Mitarbeiter Umfrage.&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
=== Ablauf 2017 ===&lt;br /&gt;
* Poll anlegen (alten kopieren - Datum Template und Blocking wird nicht kopiert und muß gesetzt werden)&lt;br /&gt;
** View Results auf after Vote&lt;br /&gt;
** Blocking by Cookie&lt;br /&gt;
** Datum (Startdatum &lt;br /&gt;
** Template (Kommentar)&lt;br /&gt;
* Testbeitrag anlegen&lt;br /&gt;
** Kategorie Test&lt;br /&gt;
** Später Kategorie ändern&lt;br /&gt;
&lt;br /&gt;
== Todo ==&lt;br /&gt;
* Backendanzeige der Votes ist Buggy&lt;br /&gt;
* Besser zum Testen wäre es wenn die Umfrage zunächst in eine Kategorie Test geht die auf der Startseite nicht dargestellt wird. - OK ist über Plugin realisiert.&lt;br /&gt;
&lt;br /&gt;
Wordpress Extension Yop Poll - verwendet bei Mascha im Blog intern:&lt;br /&gt;
&lt;br /&gt;
== yop poll Anpassungen ==&lt;br /&gt;
=== yop poll Tabellen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
------------                -----------------                 --------------&lt;br /&gt;
yop_polls                   yop_poll_answers                  yop_poll_logs&lt;br /&gt;
------------                -----------------                 --------------&lt;br /&gt;
id          --------------| id               --------------|  id&lt;br /&gt;
name                      |-poll_id                        |  pn&lt;br /&gt;
question                    answer                         |  poll_id&lt;br /&gt;
total_votes                 votes                          |  vote_id&lt;br /&gt;
total_answers               ...                            |- answer_id&lt;br /&gt;
...                                                           --------------&lt;br /&gt;
------------                -----------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----------------------      ----------------------------&lt;br /&gt;
yop_poll_custom_fields      yop_poll_votes_custom_fields&lt;br /&gt;
----------------------      ----------------------------&lt;br /&gt;
id                          id&lt;br /&gt;
poll_id                     poll_id&lt;br /&gt;
custom_field                vote_id&lt;br /&gt;
...                         custom_field_id&lt;br /&gt;
----------------------      user_id&lt;br /&gt;
                            custom_field_value&lt;br /&gt;
                            ----------------------------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da bei einem custom text field bei der fragesstellung nur einzeiliger text möglich war, musst die datei &lt;br /&gt;
 /wp-content/plugins/yop-poll/inc/yop_poll_model.php&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In der datenbank die Tabelle:&lt;br /&gt;
&lt;br /&gt;
 kas_wp_yop_poll_votes_custom_fields&lt;br /&gt;
&lt;br /&gt;
Feld: custom_field_value&lt;br /&gt;
&lt;br /&gt;
von varchar (255) auf Text geändert.&lt;br /&gt;
&lt;br /&gt;
== SQL-Abfragen für Antworten mit Kommentar ==&lt;br /&gt;
=== SQL nur Ergebnisse ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT `id` , `poll_id` , `answer_id` , `ip` , `http_referer` , `vote_date` , `pn`&lt;br /&gt;
FROM `kas_wp_yop_poll_logs`&lt;br /&gt;
WHERE `poll_id` =38&lt;br /&gt;
ORDER BY `answer_id` ASC&lt;br /&gt;
LIMIT 0 , 500&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== SQL Abfrage mit Kommentaren ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alte Abfrage&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT *&lt;br /&gt;
FROM `kas_wp_yop_poll_logs`&lt;br /&gt;
LEFT OUTER JOIN `kas_wp_yop_poll_votes_custom_fields` ON `kas_wp_yop_poll_logs`.`vote_id` = `kas_wp_yop_poll_votes_custom_fields`.`vote_id`&lt;br /&gt;
WHERE `kas_wp_yop_poll_logs`.`poll_id` =13&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Weitere Abfragen ===&lt;br /&gt;
Welche Custom Fields gehören zu welchen Umfrage (Pivot Version)&lt;br /&gt;
&lt;br /&gt;
Dynamische Version (funktioniert noch nicht aber die Richtung dürfte stimmen)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET @sql = NULL;&lt;br /&gt;
SELECT&lt;br /&gt;
  GROUP_CONCAT(DISTINCT&lt;br /&gt;
    CONCAT(&lt;br /&gt;
      &amp;#039;max(case when custom_field = &amp;#039;&amp;#039;&amp;#039;,&lt;br /&gt;
      custom_field,&lt;br /&gt;
      &amp;#039;&amp;#039;&amp;#039; then custom_field end) AS &amp;#039;,&lt;br /&gt;
      custom_field&lt;br /&gt;
    )&lt;br /&gt;
  ) INTO @sql&lt;br /&gt;
FROM kas_wp_yop_poll_custom_fields;&lt;br /&gt;
&lt;br /&gt;
SET @sql = CONCAT(&amp;#039;SELECT poll_id, &amp;#039;, @sql, &amp;#039; &lt;br /&gt;
                  FROM kas_wp_yop_poll_custom_fields &lt;br /&gt;
                  GROUP BY poll_id&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
PREPARE stmt FROM @sql;&lt;br /&gt;
EXECUTE stmt;&lt;br /&gt;
DEALLOCATE PREPARE stmt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Neue Umfrage für DEKRA Connect durchführen ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
Läuft 2 Wochen ab ca. Mitte des Monats. Danach Auswertung und Grafikerstellung.&lt;br /&gt;
==== Updates ====&lt;br /&gt;
 2015-10 - Umfrage nur mit Cookie check -&amp;gt; Mascha möchte keine Userunterbrechung. Später werden die Ergebnisse manuell gereinigt&lt;br /&gt;
&lt;br /&gt;
===== Infos zum Cookie Check =====&lt;br /&gt;
Wenn man mit Cookies kontrolliert, wie wir das im Moment machen, dann testet das Plugin immer ob für eine bestimmte Umfrage schon abgestimmt wurde. &amp;#039;&amp;#039;&amp;#039;Egal ob die Umfrage neu gestartet wurde&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Technisch wird dazu ein Cookie mit der ID der Umfrage hinterlegt. Dieses hat eine &amp;#039;&amp;#039;&amp;#039;Gültigkeitsdauer&amp;#039;&amp;#039;&amp;#039; (kann man einstellen z.B. 14 Tage). Solange das Cookie gültig ist kann man dann nicht mehr abstimmen.&lt;br /&gt;
&lt;br /&gt;
Das bedeutet &amp;#039;&amp;#039;&amp;#039;alle Browser die noch nicht abgestimmt haben können auch abstimmen&amp;#039;&amp;#039;&amp;#039; !&lt;br /&gt;
&lt;br /&gt;
Wenn du nochmal testen willst mußt du die Cookies löschen oder 14 Tage warten.&lt;br /&gt;
&lt;br /&gt;
Nochmal zur Info Vor und Nachteile der anderen Lösungen&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kontrolle über IP&amp;#039;&amp;#039;&amp;#039;: Vorteil recht zuverlässig schwer zu umgehen. Nachteil: wenn Benutzer mit der gleichen IP ankommen kann es sein dass einer nicht abstimmen kann.&lt;br /&gt;
&lt;br /&gt;
* Über die &amp;#039;&amp;#039;&amp;#039;Personalnummer&amp;#039;&amp;#039;&amp;#039; Vorteil: Sehr Zuverlässig. Nachteil: Schlechte User Experience&lt;br /&gt;
&lt;br /&gt;
== Technischer Ablauf ==&lt;br /&gt;
Stand 2017&lt;br /&gt;
* Block by Cookie&lt;br /&gt;
&lt;br /&gt;
Stand März 2015 (obsolete)&lt;br /&gt;
&lt;br /&gt;
* Das Umfrage Plugin im WP ist auf &amp;#039;&amp;#039;&amp;#039;block by Personal Number&amp;#039;&amp;#039;&amp;#039; gestellt. -&amp;gt; Ab 2016 nur noch &amp;#039;&amp;#039;&amp;#039;by Cookie&amp;#039;&amp;#039;&amp;#039;(siehe oben)&lt;br /&gt;
* obsolete -&amp;gt; Ein User kann nur Voten wenn eine id=12345 (Personalnummer) angehängt ist. Ansonsten wird zunächst auf das DEKRA Intranet weiter geleitet (über alert). &lt;br /&gt;
* Dort wird die Personalnummer als id=12345 an den Link angehängt und auf intern-blog.dekra.de/category/dekra-direkt/?id=12345 geleitet Nur wenn eine solche id vorhanden ist kann gevoted werden. Ist nicht supersicher weil die Nummer willkürlich geändert werden kann, nachträgliche Prüfung wäre mit Personalnummern Liste möglich. Verbesserungspotential wäre POST übermittlung, Gültigkeitsprüfung durch PN-Index oder Formel.&lt;br /&gt;
* Hat die id &amp;#039;&amp;#039;&amp;#039;schon gevotet&amp;#039;&amp;#039;&amp;#039; wird nur das Ergebnis angezeigt.&lt;br /&gt;
* Im DEKRA Intranet werden Links an die eine id angehängt werden soll mit dem Parameter &amp;#039;&amp;#039;&amp;#039;?id=public&amp;#039;&amp;#039;&amp;#039; Veröffentlicht. public wird dann automatisch durch die Personalnummer des Mitarbeiters ersetzt, bevor weitergeleitet wird. &lt;br /&gt;
&lt;br /&gt;
=== Umfrage erstellen ===&lt;br /&gt;
* Achtung manchmal kollidiert die Abfrage mit alten Cookies der letzten Umfrage. Genau ist das noch nicht geklärt. Hilfe bringt: &lt;br /&gt;
** dafür sorgen, daß die alte Umfrage nicht mit angezeigt wird&lt;br /&gt;
** Logs löschen&lt;br /&gt;
** Wenn nichts hilft die Stats Reseten (kann sein daß dies nicht nötig ist.)&lt;br /&gt;
&lt;br /&gt;
* 1 oder mehrere (Mascha will meist 3) Umfragen-Dummies erstellen (z.B. eine alte klonen - &amp;#039;&amp;#039;&amp;#039;Vorsicht: Einstellungen für Datum, Template und Blocking&amp;#039;&amp;#039;&amp;#039; werden nicht übernommen)&lt;br /&gt;
* Template: &amp;#039;&amp;#039;&amp;#039;DEKRA Umfrage mit Kommentar&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
** Mit dem Template &amp;#039;&amp;#039;&amp;#039;DEKRA Umfrage mit dynamischem Kommentar&amp;#039;&amp;#039;&amp;#039; kann man zusätzlich noch JavaScript Popups öffnen und auf die gewählte Antwort reagieren (siehe JS im Template)&lt;br /&gt;
** Das Template &amp;#039;&amp;#039;&amp;#039;Umfrage mit mehr Antworten&amp;#039;&amp;#039;&amp;#039; erlaubt mehr als zwei Antwortmöglichkeiten. Die Kommentare werden dann untereinander dargestellt. Das ist zugleich auch das sicherste Template, was die Darstellung angeht.&lt;br /&gt;
* Blocking by auf &amp;#039;&amp;#039;&amp;#039;Personal Number&amp;#039;&amp;#039;&amp;#039; - dadurch wird die Abfrage des id Parameters gestartet. Zum Testen auf don&amp;#039;t Block stellen. Achtung IE hat manchmal Caching Probleme.&lt;br /&gt;
* Start und Enddatum setzen&lt;br /&gt;
* Abstimmung in einen &amp;#039;&amp;#039;&amp;#039;Beitrag in Kategorie Dekra Direkt&amp;#039;&amp;#039;&amp;#039; einpflegen (evtl. erst nach dem Testen) -&amp;gt; Startseite sichtbar&lt;br /&gt;
* Am Ende Umfrage auf &amp;#039;&amp;#039;&amp;#039;nur Antwort&amp;#039;&amp;#039;&amp;#039; !&lt;br /&gt;
* Geo-bit erstellt die Fragen, diese werden von Mascha angepasst und von Ihr in einem Beitrag veröffentlicht.&lt;br /&gt;
* Start der Umfrage durch setzen der Kategorie (todo ob das klappt)&lt;br /&gt;
&lt;br /&gt;
=== Test der Umfrage ===&lt;br /&gt;
* Vorige Tests sind sinnvoll. Ein Test von Geo-bit (einfach id anhängen). Ein Test von Dekra&lt;br /&gt;
=== Ende der Umfrage und Auswertung ===&lt;br /&gt;
Für die Auswertung benötigt Mascha eine &amp;#039;&amp;#039;&amp;#039;Excel-Tabelle&amp;#039;&amp;#039;&amp;#039; in der &amp;#039;&amp;#039;&amp;#039;nach Antworten und sortiert&amp;#039;&amp;#039;&amp;#039; ist. Ebenso die dazugehörigen Kommentare. Doppelte IPs rausschmeißen. Wenn Personalnummerliste vorhanden könnte man hier nach Gültigkeit prüfen.&lt;br /&gt;
* Umfrage mit Datum beenden oder auf Maschas Hinweis, &amp;#039;&amp;#039;&amp;#039;Umfrage auf don&amp;#039;t block&amp;#039;&amp;#039;&amp;#039;, damit die Umleitung auf Dekra nicht mehr aktiv ist, außerdem &amp;#039;&amp;#039;&amp;#039;Enddatum setzen&amp;#039;&amp;#039;&amp;#039; und auf &amp;#039;&amp;#039;&amp;#039;Ergebnis anzeigen nach Enddatum&amp;#039;&amp;#039;&amp;#039;. Endzeit etwas zurücksetzen, da manchmal die Serverzeit um ein paar Stunden differiert.&lt;br /&gt;
* SQL Abfrage (siehe Statement), Export als ods oder csv&lt;br /&gt;
* Doppelte überprüfen&lt;br /&gt;
* Umwandeln in Excel&lt;br /&gt;
* Schaubild aus Numbers&lt;br /&gt;
&lt;br /&gt;
=== Löschen unerwünschter Kommentare ===&lt;br /&gt;
&lt;br /&gt;
In&lt;br /&gt;
 Admin -&amp;gt; Yop poll -&amp;gt; All polls -&amp;gt; meineUmfrage -&amp;gt; votes&lt;br /&gt;
&lt;br /&gt;
hier auswählen und löschen&lt;br /&gt;
&lt;br /&gt;
Problem: die Kommentare werden nicht mehr angezeigt. TODO&lt;br /&gt;
&lt;br /&gt;
=== Anpassungen  am Plugin Yop poll===&lt;br /&gt;
&lt;br /&gt;
 yop-poll =&amp;gt; inc =&amp;gt; admin.php&lt;br /&gt;
&lt;br /&gt;
Hier die DB mit prefix versehen. &amp;quot;kas_&amp;quot;&lt;br /&gt;
 yop-poll =&amp;gt; inc =&amp;gt; yop_poll_model.php&lt;br /&gt;
 yop-poll =&amp;gt; inc =&amp;gt; db_schema.php&lt;br /&gt;
 yop-poll =&amp;gt; js =&amp;gt; yop_poll_public.js&lt;br /&gt;
==== Kommentare ====&lt;br /&gt;
MUSS überarbeitet werden&lt;br /&gt;
 yop_poll_modell.php&lt;br /&gt;
&lt;br /&gt;
 return_poll_html -&amp;gt; &lt;br /&gt;
dort wird der Template Block  		&lt;br /&gt;
 [ANSWER_RESULT_CONTAINER]&lt;br /&gt;
 [/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
mit pregreplace über eine Callback Funktion ersetzt&lt;br /&gt;
 answer_result_callback(m$)&lt;br /&gt;
darin wiederum wird &lt;br /&gt;
 get_poll_comments($poll_id) &lt;br /&gt;
aufgerufen, dieses gibt ein array zurück das dann in HTML umgesetzt wird. Diese Ausgabe erfolbt über die Abfrage von &lt;br /&gt;
 $this-&amp;gt;is_view_poll_results()&lt;br /&gt;
Das bedeutet die Ausgabe erfolgt wenn im Backend die Bedingung für die Ausgabe der Results gesetzt ist (z.B. Results after End Date) Gute erweiterung wäre ein eigener Block für die Comments&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Im Template muß der Block natürlich auch gesetzt sein.&amp;#039;&amp;#039;&amp;#039; (beim entsprechenden Template)&lt;br /&gt;
&lt;br /&gt;
Problem: Die Ausgabe erfolgt nur wenn die Logs der Umfrage nicht gelöscht sind.&lt;br /&gt;
Ausgabe der Kommentare bisher&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT yp.id,yp.name,yp.question,ypa.answer,ypvcf.custom_field_value,ypcf.custom_field,ypl.vote_id FROM kas_wp_yop_polls yp &lt;br /&gt;
JOIN kas_wp_yop_poll_custom_fields ypcf ON (yp.id=ypcf.poll_id) &lt;br /&gt;
JOIN kas_wp_yop_poll_votes_custom_fields ypvcf ON (ypcf.id = ypvcf.custom_field_id)&lt;br /&gt;
JOIN kas_wp_yop_poll_logs ypl ON (ypvcf.vote_id = ypl.vote_id)&lt;br /&gt;
JOIN kas_wp_yop_poll_answers ypa ON (ypl.answer_id = ypa.id)&lt;br /&gt;
WHERE yp.id=[pollID] AND ypl.answer_id=[answerID];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Abfrage wird für jede Antwort (answer_id) ausgeführt. Aus den Logs wird die answer_id geholt. Wenn diese im Log fehlt wird nichts zurückgegeben.&lt;br /&gt;
Wie kann man die Zuordnung Kommentar - answer_id noch herstellen? answer_id und vote_id stehen auch in yop_poll_voters, vote_id steht auch in yop_poll_votes_custom_fields&lt;br /&gt;
Also statt mit wp_yop_poll_logs joint man mit yop_poll_voters.&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT yp.id, yp.name, yp.question, ypa.answer, ypvcf.custom_field_value, ypcf.custom_field, ypv.vote_id&lt;br /&gt;
FROM kas_wp_yop_polls yp&lt;br /&gt;
JOIN kas_wp_yop_poll_custom_fields ypcf ON ( yp.id = ypcf.poll_id )&lt;br /&gt;
JOIN kas_wp_yop_poll_votes_custom_fields ypvcf ON ( ypcf.id = ypvcf.custom_field_id )&lt;br /&gt;
JOIN kas_wp_yop_poll_voters ypv ON ( ypvcf.vote_id = ypv.vote_id )&lt;br /&gt;
JOIN kas_wp_yop_poll_answers ypa ON ( ypv.answer_id = ypa.id )&lt;br /&gt;
WHERE yp.id =50&lt;br /&gt;
AND ypv.answer_id =113&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Yop Poll Templates ==&lt;br /&gt;
Todo - Anpassen um ungenutzte Features zu nutzen (z.B. after End Date schöne Anzeige der Ergebnisse)&lt;br /&gt;
=== DEKRA Umfrage mit Kommentar ===&lt;br /&gt;
Vor Umfrage:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot; style=&amp;quot;display:table-cell;height:130px;vertical-align:middle;&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ul&amp;gt;&lt;br /&gt;
		[ANSWER_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-answer-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			%POLL-ANSWER-CHECK-INPUT% &lt;br /&gt;
			%POLL-ANSWER-LABEL%&lt;br /&gt;
			&amp;lt;span class=&amp;quot;yop-poll-results-text-%POLL-ID%&amp;quot;&amp;gt;%POLL-ANSWER-RESULT-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
             %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
        &amp;lt;/li&amp;gt;&lt;br /&gt;
        [/ANSWER_CONTAINER]&lt;br /&gt;
		[OTHER_ANSWER_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-answer-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			%POLL-OTHER-ANSWER-CHECK-INPUT% &lt;br /&gt;
			%POLL-OTHER-ANSWER-LABEL% &lt;br /&gt;
			&amp;lt;span class=&amp;quot;yop-poll-results-text-%POLL-ID%&amp;quot;&amp;gt;%POLL-ANSWER-RESULT-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
			%POLL-OTHER-ANSWER-TEXT-INPUT% &lt;br /&gt;
            %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
        &amp;lt;/li&amp;gt;&lt;br /&gt;
        [/OTHER_ANSWER_CONTAINER]&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-custom-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ul&amp;gt;&lt;br /&gt;
		[CUSTOM_FIELD_CONTAINER]&lt;br /&gt;
		&amp;lt;li&amp;gt;%POLL-CUSTOM-FIELD-LABEL% %POLL-CUSTOM-FIELD-TEXT-INPUT%&amp;lt;/li&amp;gt;&lt;br /&gt;
		[/CUSTOM_FIELD_CONTAINER]&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;    &lt;br /&gt;
[CAPTCHA_CONTAINER]&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-captcha-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;yop-poll-captcha-image-div&amp;quot; id=&amp;quot;yop-poll-captcha-image-div-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
        %CAPTCHA-IMAGE%&lt;br /&gt;
        &amp;lt;div class=&amp;quot;yop-poll-captcha-helpers-div&amp;quot; id=&amp;quot;yop-poll-captcha-helpers-div-%POLL-ID%&amp;quot;&amp;gt;%RELOAD-CAPTCHA-IMAGE% &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;yop_poll_clear&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    %CAPTCHA-LABEL%&lt;br /&gt;
    &amp;lt;div class=&amp;quot;yop-poll-captcha-input-div&amp;quot; id=&amp;quot;yop-poll-captcha-input-div-%POLL-ID%&amp;quot;&amp;gt;%CAPTCHA-INPUT%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[/CAPTCHA_CONTAINER]&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-vote-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-footer&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-VOTE-BUTTON%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;yop-poll-results-%POLL-ID%&amp;quot;&amp;gt;%POLL-VIEW-RESULT-LINK%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-ANSWERS%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-VOTES%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nach Umfrage&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot; style=&amp;quot;display:table-cell;height:130px;vertical-align:middle;&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;div id=&amp;quot;gb_cust&amp;quot;&amp;gt;VORLÄUFIGES·ERGEBNIS·DER·ABSTIMMUNG&amp;lt;/div&amp;gt;	&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
		[ANSWER_RESULT_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;label class=&amp;quot;pds-feedback-label-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;pds-answer-text-%POLL-ID%&amp;quot;&amp;gt;%POLL-ANSWER-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;pds-feedback-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;span class=&amp;quot;pds-feedback-per-%POLL-ID%&amp;quot;&amp;gt; %POLL-ANSWER-RESULT-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/label&amp;gt;&lt;br /&gt;
			&amp;lt;div&amp;gt;&lt;br /&gt;
             %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
           &amp;lt;/div&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		[/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-vote-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-footer&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-ANSWERS%&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-VOTES%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;yop-poll-back-%POLL-ID%&amp;quot;&amp;gt;%POLL-BACK-TO-VOTE-LINK%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before Start Date&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This poll is about to &amp;lt;br&amp;gt;&lt;br /&gt;
start at %POLL-START-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
and finish at %POLL-END-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After End Date&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;gb_end&amp;quot;&amp;gt;Die Abstimmung ist beendet.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul class=&amp;quot;afterVote&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		[ANSWER_RESULT_CONTAINER]&lt;br /&gt;
		&lt;br /&gt;
		[/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
CSS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#yop-poll-container-%POLL-ID% {&lt;br /&gt;
    background-image: url(&amp;quot;http://intern-blog.dekra.de/wp-content/uploads/2013/02/bg_poll_1.png&amp;quot;);&lt;br /&gt;
/*    border: 5px solid #3F8B43;*/&lt;br /&gt;
background-repeat:no-repeat;&lt;br /&gt;
    color: #555555;&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    padding: 10px;&lt;br /&gt;
    width: 632px;&lt;br /&gt;
/*    height: 300px;*/&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-name-%POLL-ID% {&lt;br /&gt;
	font-size:14px;&lt;br /&gt;
	font-weight:bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-question-%POLL-ID% {&lt;br /&gt;
    color: #000000;&lt;br /&gt;
    font-size: 14pt;&lt;br /&gt;
    font-weight: 500;&lt;br /&gt;
    height: 80px;&lt;br /&gt;
    line-height: 26px;&lt;br /&gt;
    margin: 0 50px 0 0;&lt;br /&gt;
    padding-left: 215px;&lt;br /&gt;
    padding-top: 40px;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    width: 300px;&lt;br /&gt;
margin-bottom: 100px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-answers-%POLL-ID% { &lt;br /&gt;
 }&lt;br /&gt;
#yop-poll-answers-%POLL-ID% ul {&lt;br /&gt;
    list-style: none outside none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: 20px;&lt;br /&gt;
    left: 270px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-answers-%POLL-ID% ul li { &lt;br /&gt;
	font-style:normal;&lt;br /&gt;
	margin-bottom:10px;&lt;br /&gt;
	padding:0px;&lt;br /&gt;
	font-size:12px;&lt;br /&gt;
   width: 190px !important;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-answers-%POLL-ID% ul li input { &lt;br /&gt;
	margin:0px; &lt;br /&gt;
	float:none;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-answers-%POLL-ID% ul li label { &lt;br /&gt;
	margin:0px; &lt;br /&gt;
	font-style:normal; &lt;br /&gt;
	font-weight:bold; &lt;br /&gt;
	font-size:16px; &lt;br /&gt;
	float:none;&lt;br /&gt;
        z-index: 10; &lt;br /&gt;
}&lt;br /&gt;
.yop-poll-results-%POLL-ID% {&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    margin-left: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-custom-%POLL-ID% {  }&lt;br /&gt;
#yop-poll-custom-%POLL-ID% ul {&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 500;&lt;br /&gt;
    left: 270px;&lt;br /&gt;
    list-style: none outside none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: 20px;&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 375px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-custom-%POLL-ID% ul li { &lt;br /&gt;
	padding:0px;&lt;br /&gt;
	margin:0px;	&lt;br /&gt;
	font-size:14px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-container-%POLL-ID% input[type=&amp;#039;text&amp;#039;] { &lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    margin: 10px 0;&lt;br /&gt;
    padding: 2%;&lt;br /&gt;
    text-indent: 2%;&lt;br /&gt;
    width: 92%;&lt;br /&gt;
    border: 1px solid #B9B8B8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-container-%POLL-ID% textarea {&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    margin: 10px 0;&lt;br /&gt;
    padding: 2%;&lt;br /&gt;
    text-indent: 2%;&lt;br /&gt;
    width: 92%;&lt;br /&gt;
    font-family: Verdana;&lt;br /&gt;
    color: #666;&lt;br /&gt;
    border: 1px solid #B9B8B8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-captcha-input-div-%POLL-ID% {&lt;br /&gt;
margin-top:5px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-captcha-helpers-div-%POLL-ID% {&lt;br /&gt;
width:30px;&lt;br /&gt;
float:left;&lt;br /&gt;
margin-left:5px;&lt;br /&gt;
height:0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-captcha-helpers-div-%POLL-ID% img {&lt;br /&gt;
margin-bottom:2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-captcha-image-div-%POLL-ID% {&lt;br /&gt;
margin-bottom:5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop_poll_captcha_image_%POLL-ID% {&lt;br /&gt;
float:left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.yop_poll_clear {&lt;br /&gt;
clear:both;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#yop-poll-vote-%POLL-ID% {&lt;br /&gt;
float:left; &lt;br /&gt;
/*width:100%; */&lt;br /&gt;
padding-left: 270px;&lt;br /&gt;
margin-top: 20px;&lt;br /&gt;
margin-bottom: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
li.yop-poll-li-result-%POLL-ID% {&lt;br /&gt;
/*    margin-top: 50px;*/&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.yop-poll-results-bar-%POLL-ID% { background:#f5f5f5; height:10px;  }&lt;br /&gt;
.yop-poll-results-bar-%POLL-ID% div { background:#555; height:10px; }&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div#yop-poll-vote-%POLL-ID% button { float:left; }&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div#yop-poll-results-%POLL-ID% {&lt;br /&gt;
    float: right;&lt;br /&gt;
    margin-bottom: 20px;&lt;br /&gt;
    margin-top: -20px;&lt;br /&gt;
    width: auto;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div#yop-poll-results-%POLL-ID% a { color:#3F8B43; text-decoration:underline; font-size:12px;}&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div#yop-poll-back-%POLL-ID% a { color:#3F8B43; text-decoration:underline; font-size:12px;}&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div { float:left; width:100%; }&lt;br /&gt;
&lt;br /&gt;
#yop-poll-container-error-%POLL-ID% {&lt;br /&gt;
	font-size:12px;&lt;br /&gt;
	font-style:italic;&lt;br /&gt;
	color:red;&lt;br /&gt;
    left: 290px;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: 270px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.gb-btn {&lt;br /&gt;
    background-image: url(&amp;quot;http://intern-blog.dekra.de/wp-content/uploads/2013/02/bg_button.png&amp;quot;);&lt;br /&gt;
    border: medium none;&lt;br /&gt;
    border-radius: 10px 10px 10px 10px;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    font-size: 1.9em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    height: 40px;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    width: 130px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#gb_cust {&lt;br /&gt;
    color: #999999;&lt;br /&gt;
    font-size: 1.4em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    padding-left: 0px;&lt;br /&gt;
    padding-top: 40px;&lt;br /&gt;
    background-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
.yop-poll-results-bar-%POLL-ID% div{&lt;br /&gt;
    background-image: url(&amp;quot;http://intern-blog.dekra.de/wp-content/uploads/2013/02/bg_button.png&amp;quot;);&lt;br /&gt;
    height: 30px;&lt;br /&gt;
    margin-top: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.yop-poll-results-bar-%POLL-ID% {&lt;br /&gt;
height: 30px;&lt;br /&gt;
width:99%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pds-answer-text-%POLL-ID% {&lt;br /&gt;
font-size: 0.85em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
color: #999;&lt;br /&gt;
/*    margin-top: -10px;*/&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pds-feedback-per-%POLL-ID% {&lt;br /&gt;
   color: #999999;&lt;br /&gt;
    font-size: 1em;&lt;br /&gt;
    margin-left: 5px;&lt;br /&gt;
    margin-top: -25px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.yop_poll_vote_button{&lt;br /&gt;
    background-image: url(&amp;quot;http://intern-blog.dekra.de/wp-content/uploads/2013/02/bg_button.png&amp;quot;);&lt;br /&gt;
    border: medium none;&lt;br /&gt;
    border-radius: 10px 10px 10px 10px;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    font-size: 1.9em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    height: 40px;&lt;br /&gt;
    width: 250px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#gb_end {&lt;br /&gt;
    color: #999999;&lt;br /&gt;
    font-size: 1.4em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    padding-bottom: 100px;&lt;br /&gt;
    padding-left: 250px;&lt;br /&gt;
    padding-top: 130px;&lt;br /&gt;
    background-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-container-%POLL-ID% textarea {&lt;br /&gt;
#max-width: 350px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-container-success-%POLL-ID% {&lt;br /&gt;
	font-size:12px;&lt;br /&gt;
	font-style:italic;&lt;br /&gt;
	color:green;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
JS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function stripBorder_%POLL-ID%(object) {&lt;br /&gt;
	object.each(function() {&lt;br /&gt;
			if( parseInt(jQuery(this).width() ) &amp;gt; 0) {&lt;br /&gt;
				jQuery(this).width( parseInt( jQuery(this).width() ) - parseInt(jQuery(this).css(&amp;quot;border-left-width&amp;quot;)) - parseInt(jQuery(this).css(&amp;quot;border-right-width&amp;quot;)) );&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				jQuery(this).css(&amp;quot;border-left-width&amp;quot;, &amp;#039;0px&amp;#039;);&lt;br /&gt;
				jQuery(this).css(&amp;quot;border-right-width&amp;quot;, &amp;#039;0px&amp;#039;);&lt;br /&gt;
			}&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
function stripPadding_%POLL-ID%(object) {&lt;br /&gt;
	object.each(function() { &lt;br /&gt;
			jQuery(this).width( parseInt( jQuery(this).width() ) - parseInt(jQuery(this).css(&amp;quot;padding-left&amp;quot;)) - parseInt(jQuery(this).css(&amp;quot;padding-left&amp;quot;)) );&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function strip_results_%POLL-ID%() {&lt;br /&gt;
        stripPadding_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop_poll_li_result-%POLL-ID%&amp;quot;) );   &lt;br /&gt;
	stripBorder_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-result-bar-%POLL-ID%&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
jQuery(document).ready(function(e) {&lt;br /&gt;
                if(typeof window.strip_results_%POLL-ID% == &amp;#039;function&amp;#039;) &lt;br /&gt;
			strip_results_%POLL-ID%();&lt;br /&gt;
    &lt;br /&gt;
		if(typeof window.tabulate_answers_%POLL-ID% == &amp;#039;function&amp;#039;) &lt;br /&gt;
			tabulate_answers_%POLL-ID%();&lt;br /&gt;
		&lt;br /&gt;
		if(typeof window.tabulate_results_%POLL-ID% == &amp;#039;function&amp;#039;) &lt;br /&gt;
			tabulate_results_%POLL-ID%();&lt;br /&gt;
		&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
function equalWidth_%POLL-ID%(obj, cols, findWidest ) {&lt;br /&gt;
 findWidest  = typeof findWidest  !== &amp;#039;undefined&amp;#039; ? findWidest  : false;&lt;br /&gt;
    if ( findWidest ) {&lt;br /&gt;
		obj.each(function() {&lt;br /&gt;
				var thisWidth = jQuery(this).width();&lt;br /&gt;
				width = parseInt(thisWidth / cols); &lt;br /&gt;
				jQuery(this).width(width);	&lt;br /&gt;
				jQuery(this).css(&amp;#039;float&amp;#039;, &amp;#039;left&amp;#039;);	&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		var widest = 0;&lt;br /&gt;
		obj.each(function() {&lt;br /&gt;
				var thisWidth = jQuery(this).width();&lt;br /&gt;
				if(thisWidth &amp;gt; widest) {&lt;br /&gt;
					widest = thisWidth; &lt;br /&gt;
				}	&lt;br /&gt;
		});&lt;br /&gt;
		width = parseInt( widest / cols); &lt;br /&gt;
		obj.width(width);	&lt;br /&gt;
		obj.css(&amp;#039;float&amp;#039;, &amp;#039;left&amp;#039;);	&lt;br /&gt;
	}	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function tabulate_answers_%POLL-ID%() {&lt;br /&gt;
	equalWidth_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-li-answer-%POLL-ID%&amp;quot;), %ANSWERS-TABULATED-COLS% );&lt;br /&gt;
        //equalWidth_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-li-answer-%POLL-ID% .yop-poll-results-bar-%POLL-ID% div &amp;quot;), %ANSWERS-TABULATED-COLS%, true );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function tabulate_results_%POLL-ID%() {&lt;br /&gt;
	equalWidth_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-li-result-%POLL-ID%&amp;quot;), %RESULTS-TABULATED-COLS% );&lt;br /&gt;
        //equalWidth_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-li-result-%POLL-ID% .yop-poll-results-bar-%POLL-ID% div &amp;quot;), %RESULTS-TABULATED-COLS%, true );&lt;br /&gt;
}&lt;br /&gt;
			jQuery(document).ready(function(){&lt;br /&gt;
				runOnPollStateChange_%POLL-ID%();&lt;br /&gt;
				});&lt;br /&gt;
&lt;br /&gt;
			function runOnPollStateChange_%POLL-ID%() {};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Dekra Poll Template für ID 2 (altes Template) ===&lt;br /&gt;
Vor Umfrage&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;gb_cust&amp;quot;&amp;gt;STIMMEN SIE JETZT AB !&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;ul&amp;gt;&lt;br /&gt;
    [ANSWER_CONTAINER]&lt;br /&gt;
    &amp;lt;li class=&amp;quot;gb-ac yop-poll-li-answer-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
      %POLL-ANSWER-CHECK-INPUT% &lt;br /&gt;
      %POLL-ANSWER-LABEL%&lt;br /&gt;
      &amp;lt;span class=&amp;quot;yop-poll-results-text-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
        %POLL-ANSWER-RESULT-LABEL%&lt;br /&gt;
      &amp;lt;/span&amp;gt;&lt;br /&gt;
      %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    [/ANSWER_CONTAINER]&lt;br /&gt;
    [OTHER_ANSWER_CONTAINER]&lt;br /&gt;
    &amp;lt;li class=&amp;quot;gb-oac yop-poll-li-answer-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
      %POLL-OTHER-ANSWER-CHECK-INPUT% &lt;br /&gt;
      %POLL-OTHER-ANSWER-LABEL% &lt;br /&gt;
      &amp;lt;span class=&amp;quot;yop-poll-results-text-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
        %POLL-ANSWER-RESULT-LABEL%&lt;br /&gt;
      &amp;lt;/span&amp;gt;&lt;br /&gt;
      %POLL-OTHER-ANSWER-TEXT-INPUT% &lt;br /&gt;
      %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    [/OTHER_ANSWER_CONTAINER]&lt;br /&gt;
  &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[CUSTOM_FIELD_CONTAINER]&lt;br /&gt;
		&amp;lt;li&amp;gt;%POLL-CUSTOM-FIELD-LABEL% %POLL-CUSTOM-FIELD-TEXT-INPUT%&amp;lt;/li&amp;gt;&lt;br /&gt;
		[/CUSTOM_FIELD_CONTAINER]&lt;br /&gt;
[CAPTCHA_CONTAINER]&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-captcha-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;yop-poll-captcha-image-div&amp;quot; id=&amp;quot;yop-poll-captcha-image-div-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
        %CAPTCHA-IMAGE%&lt;br /&gt;
        &amp;lt;div class=&amp;quot;yop-poll-captcha-helpers-div&amp;quot; id=&amp;quot;yop-poll-captcha-helpers-div-%POLL-ID%&amp;quot;&amp;gt;%RELOAD-CAPTCHA-IMAGE% &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;yop_poll_clear&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    %CAPTCHA-LABEL%&lt;br /&gt;
    &amp;lt;div class=&amp;quot;yop-poll-captcha-input-div&amp;quot; id=&amp;quot;yop-poll-captcha-input-div-%POLL-ID%&amp;quot;&amp;gt;%CAPTCHA-INPUT%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[/CAPTCHA_CONTAINER]&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-vote-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-footer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;poll-vote-button&amp;quot;&amp;gt;%POLL-VOTE-BUTTON%&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;%POLL-TOTAL-ANSWERS%&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;%POLL-TOTAL-VOTES%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;gb-storage&amp;quot; gb-poll-id=&amp;quot;%POLL-ID%&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Load check from Dean Edwards/Matthias Miller/John Resig&lt;br /&gt;
&lt;br /&gt;
function init() {&lt;br /&gt;
  if (arguments.callee.done) return;&lt;br /&gt;
  arguments.callee.done = true;&lt;br /&gt;
  if (_timer) clearInterval(_timer);&lt;br /&gt;
&lt;br /&gt;
  jQuery(document).ready(function() {&lt;br /&gt;
    // remove vote button&lt;br /&gt;
    jQuery(&amp;#039;.poll-vote-button&amp;#039;).html(&amp;#039;&amp;#039;);&lt;br /&gt;
    // add Buttons&lt;br /&gt;
    jQuery(&amp;#039;.gb-ac&amp;#039;).each(function(index,domEle){&lt;br /&gt;
      var answer_id;&lt;br /&gt;
      var label;&lt;br /&gt;
      var content;&lt;br /&gt;
      answer_id = jQuery(this).find(&amp;#039;input:first&amp;#039;).val();&lt;br /&gt;
      label = jQuery(this).find(&amp;#039;label:first&amp;#039;).html();&lt;br /&gt;
      content = &amp;#039;&amp;lt;button class=&amp;quot;gb-btn&amp;quot; value=&amp;quot;&amp;#039; + answer_id + &amp;#039;&amp;quot; type=&amp;quot;button&amp;quot;&amp;gt;&amp;#039; + label + &amp;#039;&amp;lt;/button&amp;gt;&amp;#039;;&lt;br /&gt;
      //jQuery(this).append(content);&lt;br /&gt;
      jQuery(this).html(content);&lt;br /&gt;
      //add click handler&lt;br /&gt;
      jQuery(this).find(&amp;#039;button:first&amp;#039;).click(function(){&lt;br /&gt;
        answer_id = jQuery(this).val();&lt;br /&gt;
        poll_id = jQuery(&amp;#039;.gb-storage:first&amp;#039;).attr(&amp;#039;gb-poll-id&amp;#039;);&lt;br /&gt;
        hidden_field = &amp;#039;&amp;lt;input id=&amp;quot;yop-poll-answer-&amp;#039; +answer_id + &amp;#039;&amp;quot; type=&amp;quot;hidden&amp;quot; name=&amp;quot;yop_poll_answer&amp;quot; value=&amp;quot;&amp;#039; + answer_id + &amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
        jQuery(this).after(hidden_field);&lt;br /&gt;
        yop_poll_do_vote(poll_id);&lt;br /&gt;
        return false;&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* for Mozilla/Opera9 */&lt;br /&gt;
if (document.addEventListener) {&lt;br /&gt;
  document.addEventListener(&amp;quot;DOMContentLoaded&amp;quot;, init, false);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* for Internet Explorer */&lt;br /&gt;
/*@cc_on @*/&lt;br /&gt;
/*@if (@_win32)&lt;br /&gt;
  document.write(&amp;quot;&amp;lt;script id=__ie_onload defer src=javascript:void(0)&amp;gt;&amp;lt;\/script&amp;gt;&amp;quot;);&lt;br /&gt;
  var script = document.getElementById(&amp;quot;__ie_onload&amp;quot;);&lt;br /&gt;
  script.onreadystatechange = function() {&lt;br /&gt;
    if (this.readyState == &amp;quot;complete&amp;quot;) {&lt;br /&gt;
      init(); // call the onload handler&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
/*@end @*/&lt;br /&gt;
&lt;br /&gt;
/* for Safari */&lt;br /&gt;
if (/WebKit/i.test(navigator.userAgent)) { // sniff&lt;br /&gt;
  var _timer = setInterval(function() {&lt;br /&gt;
    if (/loaded|complete/.test(document.readyState)) {&lt;br /&gt;
      init(); // call the onload handler&lt;br /&gt;
    }&lt;br /&gt;
  }, 10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* for other browsers */&lt;br /&gt;
window.onload = init;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nach Umfrage&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;gb_cust&amp;quot;&amp;gt;VORLÄUFIGES ERGEBNIS DER ABSTIMMUNG&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;ul&amp;gt;&lt;br /&gt;
		[ANSWER_RESULT_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;label class=&amp;quot;pds-feedback-label-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;pds-answer-text-%POLL-ID%&amp;quot;&amp;gt;%POLL-ANSWER-LABEL%&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;pds-feedback-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
					&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/label&amp;gt;&lt;br /&gt;
			&amp;lt;div&amp;gt;&lt;br /&gt;
             %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
           &amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;pds-feedback-per-%POLL-ID%&amp;quot;&amp;gt; %POLL-ANSWER-RESULT-LABEL%&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/li&amp;gt;&lt;br /&gt;
		[/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-vote-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-footer&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-ANSWERS%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-VOTES%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;!--&amp;lt;div id=&amp;quot;yop-poll-back-%POLL-ID%&amp;quot;&amp;gt;%POLL-BACK-TO-VOTE-LINK%&amp;lt;/div&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before Start Date&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This poll is about to &amp;lt;br&amp;gt;&lt;br /&gt;
start at %POLL-START-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
and finish at %POLL-END-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
After End Date&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This poll is closed!&lt;br /&gt;
Poll activity: &amp;lt;br&amp;gt;&lt;br /&gt;
start_date %POLL-START-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
end_date %POLL-END-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poll Results:&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-1&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ul&amp;gt;&lt;br /&gt;
		[ANSWER_RESULT_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;label class=&amp;quot;pds-feedback-label&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;pds-answer-text&amp;quot;&amp;gt;%POLL-ANSWER-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;pds-feedback-result&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;span class=&amp;quot;pds-feedback-per&amp;quot;&amp;gt; %POLL-ANSWER-RESULT-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/label&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;quot;pds-clear&amp;quot; style=&amp;quot;display: block;clear: both;height:1px;line-height:1px;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
	%POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
		&amp;lt;/li&amp;gt;&lt;br /&gt;
		[/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
%POLL-VOTE-BUTTON%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Generelle Prüfungen ===&lt;br /&gt;
* Custom Text Fields müssen für die Modifizierungen genau Custom Text Field 1	Kommentarund  Custom Text Field 2 Name lauten (Mascha verändert das manchmal)&lt;br /&gt;
 &lt;br /&gt;
=== Kommentare werden am Ende der Umfrage nicht angezeigt ===&lt;br /&gt;
* In der Umfrage muß bei Show results after Poll End Date oder zur Not auch Before Vote gewählt werden&lt;br /&gt;
* Im Template müssen die entsprechenden Felder im Bereich &amp;quot;Template after Poll End&amp;quot; vorhanden sein.&lt;br /&gt;
&lt;br /&gt;
== Change Log ==&lt;br /&gt;
=== Anpassungen für Admin Kommentare ===&lt;br /&gt;
2016-07&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Datenbanktabelle:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
--&lt;br /&gt;
-- Tabellenstruktur für Tabelle `kas_wp_yop_poll_admin_comments`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE IF NOT EXISTS `kas_wp_yop_poll_admin_comments` (&lt;br /&gt;
`id` int(10) unsigned NOT NULL,&lt;br /&gt;
  `vote_id` varchar(128) COLLATE latin1_general_ci NOT NULL,&lt;br /&gt;
  `comment` text COLLATE latin1_general_ci NOT NULL,&lt;br /&gt;
  `poll_id` int(11) NOT NULL&lt;br /&gt;
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=2 ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
db_schema.php Tabelle hinzufügen&lt;br /&gt;
admin.php Tabelle hinzufügen&lt;br /&gt;
yop_poll.php Tabelle hinzufügen&lt;br /&gt;
&lt;br /&gt;
answer_result_replace_callback -&amp;gt; &lt;br /&gt;
get_poll_comments -&amp;gt; admin kommentare dazufügen&lt;br /&gt;
&lt;br /&gt;
2016-06&lt;br /&gt;
Problem: Wenn Logs gelöscht sind werden keine Kommentare mehr angezeigt&lt;br /&gt;
Lösungsansatz. Leeres Ergebnis, weil ein Join über die vote_id zu den Logs geht.&lt;br /&gt;
8.8.13&lt;br /&gt;
&lt;br /&gt;
Hallo Mascha und Clemens,&lt;br /&gt;
&lt;br /&gt;
folgende Funktionalität ist jetzt implementiert:&lt;br /&gt;
&lt;br /&gt;
- Zu einem Hauptbeitrag (Sozusagen 1.Ebene - entspricht dem Post in&lt;br /&gt;
Wordpress) kann ein normaler Benutzer eine Frage stellen.&lt;br /&gt;
- Zu den Fragen (das wäre dann die 2. Ebene) kann jeder Benutzer&lt;br /&gt;
beliebig viele Beiträge machen&lt;br /&gt;
- Benutzer ab Level 7 (Redakteure und Admins) können beliebig viele&lt;br /&gt;
Fragen stellen.&lt;br /&gt;
&lt;br /&gt;
- Labels sind jetzt: &amp;quot;Hinterlasse einen Beitrag&amp;quot; und &amp;quot;Beitrag abschicken&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Grüße,&lt;br /&gt;
&lt;br /&gt;
Stephan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
11&lt;br /&gt;
&lt;br /&gt;
10/2014&lt;br /&gt;
* Kommentare in Spalten sortieren, je nach Antwort&lt;br /&gt;
* CSS Overflow auf auto setzen, damit bei langen Kommentaren ein Scrollbalken kommt. Dafür maximale Höhe für Kommentarausgabe, damit die Felder optisch nicht zu groß werden&lt;br /&gt;
&lt;br /&gt;
2016 - 04&lt;br /&gt;
* Neues Template für mehr Antwortoptionen. Kommentare werden untereinander (nicht in Spalten) dargestellt&lt;br /&gt;
* Einträge bei denen der User die nur den Namen ausfüllen aber nichts im Kommentarfeld schreiben werden nicht mehr angezeigt&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Abstimmung_wordpress&amp;diff=22638</id>
		<title>Abstimmung wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Abstimmung_wordpress&amp;diff=22638"/>
		<updated>2017-11-30T10:03:04Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;siehe auch [[DEKRA Direkt Blog]]&lt;br /&gt;
Der Blog &amp;#039;&amp;#039;&amp;#039;DEKRA Direkt&amp;#039;&amp;#039;&amp;#039; wird als interner Konzernblog verwendet und soll als Kontaktmittel der Mitarbeiter zur Vorstandsebene dienen. Dazu gibt es unter anderem die DEKRA Direkt Mitarbeiter Umfrage.&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
=== Ablauf 2017 ===&lt;br /&gt;
* Poll anlegen (alten kopieren)&lt;br /&gt;
** Blocking by Cookie&lt;br /&gt;
* Testbeitrag anlegen&lt;br /&gt;
** Kategorie Test&lt;br /&gt;
** Später Kategorie ändern&lt;br /&gt;
&lt;br /&gt;
== Todo ==&lt;br /&gt;
* Backendanzeige der Votes ist Buggy&lt;br /&gt;
* Besser zum Testen wäre es wenn die Umfrage zunächst in eine Kategorie Test geht die auf der Startseite nicht dargestellt wird. - OK ist über Plugin realisiert.&lt;br /&gt;
&lt;br /&gt;
Wordpress Extension Yop Poll - verwendet bei Mascha im Blog intern:&lt;br /&gt;
&lt;br /&gt;
== yop poll Anpassungen ==&lt;br /&gt;
=== yop poll Tabellen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
------------                -----------------                 --------------&lt;br /&gt;
yop_polls                   yop_poll_answers                  yop_poll_logs&lt;br /&gt;
------------                -----------------                 --------------&lt;br /&gt;
id          --------------| id               --------------|  id&lt;br /&gt;
name                      |-poll_id                        |  pn&lt;br /&gt;
question                    answer                         |  poll_id&lt;br /&gt;
total_votes                 votes                          |  vote_id&lt;br /&gt;
total_answers               ...                            |- answer_id&lt;br /&gt;
...                                                           --------------&lt;br /&gt;
------------                -----------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----------------------      ----------------------------&lt;br /&gt;
yop_poll_custom_fields      yop_poll_votes_custom_fields&lt;br /&gt;
----------------------      ----------------------------&lt;br /&gt;
id                          id&lt;br /&gt;
poll_id                     poll_id&lt;br /&gt;
custom_field                vote_id&lt;br /&gt;
...                         custom_field_id&lt;br /&gt;
----------------------      user_id&lt;br /&gt;
                            custom_field_value&lt;br /&gt;
                            ----------------------------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da bei einem custom text field bei der fragesstellung nur einzeiliger text möglich war, musst die datei &lt;br /&gt;
 /wp-content/plugins/yop-poll/inc/yop_poll_model.php&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In der datenbank die Tabelle:&lt;br /&gt;
&lt;br /&gt;
 kas_wp_yop_poll_votes_custom_fields&lt;br /&gt;
&lt;br /&gt;
Feld: custom_field_value&lt;br /&gt;
&lt;br /&gt;
von varchar (255) auf Text geändert.&lt;br /&gt;
&lt;br /&gt;
== SQL-Abfragen für Antworten mit Kommentar ==&lt;br /&gt;
=== SQL nur Ergebnisse ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT `id` , `poll_id` , `answer_id` , `ip` , `http_referer` , `vote_date` , `pn`&lt;br /&gt;
FROM `kas_wp_yop_poll_logs`&lt;br /&gt;
WHERE `poll_id` =38&lt;br /&gt;
ORDER BY `answer_id` ASC&lt;br /&gt;
LIMIT 0 , 500&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== SQL Abfrage mit Kommentaren ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alte Abfrage&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT *&lt;br /&gt;
FROM `kas_wp_yop_poll_logs`&lt;br /&gt;
LEFT OUTER JOIN `kas_wp_yop_poll_votes_custom_fields` ON `kas_wp_yop_poll_logs`.`vote_id` = `kas_wp_yop_poll_votes_custom_fields`.`vote_id`&lt;br /&gt;
WHERE `kas_wp_yop_poll_logs`.`poll_id` =13&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Weitere Abfragen ===&lt;br /&gt;
Welche Custom Fields gehören zu welchen Umfrage (Pivot Version)&lt;br /&gt;
&lt;br /&gt;
Dynamische Version (funktioniert noch nicht aber die Richtung dürfte stimmen)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET @sql = NULL;&lt;br /&gt;
SELECT&lt;br /&gt;
  GROUP_CONCAT(DISTINCT&lt;br /&gt;
    CONCAT(&lt;br /&gt;
      &amp;#039;max(case when custom_field = &amp;#039;&amp;#039;&amp;#039;,&lt;br /&gt;
      custom_field,&lt;br /&gt;
      &amp;#039;&amp;#039;&amp;#039; then custom_field end) AS &amp;#039;,&lt;br /&gt;
      custom_field&lt;br /&gt;
    )&lt;br /&gt;
  ) INTO @sql&lt;br /&gt;
FROM kas_wp_yop_poll_custom_fields;&lt;br /&gt;
&lt;br /&gt;
SET @sql = CONCAT(&amp;#039;SELECT poll_id, &amp;#039;, @sql, &amp;#039; &lt;br /&gt;
                  FROM kas_wp_yop_poll_custom_fields &lt;br /&gt;
                  GROUP BY poll_id&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
PREPARE stmt FROM @sql;&lt;br /&gt;
EXECUTE stmt;&lt;br /&gt;
DEALLOCATE PREPARE stmt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Neue Umfrage für DEKRA Connect durchführen ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
Läuft 2 Wochen ab ca. Mitte des Monats. Danach Auswertung und Grafikerstellung.&lt;br /&gt;
==== Updates ====&lt;br /&gt;
 2015-10 - Umfrage nur mit Cookie check -&amp;gt; Mascha möchte keine Userunterbrechung. Später werden die Ergebnisse manuell gereinigt&lt;br /&gt;
&lt;br /&gt;
===== Infos zum Cookie Check =====&lt;br /&gt;
Wenn man mit Cookies kontrolliert, wie wir das im Moment machen, dann testet das Plugin immer ob für eine bestimmte Umfrage schon abgestimmt wurde. &amp;#039;&amp;#039;&amp;#039;Egal ob die Umfrage neu gestartet wurde&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Technisch wird dazu ein Cookie mit der ID der Umfrage hinterlegt. Dieses hat eine &amp;#039;&amp;#039;&amp;#039;Gültigkeitsdauer&amp;#039;&amp;#039;&amp;#039; (kann man einstellen z.B. 14 Tage). Solange das Cookie gültig ist kann man dann nicht mehr abstimmen.&lt;br /&gt;
&lt;br /&gt;
Das bedeutet &amp;#039;&amp;#039;&amp;#039;alle Browser die noch nicht abgestimmt haben können auch abstimmen&amp;#039;&amp;#039;&amp;#039; !&lt;br /&gt;
&lt;br /&gt;
Wenn du nochmal testen willst mußt du die Cookies löschen oder 14 Tage warten.&lt;br /&gt;
&lt;br /&gt;
Nochmal zur Info Vor und Nachteile der anderen Lösungen&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kontrolle über IP&amp;#039;&amp;#039;&amp;#039;: Vorteil recht zuverlässig schwer zu umgehen. Nachteil: wenn Benutzer mit der gleichen IP ankommen kann es sein dass einer nicht abstimmen kann.&lt;br /&gt;
&lt;br /&gt;
* Über die &amp;#039;&amp;#039;&amp;#039;Personalnummer&amp;#039;&amp;#039;&amp;#039; Vorteil: Sehr Zuverlässig. Nachteil: Schlechte User Experience&lt;br /&gt;
&lt;br /&gt;
== Technischer Ablauf ==&lt;br /&gt;
Stand 2017&lt;br /&gt;
* Block by Cookie&lt;br /&gt;
&lt;br /&gt;
Stand März 2015 (obsolete)&lt;br /&gt;
&lt;br /&gt;
* Das Umfrage Plugin im WP ist auf &amp;#039;&amp;#039;&amp;#039;block by Personal Number&amp;#039;&amp;#039;&amp;#039; gestellt. -&amp;gt; Ab 2016 nur noch &amp;#039;&amp;#039;&amp;#039;by Cookie&amp;#039;&amp;#039;&amp;#039;(siehe oben)&lt;br /&gt;
* obsolete -&amp;gt; Ein User kann nur Voten wenn eine id=12345 (Personalnummer) angehängt ist. Ansonsten wird zunächst auf das DEKRA Intranet weiter geleitet (über alert). &lt;br /&gt;
* Dort wird die Personalnummer als id=12345 an den Link angehängt und auf intern-blog.dekra.de/category/dekra-direkt/?id=12345 geleitet Nur wenn eine solche id vorhanden ist kann gevoted werden. Ist nicht supersicher weil die Nummer willkürlich geändert werden kann, nachträgliche Prüfung wäre mit Personalnummern Liste möglich. Verbesserungspotential wäre POST übermittlung, Gültigkeitsprüfung durch PN-Index oder Formel.&lt;br /&gt;
* Hat die id &amp;#039;&amp;#039;&amp;#039;schon gevotet&amp;#039;&amp;#039;&amp;#039; wird nur das Ergebnis angezeigt.&lt;br /&gt;
* Im DEKRA Intranet werden Links an die eine id angehängt werden soll mit dem Parameter &amp;#039;&amp;#039;&amp;#039;?id=public&amp;#039;&amp;#039;&amp;#039; Veröffentlicht. public wird dann automatisch durch die Personalnummer des Mitarbeiters ersetzt, bevor weitergeleitet wird. &lt;br /&gt;
&lt;br /&gt;
=== Umfrage erstellen ===&lt;br /&gt;
* Achtung manchmal kollidiert die Abfrage mit alten Cookies der letzten Umfrage. Genau ist das noch nicht geklärt. Hilfe bringt: &lt;br /&gt;
** dafür sorgen, daß die alte Umfrage nicht mit angezeigt wird&lt;br /&gt;
** Logs löschen&lt;br /&gt;
** Wenn nichts hilft die Stats Reseten (kann sein daß dies nicht nötig ist.)&lt;br /&gt;
&lt;br /&gt;
* 1 oder mehrere (Mascha will meist 3) Umfragen-Dummies erstellen (z.B. eine alte klonen - &amp;#039;&amp;#039;&amp;#039;Vorsicht: Einstellungen für Datum, Template und Blocking&amp;#039;&amp;#039;&amp;#039; werden nicht übernommen)&lt;br /&gt;
* Template: &amp;#039;&amp;#039;&amp;#039;DEKRA Umfrage mit Kommentar&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
** Mit dem Template &amp;#039;&amp;#039;&amp;#039;DEKRA Umfrage mit dynamischem Kommentar&amp;#039;&amp;#039;&amp;#039; kann man zusätzlich noch JavaScript Popups öffnen und auf die gewählte Antwort reagieren (siehe JS im Template)&lt;br /&gt;
** Das Template &amp;#039;&amp;#039;&amp;#039;Umfrage mit mehr Antworten&amp;#039;&amp;#039;&amp;#039; erlaubt mehr als zwei Antwortmöglichkeiten. Die Kommentare werden dann untereinander dargestellt. Das ist zugleich auch das sicherste Template, was die Darstellung angeht.&lt;br /&gt;
* Blocking by auf &amp;#039;&amp;#039;&amp;#039;Personal Number&amp;#039;&amp;#039;&amp;#039; - dadurch wird die Abfrage des id Parameters gestartet. Zum Testen auf don&amp;#039;t Block stellen. Achtung IE hat manchmal Caching Probleme.&lt;br /&gt;
* Start und Enddatum setzen&lt;br /&gt;
* Abstimmung in einen &amp;#039;&amp;#039;&amp;#039;Beitrag in Kategorie Dekra Direkt&amp;#039;&amp;#039;&amp;#039; einpflegen (evtl. erst nach dem Testen) -&amp;gt; Startseite sichtbar&lt;br /&gt;
* Am Ende Umfrage auf &amp;#039;&amp;#039;&amp;#039;nur Antwort&amp;#039;&amp;#039;&amp;#039; !&lt;br /&gt;
* Geo-bit erstellt die Fragen, diese werden von Mascha angepasst und von Ihr in einem Beitrag veröffentlicht.&lt;br /&gt;
* Start der Umfrage durch setzen der Kategorie (todo ob das klappt)&lt;br /&gt;
&lt;br /&gt;
=== Test der Umfrage ===&lt;br /&gt;
* Vorige Tests sind sinnvoll. Ein Test von Geo-bit (einfach id anhängen). Ein Test von Dekra&lt;br /&gt;
=== Ende der Umfrage und Auswertung ===&lt;br /&gt;
Für die Auswertung benötigt Mascha eine &amp;#039;&amp;#039;&amp;#039;Excel-Tabelle&amp;#039;&amp;#039;&amp;#039; in der &amp;#039;&amp;#039;&amp;#039;nach Antworten und sortiert&amp;#039;&amp;#039;&amp;#039; ist. Ebenso die dazugehörigen Kommentare. Doppelte IPs rausschmeißen. Wenn Personalnummerliste vorhanden könnte man hier nach Gültigkeit prüfen.&lt;br /&gt;
* Umfrage mit Datum beenden oder auf Maschas Hinweis, &amp;#039;&amp;#039;&amp;#039;Umfrage auf don&amp;#039;t block&amp;#039;&amp;#039;&amp;#039;, damit die Umleitung auf Dekra nicht mehr aktiv ist, außerdem &amp;#039;&amp;#039;&amp;#039;Enddatum setzen&amp;#039;&amp;#039;&amp;#039; und auf &amp;#039;&amp;#039;&amp;#039;Ergebnis anzeigen nach Enddatum&amp;#039;&amp;#039;&amp;#039;. Endzeit etwas zurücksetzen, da manchmal die Serverzeit um ein paar Stunden differiert.&lt;br /&gt;
* SQL Abfrage (siehe Statement), Export als ods oder csv&lt;br /&gt;
* Doppelte überprüfen&lt;br /&gt;
* Umwandeln in Excel&lt;br /&gt;
* Schaubild aus Numbers&lt;br /&gt;
&lt;br /&gt;
=== Löschen unerwünschter Kommentare ===&lt;br /&gt;
&lt;br /&gt;
In&lt;br /&gt;
 Admin -&amp;gt; Yop poll -&amp;gt; All polls -&amp;gt; meineUmfrage -&amp;gt; votes&lt;br /&gt;
&lt;br /&gt;
hier auswählen und löschen&lt;br /&gt;
&lt;br /&gt;
Problem: die Kommentare werden nicht mehr angezeigt. TODO&lt;br /&gt;
&lt;br /&gt;
=== Anpassungen  am Plugin Yop poll===&lt;br /&gt;
&lt;br /&gt;
 yop-poll =&amp;gt; inc =&amp;gt; admin.php&lt;br /&gt;
&lt;br /&gt;
Hier die DB mit prefix versehen. &amp;quot;kas_&amp;quot;&lt;br /&gt;
 yop-poll =&amp;gt; inc =&amp;gt; yop_poll_model.php&lt;br /&gt;
 yop-poll =&amp;gt; inc =&amp;gt; db_schema.php&lt;br /&gt;
 yop-poll =&amp;gt; js =&amp;gt; yop_poll_public.js&lt;br /&gt;
==== Kommentare ====&lt;br /&gt;
MUSS überarbeitet werden&lt;br /&gt;
 yop_poll_modell.php&lt;br /&gt;
&lt;br /&gt;
 return_poll_html -&amp;gt; &lt;br /&gt;
dort wird der Template Block  		&lt;br /&gt;
 [ANSWER_RESULT_CONTAINER]&lt;br /&gt;
 [/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
mit pregreplace über eine Callback Funktion ersetzt&lt;br /&gt;
 answer_result_callback(m$)&lt;br /&gt;
darin wiederum wird &lt;br /&gt;
 get_poll_comments($poll_id) &lt;br /&gt;
aufgerufen, dieses gibt ein array zurück das dann in HTML umgesetzt wird. Diese Ausgabe erfolbt über die Abfrage von &lt;br /&gt;
 $this-&amp;gt;is_view_poll_results()&lt;br /&gt;
Das bedeutet die Ausgabe erfolgt wenn im Backend die Bedingung für die Ausgabe der Results gesetzt ist (z.B. Results after End Date) Gute erweiterung wäre ein eigener Block für die Comments&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Im Template muß der Block natürlich auch gesetzt sein.&amp;#039;&amp;#039;&amp;#039; (beim entsprechenden Template)&lt;br /&gt;
&lt;br /&gt;
Problem: Die Ausgabe erfolgt nur wenn die Logs der Umfrage nicht gelöscht sind.&lt;br /&gt;
Ausgabe der Kommentare bisher&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT yp.id,yp.name,yp.question,ypa.answer,ypvcf.custom_field_value,ypcf.custom_field,ypl.vote_id FROM kas_wp_yop_polls yp &lt;br /&gt;
JOIN kas_wp_yop_poll_custom_fields ypcf ON (yp.id=ypcf.poll_id) &lt;br /&gt;
JOIN kas_wp_yop_poll_votes_custom_fields ypvcf ON (ypcf.id = ypvcf.custom_field_id)&lt;br /&gt;
JOIN kas_wp_yop_poll_logs ypl ON (ypvcf.vote_id = ypl.vote_id)&lt;br /&gt;
JOIN kas_wp_yop_poll_answers ypa ON (ypl.answer_id = ypa.id)&lt;br /&gt;
WHERE yp.id=[pollID] AND ypl.answer_id=[answerID];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Abfrage wird für jede Antwort (answer_id) ausgeführt. Aus den Logs wird die answer_id geholt. Wenn diese im Log fehlt wird nichts zurückgegeben.&lt;br /&gt;
Wie kann man die Zuordnung Kommentar - answer_id noch herstellen? answer_id und vote_id stehen auch in yop_poll_voters, vote_id steht auch in yop_poll_votes_custom_fields&lt;br /&gt;
Also statt mit wp_yop_poll_logs joint man mit yop_poll_voters.&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT yp.id, yp.name, yp.question, ypa.answer, ypvcf.custom_field_value, ypcf.custom_field, ypv.vote_id&lt;br /&gt;
FROM kas_wp_yop_polls yp&lt;br /&gt;
JOIN kas_wp_yop_poll_custom_fields ypcf ON ( yp.id = ypcf.poll_id )&lt;br /&gt;
JOIN kas_wp_yop_poll_votes_custom_fields ypvcf ON ( ypcf.id = ypvcf.custom_field_id )&lt;br /&gt;
JOIN kas_wp_yop_poll_voters ypv ON ( ypvcf.vote_id = ypv.vote_id )&lt;br /&gt;
JOIN kas_wp_yop_poll_answers ypa ON ( ypv.answer_id = ypa.id )&lt;br /&gt;
WHERE yp.id =50&lt;br /&gt;
AND ypv.answer_id =113&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Yop Poll Templates ==&lt;br /&gt;
Todo - Anpassen um ungenutzte Features zu nutzen (z.B. after End Date schöne Anzeige der Ergebnisse)&lt;br /&gt;
=== DEKRA Umfrage mit Kommentar ===&lt;br /&gt;
Vor Umfrage:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot; style=&amp;quot;display:table-cell;height:130px;vertical-align:middle;&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ul&amp;gt;&lt;br /&gt;
		[ANSWER_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-answer-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			%POLL-ANSWER-CHECK-INPUT% &lt;br /&gt;
			%POLL-ANSWER-LABEL%&lt;br /&gt;
			&amp;lt;span class=&amp;quot;yop-poll-results-text-%POLL-ID%&amp;quot;&amp;gt;%POLL-ANSWER-RESULT-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
             %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
        &amp;lt;/li&amp;gt;&lt;br /&gt;
        [/ANSWER_CONTAINER]&lt;br /&gt;
		[OTHER_ANSWER_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-answer-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			%POLL-OTHER-ANSWER-CHECK-INPUT% &lt;br /&gt;
			%POLL-OTHER-ANSWER-LABEL% &lt;br /&gt;
			&amp;lt;span class=&amp;quot;yop-poll-results-text-%POLL-ID%&amp;quot;&amp;gt;%POLL-ANSWER-RESULT-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
			%POLL-OTHER-ANSWER-TEXT-INPUT% &lt;br /&gt;
            %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
        &amp;lt;/li&amp;gt;&lt;br /&gt;
        [/OTHER_ANSWER_CONTAINER]&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-custom-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ul&amp;gt;&lt;br /&gt;
		[CUSTOM_FIELD_CONTAINER]&lt;br /&gt;
		&amp;lt;li&amp;gt;%POLL-CUSTOM-FIELD-LABEL% %POLL-CUSTOM-FIELD-TEXT-INPUT%&amp;lt;/li&amp;gt;&lt;br /&gt;
		[/CUSTOM_FIELD_CONTAINER]&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;    &lt;br /&gt;
[CAPTCHA_CONTAINER]&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-captcha-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;yop-poll-captcha-image-div&amp;quot; id=&amp;quot;yop-poll-captcha-image-div-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
        %CAPTCHA-IMAGE%&lt;br /&gt;
        &amp;lt;div class=&amp;quot;yop-poll-captcha-helpers-div&amp;quot; id=&amp;quot;yop-poll-captcha-helpers-div-%POLL-ID%&amp;quot;&amp;gt;%RELOAD-CAPTCHA-IMAGE% &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;yop_poll_clear&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    %CAPTCHA-LABEL%&lt;br /&gt;
    &amp;lt;div class=&amp;quot;yop-poll-captcha-input-div&amp;quot; id=&amp;quot;yop-poll-captcha-input-div-%POLL-ID%&amp;quot;&amp;gt;%CAPTCHA-INPUT%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[/CAPTCHA_CONTAINER]&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-vote-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-footer&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-VOTE-BUTTON%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;yop-poll-results-%POLL-ID%&amp;quot;&amp;gt;%POLL-VIEW-RESULT-LINK%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-ANSWERS%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-VOTES%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nach Umfrage&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot; style=&amp;quot;display:table-cell;height:130px;vertical-align:middle;&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;div id=&amp;quot;gb_cust&amp;quot;&amp;gt;VORLÄUFIGES·ERGEBNIS·DER·ABSTIMMUNG&amp;lt;/div&amp;gt;	&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
		[ANSWER_RESULT_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;label class=&amp;quot;pds-feedback-label-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;pds-answer-text-%POLL-ID%&amp;quot;&amp;gt;%POLL-ANSWER-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;pds-feedback-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;span class=&amp;quot;pds-feedback-per-%POLL-ID%&amp;quot;&amp;gt; %POLL-ANSWER-RESULT-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/label&amp;gt;&lt;br /&gt;
			&amp;lt;div&amp;gt;&lt;br /&gt;
             %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
           &amp;lt;/div&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		[/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-vote-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-footer&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-ANSWERS%&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-VOTES%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;yop-poll-back-%POLL-ID%&amp;quot;&amp;gt;%POLL-BACK-TO-VOTE-LINK%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before Start Date&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This poll is about to &amp;lt;br&amp;gt;&lt;br /&gt;
start at %POLL-START-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
and finish at %POLL-END-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After End Date&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;gb_end&amp;quot;&amp;gt;Die Abstimmung ist beendet.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul class=&amp;quot;afterVote&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		[ANSWER_RESULT_CONTAINER]&lt;br /&gt;
		&lt;br /&gt;
		[/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
CSS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#yop-poll-container-%POLL-ID% {&lt;br /&gt;
    background-image: url(&amp;quot;http://intern-blog.dekra.de/wp-content/uploads/2013/02/bg_poll_1.png&amp;quot;);&lt;br /&gt;
/*    border: 5px solid #3F8B43;*/&lt;br /&gt;
background-repeat:no-repeat;&lt;br /&gt;
    color: #555555;&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    padding: 10px;&lt;br /&gt;
    width: 632px;&lt;br /&gt;
/*    height: 300px;*/&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-name-%POLL-ID% {&lt;br /&gt;
	font-size:14px;&lt;br /&gt;
	font-weight:bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-question-%POLL-ID% {&lt;br /&gt;
    color: #000000;&lt;br /&gt;
    font-size: 14pt;&lt;br /&gt;
    font-weight: 500;&lt;br /&gt;
    height: 80px;&lt;br /&gt;
    line-height: 26px;&lt;br /&gt;
    margin: 0 50px 0 0;&lt;br /&gt;
    padding-left: 215px;&lt;br /&gt;
    padding-top: 40px;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    width: 300px;&lt;br /&gt;
margin-bottom: 100px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-answers-%POLL-ID% { &lt;br /&gt;
 }&lt;br /&gt;
#yop-poll-answers-%POLL-ID% ul {&lt;br /&gt;
    list-style: none outside none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: 20px;&lt;br /&gt;
    left: 270px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-answers-%POLL-ID% ul li { &lt;br /&gt;
	font-style:normal;&lt;br /&gt;
	margin-bottom:10px;&lt;br /&gt;
	padding:0px;&lt;br /&gt;
	font-size:12px;&lt;br /&gt;
   width: 190px !important;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-answers-%POLL-ID% ul li input { &lt;br /&gt;
	margin:0px; &lt;br /&gt;
	float:none;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-answers-%POLL-ID% ul li label { &lt;br /&gt;
	margin:0px; &lt;br /&gt;
	font-style:normal; &lt;br /&gt;
	font-weight:bold; &lt;br /&gt;
	font-size:16px; &lt;br /&gt;
	float:none;&lt;br /&gt;
        z-index: 10; &lt;br /&gt;
}&lt;br /&gt;
.yop-poll-results-%POLL-ID% {&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    margin-left: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-custom-%POLL-ID% {  }&lt;br /&gt;
#yop-poll-custom-%POLL-ID% ul {&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 500;&lt;br /&gt;
    left: 270px;&lt;br /&gt;
    list-style: none outside none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: 20px;&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 375px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-custom-%POLL-ID% ul li { &lt;br /&gt;
	padding:0px;&lt;br /&gt;
	margin:0px;	&lt;br /&gt;
	font-size:14px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-container-%POLL-ID% input[type=&amp;#039;text&amp;#039;] { &lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    margin: 10px 0;&lt;br /&gt;
    padding: 2%;&lt;br /&gt;
    text-indent: 2%;&lt;br /&gt;
    width: 92%;&lt;br /&gt;
    border: 1px solid #B9B8B8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-container-%POLL-ID% textarea {&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    margin: 10px 0;&lt;br /&gt;
    padding: 2%;&lt;br /&gt;
    text-indent: 2%;&lt;br /&gt;
    width: 92%;&lt;br /&gt;
    font-family: Verdana;&lt;br /&gt;
    color: #666;&lt;br /&gt;
    border: 1px solid #B9B8B8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-captcha-input-div-%POLL-ID% {&lt;br /&gt;
margin-top:5px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-captcha-helpers-div-%POLL-ID% {&lt;br /&gt;
width:30px;&lt;br /&gt;
float:left;&lt;br /&gt;
margin-left:5px;&lt;br /&gt;
height:0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-captcha-helpers-div-%POLL-ID% img {&lt;br /&gt;
margin-bottom:2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-captcha-image-div-%POLL-ID% {&lt;br /&gt;
margin-bottom:5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop_poll_captcha_image_%POLL-ID% {&lt;br /&gt;
float:left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.yop_poll_clear {&lt;br /&gt;
clear:both;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#yop-poll-vote-%POLL-ID% {&lt;br /&gt;
float:left; &lt;br /&gt;
/*width:100%; */&lt;br /&gt;
padding-left: 270px;&lt;br /&gt;
margin-top: 20px;&lt;br /&gt;
margin-bottom: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
li.yop-poll-li-result-%POLL-ID% {&lt;br /&gt;
/*    margin-top: 50px;*/&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.yop-poll-results-bar-%POLL-ID% { background:#f5f5f5; height:10px;  }&lt;br /&gt;
.yop-poll-results-bar-%POLL-ID% div { background:#555; height:10px; }&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div#yop-poll-vote-%POLL-ID% button { float:left; }&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div#yop-poll-results-%POLL-ID% {&lt;br /&gt;
    float: right;&lt;br /&gt;
    margin-bottom: 20px;&lt;br /&gt;
    margin-top: -20px;&lt;br /&gt;
    width: auto;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div#yop-poll-results-%POLL-ID% a { color:#3F8B43; text-decoration:underline; font-size:12px;}&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div#yop-poll-back-%POLL-ID% a { color:#3F8B43; text-decoration:underline; font-size:12px;}&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div { float:left; width:100%; }&lt;br /&gt;
&lt;br /&gt;
#yop-poll-container-error-%POLL-ID% {&lt;br /&gt;
	font-size:12px;&lt;br /&gt;
	font-style:italic;&lt;br /&gt;
	color:red;&lt;br /&gt;
    left: 290px;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: 270px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.gb-btn {&lt;br /&gt;
    background-image: url(&amp;quot;http://intern-blog.dekra.de/wp-content/uploads/2013/02/bg_button.png&amp;quot;);&lt;br /&gt;
    border: medium none;&lt;br /&gt;
    border-radius: 10px 10px 10px 10px;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    font-size: 1.9em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    height: 40px;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    width: 130px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#gb_cust {&lt;br /&gt;
    color: #999999;&lt;br /&gt;
    font-size: 1.4em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    padding-left: 0px;&lt;br /&gt;
    padding-top: 40px;&lt;br /&gt;
    background-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
.yop-poll-results-bar-%POLL-ID% div{&lt;br /&gt;
    background-image: url(&amp;quot;http://intern-blog.dekra.de/wp-content/uploads/2013/02/bg_button.png&amp;quot;);&lt;br /&gt;
    height: 30px;&lt;br /&gt;
    margin-top: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.yop-poll-results-bar-%POLL-ID% {&lt;br /&gt;
height: 30px;&lt;br /&gt;
width:99%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pds-answer-text-%POLL-ID% {&lt;br /&gt;
font-size: 0.85em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
color: #999;&lt;br /&gt;
/*    margin-top: -10px;*/&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pds-feedback-per-%POLL-ID% {&lt;br /&gt;
   color: #999999;&lt;br /&gt;
    font-size: 1em;&lt;br /&gt;
    margin-left: 5px;&lt;br /&gt;
    margin-top: -25px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.yop_poll_vote_button{&lt;br /&gt;
    background-image: url(&amp;quot;http://intern-blog.dekra.de/wp-content/uploads/2013/02/bg_button.png&amp;quot;);&lt;br /&gt;
    border: medium none;&lt;br /&gt;
    border-radius: 10px 10px 10px 10px;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    font-size: 1.9em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    height: 40px;&lt;br /&gt;
    width: 250px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#gb_end {&lt;br /&gt;
    color: #999999;&lt;br /&gt;
    font-size: 1.4em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    padding-bottom: 100px;&lt;br /&gt;
    padding-left: 250px;&lt;br /&gt;
    padding-top: 130px;&lt;br /&gt;
    background-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-container-%POLL-ID% textarea {&lt;br /&gt;
#max-width: 350px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-container-success-%POLL-ID% {&lt;br /&gt;
	font-size:12px;&lt;br /&gt;
	font-style:italic;&lt;br /&gt;
	color:green;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
JS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function stripBorder_%POLL-ID%(object) {&lt;br /&gt;
	object.each(function() {&lt;br /&gt;
			if( parseInt(jQuery(this).width() ) &amp;gt; 0) {&lt;br /&gt;
				jQuery(this).width( parseInt( jQuery(this).width() ) - parseInt(jQuery(this).css(&amp;quot;border-left-width&amp;quot;)) - parseInt(jQuery(this).css(&amp;quot;border-right-width&amp;quot;)) );&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				jQuery(this).css(&amp;quot;border-left-width&amp;quot;, &amp;#039;0px&amp;#039;);&lt;br /&gt;
				jQuery(this).css(&amp;quot;border-right-width&amp;quot;, &amp;#039;0px&amp;#039;);&lt;br /&gt;
			}&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
function stripPadding_%POLL-ID%(object) {&lt;br /&gt;
	object.each(function() { &lt;br /&gt;
			jQuery(this).width( parseInt( jQuery(this).width() ) - parseInt(jQuery(this).css(&amp;quot;padding-left&amp;quot;)) - parseInt(jQuery(this).css(&amp;quot;padding-left&amp;quot;)) );&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function strip_results_%POLL-ID%() {&lt;br /&gt;
        stripPadding_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop_poll_li_result-%POLL-ID%&amp;quot;) );   &lt;br /&gt;
	stripBorder_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-result-bar-%POLL-ID%&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
jQuery(document).ready(function(e) {&lt;br /&gt;
                if(typeof window.strip_results_%POLL-ID% == &amp;#039;function&amp;#039;) &lt;br /&gt;
			strip_results_%POLL-ID%();&lt;br /&gt;
    &lt;br /&gt;
		if(typeof window.tabulate_answers_%POLL-ID% == &amp;#039;function&amp;#039;) &lt;br /&gt;
			tabulate_answers_%POLL-ID%();&lt;br /&gt;
		&lt;br /&gt;
		if(typeof window.tabulate_results_%POLL-ID% == &amp;#039;function&amp;#039;) &lt;br /&gt;
			tabulate_results_%POLL-ID%();&lt;br /&gt;
		&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
function equalWidth_%POLL-ID%(obj, cols, findWidest ) {&lt;br /&gt;
 findWidest  = typeof findWidest  !== &amp;#039;undefined&amp;#039; ? findWidest  : false;&lt;br /&gt;
    if ( findWidest ) {&lt;br /&gt;
		obj.each(function() {&lt;br /&gt;
				var thisWidth = jQuery(this).width();&lt;br /&gt;
				width = parseInt(thisWidth / cols); &lt;br /&gt;
				jQuery(this).width(width);	&lt;br /&gt;
				jQuery(this).css(&amp;#039;float&amp;#039;, &amp;#039;left&amp;#039;);	&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		var widest = 0;&lt;br /&gt;
		obj.each(function() {&lt;br /&gt;
				var thisWidth = jQuery(this).width();&lt;br /&gt;
				if(thisWidth &amp;gt; widest) {&lt;br /&gt;
					widest = thisWidth; &lt;br /&gt;
				}	&lt;br /&gt;
		});&lt;br /&gt;
		width = parseInt( widest / cols); &lt;br /&gt;
		obj.width(width);	&lt;br /&gt;
		obj.css(&amp;#039;float&amp;#039;, &amp;#039;left&amp;#039;);	&lt;br /&gt;
	}	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function tabulate_answers_%POLL-ID%() {&lt;br /&gt;
	equalWidth_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-li-answer-%POLL-ID%&amp;quot;), %ANSWERS-TABULATED-COLS% );&lt;br /&gt;
        //equalWidth_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-li-answer-%POLL-ID% .yop-poll-results-bar-%POLL-ID% div &amp;quot;), %ANSWERS-TABULATED-COLS%, true );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function tabulate_results_%POLL-ID%() {&lt;br /&gt;
	equalWidth_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-li-result-%POLL-ID%&amp;quot;), %RESULTS-TABULATED-COLS% );&lt;br /&gt;
        //equalWidth_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-li-result-%POLL-ID% .yop-poll-results-bar-%POLL-ID% div &amp;quot;), %RESULTS-TABULATED-COLS%, true );&lt;br /&gt;
}&lt;br /&gt;
			jQuery(document).ready(function(){&lt;br /&gt;
				runOnPollStateChange_%POLL-ID%();&lt;br /&gt;
				});&lt;br /&gt;
&lt;br /&gt;
			function runOnPollStateChange_%POLL-ID%() {};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Dekra Poll Template für ID 2 (altes Template) ===&lt;br /&gt;
Vor Umfrage&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;gb_cust&amp;quot;&amp;gt;STIMMEN SIE JETZT AB !&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;ul&amp;gt;&lt;br /&gt;
    [ANSWER_CONTAINER]&lt;br /&gt;
    &amp;lt;li class=&amp;quot;gb-ac yop-poll-li-answer-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
      %POLL-ANSWER-CHECK-INPUT% &lt;br /&gt;
      %POLL-ANSWER-LABEL%&lt;br /&gt;
      &amp;lt;span class=&amp;quot;yop-poll-results-text-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
        %POLL-ANSWER-RESULT-LABEL%&lt;br /&gt;
      &amp;lt;/span&amp;gt;&lt;br /&gt;
      %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    [/ANSWER_CONTAINER]&lt;br /&gt;
    [OTHER_ANSWER_CONTAINER]&lt;br /&gt;
    &amp;lt;li class=&amp;quot;gb-oac yop-poll-li-answer-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
      %POLL-OTHER-ANSWER-CHECK-INPUT% &lt;br /&gt;
      %POLL-OTHER-ANSWER-LABEL% &lt;br /&gt;
      &amp;lt;span class=&amp;quot;yop-poll-results-text-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
        %POLL-ANSWER-RESULT-LABEL%&lt;br /&gt;
      &amp;lt;/span&amp;gt;&lt;br /&gt;
      %POLL-OTHER-ANSWER-TEXT-INPUT% &lt;br /&gt;
      %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    [/OTHER_ANSWER_CONTAINER]&lt;br /&gt;
  &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[CUSTOM_FIELD_CONTAINER]&lt;br /&gt;
		&amp;lt;li&amp;gt;%POLL-CUSTOM-FIELD-LABEL% %POLL-CUSTOM-FIELD-TEXT-INPUT%&amp;lt;/li&amp;gt;&lt;br /&gt;
		[/CUSTOM_FIELD_CONTAINER]&lt;br /&gt;
[CAPTCHA_CONTAINER]&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-captcha-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;yop-poll-captcha-image-div&amp;quot; id=&amp;quot;yop-poll-captcha-image-div-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
        %CAPTCHA-IMAGE%&lt;br /&gt;
        &amp;lt;div class=&amp;quot;yop-poll-captcha-helpers-div&amp;quot; id=&amp;quot;yop-poll-captcha-helpers-div-%POLL-ID%&amp;quot;&amp;gt;%RELOAD-CAPTCHA-IMAGE% &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;yop_poll_clear&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    %CAPTCHA-LABEL%&lt;br /&gt;
    &amp;lt;div class=&amp;quot;yop-poll-captcha-input-div&amp;quot; id=&amp;quot;yop-poll-captcha-input-div-%POLL-ID%&amp;quot;&amp;gt;%CAPTCHA-INPUT%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[/CAPTCHA_CONTAINER]&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-vote-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-footer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;poll-vote-button&amp;quot;&amp;gt;%POLL-VOTE-BUTTON%&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;%POLL-TOTAL-ANSWERS%&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;%POLL-TOTAL-VOTES%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;gb-storage&amp;quot; gb-poll-id=&amp;quot;%POLL-ID%&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Load check from Dean Edwards/Matthias Miller/John Resig&lt;br /&gt;
&lt;br /&gt;
function init() {&lt;br /&gt;
  if (arguments.callee.done) return;&lt;br /&gt;
  arguments.callee.done = true;&lt;br /&gt;
  if (_timer) clearInterval(_timer);&lt;br /&gt;
&lt;br /&gt;
  jQuery(document).ready(function() {&lt;br /&gt;
    // remove vote button&lt;br /&gt;
    jQuery(&amp;#039;.poll-vote-button&amp;#039;).html(&amp;#039;&amp;#039;);&lt;br /&gt;
    // add Buttons&lt;br /&gt;
    jQuery(&amp;#039;.gb-ac&amp;#039;).each(function(index,domEle){&lt;br /&gt;
      var answer_id;&lt;br /&gt;
      var label;&lt;br /&gt;
      var content;&lt;br /&gt;
      answer_id = jQuery(this).find(&amp;#039;input:first&amp;#039;).val();&lt;br /&gt;
      label = jQuery(this).find(&amp;#039;label:first&amp;#039;).html();&lt;br /&gt;
      content = &amp;#039;&amp;lt;button class=&amp;quot;gb-btn&amp;quot; value=&amp;quot;&amp;#039; + answer_id + &amp;#039;&amp;quot; type=&amp;quot;button&amp;quot;&amp;gt;&amp;#039; + label + &amp;#039;&amp;lt;/button&amp;gt;&amp;#039;;&lt;br /&gt;
      //jQuery(this).append(content);&lt;br /&gt;
      jQuery(this).html(content);&lt;br /&gt;
      //add click handler&lt;br /&gt;
      jQuery(this).find(&amp;#039;button:first&amp;#039;).click(function(){&lt;br /&gt;
        answer_id = jQuery(this).val();&lt;br /&gt;
        poll_id = jQuery(&amp;#039;.gb-storage:first&amp;#039;).attr(&amp;#039;gb-poll-id&amp;#039;);&lt;br /&gt;
        hidden_field = &amp;#039;&amp;lt;input id=&amp;quot;yop-poll-answer-&amp;#039; +answer_id + &amp;#039;&amp;quot; type=&amp;quot;hidden&amp;quot; name=&amp;quot;yop_poll_answer&amp;quot; value=&amp;quot;&amp;#039; + answer_id + &amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
        jQuery(this).after(hidden_field);&lt;br /&gt;
        yop_poll_do_vote(poll_id);&lt;br /&gt;
        return false;&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* for Mozilla/Opera9 */&lt;br /&gt;
if (document.addEventListener) {&lt;br /&gt;
  document.addEventListener(&amp;quot;DOMContentLoaded&amp;quot;, init, false);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* for Internet Explorer */&lt;br /&gt;
/*@cc_on @*/&lt;br /&gt;
/*@if (@_win32)&lt;br /&gt;
  document.write(&amp;quot;&amp;lt;script id=__ie_onload defer src=javascript:void(0)&amp;gt;&amp;lt;\/script&amp;gt;&amp;quot;);&lt;br /&gt;
  var script = document.getElementById(&amp;quot;__ie_onload&amp;quot;);&lt;br /&gt;
  script.onreadystatechange = function() {&lt;br /&gt;
    if (this.readyState == &amp;quot;complete&amp;quot;) {&lt;br /&gt;
      init(); // call the onload handler&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
/*@end @*/&lt;br /&gt;
&lt;br /&gt;
/* for Safari */&lt;br /&gt;
if (/WebKit/i.test(navigator.userAgent)) { // sniff&lt;br /&gt;
  var _timer = setInterval(function() {&lt;br /&gt;
    if (/loaded|complete/.test(document.readyState)) {&lt;br /&gt;
      init(); // call the onload handler&lt;br /&gt;
    }&lt;br /&gt;
  }, 10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* for other browsers */&lt;br /&gt;
window.onload = init;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nach Umfrage&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;gb_cust&amp;quot;&amp;gt;VORLÄUFIGES ERGEBNIS DER ABSTIMMUNG&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;ul&amp;gt;&lt;br /&gt;
		[ANSWER_RESULT_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;label class=&amp;quot;pds-feedback-label-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;pds-answer-text-%POLL-ID%&amp;quot;&amp;gt;%POLL-ANSWER-LABEL%&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;pds-feedback-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
					&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/label&amp;gt;&lt;br /&gt;
			&amp;lt;div&amp;gt;&lt;br /&gt;
             %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
           &amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;pds-feedback-per-%POLL-ID%&amp;quot;&amp;gt; %POLL-ANSWER-RESULT-LABEL%&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/li&amp;gt;&lt;br /&gt;
		[/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-vote-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-footer&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-ANSWERS%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-VOTES%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;!--&amp;lt;div id=&amp;quot;yop-poll-back-%POLL-ID%&amp;quot;&amp;gt;%POLL-BACK-TO-VOTE-LINK%&amp;lt;/div&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before Start Date&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This poll is about to &amp;lt;br&amp;gt;&lt;br /&gt;
start at %POLL-START-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
and finish at %POLL-END-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
After End Date&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This poll is closed!&lt;br /&gt;
Poll activity: &amp;lt;br&amp;gt;&lt;br /&gt;
start_date %POLL-START-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
end_date %POLL-END-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poll Results:&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-1&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ul&amp;gt;&lt;br /&gt;
		[ANSWER_RESULT_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;label class=&amp;quot;pds-feedback-label&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;pds-answer-text&amp;quot;&amp;gt;%POLL-ANSWER-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;pds-feedback-result&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;span class=&amp;quot;pds-feedback-per&amp;quot;&amp;gt; %POLL-ANSWER-RESULT-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/label&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;quot;pds-clear&amp;quot; style=&amp;quot;display: block;clear: both;height:1px;line-height:1px;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
	%POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
		&amp;lt;/li&amp;gt;&lt;br /&gt;
		[/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
%POLL-VOTE-BUTTON%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Generelle Prüfungen ===&lt;br /&gt;
* Custom Text Fields müssen für die Modifizierungen genau Custom Text Field 1	Kommentarund  Custom Text Field 2 Name lauten (Mascha verändert das manchmal)&lt;br /&gt;
 &lt;br /&gt;
=== Kommentare werden am Ende der Umfrage nicht angezeigt ===&lt;br /&gt;
* In der Umfrage muß bei Show results after Poll End Date oder zur Not auch Before Vote gewählt werden&lt;br /&gt;
* Im Template müssen die entsprechenden Felder im Bereich &amp;quot;Template after Poll End&amp;quot; vorhanden sein.&lt;br /&gt;
&lt;br /&gt;
== Change Log ==&lt;br /&gt;
=== Anpassungen für Admin Kommentare ===&lt;br /&gt;
2016-07&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Datenbanktabelle:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
--&lt;br /&gt;
-- Tabellenstruktur für Tabelle `kas_wp_yop_poll_admin_comments`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE IF NOT EXISTS `kas_wp_yop_poll_admin_comments` (&lt;br /&gt;
`id` int(10) unsigned NOT NULL,&lt;br /&gt;
  `vote_id` varchar(128) COLLATE latin1_general_ci NOT NULL,&lt;br /&gt;
  `comment` text COLLATE latin1_general_ci NOT NULL,&lt;br /&gt;
  `poll_id` int(11) NOT NULL&lt;br /&gt;
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=2 ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
db_schema.php Tabelle hinzufügen&lt;br /&gt;
admin.php Tabelle hinzufügen&lt;br /&gt;
yop_poll.php Tabelle hinzufügen&lt;br /&gt;
&lt;br /&gt;
answer_result_replace_callback -&amp;gt; &lt;br /&gt;
get_poll_comments -&amp;gt; admin kommentare dazufügen&lt;br /&gt;
&lt;br /&gt;
2016-06&lt;br /&gt;
Problem: Wenn Logs gelöscht sind werden keine Kommentare mehr angezeigt&lt;br /&gt;
Lösungsansatz. Leeres Ergebnis, weil ein Join über die vote_id zu den Logs geht.&lt;br /&gt;
8.8.13&lt;br /&gt;
&lt;br /&gt;
Hallo Mascha und Clemens,&lt;br /&gt;
&lt;br /&gt;
folgende Funktionalität ist jetzt implementiert:&lt;br /&gt;
&lt;br /&gt;
- Zu einem Hauptbeitrag (Sozusagen 1.Ebene - entspricht dem Post in&lt;br /&gt;
Wordpress) kann ein normaler Benutzer eine Frage stellen.&lt;br /&gt;
- Zu den Fragen (das wäre dann die 2. Ebene) kann jeder Benutzer&lt;br /&gt;
beliebig viele Beiträge machen&lt;br /&gt;
- Benutzer ab Level 7 (Redakteure und Admins) können beliebig viele&lt;br /&gt;
Fragen stellen.&lt;br /&gt;
&lt;br /&gt;
- Labels sind jetzt: &amp;quot;Hinterlasse einen Beitrag&amp;quot; und &amp;quot;Beitrag abschicken&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Grüße,&lt;br /&gt;
&lt;br /&gt;
Stephan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
11&lt;br /&gt;
&lt;br /&gt;
10/2014&lt;br /&gt;
* Kommentare in Spalten sortieren, je nach Antwort&lt;br /&gt;
* CSS Overflow auf auto setzen, damit bei langen Kommentaren ein Scrollbalken kommt. Dafür maximale Höhe für Kommentarausgabe, damit die Felder optisch nicht zu groß werden&lt;br /&gt;
&lt;br /&gt;
2016 - 04&lt;br /&gt;
* Neues Template für mehr Antwortoptionen. Kommentare werden untereinander (nicht in Spalten) dargestellt&lt;br /&gt;
* Einträge bei denen der User die nur den Namen ausfüllen aber nichts im Kommentarfeld schreiben werden nicht mehr angezeigt&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Abstimmung_wordpress&amp;diff=22637</id>
		<title>Abstimmung wordpress</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Abstimmung_wordpress&amp;diff=22637"/>
		<updated>2017-11-30T10:00:35Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Probleme lösen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;siehe auch [[DEKRA Direkt Blog]]&lt;br /&gt;
Der Blog &amp;#039;&amp;#039;&amp;#039;DEKRA Direkt&amp;#039;&amp;#039;&amp;#039; wird als interner Konzernblog verwendet und soll als Kontaktmittel der Mitarbeiter zur Vorstandsebene dienen. Dazu gibt es unter anderem die DEKRA Direkt Mitarbeiter Umfrage.&lt;br /&gt;
&lt;br /&gt;
== Todo ==&lt;br /&gt;
* Backendanzeige der Votes ist Buggy&lt;br /&gt;
* Besser zum Testen wäre es wenn die Umfrage zunächst in eine Kategorie Test geht die auf der Startseite nicht dargestellt wird. - OK ist über Plugin realisiert.&lt;br /&gt;
&lt;br /&gt;
Wordpress Extension Yop Poll - verwendet bei Mascha im Blog intern:&lt;br /&gt;
&lt;br /&gt;
== yop poll Anpassungen ==&lt;br /&gt;
=== yop poll Tabellen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
------------                -----------------                 --------------&lt;br /&gt;
yop_polls                   yop_poll_answers                  yop_poll_logs&lt;br /&gt;
------------                -----------------                 --------------&lt;br /&gt;
id          --------------| id               --------------|  id&lt;br /&gt;
name                      |-poll_id                        |  pn&lt;br /&gt;
question                    answer                         |  poll_id&lt;br /&gt;
total_votes                 votes                          |  vote_id&lt;br /&gt;
total_answers               ...                            |- answer_id&lt;br /&gt;
...                                                           --------------&lt;br /&gt;
------------                -----------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----------------------      ----------------------------&lt;br /&gt;
yop_poll_custom_fields      yop_poll_votes_custom_fields&lt;br /&gt;
----------------------      ----------------------------&lt;br /&gt;
id                          id&lt;br /&gt;
poll_id                     poll_id&lt;br /&gt;
custom_field                vote_id&lt;br /&gt;
...                         custom_field_id&lt;br /&gt;
----------------------      user_id&lt;br /&gt;
                            custom_field_value&lt;br /&gt;
                            ----------------------------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da bei einem custom text field bei der fragesstellung nur einzeiliger text möglich war, musst die datei &lt;br /&gt;
 /wp-content/plugins/yop-poll/inc/yop_poll_model.php&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In der datenbank die Tabelle:&lt;br /&gt;
&lt;br /&gt;
 kas_wp_yop_poll_votes_custom_fields&lt;br /&gt;
&lt;br /&gt;
Feld: custom_field_value&lt;br /&gt;
&lt;br /&gt;
von varchar (255) auf Text geändert.&lt;br /&gt;
&lt;br /&gt;
== SQL-Abfragen für Antworten mit Kommentar ==&lt;br /&gt;
=== SQL nur Ergebnisse ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT `id` , `poll_id` , `answer_id` , `ip` , `http_referer` , `vote_date` , `pn`&lt;br /&gt;
FROM `kas_wp_yop_poll_logs`&lt;br /&gt;
WHERE `poll_id` =38&lt;br /&gt;
ORDER BY `answer_id` ASC&lt;br /&gt;
LIMIT 0 , 500&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== SQL Abfrage mit Kommentaren ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alte Abfrage&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT *&lt;br /&gt;
FROM `kas_wp_yop_poll_logs`&lt;br /&gt;
LEFT OUTER JOIN `kas_wp_yop_poll_votes_custom_fields` ON `kas_wp_yop_poll_logs`.`vote_id` = `kas_wp_yop_poll_votes_custom_fields`.`vote_id`&lt;br /&gt;
WHERE `kas_wp_yop_poll_logs`.`poll_id` =13&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Weitere Abfragen ===&lt;br /&gt;
Welche Custom Fields gehören zu welchen Umfrage (Pivot Version)&lt;br /&gt;
&lt;br /&gt;
Dynamische Version (funktioniert noch nicht aber die Richtung dürfte stimmen)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET @sql = NULL;&lt;br /&gt;
SELECT&lt;br /&gt;
  GROUP_CONCAT(DISTINCT&lt;br /&gt;
    CONCAT(&lt;br /&gt;
      &amp;#039;max(case when custom_field = &amp;#039;&amp;#039;&amp;#039;,&lt;br /&gt;
      custom_field,&lt;br /&gt;
      &amp;#039;&amp;#039;&amp;#039; then custom_field end) AS &amp;#039;,&lt;br /&gt;
      custom_field&lt;br /&gt;
    )&lt;br /&gt;
  ) INTO @sql&lt;br /&gt;
FROM kas_wp_yop_poll_custom_fields;&lt;br /&gt;
&lt;br /&gt;
SET @sql = CONCAT(&amp;#039;SELECT poll_id, &amp;#039;, @sql, &amp;#039; &lt;br /&gt;
                  FROM kas_wp_yop_poll_custom_fields &lt;br /&gt;
                  GROUP BY poll_id&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
PREPARE stmt FROM @sql;&lt;br /&gt;
EXECUTE stmt;&lt;br /&gt;
DEALLOCATE PREPARE stmt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Neue Umfrage für DEKRA Connect durchführen ==&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
Läuft 2 Wochen ab ca. Mitte des Monats. Danach Auswertung und Grafikerstellung.&lt;br /&gt;
==== Updates ====&lt;br /&gt;
 2015-10 - Umfrage nur mit Cookie check -&amp;gt; Mascha möchte keine Userunterbrechung. Später werden die Ergebnisse manuell gereinigt&lt;br /&gt;
&lt;br /&gt;
===== Infos zum Cookie Check =====&lt;br /&gt;
Wenn man mit Cookies kontrolliert, wie wir das im Moment machen, dann testet das Plugin immer ob für eine bestimmte Umfrage schon abgestimmt wurde. &amp;#039;&amp;#039;&amp;#039;Egal ob die Umfrage neu gestartet wurde&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Technisch wird dazu ein Cookie mit der ID der Umfrage hinterlegt. Dieses hat eine &amp;#039;&amp;#039;&amp;#039;Gültigkeitsdauer&amp;#039;&amp;#039;&amp;#039; (kann man einstellen z.B. 14 Tage). Solange das Cookie gültig ist kann man dann nicht mehr abstimmen.&lt;br /&gt;
&lt;br /&gt;
Das bedeutet &amp;#039;&amp;#039;&amp;#039;alle Browser die noch nicht abgestimmt haben können auch abstimmen&amp;#039;&amp;#039;&amp;#039; !&lt;br /&gt;
&lt;br /&gt;
Wenn du nochmal testen willst mußt du die Cookies löschen oder 14 Tage warten.&lt;br /&gt;
&lt;br /&gt;
Nochmal zur Info Vor und Nachteile der anderen Lösungen&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kontrolle über IP&amp;#039;&amp;#039;&amp;#039;: Vorteil recht zuverlässig schwer zu umgehen. Nachteil: wenn Benutzer mit der gleichen IP ankommen kann es sein dass einer nicht abstimmen kann.&lt;br /&gt;
&lt;br /&gt;
* Über die &amp;#039;&amp;#039;&amp;#039;Personalnummer&amp;#039;&amp;#039;&amp;#039; Vorteil: Sehr Zuverlässig. Nachteil: Schlechte User Experience&lt;br /&gt;
&lt;br /&gt;
== Technischer Ablauf ==&lt;br /&gt;
Stand 2017&lt;br /&gt;
* Block by Cookie&lt;br /&gt;
&lt;br /&gt;
Stand März 2015 (obsolete)&lt;br /&gt;
&lt;br /&gt;
* Das Umfrage Plugin im WP ist auf &amp;#039;&amp;#039;&amp;#039;block by Personal Number&amp;#039;&amp;#039;&amp;#039; gestellt. -&amp;gt; Ab 2016 nur noch &amp;#039;&amp;#039;&amp;#039;by Cookie&amp;#039;&amp;#039;&amp;#039;(siehe oben)&lt;br /&gt;
* obsolete -&amp;gt; Ein User kann nur Voten wenn eine id=12345 (Personalnummer) angehängt ist. Ansonsten wird zunächst auf das DEKRA Intranet weiter geleitet (über alert). &lt;br /&gt;
* Dort wird die Personalnummer als id=12345 an den Link angehängt und auf intern-blog.dekra.de/category/dekra-direkt/?id=12345 geleitet Nur wenn eine solche id vorhanden ist kann gevoted werden. Ist nicht supersicher weil die Nummer willkürlich geändert werden kann, nachträgliche Prüfung wäre mit Personalnummern Liste möglich. Verbesserungspotential wäre POST übermittlung, Gültigkeitsprüfung durch PN-Index oder Formel.&lt;br /&gt;
* Hat die id &amp;#039;&amp;#039;&amp;#039;schon gevotet&amp;#039;&amp;#039;&amp;#039; wird nur das Ergebnis angezeigt.&lt;br /&gt;
* Im DEKRA Intranet werden Links an die eine id angehängt werden soll mit dem Parameter &amp;#039;&amp;#039;&amp;#039;?id=public&amp;#039;&amp;#039;&amp;#039; Veröffentlicht. public wird dann automatisch durch die Personalnummer des Mitarbeiters ersetzt, bevor weitergeleitet wird. &lt;br /&gt;
&lt;br /&gt;
=== Umfrage erstellen ===&lt;br /&gt;
* Achtung manchmal kollidiert die Abfrage mit alten Cookies der letzten Umfrage. Genau ist das noch nicht geklärt. Hilfe bringt: &lt;br /&gt;
** dafür sorgen, daß die alte Umfrage nicht mit angezeigt wird&lt;br /&gt;
** Logs löschen&lt;br /&gt;
** Wenn nichts hilft die Stats Reseten (kann sein daß dies nicht nötig ist.)&lt;br /&gt;
&lt;br /&gt;
* 1 oder mehrere (Mascha will meist 3) Umfragen-Dummies erstellen (z.B. eine alte klonen - &amp;#039;&amp;#039;&amp;#039;Vorsicht: Einstellungen für Datum, Template und Blocking&amp;#039;&amp;#039;&amp;#039; werden nicht übernommen)&lt;br /&gt;
* Template: &amp;#039;&amp;#039;&amp;#039;DEKRA Umfrage mit Kommentar&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
** Mit dem Template &amp;#039;&amp;#039;&amp;#039;DEKRA Umfrage mit dynamischem Kommentar&amp;#039;&amp;#039;&amp;#039; kann man zusätzlich noch JavaScript Popups öffnen und auf die gewählte Antwort reagieren (siehe JS im Template)&lt;br /&gt;
** Das Template &amp;#039;&amp;#039;&amp;#039;Umfrage mit mehr Antworten&amp;#039;&amp;#039;&amp;#039; erlaubt mehr als zwei Antwortmöglichkeiten. Die Kommentare werden dann untereinander dargestellt. Das ist zugleich auch das sicherste Template, was die Darstellung angeht.&lt;br /&gt;
* Blocking by auf &amp;#039;&amp;#039;&amp;#039;Personal Number&amp;#039;&amp;#039;&amp;#039; - dadurch wird die Abfrage des id Parameters gestartet. Zum Testen auf don&amp;#039;t Block stellen. Achtung IE hat manchmal Caching Probleme.&lt;br /&gt;
* Start und Enddatum setzen&lt;br /&gt;
* Abstimmung in einen &amp;#039;&amp;#039;&amp;#039;Beitrag in Kategorie Dekra Direkt&amp;#039;&amp;#039;&amp;#039; einpflegen (evtl. erst nach dem Testen) -&amp;gt; Startseite sichtbar&lt;br /&gt;
* Am Ende Umfrage auf &amp;#039;&amp;#039;&amp;#039;nur Antwort&amp;#039;&amp;#039;&amp;#039; !&lt;br /&gt;
* Geo-bit erstellt die Fragen, diese werden von Mascha angepasst und von Ihr in einem Beitrag veröffentlicht.&lt;br /&gt;
* Start der Umfrage durch setzen der Kategorie (todo ob das klappt)&lt;br /&gt;
&lt;br /&gt;
=== Test der Umfrage ===&lt;br /&gt;
* Vorige Tests sind sinnvoll. Ein Test von Geo-bit (einfach id anhängen). Ein Test von Dekra&lt;br /&gt;
=== Ende der Umfrage und Auswertung ===&lt;br /&gt;
Für die Auswertung benötigt Mascha eine &amp;#039;&amp;#039;&amp;#039;Excel-Tabelle&amp;#039;&amp;#039;&amp;#039; in der &amp;#039;&amp;#039;&amp;#039;nach Antworten und sortiert&amp;#039;&amp;#039;&amp;#039; ist. Ebenso die dazugehörigen Kommentare. Doppelte IPs rausschmeißen. Wenn Personalnummerliste vorhanden könnte man hier nach Gültigkeit prüfen.&lt;br /&gt;
* Umfrage mit Datum beenden oder auf Maschas Hinweis, &amp;#039;&amp;#039;&amp;#039;Umfrage auf don&amp;#039;t block&amp;#039;&amp;#039;&amp;#039;, damit die Umleitung auf Dekra nicht mehr aktiv ist, außerdem &amp;#039;&amp;#039;&amp;#039;Enddatum setzen&amp;#039;&amp;#039;&amp;#039; und auf &amp;#039;&amp;#039;&amp;#039;Ergebnis anzeigen nach Enddatum&amp;#039;&amp;#039;&amp;#039;. Endzeit etwas zurücksetzen, da manchmal die Serverzeit um ein paar Stunden differiert.&lt;br /&gt;
* SQL Abfrage (siehe Statement), Export als ods oder csv&lt;br /&gt;
* Doppelte überprüfen&lt;br /&gt;
* Umwandeln in Excel&lt;br /&gt;
* Schaubild aus Numbers&lt;br /&gt;
&lt;br /&gt;
=== Löschen unerwünschter Kommentare ===&lt;br /&gt;
&lt;br /&gt;
In&lt;br /&gt;
 Admin -&amp;gt; Yop poll -&amp;gt; All polls -&amp;gt; meineUmfrage -&amp;gt; votes&lt;br /&gt;
&lt;br /&gt;
hier auswählen und löschen&lt;br /&gt;
&lt;br /&gt;
Problem: die Kommentare werden nicht mehr angezeigt. TODO&lt;br /&gt;
&lt;br /&gt;
=== Anpassungen  am Plugin Yop poll===&lt;br /&gt;
&lt;br /&gt;
 yop-poll =&amp;gt; inc =&amp;gt; admin.php&lt;br /&gt;
&lt;br /&gt;
Hier die DB mit prefix versehen. &amp;quot;kas_&amp;quot;&lt;br /&gt;
 yop-poll =&amp;gt; inc =&amp;gt; yop_poll_model.php&lt;br /&gt;
 yop-poll =&amp;gt; inc =&amp;gt; db_schema.php&lt;br /&gt;
 yop-poll =&amp;gt; js =&amp;gt; yop_poll_public.js&lt;br /&gt;
==== Kommentare ====&lt;br /&gt;
MUSS überarbeitet werden&lt;br /&gt;
 yop_poll_modell.php&lt;br /&gt;
&lt;br /&gt;
 return_poll_html -&amp;gt; &lt;br /&gt;
dort wird der Template Block  		&lt;br /&gt;
 [ANSWER_RESULT_CONTAINER]&lt;br /&gt;
 [/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
mit pregreplace über eine Callback Funktion ersetzt&lt;br /&gt;
 answer_result_callback(m$)&lt;br /&gt;
darin wiederum wird &lt;br /&gt;
 get_poll_comments($poll_id) &lt;br /&gt;
aufgerufen, dieses gibt ein array zurück das dann in HTML umgesetzt wird. Diese Ausgabe erfolbt über die Abfrage von &lt;br /&gt;
 $this-&amp;gt;is_view_poll_results()&lt;br /&gt;
Das bedeutet die Ausgabe erfolgt wenn im Backend die Bedingung für die Ausgabe der Results gesetzt ist (z.B. Results after End Date) Gute erweiterung wäre ein eigener Block für die Comments&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Im Template muß der Block natürlich auch gesetzt sein.&amp;#039;&amp;#039;&amp;#039; (beim entsprechenden Template)&lt;br /&gt;
&lt;br /&gt;
Problem: Die Ausgabe erfolgt nur wenn die Logs der Umfrage nicht gelöscht sind.&lt;br /&gt;
Ausgabe der Kommentare bisher&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT yp.id,yp.name,yp.question,ypa.answer,ypvcf.custom_field_value,ypcf.custom_field,ypl.vote_id FROM kas_wp_yop_polls yp &lt;br /&gt;
JOIN kas_wp_yop_poll_custom_fields ypcf ON (yp.id=ypcf.poll_id) &lt;br /&gt;
JOIN kas_wp_yop_poll_votes_custom_fields ypvcf ON (ypcf.id = ypvcf.custom_field_id)&lt;br /&gt;
JOIN kas_wp_yop_poll_logs ypl ON (ypvcf.vote_id = ypl.vote_id)&lt;br /&gt;
JOIN kas_wp_yop_poll_answers ypa ON (ypl.answer_id = ypa.id)&lt;br /&gt;
WHERE yp.id=[pollID] AND ypl.answer_id=[answerID];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Abfrage wird für jede Antwort (answer_id) ausgeführt. Aus den Logs wird die answer_id geholt. Wenn diese im Log fehlt wird nichts zurückgegeben.&lt;br /&gt;
Wie kann man die Zuordnung Kommentar - answer_id noch herstellen? answer_id und vote_id stehen auch in yop_poll_voters, vote_id steht auch in yop_poll_votes_custom_fields&lt;br /&gt;
Also statt mit wp_yop_poll_logs joint man mit yop_poll_voters.&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT yp.id, yp.name, yp.question, ypa.answer, ypvcf.custom_field_value, ypcf.custom_field, ypv.vote_id&lt;br /&gt;
FROM kas_wp_yop_polls yp&lt;br /&gt;
JOIN kas_wp_yop_poll_custom_fields ypcf ON ( yp.id = ypcf.poll_id )&lt;br /&gt;
JOIN kas_wp_yop_poll_votes_custom_fields ypvcf ON ( ypcf.id = ypvcf.custom_field_id )&lt;br /&gt;
JOIN kas_wp_yop_poll_voters ypv ON ( ypvcf.vote_id = ypv.vote_id )&lt;br /&gt;
JOIN kas_wp_yop_poll_answers ypa ON ( ypv.answer_id = ypa.id )&lt;br /&gt;
WHERE yp.id =50&lt;br /&gt;
AND ypv.answer_id =113&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Yop Poll Templates ==&lt;br /&gt;
Todo - Anpassen um ungenutzte Features zu nutzen (z.B. after End Date schöne Anzeige der Ergebnisse)&lt;br /&gt;
=== DEKRA Umfrage mit Kommentar ===&lt;br /&gt;
Vor Umfrage:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot; style=&amp;quot;display:table-cell;height:130px;vertical-align:middle;&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ul&amp;gt;&lt;br /&gt;
		[ANSWER_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-answer-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			%POLL-ANSWER-CHECK-INPUT% &lt;br /&gt;
			%POLL-ANSWER-LABEL%&lt;br /&gt;
			&amp;lt;span class=&amp;quot;yop-poll-results-text-%POLL-ID%&amp;quot;&amp;gt;%POLL-ANSWER-RESULT-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
             %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
        &amp;lt;/li&amp;gt;&lt;br /&gt;
        [/ANSWER_CONTAINER]&lt;br /&gt;
		[OTHER_ANSWER_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-answer-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			%POLL-OTHER-ANSWER-CHECK-INPUT% &lt;br /&gt;
			%POLL-OTHER-ANSWER-LABEL% &lt;br /&gt;
			&amp;lt;span class=&amp;quot;yop-poll-results-text-%POLL-ID%&amp;quot;&amp;gt;%POLL-ANSWER-RESULT-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
			%POLL-OTHER-ANSWER-TEXT-INPUT% &lt;br /&gt;
            %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
        &amp;lt;/li&amp;gt;&lt;br /&gt;
        [/OTHER_ANSWER_CONTAINER]&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-custom-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ul&amp;gt;&lt;br /&gt;
		[CUSTOM_FIELD_CONTAINER]&lt;br /&gt;
		&amp;lt;li&amp;gt;%POLL-CUSTOM-FIELD-LABEL% %POLL-CUSTOM-FIELD-TEXT-INPUT%&amp;lt;/li&amp;gt;&lt;br /&gt;
		[/CUSTOM_FIELD_CONTAINER]&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;    &lt;br /&gt;
[CAPTCHA_CONTAINER]&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-captcha-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;yop-poll-captcha-image-div&amp;quot; id=&amp;quot;yop-poll-captcha-image-div-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
        %CAPTCHA-IMAGE%&lt;br /&gt;
        &amp;lt;div class=&amp;quot;yop-poll-captcha-helpers-div&amp;quot; id=&amp;quot;yop-poll-captcha-helpers-div-%POLL-ID%&amp;quot;&amp;gt;%RELOAD-CAPTCHA-IMAGE% &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;yop_poll_clear&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    %CAPTCHA-LABEL%&lt;br /&gt;
    &amp;lt;div class=&amp;quot;yop-poll-captcha-input-div&amp;quot; id=&amp;quot;yop-poll-captcha-input-div-%POLL-ID%&amp;quot;&amp;gt;%CAPTCHA-INPUT%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[/CAPTCHA_CONTAINER]&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-vote-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-footer&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-VOTE-BUTTON%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;yop-poll-results-%POLL-ID%&amp;quot;&amp;gt;%POLL-VIEW-RESULT-LINK%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-ANSWERS%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-VOTES%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nach Umfrage&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot; style=&amp;quot;display:table-cell;height:130px;vertical-align:middle;&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;div id=&amp;quot;gb_cust&amp;quot;&amp;gt;VORLÄUFIGES·ERGEBNIS·DER·ABSTIMMUNG&amp;lt;/div&amp;gt;	&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
		[ANSWER_RESULT_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;label class=&amp;quot;pds-feedback-label-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;pds-answer-text-%POLL-ID%&amp;quot;&amp;gt;%POLL-ANSWER-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;pds-feedback-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;span class=&amp;quot;pds-feedback-per-%POLL-ID%&amp;quot;&amp;gt; %POLL-ANSWER-RESULT-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/label&amp;gt;&lt;br /&gt;
			&amp;lt;div&amp;gt;&lt;br /&gt;
             %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
           &amp;lt;/div&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		[/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-vote-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-footer&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-ANSWERS%&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-VOTES%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;yop-poll-back-%POLL-ID%&amp;quot;&amp;gt;%POLL-BACK-TO-VOTE-LINK%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before Start Date&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This poll is about to &amp;lt;br&amp;gt;&lt;br /&gt;
start at %POLL-START-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
and finish at %POLL-END-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After End Date&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;gb_end&amp;quot;&amp;gt;Die Abstimmung ist beendet.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul class=&amp;quot;afterVote&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		[ANSWER_RESULT_CONTAINER]&lt;br /&gt;
		&lt;br /&gt;
		[/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
CSS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#yop-poll-container-%POLL-ID% {&lt;br /&gt;
    background-image: url(&amp;quot;http://intern-blog.dekra.de/wp-content/uploads/2013/02/bg_poll_1.png&amp;quot;);&lt;br /&gt;
/*    border: 5px solid #3F8B43;*/&lt;br /&gt;
background-repeat:no-repeat;&lt;br /&gt;
    color: #555555;&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    padding: 10px;&lt;br /&gt;
    width: 632px;&lt;br /&gt;
/*    height: 300px;*/&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-name-%POLL-ID% {&lt;br /&gt;
	font-size:14px;&lt;br /&gt;
	font-weight:bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-question-%POLL-ID% {&lt;br /&gt;
    color: #000000;&lt;br /&gt;
    font-size: 14pt;&lt;br /&gt;
    font-weight: 500;&lt;br /&gt;
    height: 80px;&lt;br /&gt;
    line-height: 26px;&lt;br /&gt;
    margin: 0 50px 0 0;&lt;br /&gt;
    padding-left: 215px;&lt;br /&gt;
    padding-top: 40px;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    width: 300px;&lt;br /&gt;
margin-bottom: 100px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-answers-%POLL-ID% { &lt;br /&gt;
 }&lt;br /&gt;
#yop-poll-answers-%POLL-ID% ul {&lt;br /&gt;
    list-style: none outside none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: 20px;&lt;br /&gt;
    left: 270px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-answers-%POLL-ID% ul li { &lt;br /&gt;
	font-style:normal;&lt;br /&gt;
	margin-bottom:10px;&lt;br /&gt;
	padding:0px;&lt;br /&gt;
	font-size:12px;&lt;br /&gt;
   width: 190px !important;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-answers-%POLL-ID% ul li input { &lt;br /&gt;
	margin:0px; &lt;br /&gt;
	float:none;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-answers-%POLL-ID% ul li label { &lt;br /&gt;
	margin:0px; &lt;br /&gt;
	font-style:normal; &lt;br /&gt;
	font-weight:bold; &lt;br /&gt;
	font-size:16px; &lt;br /&gt;
	float:none;&lt;br /&gt;
        z-index: 10; &lt;br /&gt;
}&lt;br /&gt;
.yop-poll-results-%POLL-ID% {&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    margin-left: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-custom-%POLL-ID% {  }&lt;br /&gt;
#yop-poll-custom-%POLL-ID% ul {&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 500;&lt;br /&gt;
    left: 270px;&lt;br /&gt;
    list-style: none outside none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: 20px;&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 375px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-custom-%POLL-ID% ul li { &lt;br /&gt;
	padding:0px;&lt;br /&gt;
	margin:0px;	&lt;br /&gt;
	font-size:14px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-container-%POLL-ID% input[type=&amp;#039;text&amp;#039;] { &lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    margin: 10px 0;&lt;br /&gt;
    padding: 2%;&lt;br /&gt;
    text-indent: 2%;&lt;br /&gt;
    width: 92%;&lt;br /&gt;
    border: 1px solid #B9B8B8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-container-%POLL-ID% textarea {&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    margin: 10px 0;&lt;br /&gt;
    padding: 2%;&lt;br /&gt;
    text-indent: 2%;&lt;br /&gt;
    width: 92%;&lt;br /&gt;
    font-family: Verdana;&lt;br /&gt;
    color: #666;&lt;br /&gt;
    border: 1px solid #B9B8B8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-captcha-input-div-%POLL-ID% {&lt;br /&gt;
margin-top:5px;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-captcha-helpers-div-%POLL-ID% {&lt;br /&gt;
width:30px;&lt;br /&gt;
float:left;&lt;br /&gt;
margin-left:5px;&lt;br /&gt;
height:0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-captcha-helpers-div-%POLL-ID% img {&lt;br /&gt;
margin-bottom:2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-captcha-image-div-%POLL-ID% {&lt;br /&gt;
margin-bottom:5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop_poll_captcha_image_%POLL-ID% {&lt;br /&gt;
float:left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.yop_poll_clear {&lt;br /&gt;
clear:both;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#yop-poll-vote-%POLL-ID% {&lt;br /&gt;
float:left; &lt;br /&gt;
/*width:100%; */&lt;br /&gt;
padding-left: 270px;&lt;br /&gt;
margin-top: 20px;&lt;br /&gt;
margin-bottom: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
li.yop-poll-li-result-%POLL-ID% {&lt;br /&gt;
/*    margin-top: 50px;*/&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.yop-poll-results-bar-%POLL-ID% { background:#f5f5f5; height:10px;  }&lt;br /&gt;
.yop-poll-results-bar-%POLL-ID% div { background:#555; height:10px; }&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div#yop-poll-vote-%POLL-ID% button { float:left; }&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div#yop-poll-results-%POLL-ID% {&lt;br /&gt;
    float: right;&lt;br /&gt;
    margin-bottom: 20px;&lt;br /&gt;
    margin-top: -20px;&lt;br /&gt;
    width: auto;&lt;br /&gt;
}&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div#yop-poll-results-%POLL-ID% a { color:#3F8B43; text-decoration:underline; font-size:12px;}&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div#yop-poll-back-%POLL-ID% a { color:#3F8B43; text-decoration:underline; font-size:12px;}&lt;br /&gt;
#yop-poll-vote-%POLL-ID% div { float:left; width:100%; }&lt;br /&gt;
&lt;br /&gt;
#yop-poll-container-error-%POLL-ID% {&lt;br /&gt;
	font-size:12px;&lt;br /&gt;
	font-style:italic;&lt;br /&gt;
	color:red;&lt;br /&gt;
    left: 290px;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: 270px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.gb-btn {&lt;br /&gt;
    background-image: url(&amp;quot;http://intern-blog.dekra.de/wp-content/uploads/2013/02/bg_button.png&amp;quot;);&lt;br /&gt;
    border: medium none;&lt;br /&gt;
    border-radius: 10px 10px 10px 10px;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    font-size: 1.9em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    height: 40px;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    width: 130px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#gb_cust {&lt;br /&gt;
    color: #999999;&lt;br /&gt;
    font-size: 1.4em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    padding-left: 0px;&lt;br /&gt;
    padding-top: 40px;&lt;br /&gt;
    background-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
.yop-poll-results-bar-%POLL-ID% div{&lt;br /&gt;
    background-image: url(&amp;quot;http://intern-blog.dekra.de/wp-content/uploads/2013/02/bg_button.png&amp;quot;);&lt;br /&gt;
    height: 30px;&lt;br /&gt;
    margin-top: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.yop-poll-results-bar-%POLL-ID% {&lt;br /&gt;
height: 30px;&lt;br /&gt;
width:99%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pds-answer-text-%POLL-ID% {&lt;br /&gt;
font-size: 0.85em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
color: #999;&lt;br /&gt;
/*    margin-top: -10px;*/&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pds-feedback-per-%POLL-ID% {&lt;br /&gt;
   color: #999999;&lt;br /&gt;
    font-size: 1em;&lt;br /&gt;
    margin-left: 5px;&lt;br /&gt;
    margin-top: -25px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.yop_poll_vote_button{&lt;br /&gt;
    background-image: url(&amp;quot;http://intern-blog.dekra.de/wp-content/uploads/2013/02/bg_button.png&amp;quot;);&lt;br /&gt;
    border: medium none;&lt;br /&gt;
    border-radius: 10px 10px 10px 10px;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    font-size: 1.9em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    height: 40px;&lt;br /&gt;
    width: 250px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#gb_end {&lt;br /&gt;
    color: #999999;&lt;br /&gt;
    font-size: 1.4em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    padding-bottom: 100px;&lt;br /&gt;
    padding-left: 250px;&lt;br /&gt;
    padding-top: 130px;&lt;br /&gt;
    background-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-container-%POLL-ID% textarea {&lt;br /&gt;
#max-width: 350px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#yop-poll-container-success-%POLL-ID% {&lt;br /&gt;
	font-size:12px;&lt;br /&gt;
	font-style:italic;&lt;br /&gt;
	color:green;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
JS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function stripBorder_%POLL-ID%(object) {&lt;br /&gt;
	object.each(function() {&lt;br /&gt;
			if( parseInt(jQuery(this).width() ) &amp;gt; 0) {&lt;br /&gt;
				jQuery(this).width( parseInt( jQuery(this).width() ) - parseInt(jQuery(this).css(&amp;quot;border-left-width&amp;quot;)) - parseInt(jQuery(this).css(&amp;quot;border-right-width&amp;quot;)) );&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				jQuery(this).css(&amp;quot;border-left-width&amp;quot;, &amp;#039;0px&amp;#039;);&lt;br /&gt;
				jQuery(this).css(&amp;quot;border-right-width&amp;quot;, &amp;#039;0px&amp;#039;);&lt;br /&gt;
			}&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
function stripPadding_%POLL-ID%(object) {&lt;br /&gt;
	object.each(function() { &lt;br /&gt;
			jQuery(this).width( parseInt( jQuery(this).width() ) - parseInt(jQuery(this).css(&amp;quot;padding-left&amp;quot;)) - parseInt(jQuery(this).css(&amp;quot;padding-left&amp;quot;)) );&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function strip_results_%POLL-ID%() {&lt;br /&gt;
        stripPadding_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop_poll_li_result-%POLL-ID%&amp;quot;) );   &lt;br /&gt;
	stripBorder_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-result-bar-%POLL-ID%&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
jQuery(document).ready(function(e) {&lt;br /&gt;
                if(typeof window.strip_results_%POLL-ID% == &amp;#039;function&amp;#039;) &lt;br /&gt;
			strip_results_%POLL-ID%();&lt;br /&gt;
    &lt;br /&gt;
		if(typeof window.tabulate_answers_%POLL-ID% == &amp;#039;function&amp;#039;) &lt;br /&gt;
			tabulate_answers_%POLL-ID%();&lt;br /&gt;
		&lt;br /&gt;
		if(typeof window.tabulate_results_%POLL-ID% == &amp;#039;function&amp;#039;) &lt;br /&gt;
			tabulate_results_%POLL-ID%();&lt;br /&gt;
		&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
function equalWidth_%POLL-ID%(obj, cols, findWidest ) {&lt;br /&gt;
 findWidest  = typeof findWidest  !== &amp;#039;undefined&amp;#039; ? findWidest  : false;&lt;br /&gt;
    if ( findWidest ) {&lt;br /&gt;
		obj.each(function() {&lt;br /&gt;
				var thisWidth = jQuery(this).width();&lt;br /&gt;
				width = parseInt(thisWidth / cols); &lt;br /&gt;
				jQuery(this).width(width);	&lt;br /&gt;
				jQuery(this).css(&amp;#039;float&amp;#039;, &amp;#039;left&amp;#039;);	&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		var widest = 0;&lt;br /&gt;
		obj.each(function() {&lt;br /&gt;
				var thisWidth = jQuery(this).width();&lt;br /&gt;
				if(thisWidth &amp;gt; widest) {&lt;br /&gt;
					widest = thisWidth; &lt;br /&gt;
				}	&lt;br /&gt;
		});&lt;br /&gt;
		width = parseInt( widest / cols); &lt;br /&gt;
		obj.width(width);	&lt;br /&gt;
		obj.css(&amp;#039;float&amp;#039;, &amp;#039;left&amp;#039;);	&lt;br /&gt;
	}	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function tabulate_answers_%POLL-ID%() {&lt;br /&gt;
	equalWidth_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-li-answer-%POLL-ID%&amp;quot;), %ANSWERS-TABULATED-COLS% );&lt;br /&gt;
        //equalWidth_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-li-answer-%POLL-ID% .yop-poll-results-bar-%POLL-ID% div &amp;quot;), %ANSWERS-TABULATED-COLS%, true );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function tabulate_results_%POLL-ID%() {&lt;br /&gt;
	equalWidth_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-li-result-%POLL-ID%&amp;quot;), %RESULTS-TABULATED-COLS% );&lt;br /&gt;
        //equalWidth_%POLL-ID%( jQuery(&amp;quot;#yop-poll-container-%POLL-ID% .yop-poll-li-result-%POLL-ID% .yop-poll-results-bar-%POLL-ID% div &amp;quot;), %RESULTS-TABULATED-COLS%, true );&lt;br /&gt;
}&lt;br /&gt;
			jQuery(document).ready(function(){&lt;br /&gt;
				runOnPollStateChange_%POLL-ID%();&lt;br /&gt;
				});&lt;br /&gt;
&lt;br /&gt;
			function runOnPollStateChange_%POLL-ID%() {};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Dekra Poll Template für ID 2 (altes Template) ===&lt;br /&gt;
Vor Umfrage&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;gb_cust&amp;quot;&amp;gt;STIMMEN SIE JETZT AB !&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;ul&amp;gt;&lt;br /&gt;
    [ANSWER_CONTAINER]&lt;br /&gt;
    &amp;lt;li class=&amp;quot;gb-ac yop-poll-li-answer-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
      %POLL-ANSWER-CHECK-INPUT% &lt;br /&gt;
      %POLL-ANSWER-LABEL%&lt;br /&gt;
      &amp;lt;span class=&amp;quot;yop-poll-results-text-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
        %POLL-ANSWER-RESULT-LABEL%&lt;br /&gt;
      &amp;lt;/span&amp;gt;&lt;br /&gt;
      %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    [/ANSWER_CONTAINER]&lt;br /&gt;
    [OTHER_ANSWER_CONTAINER]&lt;br /&gt;
    &amp;lt;li class=&amp;quot;gb-oac yop-poll-li-answer-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
      %POLL-OTHER-ANSWER-CHECK-INPUT% &lt;br /&gt;
      %POLL-OTHER-ANSWER-LABEL% &lt;br /&gt;
      &amp;lt;span class=&amp;quot;yop-poll-results-text-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
        %POLL-ANSWER-RESULT-LABEL%&lt;br /&gt;
      &amp;lt;/span&amp;gt;&lt;br /&gt;
      %POLL-OTHER-ANSWER-TEXT-INPUT% &lt;br /&gt;
      %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    [/OTHER_ANSWER_CONTAINER]&lt;br /&gt;
  &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[CUSTOM_FIELD_CONTAINER]&lt;br /&gt;
		&amp;lt;li&amp;gt;%POLL-CUSTOM-FIELD-LABEL% %POLL-CUSTOM-FIELD-TEXT-INPUT%&amp;lt;/li&amp;gt;&lt;br /&gt;
		[/CUSTOM_FIELD_CONTAINER]&lt;br /&gt;
[CAPTCHA_CONTAINER]&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-captcha-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;yop-poll-captcha-image-div&amp;quot; id=&amp;quot;yop-poll-captcha-image-div-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
        %CAPTCHA-IMAGE%&lt;br /&gt;
        &amp;lt;div class=&amp;quot;yop-poll-captcha-helpers-div&amp;quot; id=&amp;quot;yop-poll-captcha-helpers-div-%POLL-ID%&amp;quot;&amp;gt;%RELOAD-CAPTCHA-IMAGE% &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;yop_poll_clear&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    %CAPTCHA-LABEL%&lt;br /&gt;
    &amp;lt;div class=&amp;quot;yop-poll-captcha-input-div&amp;quot; id=&amp;quot;yop-poll-captcha-input-div-%POLL-ID%&amp;quot;&amp;gt;%CAPTCHA-INPUT%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[/CAPTCHA_CONTAINER]&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-vote-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-footer&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;poll-vote-button&amp;quot;&amp;gt;%POLL-VOTE-BUTTON%&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;%POLL-TOTAL-ANSWERS%&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;%POLL-TOTAL-VOTES%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;gb-storage&amp;quot; gb-poll-id=&amp;quot;%POLL-ID%&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Load check from Dean Edwards/Matthias Miller/John Resig&lt;br /&gt;
&lt;br /&gt;
function init() {&lt;br /&gt;
  if (arguments.callee.done) return;&lt;br /&gt;
  arguments.callee.done = true;&lt;br /&gt;
  if (_timer) clearInterval(_timer);&lt;br /&gt;
&lt;br /&gt;
  jQuery(document).ready(function() {&lt;br /&gt;
    // remove vote button&lt;br /&gt;
    jQuery(&amp;#039;.poll-vote-button&amp;#039;).html(&amp;#039;&amp;#039;);&lt;br /&gt;
    // add Buttons&lt;br /&gt;
    jQuery(&amp;#039;.gb-ac&amp;#039;).each(function(index,domEle){&lt;br /&gt;
      var answer_id;&lt;br /&gt;
      var label;&lt;br /&gt;
      var content;&lt;br /&gt;
      answer_id = jQuery(this).find(&amp;#039;input:first&amp;#039;).val();&lt;br /&gt;
      label = jQuery(this).find(&amp;#039;label:first&amp;#039;).html();&lt;br /&gt;
      content = &amp;#039;&amp;lt;button class=&amp;quot;gb-btn&amp;quot; value=&amp;quot;&amp;#039; + answer_id + &amp;#039;&amp;quot; type=&amp;quot;button&amp;quot;&amp;gt;&amp;#039; + label + &amp;#039;&amp;lt;/button&amp;gt;&amp;#039;;&lt;br /&gt;
      //jQuery(this).append(content);&lt;br /&gt;
      jQuery(this).html(content);&lt;br /&gt;
      //add click handler&lt;br /&gt;
      jQuery(this).find(&amp;#039;button:first&amp;#039;).click(function(){&lt;br /&gt;
        answer_id = jQuery(this).val();&lt;br /&gt;
        poll_id = jQuery(&amp;#039;.gb-storage:first&amp;#039;).attr(&amp;#039;gb-poll-id&amp;#039;);&lt;br /&gt;
        hidden_field = &amp;#039;&amp;lt;input id=&amp;quot;yop-poll-answer-&amp;#039; +answer_id + &amp;#039;&amp;quot; type=&amp;quot;hidden&amp;quot; name=&amp;quot;yop_poll_answer&amp;quot; value=&amp;quot;&amp;#039; + answer_id + &amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
        jQuery(this).after(hidden_field);&lt;br /&gt;
        yop_poll_do_vote(poll_id);&lt;br /&gt;
        return false;&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* for Mozilla/Opera9 */&lt;br /&gt;
if (document.addEventListener) {&lt;br /&gt;
  document.addEventListener(&amp;quot;DOMContentLoaded&amp;quot;, init, false);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* for Internet Explorer */&lt;br /&gt;
/*@cc_on @*/&lt;br /&gt;
/*@if (@_win32)&lt;br /&gt;
  document.write(&amp;quot;&amp;lt;script id=__ie_onload defer src=javascript:void(0)&amp;gt;&amp;lt;\/script&amp;gt;&amp;quot;);&lt;br /&gt;
  var script = document.getElementById(&amp;quot;__ie_onload&amp;quot;);&lt;br /&gt;
  script.onreadystatechange = function() {&lt;br /&gt;
    if (this.readyState == &amp;quot;complete&amp;quot;) {&lt;br /&gt;
      init(); // call the onload handler&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
/*@end @*/&lt;br /&gt;
&lt;br /&gt;
/* for Safari */&lt;br /&gt;
if (/WebKit/i.test(navigator.userAgent)) { // sniff&lt;br /&gt;
  var _timer = setInterval(function() {&lt;br /&gt;
    if (/loaded|complete/.test(document.readyState)) {&lt;br /&gt;
      init(); // call the onload handler&lt;br /&gt;
    }&lt;br /&gt;
  }, 10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* for other browsers */&lt;br /&gt;
window.onload = init;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nach Umfrage&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-name-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-name&amp;quot;&amp;gt;%POLL-NAME%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;gb_cust&amp;quot;&amp;gt;VORLÄUFIGES ERGEBNIS DER ABSTIMMUNG&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;ul&amp;gt;&lt;br /&gt;
		[ANSWER_RESULT_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;label class=&amp;quot;pds-feedback-label-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;pds-answer-text-%POLL-ID%&amp;quot;&amp;gt;%POLL-ANSWER-LABEL%&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;pds-feedback-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
					&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/label&amp;gt;&lt;br /&gt;
			&amp;lt;div&amp;gt;&lt;br /&gt;
             %POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
           &amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;pds-feedback-per-%POLL-ID%&amp;quot;&amp;gt; %POLL-ANSWER-RESULT-LABEL%&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/li&amp;gt;&lt;br /&gt;
		[/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-vote-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-footer&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-ANSWERS%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;%POLL-TOTAL-VOTES%&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;!--&amp;lt;div id=&amp;quot;yop-poll-back-%POLL-ID%&amp;quot;&amp;gt;%POLL-BACK-TO-VOTE-LINK%&amp;lt;/div&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before Start Date&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This poll is about to &amp;lt;br&amp;gt;&lt;br /&gt;
start at %POLL-START-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
and finish at %POLL-END-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
After End Date&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This poll is closed!&lt;br /&gt;
Poll activity: &amp;lt;br&amp;gt;&lt;br /&gt;
start_date %POLL-START-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
end_date %POLL-END-DATE%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poll Results:&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-question-%POLL-ID%&amp;quot; class=&amp;quot;yop-poll-question&amp;quot;&amp;gt;%POLL-QUESTION%&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;yop-poll-answers-1&amp;quot; class=&amp;quot;yop-poll-answers&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;ul&amp;gt;&lt;br /&gt;
		[ANSWER_RESULT_CONTAINER]&lt;br /&gt;
		&amp;lt;li class=&amp;quot;yop-poll-li-result-%POLL-ID%&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;label class=&amp;quot;pds-feedback-label&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;pds-answer-text&amp;quot;&amp;gt;%POLL-ANSWER-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;pds-feedback-result&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;span class=&amp;quot;pds-feedback-per&amp;quot;&amp;gt; %POLL-ANSWER-RESULT-LABEL%&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/label&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;quot;pds-clear&amp;quot; style=&amp;quot;display: block;clear: both;height:1px;line-height:1px;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
	%POLL-ANSWER-RESULT-BAR%&lt;br /&gt;
		&amp;lt;/li&amp;gt;&lt;br /&gt;
		[/ANSWER_RESULT_CONTAINER]&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
%POLL-VOTE-BUTTON%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Generelle Prüfungen ===&lt;br /&gt;
* Custom Text Fields müssen für die Modifizierungen genau Custom Text Field 1	Kommentarund  Custom Text Field 2 Name lauten (Mascha verändert das manchmal)&lt;br /&gt;
 &lt;br /&gt;
=== Kommentare werden am Ende der Umfrage nicht angezeigt ===&lt;br /&gt;
* In der Umfrage muß bei Show results after Poll End Date oder zur Not auch Before Vote gewählt werden&lt;br /&gt;
* Im Template müssen die entsprechenden Felder im Bereich &amp;quot;Template after Poll End&amp;quot; vorhanden sein.&lt;br /&gt;
&lt;br /&gt;
== Change Log ==&lt;br /&gt;
=== Anpassungen für Admin Kommentare ===&lt;br /&gt;
2016-07&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Datenbanktabelle:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
--&lt;br /&gt;
-- Tabellenstruktur für Tabelle `kas_wp_yop_poll_admin_comments`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE IF NOT EXISTS `kas_wp_yop_poll_admin_comments` (&lt;br /&gt;
`id` int(10) unsigned NOT NULL,&lt;br /&gt;
  `vote_id` varchar(128) COLLATE latin1_general_ci NOT NULL,&lt;br /&gt;
  `comment` text COLLATE latin1_general_ci NOT NULL,&lt;br /&gt;
  `poll_id` int(11) NOT NULL&lt;br /&gt;
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=2 ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
db_schema.php Tabelle hinzufügen&lt;br /&gt;
admin.php Tabelle hinzufügen&lt;br /&gt;
yop_poll.php Tabelle hinzufügen&lt;br /&gt;
&lt;br /&gt;
answer_result_replace_callback -&amp;gt; &lt;br /&gt;
get_poll_comments -&amp;gt; admin kommentare dazufügen&lt;br /&gt;
&lt;br /&gt;
2016-06&lt;br /&gt;
Problem: Wenn Logs gelöscht sind werden keine Kommentare mehr angezeigt&lt;br /&gt;
Lösungsansatz. Leeres Ergebnis, weil ein Join über die vote_id zu den Logs geht.&lt;br /&gt;
8.8.13&lt;br /&gt;
&lt;br /&gt;
Hallo Mascha und Clemens,&lt;br /&gt;
&lt;br /&gt;
folgende Funktionalität ist jetzt implementiert:&lt;br /&gt;
&lt;br /&gt;
- Zu einem Hauptbeitrag (Sozusagen 1.Ebene - entspricht dem Post in&lt;br /&gt;
Wordpress) kann ein normaler Benutzer eine Frage stellen.&lt;br /&gt;
- Zu den Fragen (das wäre dann die 2. Ebene) kann jeder Benutzer&lt;br /&gt;
beliebig viele Beiträge machen&lt;br /&gt;
- Benutzer ab Level 7 (Redakteure und Admins) können beliebig viele&lt;br /&gt;
Fragen stellen.&lt;br /&gt;
&lt;br /&gt;
- Labels sind jetzt: &amp;quot;Hinterlasse einen Beitrag&amp;quot; und &amp;quot;Beitrag abschicken&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Grüße,&lt;br /&gt;
&lt;br /&gt;
Stephan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
11&lt;br /&gt;
&lt;br /&gt;
10/2014&lt;br /&gt;
* Kommentare in Spalten sortieren, je nach Antwort&lt;br /&gt;
* CSS Overflow auf auto setzen, damit bei langen Kommentaren ein Scrollbalken kommt. Dafür maximale Höhe für Kommentarausgabe, damit die Felder optisch nicht zu groß werden&lt;br /&gt;
&lt;br /&gt;
2016 - 04&lt;br /&gt;
* Neues Template für mehr Antwortoptionen. Kommentare werden untereinander (nicht in Spalten) dargestellt&lt;br /&gt;
* Einträge bei denen der User die nur den Namen ausfüllen aber nichts im Kommentarfeld schreiben werden nicht mehr angezeigt&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Reliefmodell_Bayerischer_Wald&amp;diff=22636</id>
		<title>Reliefmodell Bayerischer Wald</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Reliefmodell_Bayerischer_Wald&amp;diff=22636"/>
		<updated>2017-11-29T14:12:19Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
2x Firefox im Kioskmode (r-kiosk) &lt;br /&gt;
Apache (XAMPP)&lt;br /&gt;
2x HTML-Seiten mit Flash Film. Kommunikation über ActionScript.&lt;br /&gt;
&lt;br /&gt;
== ActionScript ==&lt;br /&gt;
* MenuApp Objekt importiert Klassen aus geo-bit/baywa/core/MenuApp.as&lt;br /&gt;
== ToDo ==&lt;br /&gt;
Sicherheit Windows&lt;br /&gt;
Wartungsaufgaben definieren (Apache aufräumen etc.) evt. automatisieren&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
Girder zur Automatisierung -&amp;gt; nicht benötigt (vorerst)&lt;br /&gt;
Maus-Trap -&amp;gt; nicht benötigt (Touch Screen)&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=TYPO3_auf_utf-8_umstellen&amp;diff=22635</id>
		<title>TYPO3 auf utf-8 umstellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=TYPO3_auf_utf-8_umstellen&amp;diff=22635"/>
		<updated>2017-11-24T09:14:55Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quickstart ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vorgehen mit mySQL Bordmitteln ===&lt;br /&gt;
Siehe [[mySQL charset - von latin nach utf-8]]&lt;br /&gt;
&lt;br /&gt;
=== Hinweis zum PHP Skript db_utf8_fix.php ===&lt;br /&gt;
&lt;br /&gt;
In den Tools gibt es ein Skript das in der Regel die Konvertierung gut erledigt. Manchmal gibt es Probleme, es kann z.B. vorkommen, daß die Tabellen zwar auf latin stehen aber die Zeichen trotzdem in utf-8 gespeichert sind. Dann müßte eigentlich kein modify ausgeführt werden, sondern nur ein alter charset. Hinweis darauf ist, wenn nach der Konvertierung Datenfehlen. Und zwar immer ab dem ersten Umlaut o.ä.&lt;br /&gt;
&lt;br /&gt;
=== TYPO3 ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Install Tool „All Configuration“&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[forceCharset] = utf-8&lt;br /&gt;
[setDBinit] = SET NAMES utf8; SET CHARACTER_SET utf8; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zweiter Teil ist oft nicht notwendig kann aber probiert werden wenn irgendwas nicht klappt.&lt;br /&gt;
 &lt;br /&gt;
Sie müssen im TypoScript übrigens „metaCharset“ und „renderCharset“ nicht setzen, da „forceCharset“ diese beiden Werte automatisch setzt. &lt;br /&gt;
Mit „SET NAMES utf8;&amp;quot; wird MySQL darüber informiert, in welchem Zeichensatz die Daten übermittelt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== mySQL ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Datenbank sichern&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 mysqldump --opt -Q -u USER -p PASSWORT -h HOST DB &amp;gt; dump.sql&lt;br /&gt;
oder im Kompatibilitätsmodus (ohne Kollation) mit&lt;br /&gt;
 --compatible=mysql40&lt;br /&gt;
 Wenn ohne Kompatibilitätsmodus dann Charset und Kollation anpassen. Aus der Zeile &lt;br /&gt;
 ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;&lt;br /&gt;
wird dann z.B.:&lt;br /&gt;
ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;&lt;br /&gt;
&lt;br /&gt;
Nun folgt die Konvertierung des Dumps nach UTF-8. Bitte kopieren Sie sich sicherheitshalber den Dump als Backup an eine sichere Stelle, falls bei irgendwelchen Versuchen etwas fehlschlagen sollte. Auf der Linux-Shell muss nun folgendes eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
SHELL&lt;br /&gt;
iconv -f iso-8859-1 -t utf8 dump.sql &amp;gt; dump-iconv.sql&lt;br /&gt;
Listing 2&lt;br /&gt;
&lt;br /&gt;
Wenn Sie einen anderen Zeichensatz als „ISO 8859-1“ verwendet haben, dann müssen Sie die Angabe hinter dem „-f“ noch anpassen. Der erstellte Dump sollte nun UTF-8-kodiert vorliegen und Sie können diesen schon bald zurücksichern. Doch bevor Sie dies tun, müssen erst die Einträge im Install-Tool von TYPO3 gemacht werden, die auch schon vorher bei der Neuinstallation beschrieben wurden. Sie können dazu das Install-Tool benutzen oder aber auch im Ordner „typo3conf“ die Datei „localconf.php“ um folgende zwei Zeilen ergänzen und anschließend die „temp_CACHED_*“-Dateien löschen:&lt;br /&gt;
&lt;br /&gt;
SHELL&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;setDBinit&amp;#039;] = &amp;#039;SET NAMES utf8;&amp;#039;;&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;BE&amp;#039;][&amp;#039;forceCharset&amp;#039;] = &amp;#039;utf-8&amp;#039;;&lt;br /&gt;
Listing 3&lt;br /&gt;
&lt;br /&gt;
TYPO3 verwendet jetzt schon für die Datenbankverbindung und die Ausgabe im Frontend und Backend UTF-8. Da Sie erst jetzt unseren umgewandelten Dump zurückspielen, kann es nicht passieren, dass versehentlich zwei verschiedene Zeichensätze in der Datenbank vorhanden sind (z. B. durch einen Datenbank-Eintrag in den Seitencache, der von einem Besucher der Website erzeugt wurde). Mit der folgenden Zeile wird die Datenbank zurückgesichert:&lt;br /&gt;
&lt;br /&gt;
SHELL&lt;br /&gt;
mysql -u USER -p PASSWORT -h HOST --default-character-set=utf8 DB &amp;lt; dump-iconv.sql&lt;br /&gt;
Listing 4&lt;br /&gt;
&lt;br /&gt;
Mit dem „--default-character-set=UTF8“ wird MySQL mitgeteilt, dass die Daten schon im UTF-8 Format vorliegen. Ohne diese Angabe würde aus „üöä“ „Ã¼Ã¶Ã¤“. Sie sollten nun prüfen, ob alles geklappt hat, indem Sie im Frontend, im Backend sowie mit phpMyAdmin die Umlaute prüfen. Zusätzlich können Sie auch mit dem MySQL-Query-Browser [3] prüfen, ob alles ordnungsgemäß angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
Was tun bei falsch codierten Zeichen?&lt;br /&gt;
&lt;br /&gt;
Wenn bei einer MySQL-4.0-Datenbank im Install-Tool „forceCharset“ auf „utf-8“ gesetzt wurde, übermittelt TYPO3 die Zeichen utf-8-kodiert an die Datenbank. MySQL 4 kann damit allerdings nichts anfangen und speichert diese so, dass weder Suche noch Sortierung innerhalb von MySQL funktionieren. Wenn ein Dump von dieser MySQL-4.0-Datenbank gemacht wird, sind diese Daten schon UTF-8-kodiert und müssen nur noch in eine MySQL-4.1- oder 5.0-Datenbank importiert werden. Der benötigte Befehl ist in Listing 4 zu sehen. Es kommt auch hier wieder vor allem auf die Angabe „--default-character-set=UTF8“ an. Die Kollation der Datenbank muss vor dem Einspielen des Dumps ebenfalls auf „utf8_general_ci“ gesetzt werden. Da TYPO3 in alten Versionen Probleme mit aktuelleren MySQL-Versionen hatte, wird man dies sinnvollerweise nur bei einem Update auf eine neue TYPO3-Version machen. Erst diese bietet die notwendige Einstellung „SET NAMES utf8;“.&lt;br /&gt;
&lt;br /&gt;
Und hiermit wären wir beim nächsten Problem: In alten TYPO3-Versionen gab es die Einstellung „[setDBinit]“ noch nicht und somit konnte „SET NAMES utf8;“ in älteren TYPO3-Versionen ohne Sourcecode-Änderung gar nicht durchgeführt werden. Selbst wenn man eine UTF-8-taugliche Datenbank verwendet hätte, wären falsch kodierte Zeichen die Folge. TYPO3 sendet in diesem Fall UTF-8-kodierte Zeichen zur Datenbank. Diese geht davon aus, es kämen Latin1-kodierte Zeichen und wandelt alle Umlaute erneut um. Somit hätte man nun doppelt kodierte Umlaute. In diesem Fall kann man aber einen Dump mit „iconv“ reparieren, indem man eine Wandlung von UTF nach Latin1 auf der Konsole vornimmt:&lt;br /&gt;
&lt;br /&gt;
Machen Sie ein Backup und löschen Sie dies erst, wenn Sie absolut sicher sind, dass die Umstellung erfolgreich war. Die Einstellung „[multiplyDBfieldSize]“ sollte auf „1“ stehen bleiben. MySQL 4.1 und 5.x benötigen hier keine Änderung. Prüfen Sie außerdem, ob die Version von „mysqldump“ zur MySQL-Server-Version passt. Im schlimmsten Fall können Sie nicht einmal einen Dump erzeugen. Verzichten sollten Sie auf den Einsatz der Extension „convert2utf8“. Diese wandelt nicht alle Datensätze um, wodurch „iconv“ (oder auch alternativ recode) den Dump nicht mehr ohne Fehlermeldungen konvertieren. Eine Umwandlung lässt sich zwar erzwingen, aber ohne 100-prozentige Sicherheit, dass alles geklappt hat.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Artikel aus dem t3n Magazin&lt;br /&gt;
[[http://t3n.de/magazin/mysql-typo3-utf-8-umstellen-tipps-wechsel-latin1-utf-8-220945/]]&lt;br /&gt;
&lt;br /&gt;
Guter Überblick im TYPO3 Wiki&lt;br /&gt;
[[http://wiki.typo3.org/index.php/UTF-8_support]] Der hier vorliegende Text ist eine Übersetzung des dortigen Textes.&lt;br /&gt;
&lt;br /&gt;
== Überblick / Overview ==&lt;br /&gt;
Verarbeitungskette prüfen vhost.conf - php.ini - my.cnf&lt;br /&gt;
&lt;br /&gt;
Wichtige Einstellung die leicht übersehen wird:&lt;br /&gt;
&lt;br /&gt;
Install Tool: Unter „All Configuration“ muss nun „[forceCharset]“ auf „utf-8“ und „[setDBinit]“ den Eintrag „SET NAMES utf8;“ erhalten. Der zusätzliche Eintrag „SET CHARACTER_SET utf8;“, der dem Feld „[setDBinit]“ hinzugefügt werden kann, ist oft nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
=== Verarbeitungskette ===&lt;br /&gt;
Zuerst mal testen ob in der Verarbeitungskette überall utf-8 für die Übertragung von Daten verwendet wird:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Apache: vhost.conf ====&lt;br /&gt;
&lt;br /&gt;
AddDefaultCharset UTF-8&lt;br /&gt;
&lt;br /&gt;
Dies ist für TYPO3 Versionen spätestens ab 4.3 nicht notwendig. Wenn man hier im Install Tool &amp;#039;&amp;#039;[BE][forceCharset]&amp;#039;&amp;#039; gesetzt hat&lt;br /&gt;
&lt;br /&gt;
Kann einfach getestet werden indem man sich die Header Daten einer Seite mit Firebug oder LiveHTTPTracker anschaut. Darin sollte eine Zeile in dieser Art enthalten sein:&lt;br /&gt;
&lt;br /&gt;
 Content-Type: text/html; charset=utf-8&lt;br /&gt;
&lt;br /&gt;
==== PHP: php.ini ====&lt;br /&gt;
 default_charset = &amp;quot;utf-8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit dieser Einstellung sollten auch standalone Skripte mit dem richtigen Zeichensatz arbeiten. Man kann in den Skripten aber auch &lt;br /&gt;
&lt;br /&gt;
Außerdem sollte mit der Erweiterung mbstring oder iconf gearbeitet werden. Deren Performance ist wesentlich besser als die Umwandlung über den PHP-Code von TYPO3 (s.u.)&lt;br /&gt;
&lt;br /&gt;
==== MySQL: my.cnf ====&lt;br /&gt;
Die folgende Einstellung setzt alle System Variablen für Zeichensätze und Kollationen für den MySQL SERVER. Dies betrifft also auch existierende Datenbanken. Deshalb sollte diese Einstellung nur gesetzt werden wenn ausschließlich mit utf-8 Datenbanken gearbeitet wird.&lt;br /&gt;
&lt;br /&gt;
Man benötigt die Einstellung nicht wenn im Install Tool &amp;#039;&amp;#039;[&amp;#039;SYS&amp;#039;][&amp;#039;setDBinit&amp;#039;]&amp;#039;&amp;#039;  gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
=== TYPO3 Einstellungen ===&lt;br /&gt;
&lt;br /&gt;
==== localconf.php ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// For backend charset&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;BE&amp;#039;][&amp;#039;forceCharset&amp;#039;] = &amp;#039;utf-8&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;setDBinit&amp;#039;] = &amp;#039;SET NAMES utf8;&amp;#039;; &lt;br /&gt;
&lt;br /&gt;
// For GIFBUILDER support&lt;br /&gt;
// Set it to &amp;#039;iconv&amp;#039; or &amp;#039;mbstring&amp;#039;&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;t3lib_cs_convMethod&amp;#039;] = &amp;#039;mbstring&amp;#039;;&lt;br /&gt;
// For &amp;#039;iconv&amp;#039; support you need at least PHP 5!&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;t3lib_cs_utils&amp;#039;] = &amp;#039;mbstring&amp;#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweise:&lt;br /&gt;
* Wenn die Datenbank auf  UTF-8 gesetzt ist, sollte man &amp;#039;&amp;#039;&amp;#039;nicht die Einstellung $TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;multiplyDBfieldSize&amp;#039;] setzen&amp;#039;&amp;#039;&amp;#039;. Diese wird nur benötigt, wenn die Datenbank mit latin 1 arbeitet aber der Inhalt  utf-8 ist. Außerdem führt die Einstellung des öfteren zu Problemen.&lt;br /&gt;
*  $TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;setDBinit&amp;#039;] = &amp;#039;SET NAMES utf8;&amp;#039;; Setzt folgende 3 Einstellungen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 SET character_set_client = utf8; &lt;br /&gt;
 SET character_set_results = utf8; &lt;br /&gt;
 SET character_set_connection = utf8; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Wenn &amp;#039;&amp;#039;&amp;#039;in phpMyAdmin Sonderzeichen als 2 seltsame Zeichen&amp;#039;&amp;#039;&amp;#039; angezeigt werden, reicht diese Einstellung nicht. Zuerst müssen die Inhaltstabellen konvertiert werden (oder löschen, umstellen, neu eingeben.&lt;br /&gt;
&lt;br /&gt;
* In &amp;#039;&amp;#039;&amp;#039;manchen Konfigurationen&amp;#039;&amp;#039;&amp;#039; muß man auch noch eine &amp;#039;&amp;#039;&amp;#039;Einstellung für die Sessions&amp;#039;&amp;#039;&amp;#039; machen:&lt;br /&gt;
&lt;br /&gt;
 SET NAMES utf8;&lt;br /&gt;
 SET SESSION character_set_server=utf8;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Benutze niemals SET CHARACTER SET utf8;&amp;#039;&amp;#039;&amp;#039; Dies kann große Probleme im TYPO3 Umfeld erzeugen. Mit der Einstellung SET NAMES hat sich das ohnehin erledigt, weil hier eigentlich die wichtigen Einstellungen gemacht werden&lt;br /&gt;
&lt;br /&gt;
* Wenn [BE][forceCharset] auf utf-8 gesetzt ist (siehe oben), dann wird auch &amp;#039;&amp;#039;config.renderCharset&amp;#039;&amp;#039; und &amp;#039;&amp;#039;config.metaCharset&amp;#039;&amp;#039; per default mit utf-8 arbeiten. Deshalb müssen hier keine Einstellungen mehr gemacht werden.&lt;br /&gt;
&lt;br /&gt;
=== Extensions ===&lt;br /&gt;
&lt;br /&gt;
==== RealURL ====&lt;br /&gt;
&lt;br /&gt;
One problem is that RealURL might not be able to understand a page title if it is in unusual (i.e. not Roman) characters. For example, with a page title in Japanese, I found that the title was not interpreted and the page was rendered as jp.html. Using the Navigation title solves this problem (to follow on the example, setting &amp;quot;home&amp;quot; as the Navigation title, my page was then rendered as jp/home.html).&lt;br /&gt;
&lt;br /&gt;
==== TemplaVoila ====&lt;br /&gt;
&lt;br /&gt;
Templates müssen im UTF-8 Format gespeichert werden. Möglicherweise muß neu gemappt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Weitere Hinweise ===&lt;br /&gt;
&lt;br /&gt;
==== Extensions sollten nicht strlen() benutzen====&lt;br /&gt;
Stattdessen sollte die Funktion t3lib_cs benutzt werden.&lt;br /&gt;
&lt;br /&gt;
strlen() doesn&amp;#039;t care for UTF-8. UTF-8 uses 1 to 3 Bytes for one char, so using strlen() will likely lead to wrong results. Extensions should instead use the functions provided in t3lib_cs.&lt;br /&gt;
&lt;br /&gt;
==== Sortierung ====&lt;br /&gt;
It is highly recommended (although not strictly necessary) to use UTF-8 in the database. Otherwise database sorting functions will not work correctly.&lt;br /&gt;
[edit] Problem with indeces&lt;br /&gt;
&lt;br /&gt;
==== Fehlermeldung Specified key was too long bei indizes====&lt;br /&gt;
&lt;br /&gt;
SQL=Specified key was too long; max key length is 1000 bytes:&lt;br /&gt;
&lt;br /&gt;
This particular problem might occur when you are using UTF-8 encoding. UTF-8 uses up to 3 bytes per character, and the maximum index length is 1000 bytes, so the effective maximum index is 1000/3 = 333 characters. Some tables are longer than this, hence the error (many other packages are being bitten by this issue too).&lt;br /&gt;
&lt;br /&gt;
To solve this, simply remove the index from that field and reload.&lt;br /&gt;
&lt;br /&gt;
Note: Using indeces that big anyway is not recommended and shows bad DB design.&lt;br /&gt;
[edit] Convert an already existing database to UTF-8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Konvertierung einer bestehenden Datenbank ===&lt;br /&gt;
Some links to the conversion topic:&lt;br /&gt;
&lt;br /&gt;
    * http://dev.mysql.com/doc/refman/4.1/en/charset-convert.html (MySQL based conversion)&lt;br /&gt;
    * http://www.typo3-media.com/blog/article/utf8-and-typo3-updated.html&lt;br /&gt;
    * http://m.tacker.org/blog/64.script-to-convert-wordpress-content-encoding.html (useful PHP script to convert charsets) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[edit] Possibility 1&lt;br /&gt;
Note 	This has been tested and works!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jigal van Hemert wrote a script, which can convert your database to utf-8. He offers it for download here: [[http://www.xs4all.nl/~dcbjht/typo3/db_utf8_fix.zip]] . This script converts all columns, tables and finally the setting for the whole database to utf-8.&lt;br /&gt;
&lt;br /&gt;
Jigal writes:&lt;br /&gt;
&lt;br /&gt;
Read the following very carefully, because you have to make a few adjustments depending on the situation!&lt;br /&gt;
&lt;br /&gt;
    * Make a backup of your database before you do such a conversion. &lt;br /&gt;
&lt;br /&gt;
    * The script was meant for the situation where utf-8 encoded data was stored in latin-1 (or other charsets) tables. This was very common in 2008. You can recognize this by looking in PHPmyAdmin and you find that characters with accents (diacriticals) are shown as weird double-character combinations:&lt;br /&gt;
      Instead of &amp;quot;Ali Gökgöz and Gültekin Tarcan&amp;quot; it shows as &amp;quot;Ali GÃ¶kgÃ¶z and GÃ¼ltekin Tarcan&amp;quot;.&lt;br /&gt;
      If this is *not* the case in your situation, turn lines 97 - 107 into comments by putting // in front of them. &lt;br /&gt;
&lt;br /&gt;
    * In line 19 of the script it says define(&amp;quot;SIMULATE&amp;quot;, TRUE); This makes sure that the tables are not really converted, it&amp;#039;s just a practice run; a simulation. After you executed the script at least once and there are no errors you can turn this into define(&amp;quot;SIMULATE&amp;quot;, FALSE); to do the conversion for real. &lt;br /&gt;
&lt;br /&gt;
    * Put the script in a subdirectory of the TYPO3 installation, for example inside &amp;#039;fileadmin&amp;#039;. It is designed to run from a subdirectory so it can pick up the database connection data from localconf.php. &lt;br /&gt;
&lt;br /&gt;
    * Run the script from your browser: http://domain.ext/fileadmin/db_utf8_fix.php It shows each table it found and after the name of a table a dot for each column it has converted. &lt;br /&gt;
&lt;br /&gt;
    * It really doesn&amp;#039;t matter if there are columns/tables already in utf-8 format. &lt;br /&gt;
&lt;br /&gt;
 Settings in TYPO3 &lt;br /&gt;
&lt;br /&gt;
Furthermore, if you use the following settings in the Install Tool you should have a UTF-8 installation:&lt;br /&gt;
&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;setDBinit&amp;#039;] = &amp;#039;SET NAMES utf8;&amp;#039;;&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;BE&amp;#039;][&amp;#039;forceCharset&amp;#039;] = &amp;#039;utf-8&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
 Possibility 2&lt;br /&gt;
&lt;br /&gt;
Dump your database, modifiy the dumped file and import it again.&lt;br /&gt;
Note 	If you do it that way, setting [&amp;#039;BE&amp;#039;][&amp;#039;forceCharset&amp;#039;] might cause broken special chars inside TYPO3. See below for more information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Requirements:&lt;br /&gt;
&lt;br /&gt;
    * Shell access to your unix based server&lt;br /&gt;
    * &amp;quot;Sed&amp;quot; package installed on the server &lt;br /&gt;
&lt;br /&gt;
For this example we assume:&lt;br /&gt;
&lt;br /&gt;
    * hostname: domain.com&lt;br /&gt;
    * database: typo3 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This example is for linux users. If your PC uses Windows, you can do the same using putty.exe. Enter the hostname in the field &amp;quot;Host Name (or IP adress)&amp;quot; and click on &amp;quot;Open&amp;quot;. Then enter your ssh username, press enter and enter the password (which will not be displayed) and press enter. Then you are connected to the server.&lt;br /&gt;
&lt;br /&gt;
Linux users connect to the server via ssh typing&lt;br /&gt;
&lt;br /&gt;
ssh -l (user) domain.com&lt;br /&gt;
&lt;br /&gt;
Create a backup of the database (for security reasons if things go wrong...)&lt;br /&gt;
&lt;br /&gt;
mysqldump -u (user) -p(pass) --max_allowed_packet=10000000 typo3 &amp;gt; typo3_backup.sql&lt;br /&gt;
&lt;br /&gt;
Dump database (without table typo3.sys_refindex. This prevents the following error: SQL=Specified key was too long; max key length is 1000 bytes. You have to rebuild the reference index afterwards!)&lt;br /&gt;
&lt;br /&gt;
mysqldump -u (user) -p(pass) --max_allowed_packet=10000000 --ignore-table=typo3.sys_refindex  typo3  &amp;gt; typo3_utf8.sql&lt;br /&gt;
&lt;br /&gt;
Now modifiy the dump: Newer versions of MySQL (at least 5.0) also save the collation for each column seperately. You have to convert all of them:&lt;br /&gt;
&lt;br /&gt;
First convert all occurences of &amp;quot;DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci&amp;quot; (use the character set which you have written in your file) in typo3_utf8.sql to &amp;quot;DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
sed  -e &amp;#039;s/DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci/DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci/g&amp;#039; -i typo3_utf8.sql&lt;br /&gt;
&lt;br /&gt;
Then convert all occurences of &amp;quot;COLLATE latin1_german1_ci&amp;quot; (use the charset you have written in your file) to &amp;quot;COLLATE utf8_general_ci&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
sed  -e &amp;#039;s/COLLATE latin1_german1_ci/COLLATE utf8_general_ci/g&amp;#039; -i typo3_utf8.sql&lt;br /&gt;
&lt;br /&gt;
Import database&lt;br /&gt;
&lt;br /&gt;
mysql -u (user) -p(pass) --default-character-set=utf8  typo3 &amp;lt; typo3_utf8.sql&lt;br /&gt;
&lt;br /&gt;
Alter character set and collation for the whole database&lt;br /&gt;
&lt;br /&gt;
mysql -u (user) -p(pass) -e &amp;quot;ALTER DATABASE typo3 DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[edit] Settings in TYPO3&lt;br /&gt;
&lt;br /&gt;
Furthermore, if you use the following settings in the Install Tool you should have a UTF-8 installation:&lt;br /&gt;
&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;setDBinit&amp;#039;] = &amp;#039;SET NAMES utf8;&amp;#039;;&lt;br /&gt;
$TYPO3_CONF_VARS[&amp;#039;BE&amp;#039;][&amp;#039;forceCharset&amp;#039;] = &amp;#039;utf-8&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
[edit] Broken special chars?&lt;br /&gt;
&lt;br /&gt;
If the result of the above mentioned is that special chars are displayed incorrectly in TYPO3 (a small black box with a question mark in it instead of the special char), the following might help:&lt;br /&gt;
&lt;br /&gt;
Create a new database. Make sure that it uses utf8 as default charset and utf8_general_ci as collation:&lt;br /&gt;
&lt;br /&gt;
mysql -user (user) -password(password) -e &amp;quot;ALTER DATABASE (new-db) DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Then import the dump into that database without using sed to replace the occurences of latin1 (or what you have) with utf8.&lt;br /&gt;
&lt;br /&gt;
The result will be that the tables and columns in your database still use latin1 (or what you had before).&lt;br /&gt;
&lt;br /&gt;
This might be a problem, e.g. when you now add new tables to this database, they will use utf8 as charset, because the database is set to utf8. This will lead to a mix of both charsets in your DB.&lt;br /&gt;
[edit] Possibility 3&lt;br /&gt;
&lt;br /&gt;
This might be the way to go for german speaking users with a Unix server:&lt;br /&gt;
&lt;br /&gt;
A way similar to possibility 2 is recommended by t3n (german).&lt;br /&gt;
&lt;br /&gt;
Basically they make the dump and replace the charset and collation statements.&lt;br /&gt;
&lt;br /&gt;
Then they use iconv on the dumped file to convert the signs inside:&lt;br /&gt;
&lt;br /&gt;
iconv -f iso-8859-1 -t utf8 dump.sql &amp;gt; dump-iconv.sql&lt;br /&gt;
&lt;br /&gt;
After that they import the file using the switch --default-character-set=utf8:&lt;br /&gt;
&lt;br /&gt;
mysql -u USER -p PASSWORT -h HOST --default-character-set=utf8 DB &amp;lt; dump-iconv.sql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note 	If you did that and get umlauts displayed correctly, but ß and € displayed wrong inside TYPO3, you should use CP1252 in the iconv command as origin charset like that:&lt;br /&gt;
&lt;br /&gt;
iconv -f CP1252 -t utf8 dump.sql &amp;gt; dump-iconv.sql&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
When setting [BE][forceCharset] all files in the TYPO3 root folder and below are handled as UTF-8 files by TYPO3; so you should make sure that they really are. You should e.g. check your HTML-Templates and CSS files for special chars like umlauts. If they are displayed incorrectly, you should fix that by saving the file in UTF-8 format.&lt;br /&gt;
&lt;br /&gt;
When editing such files only use editors which can save files in UTF-8 format. That is any editor on Linux and e.g. Notepad++ if you use Windows.&lt;br /&gt;
&lt;br /&gt;
Attention: Do not save the files in UTF-8 format with Byte Order Mark (BOM). Saving them as UTF-8 with BOM can cause problems, e.g. thumbnails in the BE will no longer be shown. Save the files in ANSI format (as UTF-8 without BOM) instead.&lt;br /&gt;
[edit] t3lib_cs&lt;br /&gt;
&lt;br /&gt;
Developers: Use these functions e.g. to get the length of a string. strlen doesn&amp;#039;t get the correct string-length, because the chars of UTF-8 can have 1...3 Bytes.&lt;br /&gt;
&lt;br /&gt;
In PHP 5.3 PECL/intl will be available, so maybe the TYPO3 Core-Developers switch to this.&lt;br /&gt;
[edit] Use unicode fonts&lt;br /&gt;
&lt;br /&gt;
If you use Gifbuilder to create some lines of text (e.g. in a menu) make sure that the font file you use is unicode. More info here.&lt;br /&gt;
&lt;br /&gt;
If there still are problems with broken special chars in these images, you should make sure that the configuration for mb_string or iconv (the one which you set in the Install Tool) is set to UTF-8. You can check that in phpinfo() and correct the settings in php.ini or .htaccess, if needed.&lt;br /&gt;
[edit] HTML Tidy&lt;br /&gt;
&lt;br /&gt;
If you are having problems with html entities like &amp;amp;nbsp; shown as ? in the browser, add the -utf8 option to the HTML tidy_path variable in the install tool, e.g.&lt;br /&gt;
&lt;br /&gt;
 $TYPO3_CONF_VARS[&amp;#039;FE&amp;#039;][&amp;#039;tidy_path&amp;#039;] = &amp;#039;tidy -i --quiet true --tidy-mark true -wrap 0 -raw --output-xhtml true -utf8&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== External links ====&lt;br /&gt;
&lt;br /&gt;
    * http://dev.mysql.com/doc/refman/5.0/en/charset.html&lt;br /&gt;
    * http://en.opensuse.org/SDB%3AConverting_Files_or_File_Names_to_UTF-8_Encoding&lt;br /&gt;
    * How to change the encoding like iso-8859-1, iso-8859-15, utf-8 of files: http://linuxwiki.de/tcs (just in german in the moment)&lt;br /&gt;
== Manuelles Suchen ersetzen ==&lt;br /&gt;
Manche Datenbanken sind so verfahren, das man am einfachsten ein Suchen ersetzen durchführt. Die Zeichen hat man schnell erkannt. Beispiele:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Konvertierung utf...&lt;br /&gt;
&lt;br /&gt;
Ã¼ = ü&lt;br /&gt;
Ã¶ = ö&lt;br /&gt;
ÃŸ = ß&lt;br /&gt;
Ã¤ = ä&lt;br /&gt;
â€¦ = &lt;br /&gt;
Â = -&lt;br /&gt;
Ãœ = Ü&lt;br /&gt;
â€“ = -&lt;br /&gt;
â†’ = →&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Update&amp;diff=22634</id>
		<title>Typo3 - Update</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Update&amp;diff=22634"/>
		<updated>2017-11-23T15:36:43Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Update auf 7 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
http://wiki.typo3.org/Upgrade&lt;br /&gt;
== Aufräumen vor dem Update ==&lt;br /&gt;
http://typo3blogger.de/turchen-2-tutorial-typo3-entrumpeln/&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
* kb_cleanfiles.&lt;br /&gt;
* Modul unter „DB-Überprüfung“ -&amp;gt; „Database Relations“. Neben dem Listing „Dateien, die in keinem Eintrag verwendet werden (bitte löschen!):“, welches der inhaltlichen Ausgabe der Extension sehr ähnelt, wird hier auch angezeigt ob Dateien doppelt referenziert werden &lt;br /&gt;
* typo3temp über install tool&lt;br /&gt;
=== Datenbank ===&lt;br /&gt;
*  kj_recycler für papierkorb Daten danach refefence Index updaten&lt;br /&gt;
* cache_ Tabellen leeren&lt;br /&gt;
* sys_histroy leeren&lt;br /&gt;
&lt;br /&gt;
Zur Not alles löschbar...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[PHP]TRUNCATE TABLE sys_log //e.g. alle älter als 14 Tage&lt;br /&gt;
TRUNCATE TABLE sys_history //e.g. alle änderungen älter als 30 Tage&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE index_fulltext&lt;br /&gt;
TRUNCATE TABLE index_grlist&lt;br /&gt;
TRUNCATE TABLE index_phash&lt;br /&gt;
TRUNCATE TABLE index_rel&lt;br /&gt;
TRUNCATE TABLE index_section&lt;br /&gt;
TRUNCATE TABLE index_stat_search&lt;br /&gt;
TRUNCATE TABLE index_stat_word&lt;br /&gt;
TRUNCATE TABLE index_words&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE cache_pages&lt;br /&gt;
TRUNCATE TABLE cache_hash&lt;br /&gt;
TRUNCATE TABLE cache_imagesizes&lt;br /&gt;
TRUNCATE TABLE cache_pagesection&lt;br /&gt;
TRUNCATE TABLE cache_treelist&lt;br /&gt;
TRUNCATE TABLE cache_typo3temp_log&lt;br /&gt;
TRUNCATE TABLE cache_extensions&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE tx_realurl_errorlog&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE be_sessions&lt;br /&gt;
TRUNCATE TABLE fe_sessions&lt;br /&gt;
TRUNCATE TABLE fe_session_data[/PHP]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP Update 5.5 2017 - Kurzanleitung ==&lt;br /&gt;
Kurzanleitung Update auf PHP 5.5 für TYPO3 4.5.x&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Wichtig&lt;br /&gt;
htaccess aktualisieren&lt;br /&gt;
Source aktualisieren&lt;br /&gt;
Umstellung utf8 &lt;br /&gt;
- DB Export&lt;br /&gt;
- Textmate in utf-8 speichern &lt;br /&gt;
- Ersetzen von CHARSET=latin1 durch CHARSET=utf8&lt;br /&gt;
- Ersetzen der COLLATE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
localconf.php&lt;br /&gt;
&lt;br /&gt;
== Update auf 7 ==&lt;br /&gt;
&lt;br /&gt;
https://jweiland.net/video-anleitungen/typo3/typo3-projekte-verwalten/typo3-7-lts-migration-von-css-styled-content-nach-fluid-styled-content.html&lt;br /&gt;
* css_styled_content wird durch fluid_styled_content ersetzt&lt;br /&gt;
* FSC bringt eigene CSS-Klassen für das Frontend mit. Anpassungen im CSS einer Website sind notwendig.&lt;br /&gt;
* Die Funktion &amp;quot;Rahmen und Einrückungen (section_frames)&amp;quot; gibt es nicht mehr. Hier muss bei Bedarf auf das &amp;quot;Layout&amp;quot;-Feld ausgewichen werden.&lt;br /&gt;
* Überschriften lassen sich nicht mehr direkt zentrieren oder rechts ausrichten.&lt;br /&gt;
* Die Bildeffekte (Drehung, Graustufen etc.) gibt es auch nicht mehr.&lt;br /&gt;
&lt;br /&gt;
=== Fluid Styled Content ersetzt CSS Styled Content ===&lt;br /&gt;
[[TYPO3 - fluid_styled_content]]&lt;br /&gt;
&lt;br /&gt;
=== htaccess für all-inkl TYPO3 v7===&lt;br /&gt;
So machts der Auto Installer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php_value always_populate_raw_post_data -1&lt;br /&gt;
php_value memory_limit 256M&lt;br /&gt;
php_value max_execution_time 240&lt;br /&gt;
&amp;lt;FilesMatch &amp;quot;\.(php.*|phtml)\.&amp;quot;&amp;gt; &lt;br /&gt;
 RewriteEngine on &lt;br /&gt;
 RewriteRule .* - [R=403,L] &lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#####&lt;br /&gt;
#&lt;br /&gt;
# Example .htaccess file for TYPO3 CMS - for use with Apache Webserver&lt;br /&gt;
#&lt;br /&gt;
# This file includes settings for the following configuration options:&lt;br /&gt;
#&lt;br /&gt;
# - Compression&lt;br /&gt;
# - Caching&lt;br /&gt;
# - MIME types&lt;br /&gt;
# - Cross Origin requests&lt;br /&gt;
# - Rewriting and Access&lt;br /&gt;
# - Miscellaneous&lt;br /&gt;
# - PHP optimisation&lt;br /&gt;
#&lt;br /&gt;
# If you want to use it, you have to copy it to the root folder of your TYPO3 installation (if its&lt;br /&gt;
# not there already) and rename it to &amp;#039;.htaccess&amp;#039;. To make .htaccess files work, you might need to&lt;br /&gt;
# adjust the &amp;#039;AllowOverride&amp;#039; directive in your Apache configuration file.&lt;br /&gt;
#&lt;br /&gt;
# IMPORTANT: You may need to change this file depending on your TYPO3 installation!&lt;br /&gt;
#            Consider adding this file&amp;#039;s content to your webserver&amp;#039;s configuration directly for speed improvement&lt;br /&gt;
#&lt;br /&gt;
# Lots of the options are taken from https://github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess&lt;br /&gt;
#&lt;br /&gt;
####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Compression ###&lt;br /&gt;
&lt;br /&gt;
# Compressing resource files will save bandwidth and so improve loading speed especially for users&lt;br /&gt;
# with slower internet connections. TYPO3 can compress the .js and .css files for you.&lt;br /&gt;
# *) Uncomment the following lines and&lt;br /&gt;
# *) Set $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;BE&amp;#039;][&amp;#039;compressionLevel&amp;#039;] = 9 for the Backend&lt;br /&gt;
# *) Set $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;FE&amp;#039;][&amp;#039;compressionLevel&amp;#039;] = 9 together with the TypoScript properties&lt;br /&gt;
#    config.compressJs and config.compressCss for GZIP compression of Frontend JS and CSS files.&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;FilesMatch &amp;quot;\.js\.gzip$&amp;quot;&amp;gt;&lt;br /&gt;
#	AddType &amp;quot;text/javascript&amp;quot; .gzip&lt;br /&gt;
#&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#&amp;lt;FilesMatch &amp;quot;\.css\.gzip$&amp;quot;&amp;gt;&lt;br /&gt;
#	AddType &amp;quot;text/css&amp;quot; .gzip&lt;br /&gt;
#&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#AddEncoding gzip .gzip&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_deflate.c&amp;gt;&lt;br /&gt;
	# Force compression for mangled `Accept-Encoding` request headers&lt;br /&gt;
	&amp;lt;IfModule mod_setenvif.c&amp;gt;&lt;br /&gt;
		&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
			SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding&lt;br /&gt;
			RequestHeader append Accept-Encoding &amp;quot;gzip,deflate&amp;quot; env=HAVE_Accept-Encoding&lt;br /&gt;
		&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Compress all output labeled with one of the following media types.&lt;br /&gt;
	#&lt;br /&gt;
	# (!) For Apache versions below version 2.3.7 you don&amp;#039;t need to&lt;br /&gt;
	# enable `mod_filter` and can remove the `&amp;lt;IfModule mod_filter.c&amp;gt;`&lt;br /&gt;
	# and `&amp;lt;/IfModule&amp;gt;` lines as `AddOutputFilterByType` is still in&lt;br /&gt;
	# the core directives.&lt;br /&gt;
	#&lt;br /&gt;
	# https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;IfModule mod_filter.c&amp;gt;&lt;br /&gt;
		AddOutputFilterByType DEFLATE application/atom+xml \&lt;br /&gt;
			application/javascript \&lt;br /&gt;
			application/json \&lt;br /&gt;
			application/ld+json \&lt;br /&gt;
			application/manifest+json \&lt;br /&gt;
			application/rdf+xml \&lt;br /&gt;
			application/rss+xml \&lt;br /&gt;
			application/schema+json \&lt;br /&gt;
			application/vnd.geo+json \&lt;br /&gt;
			application/vnd.ms-fontobject \&lt;br /&gt;
			application/x-font-ttf \&lt;br /&gt;
			application/x-javascript \&lt;br /&gt;
			application/x-web-app-manifest+json \&lt;br /&gt;
			application/xhtml+xml \&lt;br /&gt;
			application/xml \&lt;br /&gt;
			font/eot \&lt;br /&gt;
			font/opentype \&lt;br /&gt;
			image/bmp \&lt;br /&gt;
			image/svg+xml \&lt;br /&gt;
			image/vnd.microsoft.icon \&lt;br /&gt;
			image/x-icon \&lt;br /&gt;
			text/cache-manifest \&lt;br /&gt;
			text/css \&lt;br /&gt;
			text/html \&lt;br /&gt;
			text/javascript \&lt;br /&gt;
			text/plain \&lt;br /&gt;
			text/vcard \&lt;br /&gt;
			text/vnd.rim.location.xloc \&lt;br /&gt;
			text/vtt \&lt;br /&gt;
			text/x-component \&lt;br /&gt;
			text/x-cross-domain-policy \&lt;br /&gt;
			text/xml&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
		AddEncoding gzip              svgz&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Compression ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Browser caching of resource files ###&lt;br /&gt;
&lt;br /&gt;
# This affects Frontend and Backend and increases performance.&lt;br /&gt;
&amp;lt;IfModule mod_expires.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	ExpiresActive on&lt;br /&gt;
	ExpiresDefault                                      &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/css                              &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/json                      &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/ld+json                   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/schema+json               &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/vnd.geo+json              &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/xml                       &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType text/xml                              &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType image/vnd.microsoft.icon              &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
	ExpiresByType image/x-icon                          &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/x-component                      &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/html                             &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/javascript                &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-javascript              &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
	ExpiresByType text/javascript                       &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/manifest+json             &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-web-app-manifest+json   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType text/cache-manifest                   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType audio/ogg                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/bmp                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/gif                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/jpeg                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/png                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/svg+xml                         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/webp                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/mp4                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/ogg                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/webm                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/atom+xml                  &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
	ExpiresByType application/rdf+xml                   &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
	ExpiresByType application/rss+xml                   &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/vnd.ms-fontobject         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/eot                              &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/opentype                         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-font-ttf                &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/font-woff                 &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-font-woff               &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/woff                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/font-woff2                &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/x-cross-domain-policy            &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Browser caching of resource files ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: MIME types ###&lt;br /&gt;
&lt;br /&gt;
# Proper MIME types for all files&lt;br /&gt;
&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Data interchange&lt;br /&gt;
	AddType application/atom+xml                        atom&lt;br /&gt;
	AddType application/json                            json map topojson&lt;br /&gt;
	AddType application/ld+json                         jsonld&lt;br /&gt;
	AddType application/rss+xml                         rss&lt;br /&gt;
	AddType application/vnd.geo+json                    geojson&lt;br /&gt;
	AddType application/xml                             rdf xml&lt;br /&gt;
&lt;br /&gt;
	# JavaScript&lt;br /&gt;
	AddType application/javascript                      js&lt;br /&gt;
&lt;br /&gt;
	# Manifest files&lt;br /&gt;
	AddType application/manifest+json                   webmanifest&lt;br /&gt;
	AddType application/x-web-app-manifest+json         webapp&lt;br /&gt;
	AddType text/cache-manifest                         appcache&lt;br /&gt;
&lt;br /&gt;
	# Media files&lt;br /&gt;
&lt;br /&gt;
	AddType audio/mp4                                   f4a f4b m4a&lt;br /&gt;
	AddType audio/ogg                                   oga ogg opus&lt;br /&gt;
	AddType image/bmp                                   bmp&lt;br /&gt;
	AddType image/svg+xml                               svg svgz&lt;br /&gt;
	AddType image/webp                                  webp&lt;br /&gt;
	AddType video/mp4                                   f4v f4p m4v mp4&lt;br /&gt;
	AddType video/ogg                                   ogv&lt;br /&gt;
	AddType video/webm                                  webm&lt;br /&gt;
	AddType video/x-flv                                 flv&lt;br /&gt;
	AddType image/x-icon                                cur ico&lt;br /&gt;
&lt;br /&gt;
	# Web fonts&lt;br /&gt;
	AddType application/font-woff                       woff&lt;br /&gt;
	AddType application/font-woff2                      woff2&lt;br /&gt;
	AddType application/vnd.ms-fontobject               eot&lt;br /&gt;
	AddType application/x-font-ttf                      ttc ttf&lt;br /&gt;
	AddType font/opentype                               otf&lt;br /&gt;
&lt;br /&gt;
	# Other&lt;br /&gt;
	AddType application/octet-stream                    safariextz&lt;br /&gt;
	AddType application/x-bb-appworld                   bbaw&lt;br /&gt;
	AddType application/x-chrome-extension              crx&lt;br /&gt;
	AddType application/x-opera-extension               oex&lt;br /&gt;
	AddType application/x-xpinstall                     xpi&lt;br /&gt;
	AddType text/vcard                                  vcard vcf&lt;br /&gt;
	AddType text/vnd.rim.location.xloc                  xloc&lt;br /&gt;
	AddType text/vtt                                    vtt&lt;br /&gt;
	AddType text/x-component                            htc&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# UTF-8 encoding&lt;br /&gt;
AddDefaultCharset utf-8&lt;br /&gt;
&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
	AddCharset utf-8 .atom .css .js .json .manifest .rdf .rss .vtt .webapp .webmanifest .xml&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: MIME types ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Cross Origin ###&lt;br /&gt;
&lt;br /&gt;
# Send the CORS header for images when browsers request it.&lt;br /&gt;
&amp;lt;IfModule mod_setenvif.c&amp;gt;&lt;br /&gt;
	&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
		&amp;lt;FilesMatch &amp;quot;\.(bmp|cur|gif|ico|jpe?g|png|svgz?|webp)$&amp;quot;&amp;gt;&lt;br /&gt;
			SetEnvIf Origin &amp;quot;:&amp;quot; IS_CORS&lt;br /&gt;
			Header set Access-Control-Allow-Origin &amp;quot;*&amp;quot; env=IS_CORS&lt;br /&gt;
		&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Allow cross-origin access to web fonts.&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	&amp;lt;FilesMatch &amp;quot;\.(eot|otf|tt[cf]|woff2?)$&amp;quot;&amp;gt;&lt;br /&gt;
		Header set Access-Control-Allow-Origin &amp;quot;*&amp;quot;&lt;br /&gt;
	&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Cross Origin ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Rewriting and Access ###&lt;br /&gt;
&lt;br /&gt;
# You need rewriting, if you use a URL-Rewriting extension (RealURL, CoolUri).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_rewrite.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Enable URL rewriting&lt;br /&gt;
	RewriteEngine On&lt;br /&gt;
&lt;br /&gt;
	# Store the current location in an environment variable CWD to use&lt;br /&gt;
	# mod_rewrite in .htaccess files without knowing the RewriteBase&lt;br /&gt;
	RewriteCond $0#%{REQUEST_URI} ([^#]*)#(.*)\1$&lt;br /&gt;
	RewriteRule ^.*$ - [E=CWD:%2]&lt;br /&gt;
&lt;br /&gt;
	# Rules to set ApplicationContext based on hostname&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^dev\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Development]&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^staging\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Production/Staging]&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^www\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Production]&lt;br /&gt;
&lt;br /&gt;
	# Rule for versioned static files, configured through:&lt;br /&gt;
	# - $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;BE&amp;#039;][&amp;#039;versionNumberInFilename&amp;#039;]&lt;br /&gt;
	# - $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;FE&amp;#039;][&amp;#039;versionNumberInFilename&amp;#039;]&lt;br /&gt;
	# IMPORTANT: This rule has to be the very first RewriteCond in order to work!&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;
	RewriteRule ^(.+)\.(\d+)\.(php|js|css|png|jpg|gif|gzip)$ %{ENV:CWD}$1.$3 [L]&lt;br /&gt;
&lt;br /&gt;
	# Access block for folders&lt;br /&gt;
	RewriteRule _(?:recycler|temp)_/ - [F]&lt;br /&gt;
	RewriteRule fileadmin/templates/.*\.(?:txt|ts)$ - [F]&lt;br /&gt;
	RewriteRule ^(?:vendor|typo3_src|typo3temp/logs) - [F]&lt;br /&gt;
	RewriteRule (?:typo3conf/ext|typo3/sysext|typo3/ext)/[^/]+/(?:Configuration|Resources/Private|Tests?|Documentation|docs?)/ - [F]&lt;br /&gt;
&lt;br /&gt;
	# Block access to all hidden files and directories with the exception of&lt;br /&gt;
	# the visible content from within the `/.well-known/` hidden directory (RFC 5785).&lt;br /&gt;
	RewriteCond %{REQUEST_URI} &amp;quot;!(^|/)\.well-known/([^./]+./?)+$&amp;quot; [NC]&lt;br /&gt;
	RewriteCond %{SCRIPT_FILENAME} -d [OR]&lt;br /&gt;
	RewriteCond %{SCRIPT_FILENAME} -f&lt;br /&gt;
	RewriteRule (?:^|/)\. - [F]&lt;br /&gt;
&lt;br /&gt;
	# Stop rewrite processing, if we are in the typo3/ directory or any other known directory&lt;br /&gt;
	# NOTE: Add your additional local storages here&lt;br /&gt;
	RewriteRule ^(?:typo3/|fileadmin/|typo3conf/|typo3temp/|uploads/|favicon\.ico) - [L]&lt;br /&gt;
&lt;br /&gt;
	# If the file/symlink/directory does not exist =&amp;gt; Redirect to index.php.&lt;br /&gt;
	# For httpd.conf, you need to prefix each &amp;#039;%{REQUEST_FILENAME}&amp;#039; with &amp;#039;%{DOCUMENT_ROOT}&amp;#039;.&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
	RewriteRule ^.*$ %{ENV:CWD}index.php [QSA,L]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Access block for files&lt;br /&gt;
&amp;lt;FilesMatch &amp;quot;(?i:^\.|^#.*#|^(?:ChangeLog|ToDo|Readme|License)(?:\.md|\.txt)?|^composer\.(?:json|lock)|^ext_conf_template\.txt|^ext_typoscript_constants\.txt|^ext_typoscript_setup\.txt|flexform[^.]*\.xml|locallang[^.]*\.(?:xml|xlf)|\.(?:bak|co?nf|cfg|ya?ml|ts|dist|fla|in[ci]|log|sh|sql(?:\..*)?|sw[op]|git.*)|.*(?:~|rc))$&amp;quot;&amp;gt;&lt;br /&gt;
	# Apache &amp;lt; 2.3&lt;br /&gt;
	&amp;lt;IfModule !mod_authz_core.c&amp;gt;&lt;br /&gt;
		Order allow,deny&lt;br /&gt;
		Deny from all&lt;br /&gt;
		Satisfy All&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Apache ≥ 2.3&lt;br /&gt;
	&amp;lt;IfModule mod_authz_core.c&amp;gt;&lt;br /&gt;
		Require all denied&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Block access to vcs directories&lt;br /&gt;
&amp;lt;IfModule mod_alias.c&amp;gt;&lt;br /&gt;
	RedirectMatch 404 /\.(?:git|svn|hg)/&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Rewriting and Access ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Miscellaneous ###&lt;br /&gt;
&lt;br /&gt;
# 404 error prevention for non-existing redirected folders&lt;br /&gt;
Options -MultiViews&lt;br /&gt;
&lt;br /&gt;
# Make sure that directory listings are disabled.&lt;br /&gt;
&amp;lt;IfModule mod_autoindex.c&amp;gt;&lt;br /&gt;
	Options -Indexes&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	# Force IE to render pages in the highest available mode&lt;br /&gt;
	Header set X-UA-Compatible &amp;quot;IE=edge&amp;quot;&lt;br /&gt;
	&amp;lt;FilesMatch &amp;quot;\.(appcache|crx|css|eot|gif|htc|ico|jpe?g|js|m4a|m4v|manifest|mp4|oex|oga|ogg|ogv|otf|pdf|png|safariextz|svgz?|ttf|vcf|webapp|webm|webp|woff2?|xml|xpi)$&amp;quot;&amp;gt;&lt;br /&gt;
		Header unset X-UA-Compatible&lt;br /&gt;
	&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Reducing MIME type security risks&lt;br /&gt;
	Header set X-Content-Type-Options &amp;quot;nosniff&amp;quot;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# ETag removal&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	Header unset ETag&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
FileETag None&lt;br /&gt;
&lt;br /&gt;
### End: Miscellaneous ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Add your own rules here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Update auf 6.2 ==&lt;br /&gt;
=== Probleme mit dem index ===&lt;br /&gt;
https://forge.typo3.org/issues/61154&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fehlermeldung&amp;#039;&amp;#039;&amp;#039; &amp;quot;Migrate all file links of RTE-enabled fields to FAL&amp;quot; fails with &amp;quot;Reference index was probably out of date.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Description&lt;br /&gt;
&lt;br /&gt;
Meanwhile I did upgrades from TYPO3 4.7 to 6.2 for three different instances and every time I ran into this problem.&lt;br /&gt;
Reason are links in content elements of hidden or (from database point of view: logical) deleted pages where the target (usually the file in fileadmin) does not exist anymore.&lt;br /&gt;
&lt;br /&gt;
 cli_dispatch.phpsh lowlevel_refindex -c&lt;br /&gt;
&lt;br /&gt;
does not detect these broken links. So this is a deadlock during migration.&lt;br /&gt;
&lt;br /&gt;
I found this workaround which requires using a SQL client for the mysql database:&lt;br /&gt;
1) &amp;#039;&amp;#039;&amp;#039;check&amp;#039;&amp;#039;&amp;#039; if the result of this query matches the list of &amp;quot;Reference index was probably out of date&amp;quot; elements&lt;br /&gt;
&lt;br /&gt;
 select * from sys_refindex where softref_key = &amp;#039;typolink_tag&amp;#039; AND ref_table = &amp;#039;_FILE&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
2) If so you can &amp;#039;&amp;#039;&amp;#039;update&amp;#039;&amp;#039;&amp;#039; these records:&lt;br /&gt;
&lt;br /&gt;
 update sys_refindex set softref_key = &amp;#039;typolink&amp;#039; where softref_key = &amp;#039;typolink_tag&amp;#039; AND ref_table = &amp;#039;_FILE&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
== Update 4.5 , 4.7 ==&lt;br /&gt;
=== Umlautprobleme ===&lt;br /&gt;
evtl. auch mal bei dbinit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET character_set_client = utf8; &lt;br /&gt;
SET character_set_results = utf8; &lt;br /&gt;
SET character_set_connection = utf8; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manchmal auch bei Darstellungsproblemen oder weißer Seite&lt;br /&gt;
&lt;br /&gt;
Install-Tool nach dem Parameter &amp;quot;&lt;br /&gt;
 systemLocale -&amp;gt; de_DE.utf8&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bis TYPO3 4.6&amp;#039;&amp;#039;&amp;#039;: im Install-Tool den Parameter &lt;br /&gt;
 forceCharset -&amp;gt; utf-8&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ab TYPO3 4.7&amp;#039;&amp;#039;&amp;#039;: im &amp;#039;&amp;#039;&amp;#039;Typoscript-Setup&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
 config.renderCharset = utf-8&lt;br /&gt;
Im &amp;#039;&amp;#039;&amp;#039;Install-Tool&amp;#039;&amp;#039;&amp;#039; bei &amp;quot;&lt;br /&gt;
 setDBinit -&amp;gt;  SET NAMES utf8;&lt;br /&gt;
eintragen (ist ab TYPO3 4.7 bereits als Standard eingetragen).&lt;br /&gt;
&lt;br /&gt;
Nun den kompletten Cache leeren. Jetzt sollten die Umlaute korrekt dargestellt werden.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Falls Sie per GIFBUILDER Text in Bilder einbauen, versuchen Sie folgendes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Im Install-Tool beim Parameter &amp;quot;t3lib_cs_convMethod&amp;quot; den Wert &amp;quot;mbstring&amp;quot; eintragen.&lt;br /&gt;
    Im Install-Tool beim Parameter &amp;quot;t3lib_cs_utils&amp;quot; ebenfalls &amp;quot; mbstring&amp;quot; eintragen.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Falls Sie Templavoila verwenden, müssen Sie darauf achten, dass Ihr HTML-Editor die Datei UTF-8-kodiert speichert. In den meisten Editoren können Sie das in den Einstellungen anpassen.&lt;br /&gt;
&lt;br /&gt;
Wenn immer noch Darstellungsprobleme auftreten, kann unter Umständen eine Konvertierung der Datenbank nötig sein.&lt;br /&gt;
&lt;br /&gt;
== Update Infos 4.5 ==&lt;br /&gt;
* Weitere Tools werden separat installiert&lt;br /&gt;
* utf-8 für Datenbankverbindung wird vorausgesetzt (siehe auch Typo3 auf utf-8 umstellen)&lt;br /&gt;
** Install-Tool $TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;setDBinit&amp;#039;] und $TYPO3_CONF_VARS[&amp;#039;BE&amp;#039;][&amp;#039;forceCharset&amp;#039;] default haben sich verändert.&lt;br /&gt;
&lt;br /&gt;
* Zugriff auf veraltete php-Funktionen werden geloggt. Vorsichtig Log kann groß werden&lt;br /&gt;
* Extbase und Fluid&lt;br /&gt;
&lt;br /&gt;
== Update Infos 4.3 ==&lt;br /&gt;
* simulate_static_docs muss separat installiert werden&lt;br /&gt;
=== Update Wizard Info ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSS Styled Content: Default targets for non-frame pages&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The default page target is empty (so no target is generated). If you use frames, you have to set target to &amp;quot;page&amp;quot; in Constants.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSS Styled Content: htmlspecialchars in menu content elements&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Page titles will get htmlspecialchar&amp;#039;ed when rendered in &amp;quot;Sitemap/menu&amp;quot; content elements, to avoid generating invalid XHTML.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;htmlArea RTE: Using CSS classes for indentation and alignment&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * Indentation is produced by a CSS class instead of the blockquote element.&lt;br /&gt;
      You will need to specify in Page TSConfig the class to be used for indentation using property buttons.indent.useClass (default is &amp;quot;indent&amp;quot;). You will need to define this class in your stylesheets and ensure that it is allowed by the RTE transformation (RTE.default.proc). Alternatively, you may continue using the blockquote element by setting property buttons.indent.useBlockquote. You may also want to add the new blockquote button to the RTE toolbar.&lt;br /&gt;
&lt;br /&gt;
    * Text alignment is produced by CSS classes instead of deprecated align attribute.&lt;br /&gt;
      You will need to specify in Page TSConfig the class to be used for each text alignment button using property buttons.[left, center, right or justifyfull].useClass (defaults are &amp;quot;align-left&amp;quot;, &amp;quot;align-center&amp;quot;, &amp;quot;align-right&amp;quot;, &amp;quot;align-justify&amp;quot;). You will need to define these classes in your stylesheets, and ensure that they are allowed by the RTE transformation (RTE.default.proc). Alternatively, you may continue using deprecated align attribute by setting property buttons.[left, center, right or justifyfull].useAlignAttribute.&lt;br /&gt;
&lt;br /&gt;
== Update alter Typo3 Installationen (&amp;lt;V.3.8)==&lt;br /&gt;
Aus der Mailing Liste Östereich:&lt;br /&gt;
- der Core ist relativ easy (fast) immer zu upgraden (muesst&amp;#039; eigentlich von&lt;br /&gt;
v3.3 auch gehen ;-) )&lt;br /&gt;
- Achte immer auf installierte Extensions&lt;br /&gt;
* wenn etwas nicht geht, mal soweit wie moeglich alle Extensions wegschalten (nicht loeschen!).&lt;br /&gt;
* dann zuschalten; wenns dann hakt, dann sieht man gleich welche ext &amp;quot;boese&amp;quot; ist.&lt;br /&gt;
* dann diese ext updaten, wenns keine updates gibt, mal danach googlen.&lt;br /&gt;
* wenns dann net geht, debuggen..&lt;br /&gt;
&lt;br /&gt;
Weitere Probleme:&lt;br /&gt;
&lt;br /&gt;
Alte TS Templates arbeiten noch mit CSet und Content als default Template. Nach umstellen auf css-styled-content muß evt. einiges angepasst werden:&lt;br /&gt;
== Update auf 4.2 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Backup erstellen (sollte selbstverständlich sein)!&lt;br /&gt;
    Notieren welche Extensions &amp;quot;Global&amp;quot; installiert wurden, da diese später wieder erneut installiert werden müssen&lt;br /&gt;
    Resource herunterladen:&lt;br /&gt;
    wget kent.dl.sourceforge.net/sourceforge/typo3/typo3_src-4.2.8.tar.gz&lt;br /&gt;
    Source-Paket entpacken:&lt;br /&gt;
    tar -xzf typo3_src-4.2.8.tar.gz&lt;br /&gt;
    Im Verzeichnis typo3conf müssen Sie eine Datei mit dem Namen &amp;quot;ENALBE_INSTALL_TOOL&amp;quot; erstellen bzw. uploaden (ich mache das immer mit vi ENABLE_INSTALL_TOOL )&lt;br /&gt;
    eventuell die Rechte und die Gruppe ändern&lt;br /&gt;
    eventuell basedir_restriction anpassen (für Plesk siehe hier)&lt;br /&gt;
    typo3_src Symlink löschen:&lt;br /&gt;
    rm typo3_src&lt;br /&gt;
    neuen Symlink anlegen:&lt;br /&gt;
    ln -s ../../typo3_src-4.2.8/ typo3_src&lt;br /&gt;
    (den richtigen Pfad zum Source-Verzeichnis eventuell anpassen)&lt;br /&gt;
    index.php löschen und neu erstellen:&lt;br /&gt;
    rm index.php &lt;br /&gt;
    ln -s typo3_src/index.php index.php&lt;br /&gt;
    alte Verzeichnisse löschen (media, tslib)&lt;br /&gt;
    alte Dateien löschen (showpic.php)&lt;br /&gt;
    fehlende Verzeichnisse erstellen:&lt;br /&gt;
    typo3conf/l10n, typo3temp/temp, typo3temp/GB, typo3temp/pics, typo3temp/llxml/, typo3temp/cs/ (sofern diese nicht schon vorhanden sind)&lt;br /&gt;
    Installtool aufrufen und &amp;quot;Basic Configuration&amp;quot; überprüfen; hier sollte alles im grünen Bereich sein. Wenn nicht entsprechende Probleme beheben.&lt;br /&gt;
    &amp;quot;Update Wizard&amp;quot; ausführen&lt;br /&gt;
    Im &amp;quot;Database Analyser&amp;quot; auf &amp;quot;Update required tables&amp;quot; auf &amp;quot;Compare&amp;quot; klicken und bestätigen&lt;br /&gt;
    Ins Backend einloggen und alle &amp;quot;Global&amp;quot; installierten Extensions nachinstallieren&lt;br /&gt;
    Im Ext Manager unter Settings &amp;quot;Enable unsupported extensions&amp;quot; aktivieren, da zur Zeit noch nicht alle Exentensions überprüft wurden.&lt;br /&gt;
    Im Ext Manager unter &amp;quot;Import extensions&amp;quot; auf &amp;quot;Retrieve/Update&amp;quot; klicken, um die aktuelle Liste der Extensions herunterzuladen&lt;br /&gt;
    (Sollte es dabei zu Fehlermeldungen kommen, muss u.U. auf curl umgestellt werden) Leider ist das neue TER 2.0 extrem speicherhungrig, so dass u.U. die Speicherbeschränkung von PHP nicht ausreicht. Wenn möglich sollten Sie also zuvor den verfügbaren Speicher von PHP auf min. 45MB(!) hochsetzen. Sollten Sie dazu keine Rechte haben oder soviel Speicher nicht zur Verfügung stellen wollen, können Sie sich dadurch behelfen, dass Sie die benötigten Extensions als .t3x-Dateien herunterladen und &amp;quot;von Hand&amp;quot; installieren.&lt;br /&gt;
    Im Ext Manager die Sprache updaten&lt;br /&gt;
    Eventuell veraltete local-installierte Extensions erneuern (z.B. TemplaVoila, static_info_tables u.ä.)&lt;br /&gt;
    Nicht mehr benötigte &amp;quot;Local&amp;quot;-installierte Extensions entfernen, wie z.B. csh_de, htmlarea (ist jetzt eine &amp;quot;System&amp;quot;-Extension und sollte daher local deinstalliert werden)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Update auf 4.1 ==&lt;br /&gt;
Unbedingt im Install Tool Compare ausführen und Tabellen aktualisieren. Sonst kann es Probleme mit verschiedenen Extensions geben (z.B. Login..)&lt;br /&gt;
&lt;br /&gt;
== Probleme beim TYPO3 Update lösen ==&lt;br /&gt;
=== Weiße Seite ===&lt;br /&gt;
* Fehlermeldungen einschalten&lt;br /&gt;
=== The requested URL /typo3/alt_main.php was not found on this server.===&lt;br /&gt;
Symlink für index.php falsch&lt;br /&gt;
=== Nach dem Datenbank Compare fehlen Teile der TYPOScript Templates ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lösung&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Von Version 4.2 auf 4.1 werden blob Felder zu Text Feldern umgewandelt. Dabei werden bei Umlauten die Inhalte abgeschnitten, wenn die Datenbank utf-8 arbeitet, TYPO3 aber die Daten in latin abgelegt hat. &lt;br /&gt;
&lt;br /&gt;
Beim Compare muß man dann die blob konvertierungen weglassen (vor allem bei den Templates - in der Regel gibt es da Kommentare mit Umlauten) und leicht abgewandelt selbst durchführen:&lt;br /&gt;
&lt;br /&gt;
 ALTER TABLE sys_template CHANGE config config TEXT CHARACTER SET latin1;&lt;br /&gt;
&lt;br /&gt;
Typo3 läßt hier die Angabe welcher Zeichensatz drin ist weg.&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten Statements (Stand Typo3 4.5):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE sys_template CHANGE constants constants text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE sys_template CHANGE config config text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE image image text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE media media text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE pages pages tinytext CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE multimedia multimedia tinytext CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE pages CHANGE media media text CHARACTER SET latin1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Link: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html (Zugriff: 10/2012)&lt;br /&gt;
&lt;br /&gt;
== Release Notes Version 4.1 ==&lt;br /&gt;
Die wichtigsten Neuerungen&lt;br /&gt;
* IRRE (Inline Relational Record Editing)&lt;br /&gt;
* AJAX Page and File Tree&lt;br /&gt;
* Clean-up functions (command line scripts)(Über Extension lowlevel)&lt;br /&gt;
* Improved Extension Manager (less memory, stored extension list)&lt;br /&gt;
* UTF-8 for filenames&lt;br /&gt;
* Backend &amp;quot;Who is online&amp;quot;&lt;br /&gt;
* Frontend &amp;quot;Stay logged in&amp;quot; (Konfiguration mit new login box)&lt;br /&gt;
* MySQL InnoDB (Wird automatisch bei Neuinstallation zur Verfügung gestellt, wenn es in mySQL aktiviert ist)&lt;br /&gt;
* Speed up Backend with .htaccess http://typo3.org/development/articles/release-notes-41/page/4/)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Manuelles ändern der Tabellen auf InnoDB ===&lt;br /&gt;
Hinweis persönlich rate ich von INNODB und TYPO3 ab, besser ISAM nehmen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
alter table cache_hash ENGINE = INNODB;&lt;br /&gt;
alter table cache_imagesizes ENGINE = INNODB;&lt;br /&gt;
alter table cache_md5params ENGINE = INNODB;&lt;br /&gt;
alter table cache_pages ENGINE = INNODB;&lt;br /&gt;
alter table cache_pagesection ENGINE = INNODB;&lt;br /&gt;
alter table cache_typo3temp_log ENGINE = INNODB;&lt;br /&gt;
alter table fe_sessions ENGINE = INNODB;&lt;br /&gt;
alter table fe_session_data ENGINE = INNODB;&lt;br /&gt;
alter table index_fulltext ENGINE = INNODB;&lt;br /&gt;
alter table index_grlist ENGINE = INNODB;&lt;br /&gt;
alter table index_phash ENGINE = INNODB;&lt;br /&gt;
alter table index_rel ENGINE = INNODB;&lt;br /&gt;
alter table index_section ENGINE = INNODB;&lt;br /&gt;
alter table index_stat_search ENGINE = INNODB;&lt;br /&gt;
alter table index_stat_word ENGINE = INNODB;&lt;br /&gt;
alter table index_words ENGINE = INNODB;&lt;br /&gt;
alter table sys_log ENGINE = INNODB;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Generelle Informationen zum Update unter Linux ==&lt;br /&gt;
Quelle: typo3.net Mai 2006&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Typo3 ist normalerweise sehr einfach upzudaten - allerdings müssen ein paar Dinge beachtet werden, um updatefähig zu bleiben:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Es dürfen keine Änderungen an dem Typo3-Sourcecode gemacht worden sein. Falls dieses doch gemacht wurde, müssen natürlich diese Änderungen erst in die neue Version eingearbeitet werden.&lt;br /&gt;
* Installierte Extensions sollten möglichst immer LOCAL installiert worden sein. So bleiben diese nach dem Tausch des Typo3-Sourcecodes unberührt und funktionieren nach dem Update (meist) wie gewohnt. Es gibt nur selten den Fall, daß eine Typo3-Version eine Funktion nicht mehr verwendet, die es in der alten Version noch gab.&lt;br /&gt;
* Wenn sie HTML-Templates von GLOBAL installierten Erweiterungen direkt im Extensionordner modifiziert haben sollten, müssen diese erst z.B. in den fileadmin kopiert werden. Dann können Sie den Pfad zu dieser Datei im TypoScript anpassen.&lt;br /&gt;
&lt;br /&gt;
Den Pfad finden Sie überigens mithilfe des TypoScript-Object-Browsers schnell. Meist ist er an der Stelle plugin.extensionname.templateFile zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:T3_wichtigeVerzeichnisse.gif]]&lt;br /&gt;
&lt;br /&gt;
Einige der wichtigsten Verzeichnisse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Das Update für mittwaldmedien Kunden&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Für unsere Kunden ist es nun besonders einfach, die vorhandene Installation auf die aktuelle Version zu bringen. Sie müssen sich nur auf der Webseite http://www.typo3server.com einloggen. Nach dem Login finden Sie ein Menü mit einem Link zu dem Typo3-Versionsmanager. Dort können Sie mit einem Klick Ihren Account auf die neue Version updaten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ToDo Versionsmanager für Geo-bit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Manuelles Update&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Für diejenigen, die dieses Update manuell machen wollen oder müssen, sind die folgenden Schrittenötig. Die Beispiele - vor allem die Pfade - müssen natürlich angepasst werden. Die Beispiele gehen davon aus, daß Sie eine Verzeichnisstruktur angelegt haben, die dem obigen Bild entspricht.&lt;br /&gt;
&lt;br /&gt;
1. Machen Sie zuerst eine Datensicherung von dem Typo3-Sourcen und Ihrem html-Ordner! Die Datenbank können Sie nun über diesen Befehl sichern:&lt;br /&gt;
&lt;br /&gt;
 mysqldump -u benutzername -p -B --add-drop-table datenbank &amp;gt; typo3DBSicherung.sql&lt;br /&gt;
&lt;br /&gt;
Notfalls könnte auch ein Dump mit phpMyAdmin erstellt werden.&lt;br /&gt;
&lt;br /&gt;
2. Verbinden Sie sich mit Ihrem Server über SSH.&lt;br /&gt;
&lt;br /&gt;
3. Wechseln Sie das Verzeichnis auf einer Ebene über dem Rootverzeichnis Ihres Webservers.&lt;br /&gt;
z.B.: cd /home/www/p1234/&lt;br /&gt;
&lt;br /&gt;
4. Laden Sie sich die neuen Typo3-Sourcen auf ihren Linuxrechner. Die aktuellen Sourcen finden Sie unter: http://typo3.org/download/packages/.&lt;br /&gt;
&lt;br /&gt;
Die benötigte Datei hat das Format typo3_src-3.x.x.tar.gz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
      &lt;br /&gt;
 wget belnet.dl.sourceforge.net/sourceforge/typo3/typo3_src-3.7.0.tar.gz&lt;br /&gt;
&lt;br /&gt;
5. Entpacken Sie die Datei mit dem Kommando:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 tar -xzvf typo3_src-3.x.x.tar.gz&lt;br /&gt;
&lt;br /&gt;
6. Ändern Sie nun die Rechte so, wie der bisherige Typo3-Sourcecode-Ordner sie hatte.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 chown p1234.ftponly typo3_src-3.7.0 -R&lt;br /&gt;
&lt;br /&gt;
7. Entfernen Sie den alten symbolischen Link mit:&lt;br /&gt;
&lt;br /&gt;
 rm typo3_src&lt;br /&gt;
&lt;br /&gt;
8. Legen Sie nun einen neuen Link an mit:&lt;br /&gt;
&lt;br /&gt;
 ln -s typo3_src-3.x.x typo3_src&lt;br /&gt;
&lt;br /&gt;
(Die Versionsnummer müssen Sie natürlich noch anpassen.)&lt;br /&gt;
&lt;br /&gt;
9. Nun muss die Datenbank noch aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
Gehen Sie hierzu in das Typo3-Installtool und klicken Sie auf den 2. Menüpunkt Database Analyser. Mit einem Klick auf Compare werden die zu ändernden oder zu ergänzenden Datenbankfelder angezeigt. Mit einem Klick auf &amp;quot;Write to database&amp;quot; wird die Datenbank an die neue Typo3-Version angepasst.&lt;br /&gt;
&lt;br /&gt;
10. Loggen Sie sich nun als Admin im Backend an und löschen Sie alle Caches.&lt;br /&gt;
&lt;br /&gt;
== Neu in Version 4 ==&lt;br /&gt;
* Conditions mit AND und OR (|| &amp;amp;&amp;amp;)&lt;br /&gt;
&lt;br /&gt;
== Neu in 4.2 ==&lt;br /&gt;
Viele Usability Verbesserungen im Backend&lt;br /&gt;
== Update auf 4.2 ==&lt;br /&gt;
=== Extensions Updaten ===&lt;br /&gt;
* dam 1.0.11 ist nicht kompatibel Update auf min. 1.0.13&lt;br /&gt;
* date2cal auf &amp;gt;= 7.1.0&lt;br /&gt;
* Kickstarter 0.3.8 ist nicht kompatibel&lt;br /&gt;
* Developer tools gehen nicht mehr (wg. Frame oben)&lt;br /&gt;
&lt;br /&gt;
=== Ablauf ===&lt;br /&gt;
* Backend Benutzer sperren (only Admins)&lt;br /&gt;
* Sicherung der Datenbank&lt;br /&gt;
* neue Source + Symlink&lt;br /&gt;
* Update Wizard&lt;br /&gt;
* Compare&lt;br /&gt;
&lt;br /&gt;
=== Probleme ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DAM Upload geht für Benutzer&amp;#039;&amp;#039;&amp;#039; nicht mehr (Fehler Meta Daten können nicht geschrieben werden)&lt;br /&gt;
Beim neu indizieren geht dem dam der Media Ordner verloren. Er legt dann einen neuen an, in den er scheiben möchte. Die Benutzer sind abe noch auf den alten eingestellt. D.h. die Benutzergruppen m´üssen auf den neuen eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Im Dam stehen im IE7 die Benutzerwerkzeuge nicht zur verfügung (löschen etc.) nur der Stift ist noch da.&lt;br /&gt;
&lt;br /&gt;
Lösung: Das Problem ist das CSS für das Fenster. Es verdeckt die restlichen Symbole&lt;br /&gt;
Forum: 24.7.&lt;br /&gt;
&lt;br /&gt;
Ich hatte das gleiche Problem bis vor 5 Minuten auch,&lt;br /&gt;
gelöst habe ich es so:&lt;br /&gt;
- Datei: class.tx_dam_listbase.php im Ordner DAM\lib\&lt;br /&gt;
Unter der Zeile 256 (&amp;#039;itemTD&amp;#039; =&amp;gt; &amp;#039; class=&amp;quot;typo3-dblist-item&amp;quot;&amp;#039;,)&lt;br /&gt;
ist in 3 Werten als Breite 1% angegeben. Das auskommentieren&lt;br /&gt;
&lt;br /&gt;
- Datei: stylesheet.cdd in typo3_src\typo3\&lt;br /&gt;
table.typo3-dblist width: 98%; durch width: auto; ersetzen und in&lt;br /&gt;
table.typo3-dblist tr td {width: auto;} einsetzen,&lt;br /&gt;
&lt;br /&gt;
damit hats bei mir im IE 7, Firefox, safari für Win und Opera alles richtig angezeigt :-)&lt;br /&gt;
&lt;br /&gt;
Ich hoffe, geholrfen zu haben,&lt;br /&gt;
Schmoozer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bug in Mount Points&lt;br /&gt;
&lt;br /&gt;
== Datenbank über Root Shell sichern (mysql backup) ==&lt;br /&gt;
&lt;br /&gt;
mysqldump -opt ...&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
Die häufigste Anwendung von mysqldump ist wahrscheinlich die &amp;#039;&amp;#039;&amp;#039;Erstellung eines Backups einer vollständigen Datenbank&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --opt db_name &amp;gt; backup-file.sql&lt;br /&gt;
&lt;br /&gt;
oder mit User und Passwortangabe:&lt;br /&gt;
 mysqldump -u meinDBUser -pGEHEIM db_name &amp;gt; backup.sql&lt;br /&gt;
&lt;br /&gt;
--opt ist in neueren MySQL Versionen Standardmäßig an deshalb lassen wir es mal weg.&lt;br /&gt;
&lt;br /&gt;
Die Speicherauszugsdatei können Sie wie folgt &amp;#039;&amp;#039;&amp;#039;wieder einspielen&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysql db_name &amp;lt; backup-file.sql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oder aber so:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysql -e &amp;quot;source /path-to-backup/backup-file.sql&amp;quot; db_name&lt;br /&gt;
&lt;br /&gt;
mysqldump ist ferner sehr nützlich zum Ausfüllen von Datenbanken durch Kopieren von Daten von einem MySQL Server auf einen anderen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --opt db_name | mysql --host=remote_host -C db_name&lt;br /&gt;
&lt;br /&gt;
Sie können mit einem einzigen Befehl einen Speicherauszug mehrerer Datenbanken erstellen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --databases db_name1 [db_name2 ...] &amp;gt; my_databases.sql&lt;br /&gt;
&lt;br /&gt;
Um einen Speicherauszug aller Datenbanken zu erstellen, verwenden Sie die Option --all-databases:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Bei InnoDB-Tabellen bietet mysqldump die Möglichkeit, eine Online-Sicherung zu erstellen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --single-transaction &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Diese Datensicherung muss vor Beginn des Speicherauszugsvorgangs lediglich (mit FLUSH TABLES WITH READ LOCK) eine globale Lesesperre für alle Tabellen erwirken. Sobald diese Sperre aktiv ist, werden die Koordinaten des Binärlogs ausgelesen, und die Sperre wird aufgehoben. Wenn beim Absetzen der FLUSH-Anweisung gerade eine umfangreiche Änderungsanweisung ausgeführt wird, dann – und nur dann! – kann der MySQL Server stehen bleiben, bis diese lange Anweisung ausgeführt ist; danach ist der Server sperrfrei. Wenn die vom MySQL Server empfangenen Änderungsanweisungen (in Bezug auf ihre Ausführungsdauer) kurz sind, sollte die anfängliche Sperrperiode auch bei vielen Änderungen nicht spürbar sein.&lt;br /&gt;
&lt;br /&gt;
Bei der Point-in-Time-Wiederherstellung (die auch als „Roll-Forward“ bezeichnet wird, wenn Sie ein altes Backup wiederherstellen und die seitdem durchgeführten Änderungen neu aufspielen müssen) ist es häufig nützlich, das Binärlog zu rotieren (siehe Abschnitt 5.12.3, „Die binäre Update-Logdatei“) oder zumindest die Binärlogkoordinaten zu kennen, denen der Speicherauszug entspricht:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --master-data=2 &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Oder:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --flush-logs --master-data=2&lt;br /&gt;
              &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
== Mass Update Script ==&lt;br /&gt;
&lt;br /&gt;
Yesterday some updates came out for TYPO3. These updates fixed certain issues and we needed to update all of our excellent shared hosting environments.&lt;br /&gt;
&lt;br /&gt;
We already have a script (which is more elaborate now) that checks all our TYPO3 installations and sends the sysadmins a nice report about its findings. We use part of that report (list of paths to Document Roots) to feed the updater script.&lt;br /&gt;
&lt;br /&gt;
The TYPO3 update requires you to do the followi&lt;br /&gt;
&lt;br /&gt;
    * update encryption key&lt;br /&gt;
    * clear configuration cache&lt;br /&gt;
    * clear page cache&lt;br /&gt;
&lt;br /&gt;
We do not want to go into 200+ TYPO3 backends and do those tasks manually. We are lazy and we will write a script to automagically do the boring tasks for us.&lt;br /&gt;
&lt;br /&gt;
This script is not perfect but it works well on Debian systems. You can modify it to fit your needs. It was just a quick hack to ease the upgrade pain. Take care to switch the symlink part for upgrade runs of different versions of TYPO3.&lt;br /&gt;
&lt;br /&gt;
I am not responsible for any damage to your system that may occur to misuse of this script. Make sure you understand it before you run it. Run it with a single URI before attempting a whole ist of URI&amp;#039;s. &lt;br /&gt;
&lt;br /&gt;
Ein Massen Update Script von:&lt;br /&gt;
&lt;br /&gt;
http://typofree.org/article/archive/2009/january/title/typo3-mass-upgrade-script/&lt;br /&gt;
Zugriff am 12.3.2009&lt;br /&gt;
&lt;br /&gt;
http://typofree.org/article/archive/2009/january/title/typo3-mass-upgrade-script/&lt;br /&gt;
&lt;br /&gt;
TYPO3 mass update script&lt;br /&gt;
&lt;br /&gt;
   1.&lt;br /&gt;
      #!/bin/sh&lt;br /&gt;
   2.&lt;br /&gt;
      binDir=/usr/bin/&lt;br /&gt;
   3.&lt;br /&gt;
      sleep=2&lt;br /&gt;
   4.&lt;br /&gt;
       &lt;br /&gt;
   5.&lt;br /&gt;
      pageCacheTables=(&lt;br /&gt;
   6.&lt;br /&gt;
              cache_pages&lt;br /&gt;
   7.&lt;br /&gt;
              cache_pagesection&lt;br /&gt;
   8.&lt;br /&gt;
      )&lt;br /&gt;
   9.&lt;br /&gt;
       &lt;br /&gt;
  10.&lt;br /&gt;
      sites=(&lt;br /&gt;
  11.&lt;br /&gt;
              /var/www/sites/live/www.somedomain.tld&lt;br /&gt;
  12.&lt;br /&gt;
              /var/www/sites/live/www.someotherdomain.tld&lt;br /&gt;
  13.&lt;br /&gt;
              /var/www/sites/live/www.yetsomeotherdomain.tld&lt;br /&gt;
  14.&lt;br /&gt;
      )&lt;br /&gt;
  15.&lt;br /&gt;
       &lt;br /&gt;
  16.&lt;br /&gt;
      len=${#sites[*]}&lt;br /&gt;
  17.&lt;br /&gt;
      pageCacheTablesLength=${#pageCacheTables[*]}&lt;br /&gt;
  18.&lt;br /&gt;
      i=0&lt;br /&gt;
  19.&lt;br /&gt;
      while [ $i -lt $len ]; do&lt;br /&gt;
  20.&lt;br /&gt;
              echo updating: ${sites[$i]}&lt;br /&gt;
  21.&lt;br /&gt;
                      cd ${sites[$i]}&lt;br /&gt;
  22.&lt;br /&gt;
                      rm typo3_src&lt;br /&gt;
  23.&lt;br /&gt;
                      ln -s ../../sources/typo3_src-4.2.5 typo3_src&lt;br /&gt;
  24.&lt;br /&gt;
       &lt;br /&gt;
  25.&lt;br /&gt;
              echo generating new key&lt;br /&gt;
  26.&lt;br /&gt;
                      k=0&lt;br /&gt;
  27.&lt;br /&gt;
                      key=&amp;#039;&amp;#039;&lt;br /&gt;
  28.&lt;br /&gt;
                      while [ $k -lt 96 ]; do&lt;br /&gt;
  29.&lt;br /&gt;
                              key=$key$(head -100 /dev/urandom | md5sum | cut -c1)&lt;br /&gt;
  30.&lt;br /&gt;
                              let k++&lt;br /&gt;
  31.&lt;br /&gt;
                      done&lt;br /&gt;
  32.&lt;br /&gt;
                      echo key: $key&lt;br /&gt;
  33.&lt;br /&gt;
                      sed -i &amp;quot;s/\(\$TYPO3_CONF_VARS\[&amp;#039;SYS&amp;#039;]\[&amp;#039;encryptionKey&amp;#039;] = \).*/\1&amp;#039;$key&amp;#039;;/g&amp;quot; typo3conf/localconf.php&lt;br /&gt;
  34.&lt;br /&gt;
             &lt;br /&gt;
  35.&lt;br /&gt;
              echo removing configuration cache&lt;br /&gt;
  36.&lt;br /&gt;
                      rm -f typo3conf/temp_CACHED*&lt;br /&gt;
  37.&lt;br /&gt;
       &lt;br /&gt;
  38.&lt;br /&gt;
              echo clearing page cache&lt;br /&gt;
  39.&lt;br /&gt;
                      # For some insane reason some values are enclosed in double qotes&lt;br /&gt;
  40.&lt;br /&gt;
                      database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db =&amp;#039;)&lt;br /&gt;
  41.&lt;br /&gt;
                      if [ -z &amp;quot;$database&amp;quot; ] ; then&lt;br /&gt;
  42.&lt;br /&gt;
                              database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  43.&lt;br /&gt;
                      else&lt;br /&gt;
  44.&lt;br /&gt;
                              database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  45.&lt;br /&gt;
                      fi&lt;br /&gt;
  46.&lt;br /&gt;
                      username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db_username =&amp;#039;)&lt;br /&gt;
  47.&lt;br /&gt;
                      if [ -z &amp;quot;$username&amp;quot; ] ; then&lt;br /&gt;
  48.&lt;br /&gt;
                              username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  49.&lt;br /&gt;
                      else&lt;br /&gt;
  50.&lt;br /&gt;
                              username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  51.&lt;br /&gt;
                      fi&lt;br /&gt;
  52.&lt;br /&gt;
                      password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db_password =&amp;#039;)&lt;br /&gt;
  53.&lt;br /&gt;
                      if [ -z &amp;quot;$password&amp;quot; ] ; then&lt;br /&gt;
  54.&lt;br /&gt;
                              password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  55.&lt;br /&gt;
                      else&lt;br /&gt;
  56.&lt;br /&gt;
                              password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  57.&lt;br /&gt;
                      fi&lt;br /&gt;
  58.&lt;br /&gt;
                      j=0&lt;br /&gt;
  59.&lt;br /&gt;
                      while [ $j -lt $pageCacheTablesLength ];&lt;br /&gt;
  60.&lt;br /&gt;
                      do&lt;br /&gt;
  61.&lt;br /&gt;
                              nice -n 19 ${binDir}mysql --batch -u$username -p&amp;quot;$password&amp;quot; -D$database -e &amp;quot;TRUNCATE ${pageCacheTables[$j]}&amp;quot;&lt;br /&gt;
  62.&lt;br /&gt;
                              nice -n 19 ${binDir}mysql --batch -u$username -p&amp;quot;$password&amp;quot; -D$database -e &amp;quot;ALTER TABLE ${pageCacheTables[$j]} auto_increment=1&amp;quot;&lt;br /&gt;
  63.&lt;br /&gt;
                              let j++&lt;br /&gt;
  64.&lt;br /&gt;
                      done&lt;br /&gt;
  65.&lt;br /&gt;
       &lt;br /&gt;
  66.&lt;br /&gt;
              echo &amp;quot;done! Sleeping $sleep seconds . . .&amp;quot;&lt;br /&gt;
  67.&lt;br /&gt;
                      sleep $sleep&lt;br /&gt;
  68.&lt;br /&gt;
       &lt;br /&gt;
  69.&lt;br /&gt;
              echo&lt;br /&gt;
  70.&lt;br /&gt;
        let i++&lt;br /&gt;
  71.&lt;br /&gt;
      done&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Powermail&amp;diff=22633</id>
		<title>TYPO3 - Powermail</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Powermail&amp;diff=22633"/>
		<updated>2017-11-22T17:12:52Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Snippets für 2.x */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Powermail Extension&lt;br /&gt;
== Snippets für 2.x ==&lt;br /&gt;
=== Dynamische Anrede ===&lt;br /&gt;
&lt;br /&gt;
Mit folgendem TypoScript lässt sich in Powermail 2.x eine dynamische Anrede des Benutzers in E-Mails und Bestätigungsseite bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
TypoScript:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typoscript&amp;quot;&amp;gt;&lt;br /&gt;
lib.anrede = CASE&lt;br /&gt;
lib.anrede {&lt;br /&gt;
  key.field = 0&lt;br /&gt;
 &lt;br /&gt;
  default = TEXT&lt;br /&gt;
  default.value = Sehr geehrte Damen und Herren,&lt;br /&gt;
 &lt;br /&gt;
  Herr = TEXT&lt;br /&gt;
  # Die &amp;quot;7&amp;quot; ist die ID des Powermail-Felds {name}&lt;br /&gt;
  Herr.data = GP:tx_powermail_pi1|field|7&lt;br /&gt;
  Herr.noTrimWrap = |Sehr geehrter Herr |,|&lt;br /&gt;
 &lt;br /&gt;
  Frau = TEXT&lt;br /&gt;
  Frau.data = GP:tx_powermail_pi1|field|7&lt;br /&gt;
  Frau.noTrimWrap = |Sehr geehrte Frau |, |&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  # Englische Übersetzung:&lt;br /&gt;
  Mr = TEXT&lt;br /&gt;
  Mr.data = GP:tx_powermail_pi1|field|7&lt;br /&gt;
  Mr.noTrimWrap = |Dear Mr |, |&lt;br /&gt;
 &lt;br /&gt;
  Mrs = TEXT&lt;br /&gt;
  Mrs.data = GP:tx_powermail_pi1|field|7&lt;br /&gt;
  Mrs.noTrimWrap = |Dear Mrs |, |&lt;br /&gt;
 &lt;br /&gt;
  Ms = TEXT&lt;br /&gt;
  Ms.data = GP:tx_powermail_pi1|field|7&lt;br /&gt;
  Ms.noTrimWrap = |Dear Ms |, |&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ViewHelper für Powermail-Plugin:&lt;br /&gt;
&lt;br /&gt;
 {f:cObject(typoscriptObjectPath:&amp;#039;lib.anrede&amp;#039;,data:&amp;#039;{anrede}&amp;#039;)}&lt;br /&gt;
Quelle: typo3.net - Forum&lt;br /&gt;
&lt;br /&gt;
Ab Powermail 2.1.x werden Powermail-Felder nicht mehr über die UID, sondern den Markernamen angesprochen. Dementsprechend müssen die Zeilen im TypoScript etwas angepasst werden:&lt;br /&gt;
&lt;br /&gt;
 # Powermail-Feld {name}&lt;br /&gt;
 Herr.data = GP:tx_powermail_pi1|field|name&lt;br /&gt;
&lt;br /&gt;
=== E-Mail Empfänger abhängig von Feldwerten (powermail &amp;gt; 2 ===&lt;br /&gt;
http://typo3.3.n7.nabble.com/Powermail-2-Dynamischer-Empfanger-je-nach-Betreff-td269199.html&lt;br /&gt;
&lt;br /&gt;
ich hatte das in einem Projekt so gelöst: &lt;br /&gt;
(läuft unter Typo3 6.1 und Powermail 2.0) &lt;br /&gt;
&lt;br /&gt;
1) Betreff-Auswahl mit Select-Feld so wie du &lt;br /&gt;
&lt;br /&gt;
2) Im Powermail-Plugin im Reiter &amp;quot;Empfänger&amp;quot; folgendes: &lt;br /&gt;
&lt;br /&gt;
Name des Empfängers:{f:cObject(typoscriptObjectPath:&amp;#039;lib.receiver_name&amp;#039;)} &lt;br /&gt;
&lt;br /&gt;
E-Mail des Empfängers: &lt;br /&gt;
&lt;br /&gt;
{f:cObject(typoscriptObjectPath:&amp;#039;lib.receiver_email&amp;#039;)} &lt;br /&gt;
&lt;br /&gt;
Betreff der Mail an den Empfänger: &lt;br /&gt;
&lt;br /&gt;
{f:cObject(typoscriptObjectPath:&amp;#039;lib.subject&amp;#039;)} &lt;br /&gt;
&lt;br /&gt;
3) &lt;br /&gt;
Im TypoScript: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lib.receiver_email = CASE &lt;br /&gt;
lib.receiver_email { &lt;br /&gt;
     # content id 59: field uid 11 &lt;br /&gt;
     key.data = GP:tx_powermail_pi1|field|11 &lt;br /&gt;
     key.intval = 1 &lt;br /&gt;
     default = TEXT &lt;br /&gt;
     default.value = [hidden email] &lt;br /&gt;
     1 = TEXT &lt;br /&gt;
     1.value = [hidden email] &lt;br /&gt;
     2 = TEXT &lt;br /&gt;
     2.value = [hidden email] &lt;br /&gt;
     3 = TEXT &lt;br /&gt;
     3.value = [hidden email] &lt;br /&gt;
} &lt;br /&gt;
lib.receiver_name = CASE &lt;br /&gt;
lib.receiver_name { &lt;br /&gt;
     # content id 59: field uid 11 &lt;br /&gt;
     key.data = GP:tx_powermail_pi1|field|11 &lt;br /&gt;
     key.intval = 1 &lt;br /&gt;
     default = TEXT &lt;br /&gt;
     default.value = Firma XY &lt;br /&gt;
     1 = TEXT &lt;br /&gt;
     1.value = Firma XY Allgemein &lt;br /&gt;
     2 = TEXT &lt;br /&gt;
     2.value = Firma XY Abteilung A &lt;br /&gt;
     3 = TEXT &lt;br /&gt;
     3.value = Firma XY Abteilung B &lt;br /&gt;
} &lt;br /&gt;
lib.subject = TEXT &lt;br /&gt;
lib.subject { &lt;br /&gt;
     # content id 59: field uid 11 &lt;br /&gt;
     key.data = GP:tx_powermail_pi1|field|11 &lt;br /&gt;
     key.intval = 1 &lt;br /&gt;
     default = TEXT &lt;br /&gt;
     default.value = Allgemeine Anfrage &lt;br /&gt;
     1 = TEXT &lt;br /&gt;
     1.value = Allgemeine Anfrage &lt;br /&gt;
     2 = TEXT &lt;br /&gt;
     2.value = Anfrage an Abteilung A &lt;br /&gt;
     3 = TEXT &lt;br /&gt;
     3.value = Anfrage an Abteilung B &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Korrektur für Powermail &amp;gt; 2.1 ====&lt;br /&gt;
ich habe jetzt - mit Hilfe des Powermail-Bug-Trackers - eine Lösung für &lt;br /&gt;
 &amp;gt; 2.1 gefunden. Und zwar werden Felder nicht mehr nach deren ID, &lt;br /&gt;
sondern Feldnamen referenziert: &lt;br /&gt;
&lt;br /&gt;
Im TypoScript der Seite: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lib.receiver = CASE &lt;br /&gt;
lib.receiver { &lt;br /&gt;
   # Übergebener Wert &lt;br /&gt;
   key.field = 0 &lt;br /&gt;
&lt;br /&gt;
   default = TEXT &lt;br /&gt;
   default.value = [hidden email] &lt;br /&gt;
   # Mitgliederverwaltung &lt;br /&gt;
   member = TEXT &lt;br /&gt;
   member.value = [hidden email] &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In das Empfänger-Eingabefeld: &lt;br /&gt;
 {f:cObject(typoscriptObjectPath:&amp;#039;lib.receiver&amp;#039;,data:&amp;#039;{betreff}&amp;#039;)}&lt;br /&gt;
&lt;br /&gt;
== Letzte Version für TYPO3 4.5 ==&lt;br /&gt;
== Powermail Conditions ==&lt;br /&gt;
&lt;br /&gt;
== Snippets ==&lt;br /&gt;
&lt;br /&gt;
=== E-Mail Empfänger abhängig von Feldwerten ===&lt;br /&gt;
==== Quellen ====&lt;br /&gt;
http://blog.marmalade.de/2010/06/powermail-e-mailempfanger-mit-case-unterscheidung-uber-typoscript-zuweisen/ (3/2012)&lt;br /&gt;
&lt;br /&gt;
http://typo3blogger.de/powermail-empfanger-im-frontend-wahlen/ (3/2012)&lt;br /&gt;
Verschiedene Möglichkeiten:&lt;br /&gt;
* Direkt (schlecht)&lt;br /&gt;
* Über dynamisches TypoScript&lt;br /&gt;
* Angepasste Datenbankabfrage&lt;br /&gt;
&lt;br /&gt;
==== Direkt ====&lt;br /&gt;
Im Empfänger Feld kann man direkt einen Feldmarker angeben z.B.: ###UID234###, dann wird direkt der Wert des Feldes benutzt. Schlecht, weil einfach zu manipulieren (potentielle Spamschleuder)&lt;br /&gt;
&lt;br /&gt;
==== E-Mail über dynamisches TypoScript ====&lt;br /&gt;
TS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Case Objekt das den Wert eines Powermail Feldes auswertet. &lt;br /&gt;
emailan = CASE&lt;br /&gt;
emailan {&lt;br /&gt;
    ### Unterschiedung anhand Feld mit der UID 34 (Form hat id 25)&lt;br /&gt;
    key.data = TSFE:fe_user|sesData|powermail_25|uid34&lt;br /&gt;
    ### Standardwert&lt;br /&gt;
    default = TEXT&lt;br /&gt;
    default.value = info@indihar.de&lt;br /&gt;
    ### Wert bei Auswahl &amp;quot;empf2&amp;quot;&lt;br /&gt;
    empf2 = TEXT&lt;br /&gt;
    empf2.value = schlegel@geo-bit.de&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// neuen dynamischen Powermailmarker (###POWERMAIL_TYPOSCRIPT_EMPFAENGER###)&lt;br /&gt;
// dieser kann im Formular im Empfängerfeld eingetragen werden.&lt;br /&gt;
plugin.tx_powermail_pi1.dynamicTyposcript {&lt;br /&gt;
    empfaenger &amp;lt; emailan&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Angepasste Datenbankabfrage ====&lt;br /&gt;
http://typo3blogger.de/powermail-empfanger-im-frontend-wahlen/&lt;br /&gt;
&lt;br /&gt;
http://www.typo3.net/forum/list/list_post//76461/?howto=1&amp;amp;page=1&lt;br /&gt;
&lt;br /&gt;
http://typo3.org/documentation/document-library/extension-manuals/powermail/1.4.15/view/1/11/#id4334579&lt;br /&gt;
&lt;br /&gt;
Die Extension Powermail bietet eine komfortable Möglichkeit Formulare zusammenzuklicken – übrigens auch für Redakteure. Selbstverständlich ist Skalierbarkeit und Flexibilität ein großes Thema.&lt;br /&gt;
So ist es auch einfach möglich, den Empfänger im Frontend auszuwählen.&lt;br /&gt;
&lt;br /&gt;
Im Netz gibt es schon ein paar Erklärungen zu diesem Thema, aber ich möchte es dennoch noch einmal aufgreifen, da ich oft auf Empfängerwahl angesprochen werde.&lt;br /&gt;
&lt;br /&gt;
Mail-Adressen direkt in der Select Box&lt;br /&gt;
Technisch wäre es natürlich kein Problem eine Selectbox mit E-Mail Adressen im Frontend anzeigen zu lassen und im Flexform im Empfängerfeld dieses Feld durch einen Marker wieder aufzugreifen (z.B. ###UID234###).&lt;br /&gt;
Der Nachteil liegt aber auf der Hand:&lt;br /&gt;
- Mail Adressen können im Frontend aus dem Quelltext ausgelesen werden&lt;br /&gt;
- Mail Adressen können einfach manipuliert werden (im schlimmsten Fall stellt ihr so eine Spamschleuder ins Netz)&lt;br /&gt;
Diese Methode ist also allenfalls im Intranet nutzbar.&lt;br /&gt;
&lt;br /&gt;
Umweg über Datenbank-UID&lt;br /&gt;
Eine andere Idee ist es, Datankbankeinträge (z.B. tt_address oder fe_user) mit E-Mail Adressen vorzunehmen und in einer (z.B.) Selectbox die UID des Datensatzes wieder aufzugreifen.&lt;br /&gt;
Beispiel Eintrag im Flexform&lt;br /&gt;
In diesem Beispiel hat man die Wahl zwischen UID 1 und 2. Verwendeter Marker ist ###UID42###.&lt;br /&gt;
SQL Query Beispiel&lt;br /&gt;
Damit Powermail den Umweg über die Datenbank geht, bietet sich der Einsatz des Feldes “Alternative SQL-Query” an.&lt;br /&gt;
&lt;br /&gt;
Weitere Infos&lt;br /&gt;
Natürlich kann man auch an ganze Usergroups schicken:&lt;br /&gt;
&lt;br /&gt;
SELECT email FROM fe_users WHERE find_in_set(###UID43###,usergroup) &amp;gt; 0&lt;br /&gt;
AND hidden = 0 AND deleted = 0&lt;br /&gt;
&lt;br /&gt;
Beispiel mit fester Usergroup UID44:&lt;br /&gt;
&lt;br /&gt;
SELECT email FROM fe_users WHERE find_in_set(44,usergroup) &amp;gt; 0&lt;br /&gt;
AND hidden = 0 AND deleted = 0&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel mit Checkboxen (mehrere Empfänger auswählen):&lt;br /&gt;
&lt;br /&gt;
SELECT email FROM fe_users WHERE uid IN(###UID43###)&lt;br /&gt;
&lt;br /&gt;
Eine ganz andere Möglichkeit ist der Einsatz von Dynamictyposcript im Empfängerfeld – auch hier lassen sich einige Anforderungen flexibel umsetzen. Dynamictyposcript in Powermail&lt;br /&gt;
&lt;br /&gt;
=== Formular in Datenbank speichern ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.tx_powermail_pi1{&lt;br /&gt;
    dbEntry {&lt;br /&gt;
&lt;br /&gt;
        # Speicherung für Tabelle ermöglichen&lt;br /&gt;
        tt_address._enable = TEXT&lt;br /&gt;
        tt_address._enable.value = 1&lt;br /&gt;
&lt;br /&gt;
        #  &amp;quot;tt_address.name&amp;quot; mit dem Wert des Powermail felds ausfüllen&lt;br /&gt;
        tt_content uid 88, field uid18 (###uid18###)&lt;br /&gt;
        tt_address.name = TEXT&lt;br /&gt;
        tt_address.name.data = TSFE:fe_user|sesData|powermail_88|uid18&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausführliches Beispiel ===&lt;br /&gt;
&lt;br /&gt;
Constants&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.powermail.js.alwaysInclude = 1&lt;br /&gt;
plugin.powermail.js.includeJquery = 0&lt;br /&gt;
plugin.powermail.js.includeJqueryTools = 0&lt;br /&gt;
plugin.powermail.js.includeJqueryToolsTabs = 0&lt;br /&gt;
plugin.powermail.allow.email2sender = 0&lt;br /&gt;
plugin.powermail.PID.dblog = 0&lt;br /&gt;
plugin.powermail.markerALL.hideLabel = 1&lt;br /&gt;
plugin.powermail.format.datetime = %d.%m.%Y% %H:%M&lt;br /&gt;
plugin.powermail.format.date = %d.%m.%Y&lt;br /&gt;
plugin.powermail.debug.output = &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Setup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// CSS Pfad ändern (oder gar nicht erst statisch einbinden ;-)  )&lt;br /&gt;
page.includeCSS.powermail_frontend_basic = fileadmin/templates/onlineboerse/powermail.css&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Datenbank Speicherung mit verschiedenen Optionen ====&lt;br /&gt;
Setup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Powermail DB Storage&lt;br /&gt;
// Extra userfunc to convert date to unix timestamp&lt;br /&gt;
includeLibs.powermailTimestamp = fileadmin/templates/scripts/user_powermailTimestamp.php&lt;br /&gt;
&lt;br /&gt;
plugin.tx_powermail_pi1.dbEntry{  &lt;br /&gt;
  tx_gbbulletin_bulletin {&lt;br /&gt;
&lt;br /&gt;
    _enable = TEXT&lt;br /&gt;
    _enable.value = 1&lt;br /&gt;
     &lt;br /&gt;
    hidden = TEXT&lt;br /&gt;
    hidden.value = 1&lt;br /&gt;
     &lt;br /&gt;
    pid = TEXT&lt;br /&gt;
    pid.value = 102&lt;br /&gt;
        &lt;br /&gt;
    tstamp = TEXT&lt;br /&gt;
    tstamp.data = date:U&lt;br /&gt;
         &lt;br /&gt;
    crdate = TEXT&lt;br /&gt;
    crdate.data = date:U&lt;br /&gt;
&lt;br /&gt;
    title = TEXT&lt;br /&gt;
    title.data = TSFE:fe_user|sesData|powermail_214|uid1&lt;br /&gt;
&lt;br /&gt;
    author = TEXT&lt;br /&gt;
    author.data = TSFE:fe_user|sesData|powermail_214|uid2&lt;br /&gt;
&lt;br /&gt;
    place = TEXT&lt;br /&gt;
    place.data = TSFE:fe_user|sesData|powermail_214|uid3&lt;br /&gt;
    &lt;br /&gt;
    description = TEXT&lt;br /&gt;
    description.data = TSFE:fe_user|sesData|powermail_214|uid4&lt;br /&gt;
&lt;br /&gt;
    contact = TEXT&lt;br /&gt;
    contact.data = TSFE:fe_user|sesData|powermail_214|uid5&lt;br /&gt;
&lt;br /&gt;
    qualification = TEXT&lt;br /&gt;
    qualification.data = TSFE:fe_user|sesData|powermail_214|uid6&lt;br /&gt;
    &lt;br /&gt;
    date = USER&lt;br /&gt;
    date.userFunc = user_powermailTimestamp-&amp;gt;preflight&lt;br /&gt;
    date.userFunc.field = uid7&lt;br /&gt;
    date.userFunc.formuid = 214&lt;br /&gt;
    &lt;br /&gt;
    period = TEXT&lt;br /&gt;
    period.data = TSFE:fe_user|sesData|powermail_214|uid29&lt;br /&gt;
&lt;br /&gt;
    end_date = USER&lt;br /&gt;
    end_date.userFunc = user_powermailTimestamp-&amp;gt;preflight&lt;br /&gt;
    end_date.userFunc.field = uid14&lt;br /&gt;
    end_date.userFunc.formuid = 214&lt;br /&gt;
    &lt;br /&gt;
    url = TEXT&lt;br /&gt;
    url.data = TSFE:fe_user|sesData|powermail_214|uid8&lt;br /&gt;
&lt;br /&gt;
    text1 = TEXT&lt;br /&gt;
    text1.data = TSFE:fe_user|sesData|powermail_214|uid9&lt;br /&gt;
    &lt;br /&gt;
    cluster = TEXT&lt;br /&gt;
    cluster.data = TSFE:fe_user|sesData|powermail_214|uid11&lt;br /&gt;
    &lt;br /&gt;
    # add mm relation to uid 2 of tx_gbbulletin_cluster (via mm table)&lt;br /&gt;
    _mm = COA&lt;br /&gt;
    _mm.10 = COA&lt;br /&gt;
    # 1 is always the mm table&lt;br /&gt;
    _mm.10.1 = TEXT&lt;br /&gt;
    _mm.10.1.value = tx_gbbulletin_cluster_mm&lt;br /&gt;
    # 2 is always the other table&lt;br /&gt;
    _mm.10.2 = TEXT&lt;br /&gt;
    _mm.10.2.value = tx_gbbulletin_cluster&lt;br /&gt;
    # 3 is always the uid of the other table to get a relation to this&lt;br /&gt;
    # (in this case uid1 of tx_gbbulletin_cluster)&lt;br /&gt;
    _mm.10.3 = TEXT&lt;br /&gt;
    _mm.10.3.value = 1&lt;br /&gt;
    &lt;br /&gt;
    tag = TEXT&lt;br /&gt;
    tag.data = TSFE:fe_user|sesData|powermail_214|uid12&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Userfunktion zum umwandeln von Datum in Timestamp ===&lt;br /&gt;
Diese Funktion wird im obigen Beispiel zu Datenbankspeicherung verwendet&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
&lt;br /&gt;
    class user_powermailTimestamp { &lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
        // Function preflight() will be used from typoscript &lt;br /&gt;
        function preflight($content=&amp;#039;&amp;#039;, $conf=array()) { &lt;br /&gt;
            $value = $GLOBALS[&amp;#039;TSFE&amp;#039;]-&amp;gt;fe_user-&amp;gt;sesData[&amp;#039;powermail_&amp;#039;.$conf[&amp;#039;userFunc.&amp;#039;][&amp;#039;formuid&amp;#039;]][$conf[&amp;#039;userFunc.&amp;#039;][&amp;#039;field&amp;#039;]]; &lt;br /&gt;
            return $this-&amp;gt;getDate($value); &lt;br /&gt;
        } &lt;br /&gt;
         &lt;br /&gt;
         &lt;br /&gt;
        // Main getDate() changes a date in any format to an unix timestamp &lt;br /&gt;
        function getDate($string, $default = &amp;#039;now&amp;#039;, $timestamp = 1) { &lt;br /&gt;
            $error = 0; // no error at the beginning &lt;br /&gt;
            $string = str_replace(array(&amp;#039;-&amp;#039;, &amp;#039;_&amp;#039;, &amp;#039;:&amp;#039;, &amp;#039;+&amp;#039;, &amp;#039;,&amp;#039;, &amp;#039; &amp;#039;), &amp;#039;.&amp;#039;, $string); // change 23-12-2009 -&amp;gt; 23.12.2009 AND &amp;quot;05:00 23.01.2009&amp;quot; -&amp;gt; 05.00.23.01.2009 &lt;br /&gt;
            if (method_exists(&amp;#039;t3lib_div&amp;#039;, &amp;#039;trimExplode&amp;#039;)) $dateParts = t3lib_div::trimExplode(&amp;#039;.&amp;#039;, $string, 1); else $dateParts = explode(&amp;#039;.&amp;#039;, $string); // split at . &lt;br /&gt;
         &lt;br /&gt;
            if (count($dateParts) === 3) { // only if there are three parts like &amp;quot;23.12.2009&amp;quot; &lt;br /&gt;
                if (strlen($dateParts[0]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[1]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[2]) &amp;lt;= 2) { // xx.xx.xx &lt;br /&gt;
                    $string = strtotime($dateParts[2].&amp;#039;-&amp;#039;.$dateParts[1].&amp;#039;-&amp;#039;.$dateParts[0]); // change to timestamp &lt;br /&gt;
                } &lt;br /&gt;
                elseif (strlen($dateParts[0]) == 4 &amp;amp;&amp;amp; strlen($dateParts[1]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[2]) &amp;lt;= 2) { // xxxx.xx.xx &lt;br /&gt;
                    $string = strtotime($dateParts[0].&amp;#039;-&amp;#039;.$dateParts[1].&amp;#039;-&amp;#039;.$dateParts[2]); // change to timestamp &lt;br /&gt;
                } &lt;br /&gt;
                elseif (strlen($dateParts[0]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[1]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[2]) == 4) { // xx.xx.xxxx &lt;br /&gt;
                    $string = strtotime($dateParts[2].&amp;#039;-&amp;#039;.$dateParts[1].&amp;#039;-&amp;#039;.$dateParts[0]); // change to timestamp &lt;br /&gt;
                } &lt;br /&gt;
                else { // error &lt;br /&gt;
                    $error = 1; // error &lt;br /&gt;
                } &lt;br /&gt;
            } elseif (count($dateParts) === 5) { // only if there are five parts like &amp;quot;05.00.23.01.2009&amp;quot; &lt;br /&gt;
                $string = strtotime($dateParts[4].&amp;#039;-&amp;#039;.$dateParts[3].&amp;#039;-&amp;#039;.$dateParts[2].&amp;#039; &amp;#039;.$dateParts[0].&amp;#039;:&amp;#039;.$dateParts[1].&amp;#039;:00&amp;#039;); // change to timestamp &lt;br /&gt;
            } else { // more than 3 parts - so error &lt;br /&gt;
                $error = 1; // error &lt;br /&gt;
            } &lt;br /&gt;
            $string = date(&amp;#039;Y-m-d&amp;#039;, $string); // For default: change 1234567 -&amp;gt; 1.1.1979 &lt;br /&gt;
            if ($timestamp) $string = strtotime($string); // Change back 1.1.1979 -&amp;gt; 1234567 &lt;br /&gt;
            if ($error) $string = ($default == &amp;#039;now&amp;#039; ? time() : $default); // show default value &lt;br /&gt;
         &lt;br /&gt;
            return $string; &lt;br /&gt;
        } &lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dropdownfeld mit Werten aus der Datenbank ===&lt;br /&gt;
==== Beispiel 1 ====&lt;br /&gt;
Quelle: http://www.typo3.net/forum/thematik/zeige/thema/77259/?show=1 Zugriff: 2013-10&lt;br /&gt;
&lt;br /&gt;
1. Neues Powermail Feld anlegen (typoscript) im Feld Typoscript Objekt z.B. lib.objectname angeben&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Eine Selectabfrage in TS (Hole name, uid von tt_address der Seite 5):&lt;br /&gt;
&lt;br /&gt;
TS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lib.objectname {&lt;br /&gt;
  10 = TEXT&lt;br /&gt;
  10.value = &amp;lt;label for=&amp;quot;uid33&amp;quot;&amp;gt;Select:&amp;lt;/label&amp;gt;&lt;br /&gt;
  20 = CONTENT&lt;br /&gt;
  20.wrap = &amp;lt;select id=&amp;quot;uid33&amp;quot; name=&amp;quot;tx_powermail_pi1[uid33]&amp;quot; size=&amp;quot;1&amp;quot;&amp;gt;|&amp;lt;/select&amp;gt;&lt;br /&gt;
  20 {&lt;br /&gt;
    table = tt_address&lt;br /&gt;
    select {&lt;br /&gt;
      pidInList = 5&lt;br /&gt;
      orderBy = name&lt;br /&gt;
    }&lt;br /&gt;
    renderObj = COA&lt;br /&gt;
    renderObj {&lt;br /&gt;
      10 = COA&lt;br /&gt;
      10 {&lt;br /&gt;
        10 = TEXT&lt;br /&gt;
        10 {&lt;br /&gt;
          field = uid&lt;br /&gt;
          wrap = &amp;lt;option value=&amp;quot;|&amp;quot;&amp;gt;&lt;br /&gt;
        }&lt;br /&gt;
        20 = TEXT&lt;br /&gt;
        20 {&lt;br /&gt;
          field = name&lt;br /&gt;
          wrap = |&amp;lt;/option&amp;gt;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;br /&gt;
Dynamische Selecterbox, mit dem HTML Code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;label for=&amp;quot;uid33&amp;quot;&amp;gt;Select:&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;select id=&amp;quot;uid33&amp;quot; name=&amp;quot;tx_powermail_pi1[uid33]&amp;quot; size=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;23&amp;quot;&amp;gt;Name1&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;24&amp;quot;&amp;gt;Name2&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Datenspeicherung in m:n Tabellen ===&lt;br /&gt;
Quelle: http://typo3-blog.net/tutorials/news/powermail-tt-news-mn-tabelle.html 2013-10&lt;br /&gt;
&lt;br /&gt;
Powermail lässt sich nicht nur zum Versenden von Mails sondern auch zum Erstellen von Inhaltselementen nutzen. Dazu dient die TYPO3 Option dbEntry. Mit Hilfe dieser Option ist es sogar möglich MN-Tabellen zu befüllen, welches wenig bekannt ist. Anbei ein Beispiel, wie Eine tt_news Nachricht erzeugt und direkt in Kategorie Nr. 2 eingefügt werden kann:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.tx_powermail_pi1.upload.folder = uploads/pics/&lt;br /&gt;
plugin.tx_powermail_pi1.dbEntry.tt_news {&lt;br /&gt;
  # Neue Nachrichten müssen durch Admin genehmigt werden&lt;br /&gt;
  _enable = TEXT&lt;br /&gt;
  _enable.value = 0&lt;br /&gt;
  pid = TEXT&lt;br /&gt;
  pid.value = 2&lt;br /&gt;
  tstamp = TEXT&lt;br /&gt;
  tstamp.data = date:U&lt;br /&gt;
  crdate = TEXT&lt;br /&gt;
  crdate.data = date:U&lt;br /&gt;
  &lt;br /&gt;
  _mn = COA&lt;br /&gt;
  _mn.10 = COA&lt;br /&gt;
  # 1 muss Namen der mn Tabelle enthalten&lt;br /&gt;
  _mm.10.1 = TEXT&lt;br /&gt;
  _mm.10.1.value = tt_news_cat_mm&lt;br /&gt;
  # 2 ist der Name der Fremdtabelle, hier News Kategorie&lt;br /&gt;
  _mm.10.2 = TEXT&lt;br /&gt;
  _mm.10.2.value = tt_news_cat&lt;br /&gt;
  # 3 die Fremd uid, hier uid der Newskategorie&lt;br /&gt;
  _mm.10.3 = TEXT&lt;br /&gt;
  _mm.10.3.value = 2&lt;br /&gt;
  &lt;br /&gt;
  # 139 ist die uid des Contenelements, welches das Powermailformular darstellt&lt;br /&gt;
  # 15 ist die uid des einzelnen Feldes.&lt;br /&gt;
  title = TEXT&lt;br /&gt;
  title.data = TSFE:fe_user|sesData|powermail_139|uid15&lt;br /&gt;
  author_email = TEXT&lt;br /&gt;
  author_email.data = TSFE:fe_user|sesData|powermail_139|uid21&lt;br /&gt;
  author = TEXT&lt;br /&gt;
  author.data = TSFE:fe_user|sesData|powermail_139|uid739&lt;br /&gt;
  # short = TEXT&lt;br /&gt;
  # short.data = TSFE:fe_user|sesData|powermail_139|uid742&lt;br /&gt;
  bodytext = TEXT&lt;br /&gt;
  bodytext.data = TSFE:fe_user|sesData|powermail_139|uid19&lt;br /&gt;
  datetime = TEXT&lt;br /&gt;
  datetime.data = TSFE:fe_user|sesData|powermail_139|uid17&lt;br /&gt;
  keywords = TEXT&lt;br /&gt;
  keywords.data = TSFE:fe_user|sesData|powermail_139|uid41&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Felder vorausfüllen ===&lt;br /&gt;
Quelle: http://typo3blogger.de/powermail-trickkiste-teil-2-%E2%80%93-felder-vorbelegen/ &lt;br /&gt;
==== Über GET Parameter ====&lt;br /&gt;
Dropdown&lt;br /&gt;
 http://www.einpraegsam.net/kontakt.html?tx_powermail_pi1[uid24]=TYPO3%20Extension%20powermail&lt;br /&gt;
Input&lt;br /&gt;
 index.php?id=1&amp;amp;tx_powermail_pi1[uid12]=Hallo&lt;br /&gt;
&lt;br /&gt;
Checkbox&lt;br /&gt;
 index.php?id=1&amp;amp;tx_powermail_pi1[uid13][0]=1&lt;br /&gt;
&lt;br /&gt;
==== Über TypoScript ====&lt;br /&gt;
Vorfüllen mit TypoScript:&lt;br /&gt;
Durch eine Vorbelegung mit TypoScript gibt es kaum noch Grenzen. Statische Werte, GET und POST Parameter und userFuncs können verwendet werden. Nachfolgend ein paar Beispiele.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.tx_powermail_pi1 {&lt;br /&gt;
  prefill {&lt;br /&gt;
    # Fülle Feld 1 mit statischem Wert&lt;br /&gt;
    uid1 = TEXT&lt;br /&gt;
    uid1.value = blabla&lt;br /&gt;
 &lt;br /&gt;
    # Fülle Feld 2 mit aktuellem timestamp&lt;br /&gt;
    uid2 = TEXT&lt;br /&gt;
    uid2.data = date:U&lt;br /&gt;
 &lt;br /&gt;
    # Feld 3 mit Datum&lt;br /&gt;
    uid3 = TEXT&lt;br /&gt;
    uid3.data = date:U&lt;br /&gt;
    uid3.strftime = Datum: %d.%m.%Y&lt;br /&gt;
 &lt;br /&gt;
    # Feld 4 mit IP Adresse&lt;br /&gt;
    uid4 = TEXT&lt;br /&gt;
    uid4.data = getIndpEnv:REMOTE_ADDR&lt;br /&gt;
 &lt;br /&gt;
    # Feld 5 und 6 mit Wert aus aktueller URL&lt;br /&gt;
    # index.php?id=123&amp;amp;wert=Ort&lt;br /&gt;
    uid5 = TEXT&lt;br /&gt;
    uid5.data = GP:wert&lt;br /&gt;
    uid5.htmlSpecialChars = 1&lt;br /&gt;
 &lt;br /&gt;
    # index.php?id=123&amp;amp;tx_ttnews[tt_news]=95&lt;br /&gt;
    uid5 = TEXT&lt;br /&gt;
    uid5.data = GP:tx_ttnews|tt_news&lt;br /&gt;
    uid5.wrap = Wir befinden uns auf der Newsdetailseite mit der UID|&lt;br /&gt;
    uid5.intval = 1&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis:&lt;br /&gt;
1. Im Beispiel 4 und 5 werden Benutzerdefinierte Werte (GET oder POST) verwendet. Hier ist ein Absichern gegen XSS unabdingbar. Mit intval oder htmlSpecialChars lassen sich Werte innerhalb von TypoScript leicht absichern.&lt;br /&gt;
2. Falls ein Wert eines Feldes in der Session liegt, hat dieser Vorrang.&lt;br /&gt;
3. Ein Selectfeld wird automatisch vorselektiert wenn der vorgegebene Wert auch zur Auswahl steht&lt;br /&gt;
&lt;br /&gt;
=== User basierter Upload Ordner ===&lt;br /&gt;
ich möchte die in einem Upload-Formular übermittelten Dateien in ein bestimmtes Verzeichnis (fileadmin/user_upload/verzeichnis/) schieben. Das funktioniert auch mit folgender Konstanten:&lt;br /&gt;
&lt;br /&gt;
 plugin.powermail.upload.folder = /fileadmin/user_upload/vkb-uploads/&lt;br /&gt;
&lt;br /&gt;
Die Dateien landen im richtigen Ordner. Allerdings wird in der Powermail-Ansicht im Backend, dieser Pfad nicht übernommen. Ich lasse mir also die eingegangenen Powermails anzeigen und hier ist ja dann die übertragene Datei entsprechend verlinkt, aber eben nicht mit dem von mir vorgegebenem Pfad sondern mit dem Standard-Ordner (uploads/tx_powermail/files/Dateiname.abc).&lt;br /&gt;
&lt;br /&gt;
Lösung anscheinend selbst gefunden.&lt;br /&gt;
&lt;br /&gt;
Ich habe alle möglichen Dateien durchsuchen lassen, in denen der Pfad &amp;#039;uploads/tx_powermail/files/&amp;#039; gesetzt ist und die Datei pageTSconfig.txt gefunden.&lt;br /&gt;
&lt;br /&gt;
Hieraus konnte ich schlussfolgern, dass der folgende Schnipsel im TSConfig des Sysordners in dem die Mails auflaufen hinterlegt sein muss um mein Problem zu beheben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tx_powermail_mod1.config {&lt;br /&gt;
    list {&lt;br /&gt;
        uploadFolder = mein/pfad/zu/den/dateianhängen/&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Powermail&amp;diff=22632</id>
		<title>TYPO3 - Powermail</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Powermail&amp;diff=22632"/>
		<updated>2017-11-22T17:12:17Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* E-Mail Empfänger abhängig von Feldwerten (powermail &amp;gt; 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Powermail Extension&lt;br /&gt;
== Snippets für 2.x ==&lt;br /&gt;
=== Dynamische Anrede ===&lt;br /&gt;
&lt;br /&gt;
Mit folgendem TypoScript lässt sich in Powermail 2.x eine dynamische Anrede des Benutzers in E-Mails und Bestätigungsseite bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
TypoScript:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typoscript&amp;quot;&amp;gt;&lt;br /&gt;
lib.anrede = CASE&lt;br /&gt;
lib.anrede {&lt;br /&gt;
  key.field = 0&lt;br /&gt;
 &lt;br /&gt;
  default = TEXT&lt;br /&gt;
  default.value = Sehr geehrte Damen und Herren,&lt;br /&gt;
 &lt;br /&gt;
  Herr = TEXT&lt;br /&gt;
  # Die &amp;quot;7&amp;quot; ist die ID des Powermail-Felds {name}&lt;br /&gt;
  Herr.data = GP:tx_powermail_pi1|field|7&lt;br /&gt;
  Herr.noTrimWrap = |Sehr geehrter Herr |,|&lt;br /&gt;
 &lt;br /&gt;
  Frau = TEXT&lt;br /&gt;
  Frau.data = GP:tx_powermail_pi1|field|7&lt;br /&gt;
  Frau.noTrimWrap = |Sehr geehrte Frau |, |&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  # Englische Übersetzung:&lt;br /&gt;
  Mr = TEXT&lt;br /&gt;
  Mr.data = GP:tx_powermail_pi1|field|7&lt;br /&gt;
  Mr.noTrimWrap = |Dear Mr |, |&lt;br /&gt;
 &lt;br /&gt;
  Mrs = TEXT&lt;br /&gt;
  Mrs.data = GP:tx_powermail_pi1|field|7&lt;br /&gt;
  Mrs.noTrimWrap = |Dear Mrs |, |&lt;br /&gt;
 &lt;br /&gt;
  Ms = TEXT&lt;br /&gt;
  Ms.data = GP:tx_powermail_pi1|field|7&lt;br /&gt;
  Ms.noTrimWrap = |Dear Ms |, |&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ViewHelper für Powermail-Plugin:&lt;br /&gt;
&lt;br /&gt;
 {f:cObject(typoscriptObjectPath:&amp;#039;lib.anrede&amp;#039;,data:&amp;#039;{anrede}&amp;#039;)}&lt;br /&gt;
Quelle: typo3.net - Forum&lt;br /&gt;
&lt;br /&gt;
Ab Powermail 2.1.x werden Powermail-Felder nicht mehr über die UID, sondern den Markernamen angesprochen. Dementsprechend müssen die Zeilen im TypoScript etwas angepasst werden:&lt;br /&gt;
&lt;br /&gt;
 # Powermail-Feld {name}&lt;br /&gt;
 Herr.data = GP:tx_powermail_pi1|field|name&lt;br /&gt;
== Letzte Version für TYPO3 4.5 ==&lt;br /&gt;
== Powermail Conditions ==&lt;br /&gt;
&lt;br /&gt;
== Snippets ==&lt;br /&gt;
&lt;br /&gt;
=== E-Mail Empfänger abhängig von Feldwerten ===&lt;br /&gt;
==== Quellen ====&lt;br /&gt;
http://blog.marmalade.de/2010/06/powermail-e-mailempfanger-mit-case-unterscheidung-uber-typoscript-zuweisen/ (3/2012)&lt;br /&gt;
&lt;br /&gt;
http://typo3blogger.de/powermail-empfanger-im-frontend-wahlen/ (3/2012)&lt;br /&gt;
Verschiedene Möglichkeiten:&lt;br /&gt;
* Direkt (schlecht)&lt;br /&gt;
* Über dynamisches TypoScript&lt;br /&gt;
* Angepasste Datenbankabfrage&lt;br /&gt;
&lt;br /&gt;
==== Direkt ====&lt;br /&gt;
Im Empfänger Feld kann man direkt einen Feldmarker angeben z.B.: ###UID234###, dann wird direkt der Wert des Feldes benutzt. Schlecht, weil einfach zu manipulieren (potentielle Spamschleuder)&lt;br /&gt;
&lt;br /&gt;
==== E-Mail über dynamisches TypoScript ====&lt;br /&gt;
TS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Case Objekt das den Wert eines Powermail Feldes auswertet. &lt;br /&gt;
emailan = CASE&lt;br /&gt;
emailan {&lt;br /&gt;
    ### Unterschiedung anhand Feld mit der UID 34 (Form hat id 25)&lt;br /&gt;
    key.data = TSFE:fe_user|sesData|powermail_25|uid34&lt;br /&gt;
    ### Standardwert&lt;br /&gt;
    default = TEXT&lt;br /&gt;
    default.value = info@indihar.de&lt;br /&gt;
    ### Wert bei Auswahl &amp;quot;empf2&amp;quot;&lt;br /&gt;
    empf2 = TEXT&lt;br /&gt;
    empf2.value = schlegel@geo-bit.de&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// neuen dynamischen Powermailmarker (###POWERMAIL_TYPOSCRIPT_EMPFAENGER###)&lt;br /&gt;
// dieser kann im Formular im Empfängerfeld eingetragen werden.&lt;br /&gt;
plugin.tx_powermail_pi1.dynamicTyposcript {&lt;br /&gt;
    empfaenger &amp;lt; emailan&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Angepasste Datenbankabfrage ====&lt;br /&gt;
http://typo3blogger.de/powermail-empfanger-im-frontend-wahlen/&lt;br /&gt;
&lt;br /&gt;
http://www.typo3.net/forum/list/list_post//76461/?howto=1&amp;amp;page=1&lt;br /&gt;
&lt;br /&gt;
http://typo3.org/documentation/document-library/extension-manuals/powermail/1.4.15/view/1/11/#id4334579&lt;br /&gt;
&lt;br /&gt;
Die Extension Powermail bietet eine komfortable Möglichkeit Formulare zusammenzuklicken – übrigens auch für Redakteure. Selbstverständlich ist Skalierbarkeit und Flexibilität ein großes Thema.&lt;br /&gt;
So ist es auch einfach möglich, den Empfänger im Frontend auszuwählen.&lt;br /&gt;
&lt;br /&gt;
Im Netz gibt es schon ein paar Erklärungen zu diesem Thema, aber ich möchte es dennoch noch einmal aufgreifen, da ich oft auf Empfängerwahl angesprochen werde.&lt;br /&gt;
&lt;br /&gt;
Mail-Adressen direkt in der Select Box&lt;br /&gt;
Technisch wäre es natürlich kein Problem eine Selectbox mit E-Mail Adressen im Frontend anzeigen zu lassen und im Flexform im Empfängerfeld dieses Feld durch einen Marker wieder aufzugreifen (z.B. ###UID234###).&lt;br /&gt;
Der Nachteil liegt aber auf der Hand:&lt;br /&gt;
- Mail Adressen können im Frontend aus dem Quelltext ausgelesen werden&lt;br /&gt;
- Mail Adressen können einfach manipuliert werden (im schlimmsten Fall stellt ihr so eine Spamschleuder ins Netz)&lt;br /&gt;
Diese Methode ist also allenfalls im Intranet nutzbar.&lt;br /&gt;
&lt;br /&gt;
Umweg über Datenbank-UID&lt;br /&gt;
Eine andere Idee ist es, Datankbankeinträge (z.B. tt_address oder fe_user) mit E-Mail Adressen vorzunehmen und in einer (z.B.) Selectbox die UID des Datensatzes wieder aufzugreifen.&lt;br /&gt;
Beispiel Eintrag im Flexform&lt;br /&gt;
In diesem Beispiel hat man die Wahl zwischen UID 1 und 2. Verwendeter Marker ist ###UID42###.&lt;br /&gt;
SQL Query Beispiel&lt;br /&gt;
Damit Powermail den Umweg über die Datenbank geht, bietet sich der Einsatz des Feldes “Alternative SQL-Query” an.&lt;br /&gt;
&lt;br /&gt;
Weitere Infos&lt;br /&gt;
Natürlich kann man auch an ganze Usergroups schicken:&lt;br /&gt;
&lt;br /&gt;
SELECT email FROM fe_users WHERE find_in_set(###UID43###,usergroup) &amp;gt; 0&lt;br /&gt;
AND hidden = 0 AND deleted = 0&lt;br /&gt;
&lt;br /&gt;
Beispiel mit fester Usergroup UID44:&lt;br /&gt;
&lt;br /&gt;
SELECT email FROM fe_users WHERE find_in_set(44,usergroup) &amp;gt; 0&lt;br /&gt;
AND hidden = 0 AND deleted = 0&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel mit Checkboxen (mehrere Empfänger auswählen):&lt;br /&gt;
&lt;br /&gt;
SELECT email FROM fe_users WHERE uid IN(###UID43###)&lt;br /&gt;
&lt;br /&gt;
Eine ganz andere Möglichkeit ist der Einsatz von Dynamictyposcript im Empfängerfeld – auch hier lassen sich einige Anforderungen flexibel umsetzen. Dynamictyposcript in Powermail&lt;br /&gt;
&lt;br /&gt;
=== Formular in Datenbank speichern ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.tx_powermail_pi1{&lt;br /&gt;
    dbEntry {&lt;br /&gt;
&lt;br /&gt;
        # Speicherung für Tabelle ermöglichen&lt;br /&gt;
        tt_address._enable = TEXT&lt;br /&gt;
        tt_address._enable.value = 1&lt;br /&gt;
&lt;br /&gt;
        #  &amp;quot;tt_address.name&amp;quot; mit dem Wert des Powermail felds ausfüllen&lt;br /&gt;
        tt_content uid 88, field uid18 (###uid18###)&lt;br /&gt;
        tt_address.name = TEXT&lt;br /&gt;
        tt_address.name.data = TSFE:fe_user|sesData|powermail_88|uid18&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausführliches Beispiel ===&lt;br /&gt;
&lt;br /&gt;
Constants&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.powermail.js.alwaysInclude = 1&lt;br /&gt;
plugin.powermail.js.includeJquery = 0&lt;br /&gt;
plugin.powermail.js.includeJqueryTools = 0&lt;br /&gt;
plugin.powermail.js.includeJqueryToolsTabs = 0&lt;br /&gt;
plugin.powermail.allow.email2sender = 0&lt;br /&gt;
plugin.powermail.PID.dblog = 0&lt;br /&gt;
plugin.powermail.markerALL.hideLabel = 1&lt;br /&gt;
plugin.powermail.format.datetime = %d.%m.%Y% %H:%M&lt;br /&gt;
plugin.powermail.format.date = %d.%m.%Y&lt;br /&gt;
plugin.powermail.debug.output = &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Setup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// CSS Pfad ändern (oder gar nicht erst statisch einbinden ;-)  )&lt;br /&gt;
page.includeCSS.powermail_frontend_basic = fileadmin/templates/onlineboerse/powermail.css&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Datenbank Speicherung mit verschiedenen Optionen ====&lt;br /&gt;
Setup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Powermail DB Storage&lt;br /&gt;
// Extra userfunc to convert date to unix timestamp&lt;br /&gt;
includeLibs.powermailTimestamp = fileadmin/templates/scripts/user_powermailTimestamp.php&lt;br /&gt;
&lt;br /&gt;
plugin.tx_powermail_pi1.dbEntry{  &lt;br /&gt;
  tx_gbbulletin_bulletin {&lt;br /&gt;
&lt;br /&gt;
    _enable = TEXT&lt;br /&gt;
    _enable.value = 1&lt;br /&gt;
     &lt;br /&gt;
    hidden = TEXT&lt;br /&gt;
    hidden.value = 1&lt;br /&gt;
     &lt;br /&gt;
    pid = TEXT&lt;br /&gt;
    pid.value = 102&lt;br /&gt;
        &lt;br /&gt;
    tstamp = TEXT&lt;br /&gt;
    tstamp.data = date:U&lt;br /&gt;
         &lt;br /&gt;
    crdate = TEXT&lt;br /&gt;
    crdate.data = date:U&lt;br /&gt;
&lt;br /&gt;
    title = TEXT&lt;br /&gt;
    title.data = TSFE:fe_user|sesData|powermail_214|uid1&lt;br /&gt;
&lt;br /&gt;
    author = TEXT&lt;br /&gt;
    author.data = TSFE:fe_user|sesData|powermail_214|uid2&lt;br /&gt;
&lt;br /&gt;
    place = TEXT&lt;br /&gt;
    place.data = TSFE:fe_user|sesData|powermail_214|uid3&lt;br /&gt;
    &lt;br /&gt;
    description = TEXT&lt;br /&gt;
    description.data = TSFE:fe_user|sesData|powermail_214|uid4&lt;br /&gt;
&lt;br /&gt;
    contact = TEXT&lt;br /&gt;
    contact.data = TSFE:fe_user|sesData|powermail_214|uid5&lt;br /&gt;
&lt;br /&gt;
    qualification = TEXT&lt;br /&gt;
    qualification.data = TSFE:fe_user|sesData|powermail_214|uid6&lt;br /&gt;
    &lt;br /&gt;
    date = USER&lt;br /&gt;
    date.userFunc = user_powermailTimestamp-&amp;gt;preflight&lt;br /&gt;
    date.userFunc.field = uid7&lt;br /&gt;
    date.userFunc.formuid = 214&lt;br /&gt;
    &lt;br /&gt;
    period = TEXT&lt;br /&gt;
    period.data = TSFE:fe_user|sesData|powermail_214|uid29&lt;br /&gt;
&lt;br /&gt;
    end_date = USER&lt;br /&gt;
    end_date.userFunc = user_powermailTimestamp-&amp;gt;preflight&lt;br /&gt;
    end_date.userFunc.field = uid14&lt;br /&gt;
    end_date.userFunc.formuid = 214&lt;br /&gt;
    &lt;br /&gt;
    url = TEXT&lt;br /&gt;
    url.data = TSFE:fe_user|sesData|powermail_214|uid8&lt;br /&gt;
&lt;br /&gt;
    text1 = TEXT&lt;br /&gt;
    text1.data = TSFE:fe_user|sesData|powermail_214|uid9&lt;br /&gt;
    &lt;br /&gt;
    cluster = TEXT&lt;br /&gt;
    cluster.data = TSFE:fe_user|sesData|powermail_214|uid11&lt;br /&gt;
    &lt;br /&gt;
    # add mm relation to uid 2 of tx_gbbulletin_cluster (via mm table)&lt;br /&gt;
    _mm = COA&lt;br /&gt;
    _mm.10 = COA&lt;br /&gt;
    # 1 is always the mm table&lt;br /&gt;
    _mm.10.1 = TEXT&lt;br /&gt;
    _mm.10.1.value = tx_gbbulletin_cluster_mm&lt;br /&gt;
    # 2 is always the other table&lt;br /&gt;
    _mm.10.2 = TEXT&lt;br /&gt;
    _mm.10.2.value = tx_gbbulletin_cluster&lt;br /&gt;
    # 3 is always the uid of the other table to get a relation to this&lt;br /&gt;
    # (in this case uid1 of tx_gbbulletin_cluster)&lt;br /&gt;
    _mm.10.3 = TEXT&lt;br /&gt;
    _mm.10.3.value = 1&lt;br /&gt;
    &lt;br /&gt;
    tag = TEXT&lt;br /&gt;
    tag.data = TSFE:fe_user|sesData|powermail_214|uid12&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Userfunktion zum umwandeln von Datum in Timestamp ===&lt;br /&gt;
Diese Funktion wird im obigen Beispiel zu Datenbankspeicherung verwendet&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
&lt;br /&gt;
    class user_powermailTimestamp { &lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
        // Function preflight() will be used from typoscript &lt;br /&gt;
        function preflight($content=&amp;#039;&amp;#039;, $conf=array()) { &lt;br /&gt;
            $value = $GLOBALS[&amp;#039;TSFE&amp;#039;]-&amp;gt;fe_user-&amp;gt;sesData[&amp;#039;powermail_&amp;#039;.$conf[&amp;#039;userFunc.&amp;#039;][&amp;#039;formuid&amp;#039;]][$conf[&amp;#039;userFunc.&amp;#039;][&amp;#039;field&amp;#039;]]; &lt;br /&gt;
            return $this-&amp;gt;getDate($value); &lt;br /&gt;
        } &lt;br /&gt;
         &lt;br /&gt;
         &lt;br /&gt;
        // Main getDate() changes a date in any format to an unix timestamp &lt;br /&gt;
        function getDate($string, $default = &amp;#039;now&amp;#039;, $timestamp = 1) { &lt;br /&gt;
            $error = 0; // no error at the beginning &lt;br /&gt;
            $string = str_replace(array(&amp;#039;-&amp;#039;, &amp;#039;_&amp;#039;, &amp;#039;:&amp;#039;, &amp;#039;+&amp;#039;, &amp;#039;,&amp;#039;, &amp;#039; &amp;#039;), &amp;#039;.&amp;#039;, $string); // change 23-12-2009 -&amp;gt; 23.12.2009 AND &amp;quot;05:00 23.01.2009&amp;quot; -&amp;gt; 05.00.23.01.2009 &lt;br /&gt;
            if (method_exists(&amp;#039;t3lib_div&amp;#039;, &amp;#039;trimExplode&amp;#039;)) $dateParts = t3lib_div::trimExplode(&amp;#039;.&amp;#039;, $string, 1); else $dateParts = explode(&amp;#039;.&amp;#039;, $string); // split at . &lt;br /&gt;
         &lt;br /&gt;
            if (count($dateParts) === 3) { // only if there are three parts like &amp;quot;23.12.2009&amp;quot; &lt;br /&gt;
                if (strlen($dateParts[0]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[1]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[2]) &amp;lt;= 2) { // xx.xx.xx &lt;br /&gt;
                    $string = strtotime($dateParts[2].&amp;#039;-&amp;#039;.$dateParts[1].&amp;#039;-&amp;#039;.$dateParts[0]); // change to timestamp &lt;br /&gt;
                } &lt;br /&gt;
                elseif (strlen($dateParts[0]) == 4 &amp;amp;&amp;amp; strlen($dateParts[1]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[2]) &amp;lt;= 2) { // xxxx.xx.xx &lt;br /&gt;
                    $string = strtotime($dateParts[0].&amp;#039;-&amp;#039;.$dateParts[1].&amp;#039;-&amp;#039;.$dateParts[2]); // change to timestamp &lt;br /&gt;
                } &lt;br /&gt;
                elseif (strlen($dateParts[0]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[1]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[2]) == 4) { // xx.xx.xxxx &lt;br /&gt;
                    $string = strtotime($dateParts[2].&amp;#039;-&amp;#039;.$dateParts[1].&amp;#039;-&amp;#039;.$dateParts[0]); // change to timestamp &lt;br /&gt;
                } &lt;br /&gt;
                else { // error &lt;br /&gt;
                    $error = 1; // error &lt;br /&gt;
                } &lt;br /&gt;
            } elseif (count($dateParts) === 5) { // only if there are five parts like &amp;quot;05.00.23.01.2009&amp;quot; &lt;br /&gt;
                $string = strtotime($dateParts[4].&amp;#039;-&amp;#039;.$dateParts[3].&amp;#039;-&amp;#039;.$dateParts[2].&amp;#039; &amp;#039;.$dateParts[0].&amp;#039;:&amp;#039;.$dateParts[1].&amp;#039;:00&amp;#039;); // change to timestamp &lt;br /&gt;
            } else { // more than 3 parts - so error &lt;br /&gt;
                $error = 1; // error &lt;br /&gt;
            } &lt;br /&gt;
            $string = date(&amp;#039;Y-m-d&amp;#039;, $string); // For default: change 1234567 -&amp;gt; 1.1.1979 &lt;br /&gt;
            if ($timestamp) $string = strtotime($string); // Change back 1.1.1979 -&amp;gt; 1234567 &lt;br /&gt;
            if ($error) $string = ($default == &amp;#039;now&amp;#039; ? time() : $default); // show default value &lt;br /&gt;
         &lt;br /&gt;
            return $string; &lt;br /&gt;
        } &lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dropdownfeld mit Werten aus der Datenbank ===&lt;br /&gt;
==== Beispiel 1 ====&lt;br /&gt;
Quelle: http://www.typo3.net/forum/thematik/zeige/thema/77259/?show=1 Zugriff: 2013-10&lt;br /&gt;
&lt;br /&gt;
1. Neues Powermail Feld anlegen (typoscript) im Feld Typoscript Objekt z.B. lib.objectname angeben&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Eine Selectabfrage in TS (Hole name, uid von tt_address der Seite 5):&lt;br /&gt;
&lt;br /&gt;
TS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lib.objectname {&lt;br /&gt;
  10 = TEXT&lt;br /&gt;
  10.value = &amp;lt;label for=&amp;quot;uid33&amp;quot;&amp;gt;Select:&amp;lt;/label&amp;gt;&lt;br /&gt;
  20 = CONTENT&lt;br /&gt;
  20.wrap = &amp;lt;select id=&amp;quot;uid33&amp;quot; name=&amp;quot;tx_powermail_pi1[uid33]&amp;quot; size=&amp;quot;1&amp;quot;&amp;gt;|&amp;lt;/select&amp;gt;&lt;br /&gt;
  20 {&lt;br /&gt;
    table = tt_address&lt;br /&gt;
    select {&lt;br /&gt;
      pidInList = 5&lt;br /&gt;
      orderBy = name&lt;br /&gt;
    }&lt;br /&gt;
    renderObj = COA&lt;br /&gt;
    renderObj {&lt;br /&gt;
      10 = COA&lt;br /&gt;
      10 {&lt;br /&gt;
        10 = TEXT&lt;br /&gt;
        10 {&lt;br /&gt;
          field = uid&lt;br /&gt;
          wrap = &amp;lt;option value=&amp;quot;|&amp;quot;&amp;gt;&lt;br /&gt;
        }&lt;br /&gt;
        20 = TEXT&lt;br /&gt;
        20 {&lt;br /&gt;
          field = name&lt;br /&gt;
          wrap = |&amp;lt;/option&amp;gt;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;br /&gt;
Dynamische Selecterbox, mit dem HTML Code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;label for=&amp;quot;uid33&amp;quot;&amp;gt;Select:&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;select id=&amp;quot;uid33&amp;quot; name=&amp;quot;tx_powermail_pi1[uid33]&amp;quot; size=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;23&amp;quot;&amp;gt;Name1&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;24&amp;quot;&amp;gt;Name2&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Datenspeicherung in m:n Tabellen ===&lt;br /&gt;
Quelle: http://typo3-blog.net/tutorials/news/powermail-tt-news-mn-tabelle.html 2013-10&lt;br /&gt;
&lt;br /&gt;
Powermail lässt sich nicht nur zum Versenden von Mails sondern auch zum Erstellen von Inhaltselementen nutzen. Dazu dient die TYPO3 Option dbEntry. Mit Hilfe dieser Option ist es sogar möglich MN-Tabellen zu befüllen, welches wenig bekannt ist. Anbei ein Beispiel, wie Eine tt_news Nachricht erzeugt und direkt in Kategorie Nr. 2 eingefügt werden kann:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.tx_powermail_pi1.upload.folder = uploads/pics/&lt;br /&gt;
plugin.tx_powermail_pi1.dbEntry.tt_news {&lt;br /&gt;
  # Neue Nachrichten müssen durch Admin genehmigt werden&lt;br /&gt;
  _enable = TEXT&lt;br /&gt;
  _enable.value = 0&lt;br /&gt;
  pid = TEXT&lt;br /&gt;
  pid.value = 2&lt;br /&gt;
  tstamp = TEXT&lt;br /&gt;
  tstamp.data = date:U&lt;br /&gt;
  crdate = TEXT&lt;br /&gt;
  crdate.data = date:U&lt;br /&gt;
  &lt;br /&gt;
  _mn = COA&lt;br /&gt;
  _mn.10 = COA&lt;br /&gt;
  # 1 muss Namen der mn Tabelle enthalten&lt;br /&gt;
  _mm.10.1 = TEXT&lt;br /&gt;
  _mm.10.1.value = tt_news_cat_mm&lt;br /&gt;
  # 2 ist der Name der Fremdtabelle, hier News Kategorie&lt;br /&gt;
  _mm.10.2 = TEXT&lt;br /&gt;
  _mm.10.2.value = tt_news_cat&lt;br /&gt;
  # 3 die Fremd uid, hier uid der Newskategorie&lt;br /&gt;
  _mm.10.3 = TEXT&lt;br /&gt;
  _mm.10.3.value = 2&lt;br /&gt;
  &lt;br /&gt;
  # 139 ist die uid des Contenelements, welches das Powermailformular darstellt&lt;br /&gt;
  # 15 ist die uid des einzelnen Feldes.&lt;br /&gt;
  title = TEXT&lt;br /&gt;
  title.data = TSFE:fe_user|sesData|powermail_139|uid15&lt;br /&gt;
  author_email = TEXT&lt;br /&gt;
  author_email.data = TSFE:fe_user|sesData|powermail_139|uid21&lt;br /&gt;
  author = TEXT&lt;br /&gt;
  author.data = TSFE:fe_user|sesData|powermail_139|uid739&lt;br /&gt;
  # short = TEXT&lt;br /&gt;
  # short.data = TSFE:fe_user|sesData|powermail_139|uid742&lt;br /&gt;
  bodytext = TEXT&lt;br /&gt;
  bodytext.data = TSFE:fe_user|sesData|powermail_139|uid19&lt;br /&gt;
  datetime = TEXT&lt;br /&gt;
  datetime.data = TSFE:fe_user|sesData|powermail_139|uid17&lt;br /&gt;
  keywords = TEXT&lt;br /&gt;
  keywords.data = TSFE:fe_user|sesData|powermail_139|uid41&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Felder vorausfüllen ===&lt;br /&gt;
Quelle: http://typo3blogger.de/powermail-trickkiste-teil-2-%E2%80%93-felder-vorbelegen/ &lt;br /&gt;
==== Über GET Parameter ====&lt;br /&gt;
Dropdown&lt;br /&gt;
 http://www.einpraegsam.net/kontakt.html?tx_powermail_pi1[uid24]=TYPO3%20Extension%20powermail&lt;br /&gt;
Input&lt;br /&gt;
 index.php?id=1&amp;amp;tx_powermail_pi1[uid12]=Hallo&lt;br /&gt;
&lt;br /&gt;
Checkbox&lt;br /&gt;
 index.php?id=1&amp;amp;tx_powermail_pi1[uid13][0]=1&lt;br /&gt;
&lt;br /&gt;
==== Über TypoScript ====&lt;br /&gt;
Vorfüllen mit TypoScript:&lt;br /&gt;
Durch eine Vorbelegung mit TypoScript gibt es kaum noch Grenzen. Statische Werte, GET und POST Parameter und userFuncs können verwendet werden. Nachfolgend ein paar Beispiele.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.tx_powermail_pi1 {&lt;br /&gt;
  prefill {&lt;br /&gt;
    # Fülle Feld 1 mit statischem Wert&lt;br /&gt;
    uid1 = TEXT&lt;br /&gt;
    uid1.value = blabla&lt;br /&gt;
 &lt;br /&gt;
    # Fülle Feld 2 mit aktuellem timestamp&lt;br /&gt;
    uid2 = TEXT&lt;br /&gt;
    uid2.data = date:U&lt;br /&gt;
 &lt;br /&gt;
    # Feld 3 mit Datum&lt;br /&gt;
    uid3 = TEXT&lt;br /&gt;
    uid3.data = date:U&lt;br /&gt;
    uid3.strftime = Datum: %d.%m.%Y&lt;br /&gt;
 &lt;br /&gt;
    # Feld 4 mit IP Adresse&lt;br /&gt;
    uid4 = TEXT&lt;br /&gt;
    uid4.data = getIndpEnv:REMOTE_ADDR&lt;br /&gt;
 &lt;br /&gt;
    # Feld 5 und 6 mit Wert aus aktueller URL&lt;br /&gt;
    # index.php?id=123&amp;amp;wert=Ort&lt;br /&gt;
    uid5 = TEXT&lt;br /&gt;
    uid5.data = GP:wert&lt;br /&gt;
    uid5.htmlSpecialChars = 1&lt;br /&gt;
 &lt;br /&gt;
    # index.php?id=123&amp;amp;tx_ttnews[tt_news]=95&lt;br /&gt;
    uid5 = TEXT&lt;br /&gt;
    uid5.data = GP:tx_ttnews|tt_news&lt;br /&gt;
    uid5.wrap = Wir befinden uns auf der Newsdetailseite mit der UID|&lt;br /&gt;
    uid5.intval = 1&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis:&lt;br /&gt;
1. Im Beispiel 4 und 5 werden Benutzerdefinierte Werte (GET oder POST) verwendet. Hier ist ein Absichern gegen XSS unabdingbar. Mit intval oder htmlSpecialChars lassen sich Werte innerhalb von TypoScript leicht absichern.&lt;br /&gt;
2. Falls ein Wert eines Feldes in der Session liegt, hat dieser Vorrang.&lt;br /&gt;
3. Ein Selectfeld wird automatisch vorselektiert wenn der vorgegebene Wert auch zur Auswahl steht&lt;br /&gt;
&lt;br /&gt;
=== User basierter Upload Ordner ===&lt;br /&gt;
ich möchte die in einem Upload-Formular übermittelten Dateien in ein bestimmtes Verzeichnis (fileadmin/user_upload/verzeichnis/) schieben. Das funktioniert auch mit folgender Konstanten:&lt;br /&gt;
&lt;br /&gt;
 plugin.powermail.upload.folder = /fileadmin/user_upload/vkb-uploads/&lt;br /&gt;
&lt;br /&gt;
Die Dateien landen im richtigen Ordner. Allerdings wird in der Powermail-Ansicht im Backend, dieser Pfad nicht übernommen. Ich lasse mir also die eingegangenen Powermails anzeigen und hier ist ja dann die übertragene Datei entsprechend verlinkt, aber eben nicht mit dem von mir vorgegebenem Pfad sondern mit dem Standard-Ordner (uploads/tx_powermail/files/Dateiname.abc).&lt;br /&gt;
&lt;br /&gt;
Lösung anscheinend selbst gefunden.&lt;br /&gt;
&lt;br /&gt;
Ich habe alle möglichen Dateien durchsuchen lassen, in denen der Pfad &amp;#039;uploads/tx_powermail/files/&amp;#039; gesetzt ist und die Datei pageTSconfig.txt gefunden.&lt;br /&gt;
&lt;br /&gt;
Hieraus konnte ich schlussfolgern, dass der folgende Schnipsel im TSConfig des Sysordners in dem die Mails auflaufen hinterlegt sein muss um mein Problem zu beheben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tx_powermail_mod1.config {&lt;br /&gt;
    list {&lt;br /&gt;
        uploadFolder = mein/pfad/zu/den/dateianhängen/&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Powermail&amp;diff=22631</id>
		<title>TYPO3 - Powermail</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Powermail&amp;diff=22631"/>
		<updated>2017-11-22T17:11:45Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Powermail Extension&lt;br /&gt;
== Snippets für 2.x ==&lt;br /&gt;
=== Dynamische Anrede ===&lt;br /&gt;
&lt;br /&gt;
Mit folgendem TypoScript lässt sich in Powermail 2.x eine dynamische Anrede des Benutzers in E-Mails und Bestätigungsseite bewerkstelligen.&lt;br /&gt;
&lt;br /&gt;
TypoScript:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typoscript&amp;quot;&amp;gt;&lt;br /&gt;
lib.anrede = CASE&lt;br /&gt;
lib.anrede {&lt;br /&gt;
  key.field = 0&lt;br /&gt;
 &lt;br /&gt;
  default = TEXT&lt;br /&gt;
  default.value = Sehr geehrte Damen und Herren,&lt;br /&gt;
 &lt;br /&gt;
  Herr = TEXT&lt;br /&gt;
  # Die &amp;quot;7&amp;quot; ist die ID des Powermail-Felds {name}&lt;br /&gt;
  Herr.data = GP:tx_powermail_pi1|field|7&lt;br /&gt;
  Herr.noTrimWrap = |Sehr geehrter Herr |,|&lt;br /&gt;
 &lt;br /&gt;
  Frau = TEXT&lt;br /&gt;
  Frau.data = GP:tx_powermail_pi1|field|7&lt;br /&gt;
  Frau.noTrimWrap = |Sehr geehrte Frau |, |&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  # Englische Übersetzung:&lt;br /&gt;
  Mr = TEXT&lt;br /&gt;
  Mr.data = GP:tx_powermail_pi1|field|7&lt;br /&gt;
  Mr.noTrimWrap = |Dear Mr |, |&lt;br /&gt;
 &lt;br /&gt;
  Mrs = TEXT&lt;br /&gt;
  Mrs.data = GP:tx_powermail_pi1|field|7&lt;br /&gt;
  Mrs.noTrimWrap = |Dear Mrs |, |&lt;br /&gt;
 &lt;br /&gt;
  Ms = TEXT&lt;br /&gt;
  Ms.data = GP:tx_powermail_pi1|field|7&lt;br /&gt;
  Ms.noTrimWrap = |Dear Ms |, |&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ViewHelper für Powermail-Plugin:&lt;br /&gt;
&lt;br /&gt;
 {f:cObject(typoscriptObjectPath:&amp;#039;lib.anrede&amp;#039;,data:&amp;#039;{anrede}&amp;#039;)}&lt;br /&gt;
Quelle: typo3.net - Forum&lt;br /&gt;
&lt;br /&gt;
Ab Powermail 2.1.x werden Powermail-Felder nicht mehr über die UID, sondern den Markernamen angesprochen. Dementsprechend müssen die Zeilen im TypoScript etwas angepasst werden:&lt;br /&gt;
&lt;br /&gt;
 # Powermail-Feld {name}&lt;br /&gt;
 Herr.data = GP:tx_powermail_pi1|field|name&lt;br /&gt;
== Letzte Version für TYPO3 4.5 ==&lt;br /&gt;
== Powermail Conditions ==&lt;br /&gt;
&lt;br /&gt;
== Snippets ==&lt;br /&gt;
&lt;br /&gt;
=== E-Mail Empfänger abhängig von Feldwerten (powermail &amp;gt; 2 ===&lt;br /&gt;
http://typo3.3.n7.nabble.com/Powermail-2-Dynamischer-Empfanger-je-nach-Betreff-td269199.html&lt;br /&gt;
&lt;br /&gt;
ich hatte das in einem Projekt so gelöst: &lt;br /&gt;
(läuft unter Typo3 6.1 und Powermail 2.0) &lt;br /&gt;
&lt;br /&gt;
1) Betreff-Auswahl mit Select-Feld so wie du &lt;br /&gt;
&lt;br /&gt;
2) Im Powermail-Plugin im Reiter &amp;quot;Empfänger&amp;quot; folgendes: &lt;br /&gt;
&lt;br /&gt;
Name des Empfängers:{f:cObject(typoscriptObjectPath:&amp;#039;lib.receiver_name&amp;#039;)} &lt;br /&gt;
&lt;br /&gt;
E-Mail des Empfängers: &lt;br /&gt;
&lt;br /&gt;
{f:cObject(typoscriptObjectPath:&amp;#039;lib.receiver_email&amp;#039;)} &lt;br /&gt;
&lt;br /&gt;
Betreff der Mail an den Empfänger: &lt;br /&gt;
&lt;br /&gt;
{f:cObject(typoscriptObjectPath:&amp;#039;lib.subject&amp;#039;)} &lt;br /&gt;
&lt;br /&gt;
3) &lt;br /&gt;
Im TypoScript: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lib.receiver_email = CASE &lt;br /&gt;
lib.receiver_email { &lt;br /&gt;
     # content id 59: field uid 11 &lt;br /&gt;
     key.data = GP:tx_powermail_pi1|field|11 &lt;br /&gt;
     key.intval = 1 &lt;br /&gt;
     default = TEXT &lt;br /&gt;
     default.value = [hidden email] &lt;br /&gt;
     1 = TEXT &lt;br /&gt;
     1.value = [hidden email] &lt;br /&gt;
     2 = TEXT &lt;br /&gt;
     2.value = [hidden email] &lt;br /&gt;
     3 = TEXT &lt;br /&gt;
     3.value = [hidden email] &lt;br /&gt;
} &lt;br /&gt;
lib.receiver_name = CASE &lt;br /&gt;
lib.receiver_name { &lt;br /&gt;
     # content id 59: field uid 11 &lt;br /&gt;
     key.data = GP:tx_powermail_pi1|field|11 &lt;br /&gt;
     key.intval = 1 &lt;br /&gt;
     default = TEXT &lt;br /&gt;
     default.value = Firma XY &lt;br /&gt;
     1 = TEXT &lt;br /&gt;
     1.value = Firma XY Allgemein &lt;br /&gt;
     2 = TEXT &lt;br /&gt;
     2.value = Firma XY Abteilung A &lt;br /&gt;
     3 = TEXT &lt;br /&gt;
     3.value = Firma XY Abteilung B &lt;br /&gt;
} &lt;br /&gt;
lib.subject = TEXT &lt;br /&gt;
lib.subject { &lt;br /&gt;
     # content id 59: field uid 11 &lt;br /&gt;
     key.data = GP:tx_powermail_pi1|field|11 &lt;br /&gt;
     key.intval = 1 &lt;br /&gt;
     default = TEXT &lt;br /&gt;
     default.value = Allgemeine Anfrage &lt;br /&gt;
     1 = TEXT &lt;br /&gt;
     1.value = Allgemeine Anfrage &lt;br /&gt;
     2 = TEXT &lt;br /&gt;
     2.value = Anfrage an Abteilung A &lt;br /&gt;
     3 = TEXT &lt;br /&gt;
     3.value = Anfrage an Abteilung B &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Korrektur für Powermail &amp;gt; 2.1 ====&lt;br /&gt;
ich habe jetzt - mit Hilfe des Powermail-Bug-Trackers - eine Lösung für &lt;br /&gt;
 &amp;gt; 2.1 gefunden. Und zwar werden Felder nicht mehr nach deren ID, &lt;br /&gt;
sondern Feldnamen referenziert: &lt;br /&gt;
&lt;br /&gt;
Im TypoScript der Seite: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lib.receiver = CASE &lt;br /&gt;
lib.receiver { &lt;br /&gt;
   # Übergebener Wert &lt;br /&gt;
   key.field = 0 &lt;br /&gt;
&lt;br /&gt;
   default = TEXT &lt;br /&gt;
   default.value = [hidden email] &lt;br /&gt;
   # Mitgliederverwaltung &lt;br /&gt;
   member = TEXT &lt;br /&gt;
   member.value = [hidden email] &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In das Empfänger-Eingabefeld: &lt;br /&gt;
 {f:cObject(typoscriptObjectPath:&amp;#039;lib.receiver&amp;#039;,data:&amp;#039;{betreff}&amp;#039;)} &lt;br /&gt;
=== E-Mail Empfänger abhängig von Feldwerten ===&lt;br /&gt;
==== Quellen ====&lt;br /&gt;
http://blog.marmalade.de/2010/06/powermail-e-mailempfanger-mit-case-unterscheidung-uber-typoscript-zuweisen/ (3/2012)&lt;br /&gt;
&lt;br /&gt;
http://typo3blogger.de/powermail-empfanger-im-frontend-wahlen/ (3/2012)&lt;br /&gt;
Verschiedene Möglichkeiten:&lt;br /&gt;
* Direkt (schlecht)&lt;br /&gt;
* Über dynamisches TypoScript&lt;br /&gt;
* Angepasste Datenbankabfrage&lt;br /&gt;
&lt;br /&gt;
==== Direkt ====&lt;br /&gt;
Im Empfänger Feld kann man direkt einen Feldmarker angeben z.B.: ###UID234###, dann wird direkt der Wert des Feldes benutzt. Schlecht, weil einfach zu manipulieren (potentielle Spamschleuder)&lt;br /&gt;
&lt;br /&gt;
==== E-Mail über dynamisches TypoScript ====&lt;br /&gt;
TS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Case Objekt das den Wert eines Powermail Feldes auswertet. &lt;br /&gt;
emailan = CASE&lt;br /&gt;
emailan {&lt;br /&gt;
    ### Unterschiedung anhand Feld mit der UID 34 (Form hat id 25)&lt;br /&gt;
    key.data = TSFE:fe_user|sesData|powermail_25|uid34&lt;br /&gt;
    ### Standardwert&lt;br /&gt;
    default = TEXT&lt;br /&gt;
    default.value = info@indihar.de&lt;br /&gt;
    ### Wert bei Auswahl &amp;quot;empf2&amp;quot;&lt;br /&gt;
    empf2 = TEXT&lt;br /&gt;
    empf2.value = schlegel@geo-bit.de&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// neuen dynamischen Powermailmarker (###POWERMAIL_TYPOSCRIPT_EMPFAENGER###)&lt;br /&gt;
// dieser kann im Formular im Empfängerfeld eingetragen werden.&lt;br /&gt;
plugin.tx_powermail_pi1.dynamicTyposcript {&lt;br /&gt;
    empfaenger &amp;lt; emailan&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Angepasste Datenbankabfrage ====&lt;br /&gt;
http://typo3blogger.de/powermail-empfanger-im-frontend-wahlen/&lt;br /&gt;
&lt;br /&gt;
http://www.typo3.net/forum/list/list_post//76461/?howto=1&amp;amp;page=1&lt;br /&gt;
&lt;br /&gt;
http://typo3.org/documentation/document-library/extension-manuals/powermail/1.4.15/view/1/11/#id4334579&lt;br /&gt;
&lt;br /&gt;
Die Extension Powermail bietet eine komfortable Möglichkeit Formulare zusammenzuklicken – übrigens auch für Redakteure. Selbstverständlich ist Skalierbarkeit und Flexibilität ein großes Thema.&lt;br /&gt;
So ist es auch einfach möglich, den Empfänger im Frontend auszuwählen.&lt;br /&gt;
&lt;br /&gt;
Im Netz gibt es schon ein paar Erklärungen zu diesem Thema, aber ich möchte es dennoch noch einmal aufgreifen, da ich oft auf Empfängerwahl angesprochen werde.&lt;br /&gt;
&lt;br /&gt;
Mail-Adressen direkt in der Select Box&lt;br /&gt;
Technisch wäre es natürlich kein Problem eine Selectbox mit E-Mail Adressen im Frontend anzeigen zu lassen und im Flexform im Empfängerfeld dieses Feld durch einen Marker wieder aufzugreifen (z.B. ###UID234###).&lt;br /&gt;
Der Nachteil liegt aber auf der Hand:&lt;br /&gt;
- Mail Adressen können im Frontend aus dem Quelltext ausgelesen werden&lt;br /&gt;
- Mail Adressen können einfach manipuliert werden (im schlimmsten Fall stellt ihr so eine Spamschleuder ins Netz)&lt;br /&gt;
Diese Methode ist also allenfalls im Intranet nutzbar.&lt;br /&gt;
&lt;br /&gt;
Umweg über Datenbank-UID&lt;br /&gt;
Eine andere Idee ist es, Datankbankeinträge (z.B. tt_address oder fe_user) mit E-Mail Adressen vorzunehmen und in einer (z.B.) Selectbox die UID des Datensatzes wieder aufzugreifen.&lt;br /&gt;
Beispiel Eintrag im Flexform&lt;br /&gt;
In diesem Beispiel hat man die Wahl zwischen UID 1 und 2. Verwendeter Marker ist ###UID42###.&lt;br /&gt;
SQL Query Beispiel&lt;br /&gt;
Damit Powermail den Umweg über die Datenbank geht, bietet sich der Einsatz des Feldes “Alternative SQL-Query” an.&lt;br /&gt;
&lt;br /&gt;
Weitere Infos&lt;br /&gt;
Natürlich kann man auch an ganze Usergroups schicken:&lt;br /&gt;
&lt;br /&gt;
SELECT email FROM fe_users WHERE find_in_set(###UID43###,usergroup) &amp;gt; 0&lt;br /&gt;
AND hidden = 0 AND deleted = 0&lt;br /&gt;
&lt;br /&gt;
Beispiel mit fester Usergroup UID44:&lt;br /&gt;
&lt;br /&gt;
SELECT email FROM fe_users WHERE find_in_set(44,usergroup) &amp;gt; 0&lt;br /&gt;
AND hidden = 0 AND deleted = 0&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel mit Checkboxen (mehrere Empfänger auswählen):&lt;br /&gt;
&lt;br /&gt;
SELECT email FROM fe_users WHERE uid IN(###UID43###)&lt;br /&gt;
&lt;br /&gt;
Eine ganz andere Möglichkeit ist der Einsatz von Dynamictyposcript im Empfängerfeld – auch hier lassen sich einige Anforderungen flexibel umsetzen. Dynamictyposcript in Powermail&lt;br /&gt;
&lt;br /&gt;
=== Formular in Datenbank speichern ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.tx_powermail_pi1{&lt;br /&gt;
    dbEntry {&lt;br /&gt;
&lt;br /&gt;
        # Speicherung für Tabelle ermöglichen&lt;br /&gt;
        tt_address._enable = TEXT&lt;br /&gt;
        tt_address._enable.value = 1&lt;br /&gt;
&lt;br /&gt;
        #  &amp;quot;tt_address.name&amp;quot; mit dem Wert des Powermail felds ausfüllen&lt;br /&gt;
        tt_content uid 88, field uid18 (###uid18###)&lt;br /&gt;
        tt_address.name = TEXT&lt;br /&gt;
        tt_address.name.data = TSFE:fe_user|sesData|powermail_88|uid18&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausführliches Beispiel ===&lt;br /&gt;
&lt;br /&gt;
Constants&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.powermail.js.alwaysInclude = 1&lt;br /&gt;
plugin.powermail.js.includeJquery = 0&lt;br /&gt;
plugin.powermail.js.includeJqueryTools = 0&lt;br /&gt;
plugin.powermail.js.includeJqueryToolsTabs = 0&lt;br /&gt;
plugin.powermail.allow.email2sender = 0&lt;br /&gt;
plugin.powermail.PID.dblog = 0&lt;br /&gt;
plugin.powermail.markerALL.hideLabel = 1&lt;br /&gt;
plugin.powermail.format.datetime = %d.%m.%Y% %H:%M&lt;br /&gt;
plugin.powermail.format.date = %d.%m.%Y&lt;br /&gt;
plugin.powermail.debug.output = &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Setup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// CSS Pfad ändern (oder gar nicht erst statisch einbinden ;-)  )&lt;br /&gt;
page.includeCSS.powermail_frontend_basic = fileadmin/templates/onlineboerse/powermail.css&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Datenbank Speicherung mit verschiedenen Optionen ====&lt;br /&gt;
Setup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Powermail DB Storage&lt;br /&gt;
// Extra userfunc to convert date to unix timestamp&lt;br /&gt;
includeLibs.powermailTimestamp = fileadmin/templates/scripts/user_powermailTimestamp.php&lt;br /&gt;
&lt;br /&gt;
plugin.tx_powermail_pi1.dbEntry{  &lt;br /&gt;
  tx_gbbulletin_bulletin {&lt;br /&gt;
&lt;br /&gt;
    _enable = TEXT&lt;br /&gt;
    _enable.value = 1&lt;br /&gt;
     &lt;br /&gt;
    hidden = TEXT&lt;br /&gt;
    hidden.value = 1&lt;br /&gt;
     &lt;br /&gt;
    pid = TEXT&lt;br /&gt;
    pid.value = 102&lt;br /&gt;
        &lt;br /&gt;
    tstamp = TEXT&lt;br /&gt;
    tstamp.data = date:U&lt;br /&gt;
         &lt;br /&gt;
    crdate = TEXT&lt;br /&gt;
    crdate.data = date:U&lt;br /&gt;
&lt;br /&gt;
    title = TEXT&lt;br /&gt;
    title.data = TSFE:fe_user|sesData|powermail_214|uid1&lt;br /&gt;
&lt;br /&gt;
    author = TEXT&lt;br /&gt;
    author.data = TSFE:fe_user|sesData|powermail_214|uid2&lt;br /&gt;
&lt;br /&gt;
    place = TEXT&lt;br /&gt;
    place.data = TSFE:fe_user|sesData|powermail_214|uid3&lt;br /&gt;
    &lt;br /&gt;
    description = TEXT&lt;br /&gt;
    description.data = TSFE:fe_user|sesData|powermail_214|uid4&lt;br /&gt;
&lt;br /&gt;
    contact = TEXT&lt;br /&gt;
    contact.data = TSFE:fe_user|sesData|powermail_214|uid5&lt;br /&gt;
&lt;br /&gt;
    qualification = TEXT&lt;br /&gt;
    qualification.data = TSFE:fe_user|sesData|powermail_214|uid6&lt;br /&gt;
    &lt;br /&gt;
    date = USER&lt;br /&gt;
    date.userFunc = user_powermailTimestamp-&amp;gt;preflight&lt;br /&gt;
    date.userFunc.field = uid7&lt;br /&gt;
    date.userFunc.formuid = 214&lt;br /&gt;
    &lt;br /&gt;
    period = TEXT&lt;br /&gt;
    period.data = TSFE:fe_user|sesData|powermail_214|uid29&lt;br /&gt;
&lt;br /&gt;
    end_date = USER&lt;br /&gt;
    end_date.userFunc = user_powermailTimestamp-&amp;gt;preflight&lt;br /&gt;
    end_date.userFunc.field = uid14&lt;br /&gt;
    end_date.userFunc.formuid = 214&lt;br /&gt;
    &lt;br /&gt;
    url = TEXT&lt;br /&gt;
    url.data = TSFE:fe_user|sesData|powermail_214|uid8&lt;br /&gt;
&lt;br /&gt;
    text1 = TEXT&lt;br /&gt;
    text1.data = TSFE:fe_user|sesData|powermail_214|uid9&lt;br /&gt;
    &lt;br /&gt;
    cluster = TEXT&lt;br /&gt;
    cluster.data = TSFE:fe_user|sesData|powermail_214|uid11&lt;br /&gt;
    &lt;br /&gt;
    # add mm relation to uid 2 of tx_gbbulletin_cluster (via mm table)&lt;br /&gt;
    _mm = COA&lt;br /&gt;
    _mm.10 = COA&lt;br /&gt;
    # 1 is always the mm table&lt;br /&gt;
    _mm.10.1 = TEXT&lt;br /&gt;
    _mm.10.1.value = tx_gbbulletin_cluster_mm&lt;br /&gt;
    # 2 is always the other table&lt;br /&gt;
    _mm.10.2 = TEXT&lt;br /&gt;
    _mm.10.2.value = tx_gbbulletin_cluster&lt;br /&gt;
    # 3 is always the uid of the other table to get a relation to this&lt;br /&gt;
    # (in this case uid1 of tx_gbbulletin_cluster)&lt;br /&gt;
    _mm.10.3 = TEXT&lt;br /&gt;
    _mm.10.3.value = 1&lt;br /&gt;
    &lt;br /&gt;
    tag = TEXT&lt;br /&gt;
    tag.data = TSFE:fe_user|sesData|powermail_214|uid12&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Userfunktion zum umwandeln von Datum in Timestamp ===&lt;br /&gt;
Diese Funktion wird im obigen Beispiel zu Datenbankspeicherung verwendet&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
&lt;br /&gt;
    class user_powermailTimestamp { &lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
        // Function preflight() will be used from typoscript &lt;br /&gt;
        function preflight($content=&amp;#039;&amp;#039;, $conf=array()) { &lt;br /&gt;
            $value = $GLOBALS[&amp;#039;TSFE&amp;#039;]-&amp;gt;fe_user-&amp;gt;sesData[&amp;#039;powermail_&amp;#039;.$conf[&amp;#039;userFunc.&amp;#039;][&amp;#039;formuid&amp;#039;]][$conf[&amp;#039;userFunc.&amp;#039;][&amp;#039;field&amp;#039;]]; &lt;br /&gt;
            return $this-&amp;gt;getDate($value); &lt;br /&gt;
        } &lt;br /&gt;
         &lt;br /&gt;
         &lt;br /&gt;
        // Main getDate() changes a date in any format to an unix timestamp &lt;br /&gt;
        function getDate($string, $default = &amp;#039;now&amp;#039;, $timestamp = 1) { &lt;br /&gt;
            $error = 0; // no error at the beginning &lt;br /&gt;
            $string = str_replace(array(&amp;#039;-&amp;#039;, &amp;#039;_&amp;#039;, &amp;#039;:&amp;#039;, &amp;#039;+&amp;#039;, &amp;#039;,&amp;#039;, &amp;#039; &amp;#039;), &amp;#039;.&amp;#039;, $string); // change 23-12-2009 -&amp;gt; 23.12.2009 AND &amp;quot;05:00 23.01.2009&amp;quot; -&amp;gt; 05.00.23.01.2009 &lt;br /&gt;
            if (method_exists(&amp;#039;t3lib_div&amp;#039;, &amp;#039;trimExplode&amp;#039;)) $dateParts = t3lib_div::trimExplode(&amp;#039;.&amp;#039;, $string, 1); else $dateParts = explode(&amp;#039;.&amp;#039;, $string); // split at . &lt;br /&gt;
         &lt;br /&gt;
            if (count($dateParts) === 3) { // only if there are three parts like &amp;quot;23.12.2009&amp;quot; &lt;br /&gt;
                if (strlen($dateParts[0]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[1]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[2]) &amp;lt;= 2) { // xx.xx.xx &lt;br /&gt;
                    $string = strtotime($dateParts[2].&amp;#039;-&amp;#039;.$dateParts[1].&amp;#039;-&amp;#039;.$dateParts[0]); // change to timestamp &lt;br /&gt;
                } &lt;br /&gt;
                elseif (strlen($dateParts[0]) == 4 &amp;amp;&amp;amp; strlen($dateParts[1]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[2]) &amp;lt;= 2) { // xxxx.xx.xx &lt;br /&gt;
                    $string = strtotime($dateParts[0].&amp;#039;-&amp;#039;.$dateParts[1].&amp;#039;-&amp;#039;.$dateParts[2]); // change to timestamp &lt;br /&gt;
                } &lt;br /&gt;
                elseif (strlen($dateParts[0]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[1]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[2]) == 4) { // xx.xx.xxxx &lt;br /&gt;
                    $string = strtotime($dateParts[2].&amp;#039;-&amp;#039;.$dateParts[1].&amp;#039;-&amp;#039;.$dateParts[0]); // change to timestamp &lt;br /&gt;
                } &lt;br /&gt;
                else { // error &lt;br /&gt;
                    $error = 1; // error &lt;br /&gt;
                } &lt;br /&gt;
            } elseif (count($dateParts) === 5) { // only if there are five parts like &amp;quot;05.00.23.01.2009&amp;quot; &lt;br /&gt;
                $string = strtotime($dateParts[4].&amp;#039;-&amp;#039;.$dateParts[3].&amp;#039;-&amp;#039;.$dateParts[2].&amp;#039; &amp;#039;.$dateParts[0].&amp;#039;:&amp;#039;.$dateParts[1].&amp;#039;:00&amp;#039;); // change to timestamp &lt;br /&gt;
            } else { // more than 3 parts - so error &lt;br /&gt;
                $error = 1; // error &lt;br /&gt;
            } &lt;br /&gt;
            $string = date(&amp;#039;Y-m-d&amp;#039;, $string); // For default: change 1234567 -&amp;gt; 1.1.1979 &lt;br /&gt;
            if ($timestamp) $string = strtotime($string); // Change back 1.1.1979 -&amp;gt; 1234567 &lt;br /&gt;
            if ($error) $string = ($default == &amp;#039;now&amp;#039; ? time() : $default); // show default value &lt;br /&gt;
         &lt;br /&gt;
            return $string; &lt;br /&gt;
        } &lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dropdownfeld mit Werten aus der Datenbank ===&lt;br /&gt;
==== Beispiel 1 ====&lt;br /&gt;
Quelle: http://www.typo3.net/forum/thematik/zeige/thema/77259/?show=1 Zugriff: 2013-10&lt;br /&gt;
&lt;br /&gt;
1. Neues Powermail Feld anlegen (typoscript) im Feld Typoscript Objekt z.B. lib.objectname angeben&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Eine Selectabfrage in TS (Hole name, uid von tt_address der Seite 5):&lt;br /&gt;
&lt;br /&gt;
TS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lib.objectname {&lt;br /&gt;
  10 = TEXT&lt;br /&gt;
  10.value = &amp;lt;label for=&amp;quot;uid33&amp;quot;&amp;gt;Select:&amp;lt;/label&amp;gt;&lt;br /&gt;
  20 = CONTENT&lt;br /&gt;
  20.wrap = &amp;lt;select id=&amp;quot;uid33&amp;quot; name=&amp;quot;tx_powermail_pi1[uid33]&amp;quot; size=&amp;quot;1&amp;quot;&amp;gt;|&amp;lt;/select&amp;gt;&lt;br /&gt;
  20 {&lt;br /&gt;
    table = tt_address&lt;br /&gt;
    select {&lt;br /&gt;
      pidInList = 5&lt;br /&gt;
      orderBy = name&lt;br /&gt;
    }&lt;br /&gt;
    renderObj = COA&lt;br /&gt;
    renderObj {&lt;br /&gt;
      10 = COA&lt;br /&gt;
      10 {&lt;br /&gt;
        10 = TEXT&lt;br /&gt;
        10 {&lt;br /&gt;
          field = uid&lt;br /&gt;
          wrap = &amp;lt;option value=&amp;quot;|&amp;quot;&amp;gt;&lt;br /&gt;
        }&lt;br /&gt;
        20 = TEXT&lt;br /&gt;
        20 {&lt;br /&gt;
          field = name&lt;br /&gt;
          wrap = |&amp;lt;/option&amp;gt;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;br /&gt;
Dynamische Selecterbox, mit dem HTML Code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;label for=&amp;quot;uid33&amp;quot;&amp;gt;Select:&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;select id=&amp;quot;uid33&amp;quot; name=&amp;quot;tx_powermail_pi1[uid33]&amp;quot; size=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;23&amp;quot;&amp;gt;Name1&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;24&amp;quot;&amp;gt;Name2&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Datenspeicherung in m:n Tabellen ===&lt;br /&gt;
Quelle: http://typo3-blog.net/tutorials/news/powermail-tt-news-mn-tabelle.html 2013-10&lt;br /&gt;
&lt;br /&gt;
Powermail lässt sich nicht nur zum Versenden von Mails sondern auch zum Erstellen von Inhaltselementen nutzen. Dazu dient die TYPO3 Option dbEntry. Mit Hilfe dieser Option ist es sogar möglich MN-Tabellen zu befüllen, welches wenig bekannt ist. Anbei ein Beispiel, wie Eine tt_news Nachricht erzeugt und direkt in Kategorie Nr. 2 eingefügt werden kann:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.tx_powermail_pi1.upload.folder = uploads/pics/&lt;br /&gt;
plugin.tx_powermail_pi1.dbEntry.tt_news {&lt;br /&gt;
  # Neue Nachrichten müssen durch Admin genehmigt werden&lt;br /&gt;
  _enable = TEXT&lt;br /&gt;
  _enable.value = 0&lt;br /&gt;
  pid = TEXT&lt;br /&gt;
  pid.value = 2&lt;br /&gt;
  tstamp = TEXT&lt;br /&gt;
  tstamp.data = date:U&lt;br /&gt;
  crdate = TEXT&lt;br /&gt;
  crdate.data = date:U&lt;br /&gt;
  &lt;br /&gt;
  _mn = COA&lt;br /&gt;
  _mn.10 = COA&lt;br /&gt;
  # 1 muss Namen der mn Tabelle enthalten&lt;br /&gt;
  _mm.10.1 = TEXT&lt;br /&gt;
  _mm.10.1.value = tt_news_cat_mm&lt;br /&gt;
  # 2 ist der Name der Fremdtabelle, hier News Kategorie&lt;br /&gt;
  _mm.10.2 = TEXT&lt;br /&gt;
  _mm.10.2.value = tt_news_cat&lt;br /&gt;
  # 3 die Fremd uid, hier uid der Newskategorie&lt;br /&gt;
  _mm.10.3 = TEXT&lt;br /&gt;
  _mm.10.3.value = 2&lt;br /&gt;
  &lt;br /&gt;
  # 139 ist die uid des Contenelements, welches das Powermailformular darstellt&lt;br /&gt;
  # 15 ist die uid des einzelnen Feldes.&lt;br /&gt;
  title = TEXT&lt;br /&gt;
  title.data = TSFE:fe_user|sesData|powermail_139|uid15&lt;br /&gt;
  author_email = TEXT&lt;br /&gt;
  author_email.data = TSFE:fe_user|sesData|powermail_139|uid21&lt;br /&gt;
  author = TEXT&lt;br /&gt;
  author.data = TSFE:fe_user|sesData|powermail_139|uid739&lt;br /&gt;
  # short = TEXT&lt;br /&gt;
  # short.data = TSFE:fe_user|sesData|powermail_139|uid742&lt;br /&gt;
  bodytext = TEXT&lt;br /&gt;
  bodytext.data = TSFE:fe_user|sesData|powermail_139|uid19&lt;br /&gt;
  datetime = TEXT&lt;br /&gt;
  datetime.data = TSFE:fe_user|sesData|powermail_139|uid17&lt;br /&gt;
  keywords = TEXT&lt;br /&gt;
  keywords.data = TSFE:fe_user|sesData|powermail_139|uid41&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Felder vorausfüllen ===&lt;br /&gt;
Quelle: http://typo3blogger.de/powermail-trickkiste-teil-2-%E2%80%93-felder-vorbelegen/ &lt;br /&gt;
==== Über GET Parameter ====&lt;br /&gt;
Dropdown&lt;br /&gt;
 http://www.einpraegsam.net/kontakt.html?tx_powermail_pi1[uid24]=TYPO3%20Extension%20powermail&lt;br /&gt;
Input&lt;br /&gt;
 index.php?id=1&amp;amp;tx_powermail_pi1[uid12]=Hallo&lt;br /&gt;
&lt;br /&gt;
Checkbox&lt;br /&gt;
 index.php?id=1&amp;amp;tx_powermail_pi1[uid13][0]=1&lt;br /&gt;
&lt;br /&gt;
==== Über TypoScript ====&lt;br /&gt;
Vorfüllen mit TypoScript:&lt;br /&gt;
Durch eine Vorbelegung mit TypoScript gibt es kaum noch Grenzen. Statische Werte, GET und POST Parameter und userFuncs können verwendet werden. Nachfolgend ein paar Beispiele.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.tx_powermail_pi1 {&lt;br /&gt;
  prefill {&lt;br /&gt;
    # Fülle Feld 1 mit statischem Wert&lt;br /&gt;
    uid1 = TEXT&lt;br /&gt;
    uid1.value = blabla&lt;br /&gt;
 &lt;br /&gt;
    # Fülle Feld 2 mit aktuellem timestamp&lt;br /&gt;
    uid2 = TEXT&lt;br /&gt;
    uid2.data = date:U&lt;br /&gt;
 &lt;br /&gt;
    # Feld 3 mit Datum&lt;br /&gt;
    uid3 = TEXT&lt;br /&gt;
    uid3.data = date:U&lt;br /&gt;
    uid3.strftime = Datum: %d.%m.%Y&lt;br /&gt;
 &lt;br /&gt;
    # Feld 4 mit IP Adresse&lt;br /&gt;
    uid4 = TEXT&lt;br /&gt;
    uid4.data = getIndpEnv:REMOTE_ADDR&lt;br /&gt;
 &lt;br /&gt;
    # Feld 5 und 6 mit Wert aus aktueller URL&lt;br /&gt;
    # index.php?id=123&amp;amp;wert=Ort&lt;br /&gt;
    uid5 = TEXT&lt;br /&gt;
    uid5.data = GP:wert&lt;br /&gt;
    uid5.htmlSpecialChars = 1&lt;br /&gt;
 &lt;br /&gt;
    # index.php?id=123&amp;amp;tx_ttnews[tt_news]=95&lt;br /&gt;
    uid5 = TEXT&lt;br /&gt;
    uid5.data = GP:tx_ttnews|tt_news&lt;br /&gt;
    uid5.wrap = Wir befinden uns auf der Newsdetailseite mit der UID|&lt;br /&gt;
    uid5.intval = 1&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis:&lt;br /&gt;
1. Im Beispiel 4 und 5 werden Benutzerdefinierte Werte (GET oder POST) verwendet. Hier ist ein Absichern gegen XSS unabdingbar. Mit intval oder htmlSpecialChars lassen sich Werte innerhalb von TypoScript leicht absichern.&lt;br /&gt;
2. Falls ein Wert eines Feldes in der Session liegt, hat dieser Vorrang.&lt;br /&gt;
3. Ein Selectfeld wird automatisch vorselektiert wenn der vorgegebene Wert auch zur Auswahl steht&lt;br /&gt;
&lt;br /&gt;
=== User basierter Upload Ordner ===&lt;br /&gt;
ich möchte die in einem Upload-Formular übermittelten Dateien in ein bestimmtes Verzeichnis (fileadmin/user_upload/verzeichnis/) schieben. Das funktioniert auch mit folgender Konstanten:&lt;br /&gt;
&lt;br /&gt;
 plugin.powermail.upload.folder = /fileadmin/user_upload/vkb-uploads/&lt;br /&gt;
&lt;br /&gt;
Die Dateien landen im richtigen Ordner. Allerdings wird in der Powermail-Ansicht im Backend, dieser Pfad nicht übernommen. Ich lasse mir also die eingegangenen Powermails anzeigen und hier ist ja dann die übertragene Datei entsprechend verlinkt, aber eben nicht mit dem von mir vorgegebenem Pfad sondern mit dem Standard-Ordner (uploads/tx_powermail/files/Dateiname.abc).&lt;br /&gt;
&lt;br /&gt;
Lösung anscheinend selbst gefunden.&lt;br /&gt;
&lt;br /&gt;
Ich habe alle möglichen Dateien durchsuchen lassen, in denen der Pfad &amp;#039;uploads/tx_powermail/files/&amp;#039; gesetzt ist und die Datei pageTSconfig.txt gefunden.&lt;br /&gt;
&lt;br /&gt;
Hieraus konnte ich schlussfolgern, dass der folgende Schnipsel im TSConfig des Sysordners in dem die Mails auflaufen hinterlegt sein muss um mein Problem zu beheben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tx_powermail_mod1.config {&lt;br /&gt;
    list {&lt;br /&gt;
        uploadFolder = mein/pfad/zu/den/dateianhängen/&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Powermail&amp;diff=22630</id>
		<title>TYPO3 - Powermail</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=TYPO3_-_Powermail&amp;diff=22630"/>
		<updated>2017-11-22T16:57:41Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* E-Mail Empfänger abhängig von Feldwerten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Powermail Extension&lt;br /&gt;
== Letzte Version für TYPO3 4.5 ==&lt;br /&gt;
== Powermail Conditions ==&lt;br /&gt;
&lt;br /&gt;
== Snippets ==&lt;br /&gt;
&lt;br /&gt;
=== E-Mail Empfänger abhängig von Feldwerten (powermail &amp;gt; 2 ===&lt;br /&gt;
http://typo3.3.n7.nabble.com/Powermail-2-Dynamischer-Empfanger-je-nach-Betreff-td269199.html&lt;br /&gt;
&lt;br /&gt;
ich hatte das in einem Projekt so gelöst: &lt;br /&gt;
(läuft unter Typo3 6.1 und Powermail 2.0) &lt;br /&gt;
&lt;br /&gt;
1) Betreff-Auswahl mit Select-Feld so wie du &lt;br /&gt;
&lt;br /&gt;
2) Im Powermail-Plugin im Reiter &amp;quot;Empfänger&amp;quot; folgendes: &lt;br /&gt;
&lt;br /&gt;
Name des Empfängers:{f:cObject(typoscriptObjectPath:&amp;#039;lib.receiver_name&amp;#039;)} &lt;br /&gt;
&lt;br /&gt;
E-Mail des Empfängers: &lt;br /&gt;
&lt;br /&gt;
{f:cObject(typoscriptObjectPath:&amp;#039;lib.receiver_email&amp;#039;)} &lt;br /&gt;
&lt;br /&gt;
Betreff der Mail an den Empfänger: &lt;br /&gt;
&lt;br /&gt;
{f:cObject(typoscriptObjectPath:&amp;#039;lib.subject&amp;#039;)} &lt;br /&gt;
&lt;br /&gt;
3) &lt;br /&gt;
Im TypoScript: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lib.receiver_email = CASE &lt;br /&gt;
lib.receiver_email { &lt;br /&gt;
     # content id 59: field uid 11 &lt;br /&gt;
     key.data = GP:tx_powermail_pi1|field|11 &lt;br /&gt;
     key.intval = 1 &lt;br /&gt;
     default = TEXT &lt;br /&gt;
     default.value = [hidden email] &lt;br /&gt;
     1 = TEXT &lt;br /&gt;
     1.value = [hidden email] &lt;br /&gt;
     2 = TEXT &lt;br /&gt;
     2.value = [hidden email] &lt;br /&gt;
     3 = TEXT &lt;br /&gt;
     3.value = [hidden email] &lt;br /&gt;
} &lt;br /&gt;
lib.receiver_name = CASE &lt;br /&gt;
lib.receiver_name { &lt;br /&gt;
     # content id 59: field uid 11 &lt;br /&gt;
     key.data = GP:tx_powermail_pi1|field|11 &lt;br /&gt;
     key.intval = 1 &lt;br /&gt;
     default = TEXT &lt;br /&gt;
     default.value = Firma XY &lt;br /&gt;
     1 = TEXT &lt;br /&gt;
     1.value = Firma XY Allgemein &lt;br /&gt;
     2 = TEXT &lt;br /&gt;
     2.value = Firma XY Abteilung A &lt;br /&gt;
     3 = TEXT &lt;br /&gt;
     3.value = Firma XY Abteilung B &lt;br /&gt;
} &lt;br /&gt;
lib.subject = TEXT &lt;br /&gt;
lib.subject { &lt;br /&gt;
     # content id 59: field uid 11 &lt;br /&gt;
     key.data = GP:tx_powermail_pi1|field|11 &lt;br /&gt;
     key.intval = 1 &lt;br /&gt;
     default = TEXT &lt;br /&gt;
     default.value = Allgemeine Anfrage &lt;br /&gt;
     1 = TEXT &lt;br /&gt;
     1.value = Allgemeine Anfrage &lt;br /&gt;
     2 = TEXT &lt;br /&gt;
     2.value = Anfrage an Abteilung A &lt;br /&gt;
     3 = TEXT &lt;br /&gt;
     3.value = Anfrage an Abteilung B &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Korrektur für Powermail &amp;gt; 2.1 ====&lt;br /&gt;
ich habe jetzt - mit Hilfe des Powermail-Bug-Trackers - eine Lösung für &lt;br /&gt;
 &amp;gt; 2.1 gefunden. Und zwar werden Felder nicht mehr nach deren ID, &lt;br /&gt;
sondern Feldnamen referenziert: &lt;br /&gt;
&lt;br /&gt;
Im TypoScript der Seite: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lib.receiver = CASE &lt;br /&gt;
lib.receiver { &lt;br /&gt;
   # Übergebener Wert &lt;br /&gt;
   key.field = 0 &lt;br /&gt;
&lt;br /&gt;
   default = TEXT &lt;br /&gt;
   default.value = [hidden email] &lt;br /&gt;
   # Mitgliederverwaltung &lt;br /&gt;
   member = TEXT &lt;br /&gt;
   member.value = [hidden email] &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In das Empfänger-Eingabefeld: &lt;br /&gt;
 {f:cObject(typoscriptObjectPath:&amp;#039;lib.receiver&amp;#039;,data:&amp;#039;{betreff}&amp;#039;)} &lt;br /&gt;
=== E-Mail Empfänger abhängig von Feldwerten ===&lt;br /&gt;
==== Quellen ====&lt;br /&gt;
http://blog.marmalade.de/2010/06/powermail-e-mailempfanger-mit-case-unterscheidung-uber-typoscript-zuweisen/ (3/2012)&lt;br /&gt;
&lt;br /&gt;
http://typo3blogger.de/powermail-empfanger-im-frontend-wahlen/ (3/2012)&lt;br /&gt;
Verschiedene Möglichkeiten:&lt;br /&gt;
* Direkt (schlecht)&lt;br /&gt;
* Über dynamisches TypoScript&lt;br /&gt;
* Angepasste Datenbankabfrage&lt;br /&gt;
&lt;br /&gt;
==== Direkt ====&lt;br /&gt;
Im Empfänger Feld kann man direkt einen Feldmarker angeben z.B.: ###UID234###, dann wird direkt der Wert des Feldes benutzt. Schlecht, weil einfach zu manipulieren (potentielle Spamschleuder)&lt;br /&gt;
&lt;br /&gt;
==== E-Mail über dynamisches TypoScript ====&lt;br /&gt;
TS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Case Objekt das den Wert eines Powermail Feldes auswertet. &lt;br /&gt;
emailan = CASE&lt;br /&gt;
emailan {&lt;br /&gt;
    ### Unterschiedung anhand Feld mit der UID 34 (Form hat id 25)&lt;br /&gt;
    key.data = TSFE:fe_user|sesData|powermail_25|uid34&lt;br /&gt;
    ### Standardwert&lt;br /&gt;
    default = TEXT&lt;br /&gt;
    default.value = info@indihar.de&lt;br /&gt;
    ### Wert bei Auswahl &amp;quot;empf2&amp;quot;&lt;br /&gt;
    empf2 = TEXT&lt;br /&gt;
    empf2.value = schlegel@geo-bit.de&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// neuen dynamischen Powermailmarker (###POWERMAIL_TYPOSCRIPT_EMPFAENGER###)&lt;br /&gt;
// dieser kann im Formular im Empfängerfeld eingetragen werden.&lt;br /&gt;
plugin.tx_powermail_pi1.dynamicTyposcript {&lt;br /&gt;
    empfaenger &amp;lt; emailan&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Angepasste Datenbankabfrage ====&lt;br /&gt;
http://typo3blogger.de/powermail-empfanger-im-frontend-wahlen/&lt;br /&gt;
&lt;br /&gt;
http://www.typo3.net/forum/list/list_post//76461/?howto=1&amp;amp;page=1&lt;br /&gt;
&lt;br /&gt;
http://typo3.org/documentation/document-library/extension-manuals/powermail/1.4.15/view/1/11/#id4334579&lt;br /&gt;
&lt;br /&gt;
Die Extension Powermail bietet eine komfortable Möglichkeit Formulare zusammenzuklicken – übrigens auch für Redakteure. Selbstverständlich ist Skalierbarkeit und Flexibilität ein großes Thema.&lt;br /&gt;
So ist es auch einfach möglich, den Empfänger im Frontend auszuwählen.&lt;br /&gt;
&lt;br /&gt;
Im Netz gibt es schon ein paar Erklärungen zu diesem Thema, aber ich möchte es dennoch noch einmal aufgreifen, da ich oft auf Empfängerwahl angesprochen werde.&lt;br /&gt;
&lt;br /&gt;
Mail-Adressen direkt in der Select Box&lt;br /&gt;
Technisch wäre es natürlich kein Problem eine Selectbox mit E-Mail Adressen im Frontend anzeigen zu lassen und im Flexform im Empfängerfeld dieses Feld durch einen Marker wieder aufzugreifen (z.B. ###UID234###).&lt;br /&gt;
Der Nachteil liegt aber auf der Hand:&lt;br /&gt;
- Mail Adressen können im Frontend aus dem Quelltext ausgelesen werden&lt;br /&gt;
- Mail Adressen können einfach manipuliert werden (im schlimmsten Fall stellt ihr so eine Spamschleuder ins Netz)&lt;br /&gt;
Diese Methode ist also allenfalls im Intranet nutzbar.&lt;br /&gt;
&lt;br /&gt;
Umweg über Datenbank-UID&lt;br /&gt;
Eine andere Idee ist es, Datankbankeinträge (z.B. tt_address oder fe_user) mit E-Mail Adressen vorzunehmen und in einer (z.B.) Selectbox die UID des Datensatzes wieder aufzugreifen.&lt;br /&gt;
Beispiel Eintrag im Flexform&lt;br /&gt;
In diesem Beispiel hat man die Wahl zwischen UID 1 und 2. Verwendeter Marker ist ###UID42###.&lt;br /&gt;
SQL Query Beispiel&lt;br /&gt;
Damit Powermail den Umweg über die Datenbank geht, bietet sich der Einsatz des Feldes “Alternative SQL-Query” an.&lt;br /&gt;
&lt;br /&gt;
Weitere Infos&lt;br /&gt;
Natürlich kann man auch an ganze Usergroups schicken:&lt;br /&gt;
&lt;br /&gt;
SELECT email FROM fe_users WHERE find_in_set(###UID43###,usergroup) &amp;gt; 0&lt;br /&gt;
AND hidden = 0 AND deleted = 0&lt;br /&gt;
&lt;br /&gt;
Beispiel mit fester Usergroup UID44:&lt;br /&gt;
&lt;br /&gt;
SELECT email FROM fe_users WHERE find_in_set(44,usergroup) &amp;gt; 0&lt;br /&gt;
AND hidden = 0 AND deleted = 0&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel mit Checkboxen (mehrere Empfänger auswählen):&lt;br /&gt;
&lt;br /&gt;
SELECT email FROM fe_users WHERE uid IN(###UID43###)&lt;br /&gt;
&lt;br /&gt;
Eine ganz andere Möglichkeit ist der Einsatz von Dynamictyposcript im Empfängerfeld – auch hier lassen sich einige Anforderungen flexibel umsetzen. Dynamictyposcript in Powermail&lt;br /&gt;
&lt;br /&gt;
=== Formular in Datenbank speichern ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.tx_powermail_pi1{&lt;br /&gt;
    dbEntry {&lt;br /&gt;
&lt;br /&gt;
        # Speicherung für Tabelle ermöglichen&lt;br /&gt;
        tt_address._enable = TEXT&lt;br /&gt;
        tt_address._enable.value = 1&lt;br /&gt;
&lt;br /&gt;
        #  &amp;quot;tt_address.name&amp;quot; mit dem Wert des Powermail felds ausfüllen&lt;br /&gt;
        tt_content uid 88, field uid18 (###uid18###)&lt;br /&gt;
        tt_address.name = TEXT&lt;br /&gt;
        tt_address.name.data = TSFE:fe_user|sesData|powermail_88|uid18&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausführliches Beispiel ===&lt;br /&gt;
&lt;br /&gt;
Constants&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.powermail.js.alwaysInclude = 1&lt;br /&gt;
plugin.powermail.js.includeJquery = 0&lt;br /&gt;
plugin.powermail.js.includeJqueryTools = 0&lt;br /&gt;
plugin.powermail.js.includeJqueryToolsTabs = 0&lt;br /&gt;
plugin.powermail.allow.email2sender = 0&lt;br /&gt;
plugin.powermail.PID.dblog = 0&lt;br /&gt;
plugin.powermail.markerALL.hideLabel = 1&lt;br /&gt;
plugin.powermail.format.datetime = %d.%m.%Y% %H:%M&lt;br /&gt;
plugin.powermail.format.date = %d.%m.%Y&lt;br /&gt;
plugin.powermail.debug.output = &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Setup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// CSS Pfad ändern (oder gar nicht erst statisch einbinden ;-)  )&lt;br /&gt;
page.includeCSS.powermail_frontend_basic = fileadmin/templates/onlineboerse/powermail.css&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Datenbank Speicherung mit verschiedenen Optionen ====&lt;br /&gt;
Setup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Powermail DB Storage&lt;br /&gt;
// Extra userfunc to convert date to unix timestamp&lt;br /&gt;
includeLibs.powermailTimestamp = fileadmin/templates/scripts/user_powermailTimestamp.php&lt;br /&gt;
&lt;br /&gt;
plugin.tx_powermail_pi1.dbEntry{  &lt;br /&gt;
  tx_gbbulletin_bulletin {&lt;br /&gt;
&lt;br /&gt;
    _enable = TEXT&lt;br /&gt;
    _enable.value = 1&lt;br /&gt;
     &lt;br /&gt;
    hidden = TEXT&lt;br /&gt;
    hidden.value = 1&lt;br /&gt;
     &lt;br /&gt;
    pid = TEXT&lt;br /&gt;
    pid.value = 102&lt;br /&gt;
        &lt;br /&gt;
    tstamp = TEXT&lt;br /&gt;
    tstamp.data = date:U&lt;br /&gt;
         &lt;br /&gt;
    crdate = TEXT&lt;br /&gt;
    crdate.data = date:U&lt;br /&gt;
&lt;br /&gt;
    title = TEXT&lt;br /&gt;
    title.data = TSFE:fe_user|sesData|powermail_214|uid1&lt;br /&gt;
&lt;br /&gt;
    author = TEXT&lt;br /&gt;
    author.data = TSFE:fe_user|sesData|powermail_214|uid2&lt;br /&gt;
&lt;br /&gt;
    place = TEXT&lt;br /&gt;
    place.data = TSFE:fe_user|sesData|powermail_214|uid3&lt;br /&gt;
    &lt;br /&gt;
    description = TEXT&lt;br /&gt;
    description.data = TSFE:fe_user|sesData|powermail_214|uid4&lt;br /&gt;
&lt;br /&gt;
    contact = TEXT&lt;br /&gt;
    contact.data = TSFE:fe_user|sesData|powermail_214|uid5&lt;br /&gt;
&lt;br /&gt;
    qualification = TEXT&lt;br /&gt;
    qualification.data = TSFE:fe_user|sesData|powermail_214|uid6&lt;br /&gt;
    &lt;br /&gt;
    date = USER&lt;br /&gt;
    date.userFunc = user_powermailTimestamp-&amp;gt;preflight&lt;br /&gt;
    date.userFunc.field = uid7&lt;br /&gt;
    date.userFunc.formuid = 214&lt;br /&gt;
    &lt;br /&gt;
    period = TEXT&lt;br /&gt;
    period.data = TSFE:fe_user|sesData|powermail_214|uid29&lt;br /&gt;
&lt;br /&gt;
    end_date = USER&lt;br /&gt;
    end_date.userFunc = user_powermailTimestamp-&amp;gt;preflight&lt;br /&gt;
    end_date.userFunc.field = uid14&lt;br /&gt;
    end_date.userFunc.formuid = 214&lt;br /&gt;
    &lt;br /&gt;
    url = TEXT&lt;br /&gt;
    url.data = TSFE:fe_user|sesData|powermail_214|uid8&lt;br /&gt;
&lt;br /&gt;
    text1 = TEXT&lt;br /&gt;
    text1.data = TSFE:fe_user|sesData|powermail_214|uid9&lt;br /&gt;
    &lt;br /&gt;
    cluster = TEXT&lt;br /&gt;
    cluster.data = TSFE:fe_user|sesData|powermail_214|uid11&lt;br /&gt;
    &lt;br /&gt;
    # add mm relation to uid 2 of tx_gbbulletin_cluster (via mm table)&lt;br /&gt;
    _mm = COA&lt;br /&gt;
    _mm.10 = COA&lt;br /&gt;
    # 1 is always the mm table&lt;br /&gt;
    _mm.10.1 = TEXT&lt;br /&gt;
    _mm.10.1.value = tx_gbbulletin_cluster_mm&lt;br /&gt;
    # 2 is always the other table&lt;br /&gt;
    _mm.10.2 = TEXT&lt;br /&gt;
    _mm.10.2.value = tx_gbbulletin_cluster&lt;br /&gt;
    # 3 is always the uid of the other table to get a relation to this&lt;br /&gt;
    # (in this case uid1 of tx_gbbulletin_cluster)&lt;br /&gt;
    _mm.10.3 = TEXT&lt;br /&gt;
    _mm.10.3.value = 1&lt;br /&gt;
    &lt;br /&gt;
    tag = TEXT&lt;br /&gt;
    tag.data = TSFE:fe_user|sesData|powermail_214|uid12&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Userfunktion zum umwandeln von Datum in Timestamp ===&lt;br /&gt;
Diese Funktion wird im obigen Beispiel zu Datenbankspeicherung verwendet&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
&lt;br /&gt;
    class user_powermailTimestamp { &lt;br /&gt;
     &lt;br /&gt;
     &lt;br /&gt;
        // Function preflight() will be used from typoscript &lt;br /&gt;
        function preflight($content=&amp;#039;&amp;#039;, $conf=array()) { &lt;br /&gt;
            $value = $GLOBALS[&amp;#039;TSFE&amp;#039;]-&amp;gt;fe_user-&amp;gt;sesData[&amp;#039;powermail_&amp;#039;.$conf[&amp;#039;userFunc.&amp;#039;][&amp;#039;formuid&amp;#039;]][$conf[&amp;#039;userFunc.&amp;#039;][&amp;#039;field&amp;#039;]]; &lt;br /&gt;
            return $this-&amp;gt;getDate($value); &lt;br /&gt;
        } &lt;br /&gt;
         &lt;br /&gt;
         &lt;br /&gt;
        // Main getDate() changes a date in any format to an unix timestamp &lt;br /&gt;
        function getDate($string, $default = &amp;#039;now&amp;#039;, $timestamp = 1) { &lt;br /&gt;
            $error = 0; // no error at the beginning &lt;br /&gt;
            $string = str_replace(array(&amp;#039;-&amp;#039;, &amp;#039;_&amp;#039;, &amp;#039;:&amp;#039;, &amp;#039;+&amp;#039;, &amp;#039;,&amp;#039;, &amp;#039; &amp;#039;), &amp;#039;.&amp;#039;, $string); // change 23-12-2009 -&amp;gt; 23.12.2009 AND &amp;quot;05:00 23.01.2009&amp;quot; -&amp;gt; 05.00.23.01.2009 &lt;br /&gt;
            if (method_exists(&amp;#039;t3lib_div&amp;#039;, &amp;#039;trimExplode&amp;#039;)) $dateParts = t3lib_div::trimExplode(&amp;#039;.&amp;#039;, $string, 1); else $dateParts = explode(&amp;#039;.&amp;#039;, $string); // split at . &lt;br /&gt;
         &lt;br /&gt;
            if (count($dateParts) === 3) { // only if there are three parts like &amp;quot;23.12.2009&amp;quot; &lt;br /&gt;
                if (strlen($dateParts[0]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[1]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[2]) &amp;lt;= 2) { // xx.xx.xx &lt;br /&gt;
                    $string = strtotime($dateParts[2].&amp;#039;-&amp;#039;.$dateParts[1].&amp;#039;-&amp;#039;.$dateParts[0]); // change to timestamp &lt;br /&gt;
                } &lt;br /&gt;
                elseif (strlen($dateParts[0]) == 4 &amp;amp;&amp;amp; strlen($dateParts[1]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[2]) &amp;lt;= 2) { // xxxx.xx.xx &lt;br /&gt;
                    $string = strtotime($dateParts[0].&amp;#039;-&amp;#039;.$dateParts[1].&amp;#039;-&amp;#039;.$dateParts[2]); // change to timestamp &lt;br /&gt;
                } &lt;br /&gt;
                elseif (strlen($dateParts[0]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[1]) &amp;lt;= 2 &amp;amp;&amp;amp; strlen($dateParts[2]) == 4) { // xx.xx.xxxx &lt;br /&gt;
                    $string = strtotime($dateParts[2].&amp;#039;-&amp;#039;.$dateParts[1].&amp;#039;-&amp;#039;.$dateParts[0]); // change to timestamp &lt;br /&gt;
                } &lt;br /&gt;
                else { // error &lt;br /&gt;
                    $error = 1; // error &lt;br /&gt;
                } &lt;br /&gt;
            } elseif (count($dateParts) === 5) { // only if there are five parts like &amp;quot;05.00.23.01.2009&amp;quot; &lt;br /&gt;
                $string = strtotime($dateParts[4].&amp;#039;-&amp;#039;.$dateParts[3].&amp;#039;-&amp;#039;.$dateParts[2].&amp;#039; &amp;#039;.$dateParts[0].&amp;#039;:&amp;#039;.$dateParts[1].&amp;#039;:00&amp;#039;); // change to timestamp &lt;br /&gt;
            } else { // more than 3 parts - so error &lt;br /&gt;
                $error = 1; // error &lt;br /&gt;
            } &lt;br /&gt;
            $string = date(&amp;#039;Y-m-d&amp;#039;, $string); // For default: change 1234567 -&amp;gt; 1.1.1979 &lt;br /&gt;
            if ($timestamp) $string = strtotime($string); // Change back 1.1.1979 -&amp;gt; 1234567 &lt;br /&gt;
            if ($error) $string = ($default == &amp;#039;now&amp;#039; ? time() : $default); // show default value &lt;br /&gt;
         &lt;br /&gt;
            return $string; &lt;br /&gt;
        } &lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dropdownfeld mit Werten aus der Datenbank ===&lt;br /&gt;
==== Beispiel 1 ====&lt;br /&gt;
Quelle: http://www.typo3.net/forum/thematik/zeige/thema/77259/?show=1 Zugriff: 2013-10&lt;br /&gt;
&lt;br /&gt;
1. Neues Powermail Feld anlegen (typoscript) im Feld Typoscript Objekt z.B. lib.objectname angeben&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Eine Selectabfrage in TS (Hole name, uid von tt_address der Seite 5):&lt;br /&gt;
&lt;br /&gt;
TS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lib.objectname {&lt;br /&gt;
  10 = TEXT&lt;br /&gt;
  10.value = &amp;lt;label for=&amp;quot;uid33&amp;quot;&amp;gt;Select:&amp;lt;/label&amp;gt;&lt;br /&gt;
  20 = CONTENT&lt;br /&gt;
  20.wrap = &amp;lt;select id=&amp;quot;uid33&amp;quot; name=&amp;quot;tx_powermail_pi1[uid33]&amp;quot; size=&amp;quot;1&amp;quot;&amp;gt;|&amp;lt;/select&amp;gt;&lt;br /&gt;
  20 {&lt;br /&gt;
    table = tt_address&lt;br /&gt;
    select {&lt;br /&gt;
      pidInList = 5&lt;br /&gt;
      orderBy = name&lt;br /&gt;
    }&lt;br /&gt;
    renderObj = COA&lt;br /&gt;
    renderObj {&lt;br /&gt;
      10 = COA&lt;br /&gt;
      10 {&lt;br /&gt;
        10 = TEXT&lt;br /&gt;
        10 {&lt;br /&gt;
          field = uid&lt;br /&gt;
          wrap = &amp;lt;option value=&amp;quot;|&amp;quot;&amp;gt;&lt;br /&gt;
        }&lt;br /&gt;
        20 = TEXT&lt;br /&gt;
        20 {&lt;br /&gt;
          field = name&lt;br /&gt;
          wrap = |&amp;lt;/option&amp;gt;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;br /&gt;
Dynamische Selecterbox, mit dem HTML Code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;label for=&amp;quot;uid33&amp;quot;&amp;gt;Select:&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;select id=&amp;quot;uid33&amp;quot; name=&amp;quot;tx_powermail_pi1[uid33]&amp;quot; size=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;23&amp;quot;&amp;gt;Name1&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;24&amp;quot;&amp;gt;Name2&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Datenspeicherung in m:n Tabellen ===&lt;br /&gt;
Quelle: http://typo3-blog.net/tutorials/news/powermail-tt-news-mn-tabelle.html 2013-10&lt;br /&gt;
&lt;br /&gt;
Powermail lässt sich nicht nur zum Versenden von Mails sondern auch zum Erstellen von Inhaltselementen nutzen. Dazu dient die TYPO3 Option dbEntry. Mit Hilfe dieser Option ist es sogar möglich MN-Tabellen zu befüllen, welches wenig bekannt ist. Anbei ein Beispiel, wie Eine tt_news Nachricht erzeugt und direkt in Kategorie Nr. 2 eingefügt werden kann:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.tx_powermail_pi1.upload.folder = uploads/pics/&lt;br /&gt;
plugin.tx_powermail_pi1.dbEntry.tt_news {&lt;br /&gt;
  # Neue Nachrichten müssen durch Admin genehmigt werden&lt;br /&gt;
  _enable = TEXT&lt;br /&gt;
  _enable.value = 0&lt;br /&gt;
  pid = TEXT&lt;br /&gt;
  pid.value = 2&lt;br /&gt;
  tstamp = TEXT&lt;br /&gt;
  tstamp.data = date:U&lt;br /&gt;
  crdate = TEXT&lt;br /&gt;
  crdate.data = date:U&lt;br /&gt;
  &lt;br /&gt;
  _mn = COA&lt;br /&gt;
  _mn.10 = COA&lt;br /&gt;
  # 1 muss Namen der mn Tabelle enthalten&lt;br /&gt;
  _mm.10.1 = TEXT&lt;br /&gt;
  _mm.10.1.value = tt_news_cat_mm&lt;br /&gt;
  # 2 ist der Name der Fremdtabelle, hier News Kategorie&lt;br /&gt;
  _mm.10.2 = TEXT&lt;br /&gt;
  _mm.10.2.value = tt_news_cat&lt;br /&gt;
  # 3 die Fremd uid, hier uid der Newskategorie&lt;br /&gt;
  _mm.10.3 = TEXT&lt;br /&gt;
  _mm.10.3.value = 2&lt;br /&gt;
  &lt;br /&gt;
  # 139 ist die uid des Contenelements, welches das Powermailformular darstellt&lt;br /&gt;
  # 15 ist die uid des einzelnen Feldes.&lt;br /&gt;
  title = TEXT&lt;br /&gt;
  title.data = TSFE:fe_user|sesData|powermail_139|uid15&lt;br /&gt;
  author_email = TEXT&lt;br /&gt;
  author_email.data = TSFE:fe_user|sesData|powermail_139|uid21&lt;br /&gt;
  author = TEXT&lt;br /&gt;
  author.data = TSFE:fe_user|sesData|powermail_139|uid739&lt;br /&gt;
  # short = TEXT&lt;br /&gt;
  # short.data = TSFE:fe_user|sesData|powermail_139|uid742&lt;br /&gt;
  bodytext = TEXT&lt;br /&gt;
  bodytext.data = TSFE:fe_user|sesData|powermail_139|uid19&lt;br /&gt;
  datetime = TEXT&lt;br /&gt;
  datetime.data = TSFE:fe_user|sesData|powermail_139|uid17&lt;br /&gt;
  keywords = TEXT&lt;br /&gt;
  keywords.data = TSFE:fe_user|sesData|powermail_139|uid41&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Felder vorausfüllen ===&lt;br /&gt;
Quelle: http://typo3blogger.de/powermail-trickkiste-teil-2-%E2%80%93-felder-vorbelegen/ &lt;br /&gt;
==== Über GET Parameter ====&lt;br /&gt;
Dropdown&lt;br /&gt;
 http://www.einpraegsam.net/kontakt.html?tx_powermail_pi1[uid24]=TYPO3%20Extension%20powermail&lt;br /&gt;
Input&lt;br /&gt;
 index.php?id=1&amp;amp;tx_powermail_pi1[uid12]=Hallo&lt;br /&gt;
&lt;br /&gt;
Checkbox&lt;br /&gt;
 index.php?id=1&amp;amp;tx_powermail_pi1[uid13][0]=1&lt;br /&gt;
&lt;br /&gt;
==== Über TypoScript ====&lt;br /&gt;
Vorfüllen mit TypoScript:&lt;br /&gt;
Durch eine Vorbelegung mit TypoScript gibt es kaum noch Grenzen. Statische Werte, GET und POST Parameter und userFuncs können verwendet werden. Nachfolgend ein paar Beispiele.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin.tx_powermail_pi1 {&lt;br /&gt;
  prefill {&lt;br /&gt;
    # Fülle Feld 1 mit statischem Wert&lt;br /&gt;
    uid1 = TEXT&lt;br /&gt;
    uid1.value = blabla&lt;br /&gt;
 &lt;br /&gt;
    # Fülle Feld 2 mit aktuellem timestamp&lt;br /&gt;
    uid2 = TEXT&lt;br /&gt;
    uid2.data = date:U&lt;br /&gt;
 &lt;br /&gt;
    # Feld 3 mit Datum&lt;br /&gt;
    uid3 = TEXT&lt;br /&gt;
    uid3.data = date:U&lt;br /&gt;
    uid3.strftime = Datum: %d.%m.%Y&lt;br /&gt;
 &lt;br /&gt;
    # Feld 4 mit IP Adresse&lt;br /&gt;
    uid4 = TEXT&lt;br /&gt;
    uid4.data = getIndpEnv:REMOTE_ADDR&lt;br /&gt;
 &lt;br /&gt;
    # Feld 5 und 6 mit Wert aus aktueller URL&lt;br /&gt;
    # index.php?id=123&amp;amp;wert=Ort&lt;br /&gt;
    uid5 = TEXT&lt;br /&gt;
    uid5.data = GP:wert&lt;br /&gt;
    uid5.htmlSpecialChars = 1&lt;br /&gt;
 &lt;br /&gt;
    # index.php?id=123&amp;amp;tx_ttnews[tt_news]=95&lt;br /&gt;
    uid5 = TEXT&lt;br /&gt;
    uid5.data = GP:tx_ttnews|tt_news&lt;br /&gt;
    uid5.wrap = Wir befinden uns auf der Newsdetailseite mit der UID|&lt;br /&gt;
    uid5.intval = 1&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis:&lt;br /&gt;
1. Im Beispiel 4 und 5 werden Benutzerdefinierte Werte (GET oder POST) verwendet. Hier ist ein Absichern gegen XSS unabdingbar. Mit intval oder htmlSpecialChars lassen sich Werte innerhalb von TypoScript leicht absichern.&lt;br /&gt;
2. Falls ein Wert eines Feldes in der Session liegt, hat dieser Vorrang.&lt;br /&gt;
3. Ein Selectfeld wird automatisch vorselektiert wenn der vorgegebene Wert auch zur Auswahl steht&lt;br /&gt;
&lt;br /&gt;
=== User basierter Upload Ordner ===&lt;br /&gt;
ich möchte die in einem Upload-Formular übermittelten Dateien in ein bestimmtes Verzeichnis (fileadmin/user_upload/verzeichnis/) schieben. Das funktioniert auch mit folgender Konstanten:&lt;br /&gt;
&lt;br /&gt;
 plugin.powermail.upload.folder = /fileadmin/user_upload/vkb-uploads/&lt;br /&gt;
&lt;br /&gt;
Die Dateien landen im richtigen Ordner. Allerdings wird in der Powermail-Ansicht im Backend, dieser Pfad nicht übernommen. Ich lasse mir also die eingegangenen Powermails anzeigen und hier ist ja dann die übertragene Datei entsprechend verlinkt, aber eben nicht mit dem von mir vorgegebenem Pfad sondern mit dem Standard-Ordner (uploads/tx_powermail/files/Dateiname.abc).&lt;br /&gt;
&lt;br /&gt;
Lösung anscheinend selbst gefunden.&lt;br /&gt;
&lt;br /&gt;
Ich habe alle möglichen Dateien durchsuchen lassen, in denen der Pfad &amp;#039;uploads/tx_powermail/files/&amp;#039; gesetzt ist und die Datei pageTSconfig.txt gefunden.&lt;br /&gt;
&lt;br /&gt;
Hieraus konnte ich schlussfolgern, dass der folgende Schnipsel im TSConfig des Sysordners in dem die Mails auflaufen hinterlegt sein muss um mein Problem zu beheben:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tx_powermail_mod1.config {&lt;br /&gt;
    list {&lt;br /&gt;
        uploadFolder = mein/pfad/zu/den/dateianhängen/&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Mac_-_Tipps_und_Tricks&amp;diff=22629</id>
		<title>Mac - Tipps und Tricks</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Mac_-_Tipps_und_Tricks&amp;diff=22629"/>
		<updated>2017-11-19T22:04:19Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Library Ordner anzeigen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Shell Skripte ==&lt;br /&gt;
http://stackoverflow.com/questions/26235324/how-to-create-a-batch-file-in-mac&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;winbatch&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
FILENAME=`date +&amp;quot;/Volumes/path/to/network/share/Backup/%Y-%m-%d.tgz&amp;quot;`&lt;br /&gt;
cd /directory/to/backup || exit 1&lt;br /&gt;
tar -cvz &amp;quot;$FILENAME&amp;quot; .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You can save that on your Desktop as backup and then go in Terminal and type:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;winbatch&amp;quot;&amp;gt;&lt;br /&gt;
chmod +x ~/Desktop/backup&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mac Wartung ==&lt;br /&gt;
=== Recovery Mode ===&lt;br /&gt;
=== PRAM löschen ===&lt;br /&gt;
== Benutzerordner verschieben ==&lt;br /&gt;
=== Variante 1 - Versteckte Option Speicherort ===&lt;br /&gt;
Hinweis: Sinnvoll ist ein &amp;#039;&amp;#039;&amp;#039;Adminkonto auf dem Startvolume zu belassen&amp;#039;&amp;#039;&amp;#039;, mit dem man im Notfall arbeiten kann, falls es mal Probleme gibt.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Privatorder&amp;#039;&amp;#039;&amp;#039; des Benutzers auf ein anderes Volume &amp;#039;&amp;#039;&amp;#039;kopieren&amp;#039;&amp;#039;&amp;#039; (dabei darf aber die Funktion &amp;quot;Eigentümer auf diesem Volume ignorieren&amp;quot; nicht aktiviert sein; siehe Info-Fenster für diese Festplatte unter &amp;quot;Freigaben &amp;amp; Zugriffsrechte&amp;quot;). &lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Systemeinstellung &amp;gt; &amp;quot;Benutzer&amp;quot; Kontextmenü&amp;#039;&amp;#039;&amp;#039; des betreffenden Benutzers &amp;#039;&amp;#039;&amp;#039;&amp;quot;Erweiterte Optionen&amp;quot;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;&amp;quot;Benutzerordner&amp;quot; &amp;gt; &amp;quot;Auswählen&amp;quot;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# Alten Ordner löschen und &amp;#039;&amp;#039;&amp;#039;Neustart&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Nachteil: Manche aus Linux portierte Apps (z.B. Filezilla) arbeiten nicht mit dem Library Ordner und finden u.U. manche User-Einstellungen nicht, bzw. wollen suchen im Standardpfad. Dafür ist die Symlink Methode besser.&lt;br /&gt;
 &lt;br /&gt;
=== Variante 2 - Symlink ===&lt;br /&gt;
Hinweis: Vielleicht ist es hier Sinnvoll nur die Dokumente zu verschieben. Auf diese Weise bleiben die Library Daten im schnellen Zugriff auf der SSD?&lt;br /&gt;
&lt;br /&gt;
http://www.macnotes.de/2011/08/31/mac-os-x-benutzerordner-auf-anderes-volume-verschieben/&lt;br /&gt;
&lt;br /&gt;
====  Vorbereitung ====&lt;br /&gt;
* Temporären Admin User anlegen (s.o.)&lt;br /&gt;
* Festplatten sollten finalen Namen haben&lt;br /&gt;
* Mit temporärem Admin anmelden&lt;br /&gt;
==== Benutzerordner verschieben ====&lt;br /&gt;
* Benutzerordner verschieben über Terminal&lt;br /&gt;
 sudo ditto -rsrcFork /Users/Benutzer /Volumes/Daten/Benutzer&lt;br /&gt;
sudo gibt root Rechte, ditto sorgt dafür, daß Metadaten verschoben werden können.&lt;br /&gt;
&lt;br /&gt;
* Original umbenennen / verstecken&lt;br /&gt;
 sudo mv /Users/Benutzer /Users/Benutzer.backup&lt;br /&gt;
&lt;br /&gt;
* Symlink erzeugen&lt;br /&gt;
 sudo ln -s /Volumes/Daten/Benutzer /Users/Benutzer&lt;br /&gt;
&lt;br /&gt;
* Prüfen ob alles stimmt&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rechnername:~ testadmin$ ls -l /Users&lt;br /&gt;
total 10&lt;br /&gt;
drwxrwxrwt 5 root wheel 170 23 Aug 17:54 Shared&lt;br /&gt;
lrwxr-xr-x 1 root admin 21 23 Aug 16:10 testadmin&lt;br /&gt;
lrwxr-xr-x 1 root admin 21 23 Aug 16:10 Benutzer.backup&lt;br /&gt;
lrwxr-xr-x 1 root admin 21 23 Aug 16:10 Benutzer -&amp;gt; /Volumes/Daten/Benutzer&lt;br /&gt;
rechnername:~ testadmin$&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Temporären Account wieder löschen&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Ordner verschieben ====&lt;br /&gt;
Dafür sind die Schritte mit ditto, mv und ln für alle Ordner zu wiederholen, die weg sollen. Zu beachten ist, dass die Ordner für “Musik”, “Filme”, “Bilder” usw. auf englisch sind – wer nachschauen möchte, wie sie im Original heißen, gibt im Terminal ein:&lt;br /&gt;
&lt;br /&gt;
 ls -l /Users/Benutzer/&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
=== Screenshots erstellen ===&lt;br /&gt;
&lt;br /&gt;
 Command-Shift-3 -&amp;gt; Desktop Foto&lt;br /&gt;
 Command-Shift-4 -&amp;gt; Bereich auswählen und fotografieren&lt;br /&gt;
 Command-Shift-4 danach Space -&amp;gt; App Window fotografieren&lt;br /&gt;
 + Control -&amp;gt; speichert das Foto in einem beliebigen Ordner&lt;br /&gt;
&lt;br /&gt;
Außerdem ist die App &amp;#039;&amp;#039;&amp;#039;Bildschirmfoto&amp;#039;&amp;#039;&amp;#039; (Grab) mit an Bord&lt;br /&gt;
&lt;br /&gt;
=== Dictionary ===&lt;br /&gt;
Cursor über Text und Command + Control + D&lt;br /&gt;
&lt;br /&gt;
== Sonderzeichen ==&lt;br /&gt;
In den meisten Menüs kann man sie über Bearbeiten -&amp;gt; Sonderzeichen aufrufen. Shortcut ctrl+cmd + Leertaste.&lt;br /&gt;
&lt;br /&gt;
Viele sind über Alt+Key zu erreichen z.B. die Tilde über Alt+N&lt;br /&gt;
&lt;br /&gt;
== Nützliche Shortcuts ==&lt;br /&gt;
Grundsätzlich viel was auf Windows mit STRG + Taste geht, geht auf dem Mac mit Apfel (CMD) + Taste&lt;br /&gt;
&lt;br /&gt;
 Command + Shift + V to paste text without formatting.&lt;br /&gt;
 Command + Entfernen -&amp;gt; Löschen statt Papierkorb&lt;br /&gt;
 Command + Option + Control + 8 -&amp;gt; Invertierte Farben&lt;br /&gt;
&lt;br /&gt;
== Prozesse und System ==&lt;br /&gt;
=== Schnell mal Speicher frei machen wenn der Rechner langsam wird===&lt;br /&gt;
&lt;br /&gt;
Terminal eingeben:&lt;br /&gt;
 purge&lt;br /&gt;
=== Schnell zwischen Audiodevices umschalten ===&lt;br /&gt;
Option + Klick auf Lautsprechersymbol&lt;br /&gt;
&lt;br /&gt;
=== Lautstärke und Helligkeit ===&lt;br /&gt;
FineTuning&lt;br /&gt;
 Shift + Alt + Lautstärke/Helligkeit&lt;br /&gt;
Kein Restart Sound&lt;br /&gt;
 Beim Restart Mute Knopf drücken&lt;br /&gt;
Kein Geräusch beim Lautstärke verändern&lt;br /&gt;
 + Shift&lt;br /&gt;
&lt;br /&gt;
== Finder Tricks ==&lt;br /&gt;
=== Library Ordner anzeigen ===&lt;br /&gt;
 Gehe zu &amp;gt; Alt Taste&lt;br /&gt;
&lt;br /&gt;
oder im Finder&lt;br /&gt;
 cmd - j&lt;br /&gt;
&lt;br /&gt;
oder dauerhaft anzeigen mit Terminal&lt;br /&gt;
 chflags nohidden ~/Library/&lt;br /&gt;
verstecke ihn wieder mit&lt;br /&gt;
 chflags hidden ~/Library/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Firefox und Thunderbird Benutzerprofile wieder herstellen ====&lt;br /&gt;
https://support.mozilla.org/de/kb/benutzerprofile-mit-ihren-persoenlichen-daten#w_wie-finde-ich-mein-profil&lt;br /&gt;
&lt;br /&gt;
https://support.mozilla.org/de/kb/Benutzerprofile-Thunderbird#w_wo-wird-mein-profil-gespeichert&lt;br /&gt;
&lt;br /&gt;
Firefox Profil im Mac liegt in:&lt;br /&gt;
 Library &amp;gt; Application Support &amp;gt; Firefox &amp;gt; Profiles&lt;br /&gt;
&lt;br /&gt;
Thunderbird:&lt;br /&gt;
 Library &amp;gt; Thunderbird &amp;gt; Profiles&lt;br /&gt;
&lt;br /&gt;
Tipp den versteckten Ordner Library kann man sehen wenn man im Finder auf Gehe zu geht und dann die alt Taste drückt.&lt;br /&gt;
&lt;br /&gt;
Man kann Profile einfach verschieben. Das Profil sollte nachher den gleichen Namen haben wir vorher, damit Firefox es übernimmt. Im Zweifel Ordner umbenennen.&lt;br /&gt;
&lt;br /&gt;
== Programme ==&lt;br /&gt;
=== Shortcuts ===&lt;br /&gt;
http://www.hcs.harvard.edu/~jrus/Site/System%20Bindings.html&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen und Konfiguration von Programmen auf dem Mac ===&lt;br /&gt;
Es gibt eine Reihe von Orten in denen Programme ihre Einstellungen hinterlegen, bzw beziehen.&lt;br /&gt;
# Systemeinstellungen (Systemeinstellungen &amp;gt; Keyboard) Standardkeybindings sind z.B. hier hinterlegt: &amp;#039;&amp;#039;/System/‍Library/‍Frameworks/‍AppKit.framework/‍Resources/‍StandardKeyBinding.dict&amp;#039;&amp;#039;). Man kann sie auch überschreiben im obigen Fall legt man dann eine Datei hier an: &amp;#039;&amp;#039;~/Library/‍KeyBindings/‍DefaultKeyBinding.dict&amp;#039;&amp;#039;.&lt;br /&gt;
# Programmordner (z.B.: &amp;#039;&amp;#039;/path/‍to/‍TextMate.app/‍Contents/‍Resources/‍&amp;#039;&amp;#039;)&lt;br /&gt;
# User Ordner (z.b.: &amp;#039;&amp;#039;~/Library/‍Application Support/‍TextMate&amp;#039;&amp;#039; )&lt;br /&gt;
In vielen Fällen kann man Einstellungen aus dem Programmordner kopieren und im User Ordner die Datei abändern. Die Einstellungen dort haben dann Vorrang.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel Shortcuts von Textmate ====&lt;br /&gt;
Default ist in&lt;br /&gt;
 /path/‍to/‍TextMate.app/‍Contents/‍Resources/‍KeyBindings.dict&lt;br /&gt;
Und kann man hierhin kopieren und ändern:&lt;br /&gt;
 ~/Library/‍Application Support/‍TextMate/KeyBindings.dict&lt;br /&gt;
&lt;br /&gt;
== Autostart von Programmen auf dem Mac ==&lt;br /&gt;
# Checken ob das Programm selbst eine &amp;#039;&amp;#039;Option zum Einstellen&amp;#039;&amp;#039; hat&lt;br /&gt;
# &amp;#039;&amp;#039;Einstellungen &amp;gt; Benutzer und Gruppen &amp;gt; MeinBenutzer &amp;gt; Anmeldeobjekte &amp;#039;&amp;#039;Alles was hier drin ist wird automatisch gestartet. Ausblenden bedeutet, dass das Programm zwar gestartet, aber nicht im Vordergrund angezeigt wird.&lt;br /&gt;
# &amp;#039;&amp;#039;/Library/LaunchDaemons&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;LaunchAgents&amp;#039;&amp;#039; &lt;br /&gt;
=== Firefox ===&lt;br /&gt;
==== Firefox Lesezeichen wieder herstellen ====&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_iOS_Orientation_Change_Fix&amp;diff=22555</id>
		<title>JavaScript - iOS Orientation Change Fix</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_iOS_Orientation_Change_Fix&amp;diff=22555"/>
		<updated>2017-10-30T09:41:25Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: Die Seite wurde neu angelegt: „&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt; /*! A fix for the iOS orientationchange zoom bug.  Script by @scottjehl, rebound by @wilto.  MIT / GPLv2 License. */ (funct…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*! A fix for the iOS orientationchange zoom bug.&lt;br /&gt;
 Script by @scottjehl, rebound by @wilto.&lt;br /&gt;
 MIT / GPLv2 License.&lt;br /&gt;
*/&lt;br /&gt;
(function(w){&lt;br /&gt;
	&lt;br /&gt;
	// This fix addresses an iOS bug, so return early if the UA claims it&amp;#039;s something else.&lt;br /&gt;
	var ua = navigator.userAgent;&lt;br /&gt;
	if( !( /iPhone|iPad|iPod/.test( navigator.platform ) &amp;amp;&amp;amp; /OS [1-5]_[0-9_]* like Mac OS X/i.test(ua) &amp;amp;&amp;amp; ua.indexOf( &amp;quot;AppleWebKit&amp;quot; ) &amp;gt; -1 ) ){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    var doc = w.document;&lt;br /&gt;
&lt;br /&gt;
    if( !doc.querySelector ){ return; }&lt;br /&gt;
&lt;br /&gt;
    var meta = doc.querySelector( &amp;quot;meta[name=viewport]&amp;quot; ),&lt;br /&gt;
        initialContent = meta &amp;amp;&amp;amp; meta.getAttribute( &amp;quot;content&amp;quot; ),&lt;br /&gt;
        disabledZoom = initialContent + &amp;quot;,maximum-scale=1&amp;quot;,&lt;br /&gt;
        enabledZoom = initialContent + &amp;quot;,maximum-scale=10&amp;quot;,&lt;br /&gt;
        enabled = true,&lt;br /&gt;
		x, y, z, aig;&lt;br /&gt;
&lt;br /&gt;
    if( !meta ){ return; }&lt;br /&gt;
&lt;br /&gt;
    function restoreZoom(){&lt;br /&gt;
        meta.setAttribute( &amp;quot;content&amp;quot;, enabledZoom );&lt;br /&gt;
        enabled = true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function disableZoom(){&lt;br /&gt;
        meta.setAttribute( &amp;quot;content&amp;quot;, disabledZoom );&lt;br /&gt;
        enabled = false;&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
    function checkTilt( e ){&lt;br /&gt;
		aig = e.accelerationIncludingGravity;&lt;br /&gt;
		x = Math.abs( aig.x );&lt;br /&gt;
		y = Math.abs( aig.y );&lt;br /&gt;
		z = Math.abs( aig.z );&lt;br /&gt;
				&lt;br /&gt;
		// If portrait orientation and in one of the danger zones&lt;br /&gt;
        if( (!w.orientation || w.orientation === 180) &amp;amp;&amp;amp; ( x &amp;gt; 7 || ( ( z &amp;gt; 6 &amp;amp;&amp;amp; y &amp;lt; 8 || z &amp;lt; 8 &amp;amp;&amp;amp; y &amp;gt; 6 ) &amp;amp;&amp;amp; x &amp;gt; 5 ) ) ){&lt;br /&gt;
			if( enabled ){&lt;br /&gt;
				disableZoom();&lt;br /&gt;
			}        	&lt;br /&gt;
        }&lt;br /&gt;
		else if( !enabled ){&lt;br /&gt;
			restoreZoom();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
	w.addEventListener( &amp;quot;orientationchange&amp;quot;, restoreZoom, false );&lt;br /&gt;
	w.addEventListener( &amp;quot;devicemotion&amp;quot;, checkTilt, false );&lt;br /&gt;
&lt;br /&gt;
})( this );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Plugins&amp;diff=22554</id>
		<title>JavaScript - Plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Plugins&amp;diff=22554"/>
		<updated>2017-10-30T09:40:50Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Libraries Skripte und Plugins für JavaScript, sortiert nach Kategorien&lt;br /&gt;
== Links ==&lt;br /&gt;
http://www.jqueryscript.net/&lt;br /&gt;
&lt;br /&gt;
== Images Loaded ==&lt;br /&gt;
Testen ob alle Bilder geladen sind, um dann weitere Funktionen auzuführen.&lt;br /&gt;
&lt;br /&gt;
[[JavaScript - Images Loaded]]&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
=== CreateJS ===&lt;br /&gt;
Tools für Animation und Interaktion&lt;br /&gt;
&lt;br /&gt;
http://createjs.com&lt;br /&gt;
&lt;br /&gt;
=== jQuery Appear ===&lt;br /&gt;
[[jQuery Appear - Plugin]] - Events wenn Elemente im Viewport auftauchen / verschwinden&lt;br /&gt;
&lt;br /&gt;
=== jQuery Easing ===&lt;br /&gt;
Easing Kurven für Animationen [[jQuery Easing - Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Simple Text Rotator ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Simple Text Rotator&lt;br /&gt;
!function(e){var t={animation:&amp;quot;dissolve&amp;quot;,separator:&amp;quot;,&amp;quot;,speed:2e3};e.fn.textrotator=function(n){var r=e.extend({},t,n);return this.each(function(){var t=e(this);var n=[];e.each(t.text().split(r.separator),function(e,t){n.push(t)});t.text(n[0]);var i=function(){switch(r.animation){case&amp;quot;dissolve&amp;quot;:t.animate({textShadowBlur:20,opacity:0},500,function(){s=e.inArray(t.text(),n);if(s+1==n.length)s=-1;t.text(n[s+1]).animate({textShadowBlur:0,opacity:1},500)});break;case&amp;quot;flip&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateY(-180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateY(-180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateY(-180deg)&amp;quot;,transform:&amp;quot; rotateY(-180deg)&amp;quot;});break;case&amp;quot;flipUp&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip up&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateX(-180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateX(-180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateX(-180deg)&amp;quot;,transform:&amp;quot; rotateX(-180deg)&amp;quot;});break;case&amp;quot;flipCube&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip cube&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateY(180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateY(180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateY(180deg)&amp;quot;,transform:&amp;quot; rotateY(180deg)&amp;quot;});break;case&amp;quot;flipCubeUp&amp;quot;:if(t.find(&amp;quot;.back&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.back&amp;quot;).html())}var i=t.text();var s=e.inArray(i,n);if(s+1==n.length)s=-1;t.html(&amp;quot;&amp;quot;);e(&amp;quot;&amp;lt;span class=&amp;#039;front&amp;#039;&amp;gt;&amp;quot;+i+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);e(&amp;quot;&amp;lt;span class=&amp;#039;back&amp;#039;&amp;gt;&amp;quot;+n[s+1]+&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;).appendTo(t);t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().addClass(&amp;quot;flip cube up&amp;quot;).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotateX(180deg)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot; rotateX(180deg)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot; rotateX(180deg)&amp;quot;,transform:&amp;quot; rotateX(180deg)&amp;quot;});break;case&amp;quot;spin&amp;quot;:if(t.find(&amp;quot;.rotating&amp;quot;).length&amp;gt;0){t.html(t.find(&amp;quot;.rotating&amp;quot;).html())}s=e.inArray(t.text(),n);if(s+1==n.length)s=-1;t.wrapInner(&amp;quot;&amp;lt;span class=&amp;#039;rotating spin&amp;#039; /&amp;gt;&amp;quot;).find(&amp;quot;.rotating&amp;quot;).hide().text(n[s+1]).show().css({&amp;quot;-webkit-transform&amp;quot;:&amp;quot; rotate(0) scale(1)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot;rotate(0) scale(1)&amp;quot;,&amp;quot;-o-transform&amp;quot;:&amp;quot;rotate(0) scale(1)&amp;quot;,transform:&amp;quot;rotate(0) scale(1)&amp;quot;});break;case&amp;quot;fade&amp;quot;:t.fadeOut(r.speed,function(){s=e.inArray(t.text(),n);if(s+1==n.length)s=-1;t.text(n[s+1]).fadeIn(r.speed)});break}};setInterval(i,r.speed)})}}(window.jQuery)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wow Reveal Animations ===&lt;br /&gt;
Kostenpflichtig für kommerzielle Seiten. Developer Lizenz ca 99$. Enthalten z.B. bei angelajochum.de. Kann kostenlos geladen werden zum testen.&lt;br /&gt;
&lt;br /&gt;
https://github.com/matthieua/WOW&lt;br /&gt;
&lt;br /&gt;
http://mynameismatthieu.com/WOW/index.html&lt;br /&gt;
&lt;br /&gt;
=== Flippy Text Effekt ===&lt;br /&gt;
https://github.com/yemM/flippy&lt;br /&gt;
&lt;br /&gt;
Verwendet in Hera Template&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
=== Pushy ===&lt;br /&gt;
Gutes Mobiles Off-Canvas Menu&lt;br /&gt;
&lt;br /&gt;
[[Pushy Menu]]&lt;br /&gt;
=== Meanmenu ===&lt;br /&gt;
Verwandelt ein Normales verschachteltes Menu in ein gut zu bediendendes Mobiles Menu.&lt;br /&gt;
&lt;br /&gt;
[[Meanmenu.js - jQuery Plugin]] (1.x,2.x)&lt;br /&gt;
&lt;br /&gt;
=== jQuery Mobile Menu ===&lt;br /&gt;
Mobiles Dropdownmenü aus ul Liste&lt;br /&gt;
&lt;br /&gt;
[[jQuery Mobile Menu - Plugin]]&lt;br /&gt;
&lt;br /&gt;
== Parallax ==&lt;br /&gt;
=== jquery-parallax (jQuery) ===&lt;br /&gt;
Einfach und effektiv.&lt;br /&gt;
&lt;br /&gt;
[[jquery-parallax]]&lt;br /&gt;
&lt;br /&gt;
=== Stellar.js ===&lt;br /&gt;
http://markdalgleish.com/projects/stellar.js/&lt;br /&gt;
&lt;br /&gt;
http://markdalgleish.com/projects/stellar.js/docs/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*! Stellar.js v0.6.2 | Copyright 2014, Mark Dalgleish | http://markdalgleish.com/projects/stellar.js | http://markdalgleish.mit-license.org */&lt;br /&gt;
!function(a,b,c,d){function e(b,c){this.element=b,this.options=a.extend({},g,c),this._defaults=g,this._name=f,this.init()}var f=&amp;quot;stellar&amp;quot;,g={scrollProperty:&amp;quot;scroll&amp;quot;,positionProperty:&amp;quot;position&amp;quot;,horizontalScrolling:!0,verticalScrolling:!0,horizontalOffset:0,verticalOffset:0,responsive:!1,parallaxBackgrounds:!0,parallaxElements:!0,hideDistantElements:!0,hideElement:function(a){a.hide()},showElement:function(a){a.show()}},h={scroll:{getLeft:function(a){return a.scrollLeft()},setLeft:function(a,b){a.scrollLeft(b)},getTop:function(a){return a.scrollTop()},setTop:function(a,b){a.scrollTop(b)}},position:{getLeft:function(a){return-1*parseInt(a.css(&amp;quot;left&amp;quot;),10)},getTop:function(a){return-1*parseInt(a.css(&amp;quot;top&amp;quot;),10)}},margin:{getLeft:function(a){return-1*parseInt(a.css(&amp;quot;margin-left&amp;quot;),10)},getTop:function(a){return-1*parseInt(a.css(&amp;quot;margin-top&amp;quot;),10)}},transform:{getLeft:function(a){var b=getComputedStyle(a[0])[k];return&amp;quot;none&amp;quot;!==b?-1*parseInt(b.match(/(-?[0-9]+)/g)[4],10):0},getTop:function(a){var b=getComputedStyle(a[0])[k];return&amp;quot;none&amp;quot;!==b?-1*parseInt(b.match(/(-?[0-9]+)/g)[5],10):0}}},i={position:{setLeft:function(a,b){a.css(&amp;quot;left&amp;quot;,b)},setTop:function(a,b){a.css(&amp;quot;top&amp;quot;,b)}},transform:{setPosition:function(a,b,c,d,e){a[0].style[k]=&amp;quot;translate3d(&amp;quot;+(b-c)+&amp;quot;px, &amp;quot;+(d-e)+&amp;quot;px, 0)&amp;quot;}}},j=function(){var b,c=/^(Moz|Webkit|Khtml|O|ms|Icab)(?=[A-Z])/,d=a(&amp;quot;script&amp;quot;)[0].style,e=&amp;quot;&amp;quot;;for(b in d)if(c.test(b)){e=b.match(c)[0];break}return&amp;quot;WebkitOpacity&amp;quot;in d&amp;amp;&amp;amp;(e=&amp;quot;Webkit&amp;quot;),&amp;quot;KhtmlOpacity&amp;quot;in d&amp;amp;&amp;amp;(e=&amp;quot;Khtml&amp;quot;),function(a){return e+(e.length&amp;gt;0?a.charAt(0).toUpperCase()+a.slice(1):a)}}(),k=j(&amp;quot;transform&amp;quot;),l=a(&amp;quot;&amp;lt;div /&amp;gt;&amp;quot;,{style:&amp;quot;background:#fff&amp;quot;}).css(&amp;quot;background-position-x&amp;quot;)!==d,m=l?function(a,b,c){a.css({&amp;quot;background-position-x&amp;quot;:b,&amp;quot;background-position-y&amp;quot;:c})}:function(a,b,c){a.css(&amp;quot;background-position&amp;quot;,b+&amp;quot; &amp;quot;+c)},n=l?function(a){return[a.css(&amp;quot;background-position-x&amp;quot;),a.css(&amp;quot;background-position-y&amp;quot;)]}:function(a){return a.css(&amp;quot;background-position&amp;quot;).split(&amp;quot; &amp;quot;)},o=b.requestAnimationFrame||b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||b.oRequestAnimationFrame||b.msRequestAnimationFrame||function(a){setTimeout(a,1e3/60)};e.prototype={init:function(){this.options.name=f+&amp;quot;_&amp;quot;+Math.floor(1e9*Math.random()),this._defineElements(),this._defineGetters(),this._defineSetters(),this._handleWindowLoadAndResize(),this._detectViewport(),this.refresh({firstLoad:!0}),&amp;quot;scroll&amp;quot;===this.options.scrollProperty?this._handleScrollEvent():this._startAnimationLoop()},_defineElements:function(){this.element===c.body&amp;amp;&amp;amp;(this.element=b),this.$scrollElement=a(this.element),this.$element=this.element===b?a(&amp;quot;body&amp;quot;):this.$scrollElement,this.$viewportElement=this.options.viewportElement!==d?a(this.options.viewportElement):this.$scrollElement[0]===b||&amp;quot;scroll&amp;quot;===this.options.scrollProperty?this.$scrollElement:this.$scrollElement.parent()},_defineGetters:function(){var a=this,b=h[a.options.scrollProperty];this._getScrollLeft=function(){return b.getLeft(a.$scrollElement)},this._getScrollTop=function(){return b.getTop(a.$scrollElement)}},_defineSetters:function(){var b=this,c=h[b.options.scrollProperty],d=i[b.options.positionProperty],e=c.setLeft,f=c.setTop;this._setScrollLeft=&amp;quot;function&amp;quot;==typeof e?function(a){e(b.$scrollElement,a)}:a.noop,this._setScrollTop=&amp;quot;function&amp;quot;==typeof f?function(a){f(b.$scrollElement,a)}:a.noop,this._setPosition=d.setPosition||function(a,c,e,f,g){b.options.horizontalScrolling&amp;amp;&amp;amp;d.setLeft(a,c,e),b.options.verticalScrolling&amp;amp;&amp;amp;d.setTop(a,f,g)}},_handleWindowLoadAndResize:function(){var c=this,d=a(b);c.options.responsive&amp;amp;&amp;amp;d.bind(&amp;quot;load.&amp;quot;+this.name,function(){c.refresh()}),d.bind(&amp;quot;resize.&amp;quot;+this.name,function(){c._detectViewport(),c.options.responsive&amp;amp;&amp;amp;c.refresh()})},refresh:function(c){var d=this,e=d._getScrollLeft(),f=d._getScrollTop();c&amp;amp;&amp;amp;c.firstLoad||this._reset(),this._setScrollLeft(0),this._setScrollTop(0),this._setOffsets(),this._findParticles(),this._findBackgrounds(),c&amp;amp;&amp;amp;c.firstLoad&amp;amp;&amp;amp;/WebKit/.test(navigator.userAgent)&amp;amp;&amp;amp;a(b).load(function(){var a=d._getScrollLeft(),b=d._getScrollTop();d._setScrollLeft(a+1),d._setScrollTop(b+1),d._setScrollLeft(a),d._setScrollTop(b)}),this._setScrollLeft(e),this._setScrollTop(f)},_detectViewport:function(){var a=this.$viewportElement.offset(),b=null!==a&amp;amp;&amp;amp;a!==d;this.viewportWidth=this.$viewportElement.width(),this.viewportHeight=this.$viewportElement.height(),this.viewportOffsetTop=b?a.top:0,this.viewportOffsetLeft=b?a.left:0},_findParticles:function(){{var b=this;this._getScrollLeft(),this._getScrollTop()}if(this.particles!==d)for(var c=this.particles.length-1;c&amp;gt;=0;c--)this.particles[c].$element.data(&amp;quot;stellar-elementIsActive&amp;quot;,d);this.particles=[],this.options.parallaxElements&amp;amp;&amp;amp;this.$element.find(&amp;quot;[data-stellar-ratio]&amp;quot;).each(function(){var c,e,f,g,h,i,j,k,l,m=a(this),n=0,o=0,p=0,q=0;if(m.data(&amp;quot;stellar-elementIsActive&amp;quot;)){if(m.data(&amp;quot;stellar-elementIsActive&amp;quot;)!==this)return}else m.data(&amp;quot;stellar-elementIsActive&amp;quot;,this);b.options.showElement(m),m.data(&amp;quot;stellar-startingLeft&amp;quot;)?(m.css(&amp;quot;left&amp;quot;,m.data(&amp;quot;stellar-startingLeft&amp;quot;)),m.css(&amp;quot;top&amp;quot;,m.data(&amp;quot;stellar-startingTop&amp;quot;))):(m.data(&amp;quot;stellar-startingLeft&amp;quot;,m.css(&amp;quot;left&amp;quot;)),m.data(&amp;quot;stellar-startingTop&amp;quot;,m.css(&amp;quot;top&amp;quot;))),f=m.position().left,g=m.position().top,h=&amp;quot;auto&amp;quot;===m.css(&amp;quot;margin-left&amp;quot;)?0:parseInt(m.css(&amp;quot;margin-left&amp;quot;),10),i=&amp;quot;auto&amp;quot;===m.css(&amp;quot;margin-top&amp;quot;)?0:parseInt(m.css(&amp;quot;margin-top&amp;quot;),10),k=m.offset().left-h,l=m.offset().top-i,m.parents().each(function(){var b=a(this);return b.data(&amp;quot;stellar-offset-parent&amp;quot;)===!0?(n=p,o=q,j=b,!1):(p+=b.position().left,void(q+=b.position().top))}),c=m.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?m.data(&amp;quot;stellar-horizontal-offset&amp;quot;):j!==d&amp;amp;&amp;amp;j.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?j.data(&amp;quot;stellar-horizontal-offset&amp;quot;):b.horizontalOffset,e=m.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?m.data(&amp;quot;stellar-vertical-offset&amp;quot;):j!==d&amp;amp;&amp;amp;j.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?j.data(&amp;quot;stellar-vertical-offset&amp;quot;):b.verticalOffset,b.particles.push({$element:m,$offsetParent:j,isFixed:&amp;quot;fixed&amp;quot;===m.css(&amp;quot;position&amp;quot;),horizontalOffset:c,verticalOffset:e,startingPositionLeft:f,startingPositionTop:g,startingOffsetLeft:k,startingOffsetTop:l,parentOffsetLeft:n,parentOffsetTop:o,stellarRatio:m.data(&amp;quot;stellar-ratio&amp;quot;)!==d?m.data(&amp;quot;stellar-ratio&amp;quot;):1,width:m.outerWidth(!0),height:m.outerHeight(!0),isHidden:!1})})},_findBackgrounds:function(){var b,c=this,e=this._getScrollLeft(),f=this._getScrollTop();this.backgrounds=[],this.options.parallaxBackgrounds&amp;amp;&amp;amp;(b=this.$element.find(&amp;quot;[data-stellar-background-ratio]&amp;quot;),this.$element.data(&amp;quot;stellar-background-ratio&amp;quot;)&amp;amp;&amp;amp;(b=b.add(this.$element)),b.each(function(){var b,g,h,i,j,k,l,o=a(this),p=n(o),q=0,r=0,s=0,t=0;if(o.data(&amp;quot;stellar-backgroundIsActive&amp;quot;)){if(o.data(&amp;quot;stellar-backgroundIsActive&amp;quot;)!==this)return}else o.data(&amp;quot;stellar-backgroundIsActive&amp;quot;,this);o.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;)?m(o,o.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;),o.data(&amp;quot;stellar-backgroundStartingTop&amp;quot;)):(o.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;,p[0]),o.data(&amp;quot;stellar-backgroundStartingTop&amp;quot;,p[1])),h=&amp;quot;auto&amp;quot;===o.css(&amp;quot;margin-left&amp;quot;)?0:parseInt(o.css(&amp;quot;margin-left&amp;quot;),10),i=&amp;quot;auto&amp;quot;===o.css(&amp;quot;margin-top&amp;quot;)?0:parseInt(o.css(&amp;quot;margin-top&amp;quot;),10),j=o.offset().left-h-e,k=o.offset().top-i-f,o.parents().each(function(){var b=a(this);return b.data(&amp;quot;stellar-offset-parent&amp;quot;)===!0?(q=s,r=t,l=b,!1):(s+=b.position().left,void(t+=b.position().top))}),b=o.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?o.data(&amp;quot;stellar-horizontal-offset&amp;quot;):l!==d&amp;amp;&amp;amp;l.data(&amp;quot;stellar-horizontal-offset&amp;quot;)!==d?l.data(&amp;quot;stellar-horizontal-offset&amp;quot;):c.horizontalOffset,g=o.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?o.data(&amp;quot;stellar-vertical-offset&amp;quot;):l!==d&amp;amp;&amp;amp;l.data(&amp;quot;stellar-vertical-offset&amp;quot;)!==d?l.data(&amp;quot;stellar-vertical-offset&amp;quot;):c.verticalOffset,c.backgrounds.push({$element:o,$offsetParent:l,isFixed:&amp;quot;fixed&amp;quot;===o.css(&amp;quot;background-attachment&amp;quot;),horizontalOffset:b,verticalOffset:g,startingValueLeft:p[0],startingValueTop:p[1],startingBackgroundPositionLeft:isNaN(parseInt(p[0],10))?0:parseInt(p[0],10),startingBackgroundPositionTop:isNaN(parseInt(p[1],10))?0:parseInt(p[1],10),startingPositionLeft:o.position().left,startingPositionTop:o.position().top,startingOffsetLeft:j,startingOffsetTop:k,parentOffsetLeft:q,parentOffsetTop:r,stellarRatio:o.data(&amp;quot;stellar-background-ratio&amp;quot;)===d?1:o.data(&amp;quot;stellar-background-ratio&amp;quot;)})}))},_reset:function(){var a,b,c,d,e;for(e=this.particles.length-1;e&amp;gt;=0;e--)a=this.particles[e],b=a.$element.data(&amp;quot;stellar-startingLeft&amp;quot;),c=a.$element.data(&amp;quot;stellar-startingTop&amp;quot;),this._setPosition(a.$element,b,b,c,c),this.options.showElement(a.$element),a.$element.data(&amp;quot;stellar-startingLeft&amp;quot;,null).data(&amp;quot;stellar-elementIsActive&amp;quot;,null).data(&amp;quot;stellar-backgroundIsActive&amp;quot;,null);for(e=this.backgrounds.length-1;e&amp;gt;=0;e--)d=this.backgrounds[e],d.$element.data(&amp;quot;stellar-backgroundStartingLeft&amp;quot;,null).data(&amp;quot;stellar-backgroundStartingTop&amp;quot;,null),m(d.$element,d.startingValueLeft,d.startingValueTop)},destroy:function(){this._reset(),this.$scrollElement.unbind(&amp;quot;resize.&amp;quot;+this.name).unbind(&amp;quot;scroll.&amp;quot;+this.name),this._animationLoop=a.noop,a(b).unbind(&amp;quot;load.&amp;quot;+this.name).unbind(&amp;quot;resize.&amp;quot;+this.name)},_setOffsets:function(){var c=this,d=a(b);d.unbind(&amp;quot;resize.horizontal-&amp;quot;+this.name).unbind(&amp;quot;resize.vertical-&amp;quot;+this.name),&amp;quot;function&amp;quot;==typeof this.options.horizontalOffset?(this.horizontalOffset=this.options.horizontalOffset(),d.bind(&amp;quot;resize.horizontal-&amp;quot;+this.name,function(){c.horizontalOffset=c.options.horizontalOffset()})):this.horizontalOffset=this.options.horizontalOffset,&amp;quot;function&amp;quot;==typeof this.options.verticalOffset?(this.verticalOffset=this.options.verticalOffset(),d.bind(&amp;quot;resize.vertical-&amp;quot;+this.name,function(){c.verticalOffset=c.options.verticalOffset()})):this.verticalOffset=this.options.verticalOffset},_repositionElements:function(){var a,b,c,d,e,f,g,h,i,j,k=this._getScrollLeft(),l=this._getScrollTop(),n=!0,o=!0;if(this.currentScrollLeft!==k||this.currentScrollTop!==l||this.currentWidth!==this.viewportWidth||this.currentHeight!==this.viewportHeight){for(this.currentScrollLeft=k,this.currentScrollTop=l,this.currentWidth=this.viewportWidth,this.currentHeight=this.viewportHeight,j=this.particles.length-1;j&amp;gt;=0;j--)a=this.particles[j],b=a.isFixed?1:0,this.options.horizontalScrolling?(f=(k+a.horizontalOffset+this.viewportOffsetLeft+a.startingPositionLeft-a.startingOffsetLeft+a.parentOffsetLeft)*-(a.stellarRatio+b-1)+a.startingPositionLeft,h=f-a.startingPositionLeft+a.startingOffsetLeft):(f=a.startingPositionLeft,h=a.startingOffsetLeft),this.options.verticalScrolling?(g=(l+a.verticalOffset+this.viewportOffsetTop+a.startingPositionTop-a.startingOffsetTop+a.parentOffsetTop)*-(a.stellarRatio+b-1)+a.startingPositionTop,i=g-a.startingPositionTop+a.startingOffsetTop):(g=a.startingPositionTop,i=a.startingOffsetTop),this.options.hideDistantElements&amp;amp;&amp;amp;(o=!this.options.horizontalScrolling||h+a.width&amp;gt;(a.isFixed?0:k)&amp;amp;&amp;amp;h&amp;lt;(a.isFixed?0:k)+this.viewportWidth+this.viewportOffsetLeft,n=!this.options.verticalScrolling||i+a.height&amp;gt;(a.isFixed?0:l)&amp;amp;&amp;amp;i&amp;lt;(a.isFixed?0:l)+this.viewportHeight+this.viewportOffsetTop),o&amp;amp;&amp;amp;n?(a.isHidden&amp;amp;&amp;amp;(this.options.showElement(a.$element),a.isHidden=!1),this._setPosition(a.$element,f,a.startingPositionLeft,g,a.startingPositionTop)):a.isHidden||(this.options.hideElement(a.$element),a.isHidden=!0);for(j=this.backgrounds.length-1;j&amp;gt;=0;j--)c=this.backgrounds[j],b=c.isFixed?0:1,d=this.options.horizontalScrolling?(k+c.horizontalOffset-this.viewportOffsetLeft-c.startingOffsetLeft+c.parentOffsetLeft-c.startingBackgroundPositionLeft)*(b-c.stellarRatio)+&amp;quot;px&amp;quot;:c.startingValueLeft,e=this.options.verticalScrolling?(l+c.verticalOffset-this.viewportOffsetTop-c.startingOffsetTop+c.parentOffsetTop-c.startingBackgroundPositionTop)*(b-c.stellarRatio)+&amp;quot;px&amp;quot;:c.startingValueTop,m(c.$element,d,e)}},_handleScrollEvent:function(){var a=this,b=!1,c=function(){a._repositionElements(),b=!1},d=function(){b||(o(c),b=!0)};this.$scrollElement.bind(&amp;quot;scroll.&amp;quot;+this.name,d),d()},_startAnimationLoop:function(){var a=this;this._animationLoop=function(){o(a._animationLoop),a._repositionElements()},this._animationLoop()}},a.fn[f]=function(b){var c=arguments;return b===d||&amp;quot;object&amp;quot;==typeof b?this.each(function(){a.data(this,&amp;quot;plugin_&amp;quot;+f)||a.data(this,&amp;quot;plugin_&amp;quot;+f,new e(this,b))}):&amp;quot;string&amp;quot;==typeof b&amp;amp;&amp;amp;&amp;quot;_&amp;quot;!==b[0]&amp;amp;&amp;amp;&amp;quot;init&amp;quot;!==b?this.each(function(){var d=a.data(this,&amp;quot;plugin_&amp;quot;+f);d instanceof e&amp;amp;&amp;amp;&amp;quot;function&amp;quot;==typeof d[b]&amp;amp;&amp;amp;d[b].apply(d,Array.prototype.slice.call(c,1)),&amp;quot;destroy&amp;quot;===b&amp;amp;&amp;amp;a.data(this,&amp;quot;plugin_&amp;quot;+f,null)}):void 0},a[f]=function(){var c=a(b);return c.stellar.apply(c,Array.prototype.slice.call(arguments,0))},a[f].scrollProperty=h,a[f].positionProperty=i,b.Stellar=e}(jQuery,this,document);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Lightbox, Gallery &amp;amp; co ==&lt;br /&gt;
&lt;br /&gt;
=== Chocolat ===&lt;br /&gt;
Nette responsive Lightbox für Anfänger und Profis&lt;br /&gt;
&lt;br /&gt;
http://chocolat.insipi.de&lt;br /&gt;
&lt;br /&gt;
[[Chocolat Lightbox]]&lt;br /&gt;
&lt;br /&gt;
=== Lightbox ===&lt;br /&gt;
Der Klassiker: [[Lightbox jQuery Plugin]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Magnific Popup ===&lt;br /&gt;
Galt lange als DER Nachfolger der Lightbox [[Magnific Popup jQuery Plugin]]&lt;br /&gt;
&lt;br /&gt;
== Isotope / Masonry ==&lt;br /&gt;
[[JavaScript - Masonry / Isotope]]&lt;br /&gt;
&lt;br /&gt;
== Charts / Counter ==&lt;br /&gt;
=== jQuery CountTo ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// jQuery CountTo&lt;br /&gt;
!function(t){&amp;quot;use strict&amp;quot;;function e(t,e){return t.toFixed(e.decimals)}t.fn.countTo=function(e){return e=e||{},t(this).each(function(){function a(){s+=l,c++,n(s),&amp;quot;function&amp;quot;==typeof o.onUpdate&amp;amp;&amp;amp;o.onUpdate.call(i,s),c&amp;gt;=r&amp;amp;&amp;amp;(f.removeData(&amp;quot;countTo&amp;quot;),clearInterval(d.interval),s=o.to,&amp;quot;function&amp;quot;==typeof o.onComplete&amp;amp;&amp;amp;o.onComplete.call(i,s))}function n(t){var e=o.formatter.call(i,t,o);f.text(e)}var o=t.extend({},t.fn.countTo.defaults,{from:t(this).data(&amp;quot;from&amp;quot;),to:t(this).data(&amp;quot;to&amp;quot;),speed:t(this).data(&amp;quot;speed&amp;quot;),refreshInterval:t(this).data(&amp;quot;refresh-interval&amp;quot;),decimals:t(this).data(&amp;quot;decimals&amp;quot;)},e),r=Math.ceil(o.speed/o.refreshInterval),l=(o.to-o.from)/r,i=this,f=t(this),c=0,s=o.from,d=f.data(&amp;quot;countTo&amp;quot;)||{};f.data(&amp;quot;countTo&amp;quot;,d),d.interval&amp;amp;&amp;amp;clearInterval(d.interval),d.interval=setInterval(a,o.refreshInterval),n(s)})},t.fn.countTo.defaults={from:0,to:0,speed:1e3,refreshInterval:100,decimals:0,formatter:e,onUpdate:null,onComplete:null}}(jQuery);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Easy Pie Chart ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/**!&lt;br /&gt;
 * easyPieChart&lt;br /&gt;
 * Lightweight plugin to render simple, animated and retina optimized pie charts&lt;br /&gt;
 *&lt;br /&gt;
 * @license &lt;br /&gt;
 * @author Robert Fleischmann &amp;lt;rendro87@gmail.com&amp;gt; (http://robert-fleischmann.de)&lt;br /&gt;
 * @version 2.1.6&lt;br /&gt;
 **/&lt;br /&gt;
!function(a,b){&amp;quot;object&amp;quot;==typeof exports?module.exports=b(require(&amp;quot;jquery&amp;quot;)):&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define([&amp;quot;jquery&amp;quot;],b):b(a.jQuery)}(this,function(a){var b=function(a,b){var c,d=document.createElement(&amp;quot;canvas&amp;quot;);a.appendChild(d),&amp;quot;undefined&amp;quot;!=typeof G_vmlCanvasManager&amp;amp;&amp;amp;G_vmlCanvasManager.initElement(d);var e=d.getContext(&amp;quot;2d&amp;quot;);d.width=d.height=b.size;var f=1;window.devicePixelRatio&amp;gt;1&amp;amp;&amp;amp;(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,&amp;quot;px&amp;quot;].join(&amp;quot;&amp;quot;),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&amp;amp;&amp;amp;b.scaleLength&amp;amp;&amp;amp;(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(-1,c||0),1);var d=0&amp;gt;=c?!0:!1;e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,d),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d&amp;gt;0;--d)d%6===0?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&amp;amp;&amp;amp;i(),b.trackColor&amp;amp;&amp;amp;h(b.trackColor,b.trackWidth||b.lineWidth,1)};this.getCanvas=function(){return d},this.getCtx=function(){return e},this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&amp;amp;&amp;amp;e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d=&amp;quot;function&amp;quot;==typeof b.barColor?b.barColor(a):b.barColor,h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate.duration),g=b.easing(this,f,a,c-a,b.animate.duration);this.draw(g),b.onStep(a,c,g),f&amp;gt;=b.animate.duration?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:&amp;quot;#ef1e25&amp;quot;,trackColor:&amp;quot;#f9f9f9&amp;quot;,scaleColor:&amp;quot;#dfe0e0&amp;quot;,scaleLength:5,lineCap:&amp;quot;round&amp;quot;,lineWidth:3,trackWidth:void 0,size:110,rotate:0,animate:{duration:1e3,enabled:!0},easing:function(a,b,c,d,e){return b/=e/2,1&amp;gt;b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if(&amp;quot;undefined&amp;quot;!=typeof b)d.renderer=b;else{if(&amp;quot;undefined&amp;quot;==typeof SVGRenderer)throw new Error(&amp;quot;Please load either the SVG- or the CanvasRenderer&amp;quot;);d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&amp;amp;&amp;amp;(e[b]=c&amp;amp;&amp;amp;&amp;quot;undefined&amp;quot;!=typeof c[b]?c[b]:d[b],&amp;quot;function&amp;quot;==typeof e[b]&amp;amp;&amp;amp;(e[b]=e[b].bind(this)));e.easing=&amp;quot;string&amp;quot;==typeof e.easing&amp;amp;&amp;amp;&amp;quot;undefined&amp;quot;!=typeof jQuery&amp;amp;&amp;amp;jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,&amp;quot;number&amp;quot;==typeof e.animate&amp;amp;&amp;amp;(e.animate={duration:e.animate,enabled:!0}),&amp;quot;boolean&amp;quot;!=typeof e.animate||e.animate||(e.animate={duration:1e3,enabled:e.animate}),this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&amp;amp;&amp;amp;a.dataset.percent?this.update(parseFloat(a.dataset.percent)):a.getAttribute&amp;amp;&amp;amp;a.getAttribute(&amp;quot;data-percent&amp;quot;)&amp;amp;&amp;amp;this.update(parseFloat(a.getAttribute(&amp;quot;data-percent&amp;quot;)))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate.enabled?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),this.disableAnimation=function(){return e.animate.enabled=!1,this},this.enableAnimation=function(){return e.animate.enabled=!0,this},g()};a.fn.easyPieChart=function(b){return this.each(function(){var d;a.data(this,&amp;quot;easyPieChart&amp;quot;)||(d=a.extend({},b,a(this).data()),a.data(this,&amp;quot;easyPieChart&amp;quot;,new c(this,d)))})}});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Video ==&lt;br /&gt;
&lt;br /&gt;
=== FitVids ===&lt;br /&gt;
Embedding Videos from YouTube, Vimeo,...&lt;br /&gt;
&lt;br /&gt;
[[FitVids jQuery Plugin]] https://github.com/davatron5000/FitVids.js&lt;br /&gt;
&lt;br /&gt;
=== Vide - Video Backgrounds ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *  Vide - v0.5.1&lt;br /&gt;
 *  Easy as hell jQuery plugin for video backgrounds.&lt;br /&gt;
 *  http://vodkabears.github.io/vide/&lt;br /&gt;
 *&lt;br /&gt;
 *  Made by Ilya Makarov&lt;br /&gt;
 *  Under MIT License&lt;br /&gt;
 */&lt;br /&gt;
!function(a,b){&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define([&amp;quot;jquery&amp;quot;],b):b(&amp;quot;object&amp;quot;==typeof exports?require(&amp;quot;jquery&amp;quot;):a.jQuery)}(this,function(a){&amp;quot;use strict&amp;quot;;function b(a){var b,c,d,e,f,g,h,i={};for(f=a.replace(/\s*:\s*/g,&amp;quot;:&amp;quot;).replace(/\s*,\s*/g,&amp;quot;,&amp;quot;).split(&amp;quot;,&amp;quot;),h=0,g=f.length;h&amp;lt;g&amp;amp;&amp;amp;(c=f[h],c.search(/^(http|https|ftp):\/\//)===-1&amp;amp;&amp;amp;c.search(&amp;quot;:&amp;quot;)!==-1);h++)b=c.indexOf(&amp;quot;:&amp;quot;),d=c.substring(0,b),e=c.substring(b+1),e||(e=void 0),&amp;quot;string&amp;quot;==typeof e&amp;amp;&amp;amp;(e=&amp;quot;true&amp;quot;===e||&amp;quot;false&amp;quot;!==e&amp;amp;&amp;amp;e),&amp;quot;string&amp;quot;==typeof e&amp;amp;&amp;amp;(e=isNaN(e)?e:+e),i[d]=e;return null==d&amp;amp;&amp;amp;null==e?a:i}function c(a){a=&amp;quot;&amp;quot;+a;var b,c,d,e=a.split(/\s+/),f=&amp;quot;50%&amp;quot;,g=&amp;quot;50%&amp;quot;;for(d=0,b=e.length;d&amp;lt;b;d++)c=e[d],&amp;quot;left&amp;quot;===c?f=&amp;quot;0%&amp;quot;:&amp;quot;right&amp;quot;===c?f=&amp;quot;100%&amp;quot;:&amp;quot;top&amp;quot;===c?g=&amp;quot;0%&amp;quot;:&amp;quot;bottom&amp;quot;===c?g=&amp;quot;100%&amp;quot;:&amp;quot;center&amp;quot;===c?0===d?f=&amp;quot;50%&amp;quot;:g=&amp;quot;50%&amp;quot;:0===d?f=c:g=c;return{x:f,y:g}}function d(b,c){var d=function(){c(this.src)};a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.gif&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d),a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.jpg&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d),a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.jpeg&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d),a(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;+b+&amp;#039;.png&amp;quot;&amp;gt;&amp;#039;).on(&amp;quot;load&amp;quot;,d)}function e(c,d,e){if(this.$element=a(c),&amp;quot;string&amp;quot;==typeof d&amp;amp;&amp;amp;(d=b(d)),e?&amp;quot;string&amp;quot;==typeof e&amp;amp;&amp;amp;(e=b(e)):e={},&amp;quot;string&amp;quot;==typeof d)d=d.replace(/\.\w*$/,&amp;quot;&amp;quot;);else if(&amp;quot;object&amp;quot;==typeof d)for(var f in d)d.hasOwnProperty(f)&amp;amp;&amp;amp;(d[f]=d[f].replace(/\.\w*$/,&amp;quot;&amp;quot;));this.settings=a.extend({},g,e),this.path=d;try{this.init()}catch(i){if(i.message!==h)throw i}}var f=&amp;quot;vide&amp;quot;,g={volume:1,playbackRate:1,muted:!0,loop:!0,autoplay:!0,position:&amp;quot;50% 50%&amp;quot;,posterType:&amp;quot;detect&amp;quot;,resizing:!0,bgColor:&amp;quot;transparent&amp;quot;,className:&amp;quot;&amp;quot;},h=&amp;quot;Not implemented&amp;quot;;e.prototype.init=function(){var b,e,f=this,g=f.path,i=g,j=&amp;quot;&amp;quot;,k=f.$element,l=f.settings,m=c(l.position),n=l.posterType;e=f.$wrapper=a(&amp;quot;&amp;lt;div&amp;gt;&amp;quot;).addClass(l.className).css({position:&amp;quot;absolute&amp;quot;,&amp;quot;z-index&amp;quot;:-1,top:0,left:0,bottom:0,right:0,overflow:&amp;quot;hidden&amp;quot;,&amp;quot;-webkit-background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;-moz-background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;-o-background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;background-size&amp;quot;:&amp;quot;cover&amp;quot;,&amp;quot;background-color&amp;quot;:l.bgColor,&amp;quot;background-repeat&amp;quot;:&amp;quot;no-repeat&amp;quot;,&amp;quot;background-position&amp;quot;:m.x+&amp;quot; &amp;quot;+m.y}),&amp;quot;object&amp;quot;==typeof g&amp;amp;&amp;amp;(g.poster?i=g.poster:g.mp4?i=g.mp4:g.webm?i=g.webm:g.ogv&amp;amp;&amp;amp;(i=g.ogv)),&amp;quot;detect&amp;quot;===n?d(i,function(a){e.css(&amp;quot;background-image&amp;quot;,&amp;quot;url(&amp;quot;+a+&amp;quot;)&amp;quot;)}):&amp;quot;none&amp;quot;!==n&amp;amp;&amp;amp;e.css(&amp;quot;background-image&amp;quot;,&amp;quot;url(&amp;quot;+i+&amp;quot;.&amp;quot;+n+&amp;quot;)&amp;quot;),&amp;quot;static&amp;quot;===k.css(&amp;quot;position&amp;quot;)&amp;amp;&amp;amp;k.css(&amp;quot;position&amp;quot;,&amp;quot;relative&amp;quot;),k.prepend(e),&amp;quot;object&amp;quot;==typeof g?(g.mp4&amp;amp;&amp;amp;(j+=&amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;+g.mp4+&amp;#039;.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;&amp;#039;),g.webm&amp;amp;&amp;amp;(j+=&amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;+g.webm+&amp;#039;.webm&amp;quot; type=&amp;quot;video/webm&amp;quot;&amp;gt;&amp;#039;),g.ogv&amp;amp;&amp;amp;(j+=&amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;+g.ogv+&amp;#039;.ogv&amp;quot; type=&amp;quot;video/ogg&amp;quot;&amp;gt;&amp;#039;),b=f.$video=a(&amp;quot;&amp;lt;video&amp;gt;&amp;quot;+j+&amp;quot;&amp;lt;/video&amp;gt;&amp;quot;)):b=f.$video=a(&amp;#039;&amp;lt;video&amp;gt;&amp;lt;source src=&amp;quot;&amp;#039;+g+&amp;#039;.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;&amp;#039;+g+&amp;#039;.webm&amp;quot; type=&amp;quot;video/webm&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;&amp;#039;+g+&amp;#039;.ogv&amp;quot; type=&amp;quot;video/ogg&amp;quot;&amp;gt;&amp;lt;/video&amp;gt;&amp;#039;);try{b.prop({autoplay:l.autoplay,loop:l.loop,volume:l.volume,muted:l.muted,defaultMuted:l.muted,playbackRate:l.playbackRate,defaultPlaybackRate:l.playbackRate})}catch(o){throw new Error(h)}b.css({margin:&amp;quot;auto&amp;quot;,position:&amp;quot;absolute&amp;quot;,&amp;quot;z-index&amp;quot;:-1,top:m.y,left:m.x,&amp;quot;-webkit-transform&amp;quot;:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,&amp;quot;-ms-transform&amp;quot;:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,&amp;quot;-moz-transform&amp;quot;:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,transform:&amp;quot;translate(-&amp;quot;+m.x+&amp;quot;, -&amp;quot;+m.y+&amp;quot;)&amp;quot;,visibility:&amp;quot;hidden&amp;quot;,opacity:0}).one(&amp;quot;canplaythrough.vide&amp;quot;,function(){f.resize()}).one(&amp;quot;playing.vide&amp;quot;,function(){b.css({visibility:&amp;quot;visible&amp;quot;,opacity:1}),e.css(&amp;quot;background-image&amp;quot;,&amp;quot;none&amp;quot;)}),k.on(&amp;quot;resize.vide&amp;quot;,function(){l.resizing&amp;amp;&amp;amp;f.resize()}),e.append(b)},e.prototype.getVideoObject=function(){return this.$video[0]},e.prototype.resize=function(){if(this.$video){var a=this.$wrapper,b=this.$video,c=b[0],d=c.videoHeight,e=c.videoWidth,f=a.height(),g=a.width();g/e&amp;gt;f/d?b.css({width:g+2,height:&amp;quot;auto&amp;quot;}):b.css({width:&amp;quot;auto&amp;quot;,height:f+2})}},e.prototype.destroy=function(){delete a[f].lookup[this.index],this.$video&amp;amp;&amp;amp;this.$video.off(f),this.$element.off(f).removeData(f),this.$wrapper.remove()},a[f]={lookup:[]},a.fn[f]=function(b,c){var d;return this.each(function(){d=a.data(this,f),d&amp;amp;&amp;amp;d.destroy(),d=new e(this,b,c),d.index=a[f].lookup.push(d)-1,a.data(this,f,d)}),this},a(document).ready(function(){var b=a(window);b.on(&amp;quot;resize.vide&amp;quot;,function(){for(var b,c=a[f].lookup.length,d=0;d&amp;lt;c;d++)b=a[f].lookup[d],b&amp;amp;&amp;amp;b.settings.resizing&amp;amp;&amp;amp;b.resize()}),b.on(&amp;quot;unload.vide&amp;quot;,function(){return!1}),a(document).find(&amp;quot;[data-vide-bg]&amp;quot;).each(function(b,c){var d=a(c),e=d.data(&amp;quot;vide-options&amp;quot;),g=d.data(&amp;quot;vide-bg&amp;quot;);d[f](g,e)})})});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vegas Slider ===&lt;br /&gt;
Siehe Extra Seite&lt;br /&gt;
&lt;br /&gt;
== Slider &amp;amp; Carousel ==&lt;br /&gt;
=== Slick Carousel &amp;amp; Slider ===&lt;br /&gt;
Der kann fast alles Slider. Gehört mit Owl Slider zu den vielseitigen.&lt;br /&gt;
&lt;br /&gt;
http://kenwheeler.github.io/slick/&lt;br /&gt;
&lt;br /&gt;
=== Owl Carousel===&lt;br /&gt;
[[Owl Carousel - JavaScript Plugin]]&lt;br /&gt;
&lt;br /&gt;
=== Revolution Slider ===&lt;br /&gt;
https://revolution.themepunch.com/examples-jquery/&lt;br /&gt;
&lt;br /&gt;
=== FlexSlider ===&lt;br /&gt;
[[FlexSlider - JavaScript Plugin]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vegas Slider ===&lt;br /&gt;
Schlichter aber vielseitiger Slider mit schönem KenBurns Effekt und div. Übergängen. Erfordert etwas JS Kenntnisse wenn mehr angepasst werden soll.&lt;br /&gt;
&lt;br /&gt;
[[JavaScript - Vegas Slider]]&lt;br /&gt;
&lt;br /&gt;
=== MultiScroll.js ===&lt;br /&gt;
http://alvarotrigo.com/multiScroll&lt;br /&gt;
&lt;br /&gt;
Gegenläufiger Scroller&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;jquery.multiscroll.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- This following line is needed in case of using the default easing option or when using another&lt;br /&gt;
 one rather than &amp;quot;linear&amp;quot; or &amp;quot;swing&amp;quot;. You can also add the full jQuery UI instead of this file if you prefer --&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;vendors/jquery.easings.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;jquery.multiscroll.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;multiscroll&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;ms-left&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;ms-right&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;ms-section&amp;quot;&amp;gt;Some section&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DOM Elemente manipulieren ==&lt;br /&gt;
=== Match Heights ===&lt;br /&gt;
Spalten in der Länge anpassen. Siehe auch Flex Grid in CSS3&lt;br /&gt;
&lt;br /&gt;
[[Equal Heights]]&lt;br /&gt;
&lt;br /&gt;
[[JavaScript - Match Height]]&lt;br /&gt;
&lt;br /&gt;
=== Fit Viewport ===&lt;br /&gt;
==== Viewport Height ====&lt;br /&gt;
Element an die Höhe des Viewports anpassen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  $(document).ready(function(){&lt;br /&gt;
      $(&amp;quot;#hero&amp;quot;).height($(window).height());&lt;br /&gt;
          $(window).resize(function(){&lt;br /&gt;
              $(&amp;quot;#hero&amp;quot;).height($(window).height());&lt;br /&gt;
      });&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scrolling ==&lt;br /&gt;
Hinweis die meisten Scroll To and ScrollTops lassen sich auch mit einfachen jquery Snippets realisieren. &lt;br /&gt;
=== Einfaches jQuery Scroll To Top ===&lt;br /&gt;
Mehr brauchts nicht :-) [[Scroll ToTop (jQuery)]]&lt;br /&gt;
&lt;br /&gt;
=== Perfect Scrollbar ===&lt;br /&gt;
[[Perfect Scrollbar]]&lt;br /&gt;
&lt;br /&gt;
=== Ariel Fiesler ScrollTo ===&lt;br /&gt;
https://github.com/flesler/jquery.scrollTo&lt;br /&gt;
&lt;br /&gt;
Lightweight, cross-browser and highly customizable animated scrolling with jQuery&lt;br /&gt;
&lt;br /&gt;
=== Ariel Fiesler LocalScroll ===&lt;br /&gt;
https://github.com/flesler/jquery.localScroll&lt;br /&gt;
&lt;br /&gt;
Animated anchor navigation made easy with jQuery&lt;br /&gt;
&lt;br /&gt;
=== Smooth Scroll ===&lt;br /&gt;
Oil for Scrolling - damit ruckelt es nicht so beim Scrollen mit dem Mausrad&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// SmoothScroll for websites v1.4.0 (Balazs Galambosi)&lt;br /&gt;
// http://www.smoothscroll.net/&lt;br /&gt;
//&lt;br /&gt;
// Licensed under the terms of the MIT license.&lt;br /&gt;
//&lt;br /&gt;
// You may use it in your theme if you credit me. &lt;br /&gt;
// It is also free to use on any individual website.&lt;br /&gt;
//&lt;br /&gt;
// Exception:&lt;br /&gt;
// The only restriction is to not publish any  &lt;br /&gt;
// extension for browsers or native application&lt;br /&gt;
// without getting a written permission first.&lt;br /&gt;
//&lt;br /&gt;
!function(){function e(){z.keyboardSupport&amp;amp;&amp;amp;m(&amp;quot;keydown&amp;quot;,a)}function t(){if(!A&amp;amp;&amp;amp;document.body){A=!0;var t=document.body,o=document.documentElement,n=window.innerHeight,r=t.scrollHeight;if(B=document.compatMode.indexOf(&amp;quot;CSS&amp;quot;)&amp;gt;=0?o:t,D=t,e(),top!=self)X=!0;else if(r&amp;gt;n&amp;amp;&amp;amp;(t.offsetHeight&amp;lt;=n||o.offsetHeight&amp;lt;=n)){var a=document.createElement(&amp;quot;div&amp;quot;);a.style.cssText=&amp;quot;position:absolute; z-index:-10000; top:0; left:0; right:0; height:&amp;quot;+B.scrollHeight+&amp;quot;px&amp;quot;,document.body.appendChild(a);var i;T=function(){i||(i=setTimeout(function(){L||(a.style.height=&amp;quot;0&amp;quot;,a.style.height=B.scrollHeight+&amp;quot;px&amp;quot;,i=null)},500))},setTimeout(T,10),m(&amp;quot;resize&amp;quot;,T);var l={attributes:!0,childList:!0,characterData:!1};if(M=new V(T),M.observe(t,l),B.offsetHeight&amp;lt;=n){var c=document.createElement(&amp;quot;div&amp;quot;);c.style.clear=&amp;quot;both&amp;quot;,t.appendChild(c)}}z.fixedBackground||L||(t.style.backgroundAttachment=&amp;quot;scroll&amp;quot;,o.style.backgroundAttachment=&amp;quot;scroll&amp;quot;)}}function o(){M&amp;amp;&amp;amp;M.disconnect(),h(I,r),h(&amp;quot;mousedown&amp;quot;,i),h(&amp;quot;keydown&amp;quot;,a),h(&amp;quot;resize&amp;quot;,T),h(&amp;quot;load&amp;quot;,t)}function n(e,t,o){if(p(t,o),1!=z.accelerationMax){var n=Date.now(),r=n-R;if(r&amp;lt;z.accelerationDelta){var a=(1+50/r)/2;a&amp;gt;1&amp;amp;&amp;amp;(a=Math.min(a,z.accelerationMax),t*=a,o*=a)}R=Date.now()}if(q.push({x:t,y:o,lastX:0&amp;gt;t?.99:-.99,lastY:0&amp;gt;o?.99:-.99,start:Date.now()}),!P){var i=e===document.body,l=function(n){for(var r=Date.now(),a=0,c=0,u=0;u&amp;lt;q.length;u++){var d=q[u],s=r-d.start,f=s&amp;gt;=z.animationTime,m=f?1:s/z.animationTime;z.pulseAlgorithm&amp;amp;&amp;amp;(m=x(m));var h=d.x*m-d.lastX&amp;gt;&amp;gt;0,w=d.y*m-d.lastY&amp;gt;&amp;gt;0;a+=h,c+=w,d.lastX+=h,d.lastY+=w,f&amp;amp;&amp;amp;(q.splice(u,1),u--)}i?window.scrollBy(a,c):(a&amp;amp;&amp;amp;(e.scrollLeft+=a),c&amp;amp;&amp;amp;(e.scrollTop+=c)),t||o||(q=[]),q.length?_(l,e,1e3/z.frameRate+1):P=!1};_(l,e,0),P=!0}}function r(e){A||t();var o=e.target,r=u(o);if(!r||e.defaultPrevented||e.ctrlKey)return!0;if(w(D,&amp;quot;embed&amp;quot;)||w(o,&amp;quot;embed&amp;quot;)&amp;amp;&amp;amp;/\.pdf/i.test(o.src)||w(D,&amp;quot;object&amp;quot;))return!0;var a=-e.wheelDeltaX||e.deltaX||0,i=-e.wheelDeltaY||e.deltaY||0;return K&amp;amp;&amp;amp;(e.wheelDeltaX&amp;amp;&amp;amp;b(e.wheelDeltaX,120)&amp;amp;&amp;amp;(a=-120*(e.wheelDeltaX/Math.abs(e.wheelDeltaX))),e.wheelDeltaY&amp;amp;&amp;amp;b(e.wheelDeltaY,120)&amp;amp;&amp;amp;(i=-120*(e.wheelDeltaY/Math.abs(e.wheelDeltaY)))),a||i||(i=-e.wheelDelta||0),1===e.deltaMode&amp;amp;&amp;amp;(a*=40,i*=40),!z.touchpadSupport&amp;amp;&amp;amp;v(i)?!0:(Math.abs(a)&amp;gt;1.2&amp;amp;&amp;amp;(a*=z.stepSize/120),Math.abs(i)&amp;gt;1.2&amp;amp;&amp;amp;(i*=z.stepSize/120),n(r,a,i),e.preventDefault(),void l())}function a(e){var t=e.target,o=e.ctrlKey||e.altKey||e.metaKey||e.shiftKey&amp;amp;&amp;amp;e.keyCode!==N.spacebar;document.contains(D)||(D=document.activeElement);var r=/^(textarea|select|embed|object)$/i,a=/^(button|submit|radio|checkbox|file|color|image)$/i;if(r.test(t.nodeName)||w(t,&amp;quot;input&amp;quot;)&amp;amp;&amp;amp;!a.test(t.type)||w(D,&amp;quot;video&amp;quot;)||y(e)||t.isContentEditable||e.defaultPrevented||o)return!0;if((w(t,&amp;quot;button&amp;quot;)||w(t,&amp;quot;input&amp;quot;)&amp;amp;&amp;amp;a.test(t.type))&amp;amp;&amp;amp;e.keyCode===N.spacebar)return!0;var i,c=0,d=0,s=u(D),f=s.clientHeight;switch(s==document.body&amp;amp;&amp;amp;(f=window.innerHeight),e.keyCode){case N.up:d=-z.arrowScroll;break;case N.down:d=z.arrowScroll;break;case N.spacebar:i=e.shiftKey?1:-1,d=-i*f*.9;break;case N.pageup:d=.9*-f;break;case N.pagedown:d=.9*f;break;case N.home:d=-s.scrollTop;break;case N.end:var m=s.scrollHeight-s.scrollTop-f;d=m&amp;gt;0?m+10:0;break;case N.left:c=-z.arrowScroll;break;case N.right:c=z.arrowScroll;break;default:return!0}n(s,c,d),e.preventDefault(),l()}function i(e){D=e.target}function l(){clearTimeout(E),E=setInterval(function(){F={}},1e3)}function c(e,t){for(var o=e.length;o--;)F[j(e[o])]=t;return t}function u(e){var t=[],o=document.body,n=B.scrollHeight;do{var r=F[j(e)];if(r)return c(t,r);if(t.push(e),n===e.scrollHeight){var a=s(B)&amp;amp;&amp;amp;s(o),i=a||f(B);if(X&amp;amp;&amp;amp;d(B)||!X&amp;amp;&amp;amp;i)return c(t,$())}else if(d(e)&amp;amp;&amp;amp;f(e))return c(t,e)}while(e=e.parentElement)}function d(e){return e.clientHeight+10&amp;lt;e.scrollHeight}function s(e){var t=getComputedStyle(e,&amp;quot;&amp;quot;).getPropertyValue(&amp;quot;overflow-y&amp;quot;);return&amp;quot;hidden&amp;quot;!==t}function f(e){var t=getComputedStyle(e,&amp;quot;&amp;quot;).getPropertyValue(&amp;quot;overflow-y&amp;quot;);return&amp;quot;scroll&amp;quot;===t||&amp;quot;auto&amp;quot;===t}function m(e,t){window.addEventListener(e,t,!1)}function h(e,t){window.removeEventListener(e,t,!1)}function w(e,t){return(e.nodeName||&amp;quot;&amp;quot;).toLowerCase()===t.toLowerCase()}function p(e,t){e=e&amp;gt;0?1:-1,t=t&amp;gt;0?1:-1,(Y.x!==e||Y.y!==t)&amp;amp;&amp;amp;(Y.x=e,Y.y=t,q=[],R=0)}function v(e){return e?(O.length||(O=[e,e,e]),e=Math.abs(e),O.push(e),O.shift(),clearTimeout(H),H=setTimeout(function(){window.localStorage&amp;amp;&amp;amp;(localStorage.SS_deltaBuffer=O.join(&amp;quot;,&amp;quot;))},1e3),!g(120)&amp;amp;&amp;amp;!g(100)):void 0}function b(e,t){return Math.floor(e/t)==e/t}function g(e){return b(O[0],e)&amp;amp;&amp;amp;b(O[1],e)&amp;amp;&amp;amp;b(O[2],e)}function y(e){var t=e.target,o=!1;if(-1!=document.URL.indexOf(&amp;quot;www.youtube.com/watch&amp;quot;))do if(o=t.classList&amp;amp;&amp;amp;t.classList.contains(&amp;quot;html5-video-controls&amp;quot;))break;while(t=t.parentNode);return o}function S(e){var t,o,n;return e*=z.pulseScale,1&amp;gt;e?t=e-(1-Math.exp(-e)):(o=Math.exp(-1),e-=1,n=1-Math.exp(-e),t=o+n*(1-o)),t*z.pulseNormalize}function x(e){return e&amp;gt;=1?1:0&amp;gt;=e?0:(1==z.pulseNormalize&amp;amp;&amp;amp;(z.pulseNormalize/=S(1)),S(e))}function k(e){for(var t in e)C.hasOwnProperty(t)&amp;amp;&amp;amp;(z[t]=e[t])}var D,M,T,E,H,C={frameRate:150,animationTime:400,stepSize:100,pulseAlgorithm:!0,pulseScale:4,pulseNormalize:1,accelerationDelta:50,accelerationMax:3,keyboardSupport:!0,arrowScroll:50,touchpadSupport:!1,fixedBackground:!0,excluded:&amp;quot;&amp;quot;},z=C,L=!1,X=!1,Y={x:0,y:0},A=!1,B=document.documentElement,O=[],K=/^Mac/.test(navigator.platform),N={left:37,up:38,right:39,down:40,spacebar:32,pageup:33,pagedown:34,end:35,home:36},q=[],P=!1,R=Date.now(),j=function(){var e=0;return function(t){return t.uniqueID||(t.uniqueID=e++)}}(),F={};window.localStorage&amp;amp;&amp;amp;localStorage.SS_deltaBuffer&amp;amp;&amp;amp;(O=localStorage.SS_deltaBuffer.split(&amp;quot;,&amp;quot;));var I,_=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(e,t,o){window.setTimeout(e,o||1e3/60)}}(),V=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,$=function(){var e;return function(){if(!e){var t=document.createElement(&amp;quot;div&amp;quot;);t.style.cssText=&amp;quot;height:10000px;width:1px;&amp;quot;,document.body.appendChild(t);var o=document.body.scrollTop;document.documentElement.scrollTop;window.scrollBy(0,1),e=document.body.scrollTop!=o?document.body:document.documentElement,window.scrollBy(0,-1),document.body.removeChild(t)}return e}}(),U=window.navigator.userAgent,W=/Edge/.test(U),G=/chrome/i.test(U)&amp;amp;&amp;amp;!W,J=/safari/i.test(U)&amp;amp;&amp;amp;!W,Q=/mobile/i.test(U),Z=(G||J)&amp;amp;&amp;amp;!Q;&amp;quot;onwheel&amp;quot;in document.createElement(&amp;quot;div&amp;quot;)?I=&amp;quot;wheel&amp;quot;:&amp;quot;onmousewheel&amp;quot;in document.createElement(&amp;quot;div&amp;quot;)&amp;amp;&amp;amp;(I=&amp;quot;mousewheel&amp;quot;),I&amp;amp;&amp;amp;Z&amp;amp;&amp;amp;(m(I,r),m(&amp;quot;mousedown&amp;quot;,i),m(&amp;quot;load&amp;quot;,t)),k.destroy=o,window.SmoothScrollOptions&amp;amp;&amp;amp;k(window.SmoothScrollOptions),&amp;quot;function&amp;quot;==typeof define&amp;amp;&amp;amp;define.amd?define(function(){return k}):&amp;quot;object&amp;quot;==typeof exports?module.exports=k:window.SmoothScroll=k}();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Typography ==&lt;br /&gt;
=== Letter.js ===&lt;br /&gt;
Zerpflückt Texte und wrappt Buchstaben / Wörter / Zeilen in durchnummerierte Klassen. Diese kann man dann cool Stylen.&lt;br /&gt;
&lt;br /&gt;
https://github.com/davatron5000/Lettering.js&lt;br /&gt;
&lt;br /&gt;
=== Fittext ===&lt;br /&gt;
Responsive Textgrößen in Typographie-Spielereien für Überschriften etc.&lt;br /&gt;
&lt;br /&gt;
http://fittextjs.com/&lt;br /&gt;
&lt;br /&gt;
== Google Maps mit gmaps.js ==&lt;br /&gt;
https://hpneo.github.io/gmaps/&lt;br /&gt;
Einfache Karte&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
new GMaps({&lt;br /&gt;
  div: &amp;#039;#map&amp;#039;,&lt;br /&gt;
  lat: -12.043333,&lt;br /&gt;
  lng: -77.028333&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Grey Style Karte&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//Google map	&lt;br /&gt;
/*global $:false */&lt;br /&gt;
    var map;&lt;br /&gt;
    $(document).ready(function(){&amp;quot;use strict&amp;quot;;&lt;br /&gt;
      map = new GMaps({&lt;br /&gt;
    disableDefaultUI: true,&lt;br /&gt;
    scrollwheel: false,&lt;br /&gt;
        el: &amp;#039;#map&amp;#039;,&lt;br /&gt;
        lat: 48.4912812,&lt;br /&gt;
        lng: 9.2175255&lt;br /&gt;
      });&lt;br /&gt;
      map.drawOverlay({&lt;br /&gt;
        lat: map.getCenter().lat(),&lt;br /&gt;
        lng: map.getCenter().lng(),&lt;br /&gt;
        layer: &amp;#039;overlayLayer&amp;#039;,&lt;br /&gt;
        content: &amp;#039;&amp;lt;div class=&amp;quot;overlay&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;,&lt;br /&gt;
        verticalAlign: &amp;#039;center&amp;#039;,&lt;br /&gt;
        horizontalAlign: &amp;#039;center&amp;#039;&lt;br /&gt;
      });&lt;br /&gt;
        var styles = [&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;poi&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;visibility&amp;quot;: &amp;quot;on&amp;quot; },&lt;br /&gt;
      { &amp;quot;weight&amp;quot;: 0.9 },&lt;br /&gt;
      { &amp;quot;lightness&amp;quot;: 37 },&lt;br /&gt;
      { &amp;quot;gamma&amp;quot;: 0.62 },&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -93 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;poi&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -1 },&lt;br /&gt;
      { &amp;quot;color&amp;quot;: &amp;quot;#ffffff&amp;quot; },&lt;br /&gt;
      { &amp;quot;weight&amp;quot;: 0.2 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;road&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -98 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;landscape&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#ff0000&amp;quot; },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -89 }&lt;br /&gt;
    ]&lt;br /&gt;
  },{&lt;br /&gt;
    &amp;quot;featureType&amp;quot;: &amp;quot;water&amp;quot;,&lt;br /&gt;
    &amp;quot;stylers&amp;quot;: [&lt;br /&gt;
      { &amp;quot;hue&amp;quot;: &amp;quot;#cfa144&amp;quot; },&lt;br /&gt;
      { &amp;quot;weight&amp;quot;: 0.4 },&lt;br /&gt;
      { &amp;quot;saturation&amp;quot;: -38 }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
];&lt;br /&gt;
        &lt;br /&gt;
        map.addStyle({&lt;br /&gt;
            styledMapName:&amp;quot;Styled Map&amp;quot;,&lt;br /&gt;
            styles: styles,&lt;br /&gt;
            mapTypeId: &amp;quot;map_style&amp;quot;  &lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        map.setStyle(&amp;quot;map_style&amp;quot;);	&lt;br /&gt;
		&lt;br /&gt;
    });			&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
(function(root, factory) {&lt;br /&gt;
  if(typeof exports === &amp;#039;object&amp;#039;) {&lt;br /&gt;
    module.exports = factory();&lt;br /&gt;
  }&lt;br /&gt;
  else if(typeof define === &amp;#039;function&amp;#039; &amp;amp;&amp;amp; define.amd) {&lt;br /&gt;
    define([&amp;#039;jquery&amp;#039;, &amp;#039;googlemaps!&amp;#039;], factory);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    root.GMaps = factory();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}(this, function() {&lt;br /&gt;
&lt;br /&gt;
/*!&lt;br /&gt;
 * GMaps.js v0.4.25&lt;br /&gt;
 * http://hpneo.github.com/gmaps/&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2017, Gustavo Leon&lt;br /&gt;
 * Released under the MIT License.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
var extend_object = function(obj, new_obj) {&lt;br /&gt;
  var name;&lt;br /&gt;
&lt;br /&gt;
  if (obj === new_obj) {&lt;br /&gt;
    return obj;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (name in new_obj) {&lt;br /&gt;
    if (new_obj[name] !== undefined) {&lt;br /&gt;
      obj[name] = new_obj[name];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return obj;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var replace_object = function(obj, replace) {&lt;br /&gt;
  var name;&lt;br /&gt;
&lt;br /&gt;
  if (obj === replace) {&lt;br /&gt;
    return obj;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (name in replace) {&lt;br /&gt;
    if (obj[name] != undefined) {&lt;br /&gt;
      obj[name] = replace[name];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return obj;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var array_map = function(array, callback) {&lt;br /&gt;
  var original_callback_params = Array.prototype.slice.call(arguments, 2),&lt;br /&gt;
      array_return = [],&lt;br /&gt;
      array_length = array.length,&lt;br /&gt;
      i;&lt;br /&gt;
&lt;br /&gt;
  if (Array.prototype.map &amp;amp;&amp;amp; array.map === Array.prototype.map) {&lt;br /&gt;
    array_return = Array.prototype.map.call(array, function(item) {&lt;br /&gt;
      var callback_params = original_callback_params.slice(0);&lt;br /&gt;
      callback_params.splice(0, 0, item);&lt;br /&gt;
&lt;br /&gt;
      return callback.apply(this, callback_params);&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    for (i = 0; i &amp;lt; array_length; i++) {&lt;br /&gt;
      callback_params = original_callback_params;&lt;br /&gt;
      callback_params.splice(0, 0, array[i]);&lt;br /&gt;
      array_return.push(callback.apply(this, callback_params));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return array_return;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var array_flat = function(array) {&lt;br /&gt;
  var new_array = [],&lt;br /&gt;
      i;&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; array.length; i++) {&lt;br /&gt;
    new_array = new_array.concat(array[i]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return new_array;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var coordsToLatLngs = function(coords, useGeoJSON) {&lt;br /&gt;
  var first_coord = coords[0],&lt;br /&gt;
      second_coord = coords[1];&lt;br /&gt;
&lt;br /&gt;
  if (useGeoJSON) {&lt;br /&gt;
    first_coord = coords[1];&lt;br /&gt;
    second_coord = coords[0];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return new google.maps.LatLng(first_coord, second_coord);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var arrayToLatLng = function(coords, useGeoJSON) {&lt;br /&gt;
  var i;&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; coords.length; i++) {&lt;br /&gt;
    if (!(coords[i] instanceof google.maps.LatLng)) {&lt;br /&gt;
      if (coords[i].length &amp;gt; 0 &amp;amp;&amp;amp; typeof(coords[i][0]) === &amp;quot;object&amp;quot;) {&lt;br /&gt;
        coords[i] = arrayToLatLng(coords[i], useGeoJSON);&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        coords[i] = coordsToLatLngs(coords[i], useGeoJSON);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return coords;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var getElementsByClassName = function (class_name, context) {&lt;br /&gt;
    var element,&lt;br /&gt;
        _class = class_name.replace(&amp;#039;.&amp;#039;, &amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    if (&amp;#039;jQuery&amp;#039; in this &amp;amp;&amp;amp; context) {&lt;br /&gt;
        element = $(&amp;quot;.&amp;quot; + _class, context)[0];&lt;br /&gt;
    } else {&lt;br /&gt;
        element = document.getElementsByClassName(_class)[0];&lt;br /&gt;
    }&lt;br /&gt;
    return element;&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var getElementById = function(id, context) {&lt;br /&gt;
  var element,&lt;br /&gt;
  id = id.replace(&amp;#039;#&amp;#039;, &amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  if (&amp;#039;jQuery&amp;#039; in window &amp;amp;&amp;amp; context) {&lt;br /&gt;
    element = $(&amp;#039;#&amp;#039; + id, context)[0];&lt;br /&gt;
  } else {&lt;br /&gt;
    element = document.getElementById(id);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return element;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var findAbsolutePosition = function(obj)  {&lt;br /&gt;
  var curleft = 0,&lt;br /&gt;
      curtop = 0;&lt;br /&gt;
&lt;br /&gt;
  if (obj.getBoundingClientRect) {&lt;br /&gt;
      var rect = obj.getBoundingClientRect();&lt;br /&gt;
      var sx = -(window.scrollX ? window.scrollX : window.pageXOffset);&lt;br /&gt;
      var sy = -(window.scrollY ? window.scrollY : window.pageYOffset);&lt;br /&gt;
&lt;br /&gt;
      return [(rect.left - sx), (rect.top - sy)];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (obj.offsetParent) {&lt;br /&gt;
    do {&lt;br /&gt;
      curleft += obj.offsetLeft;&lt;br /&gt;
      curtop += obj.offsetTop;&lt;br /&gt;
    } while (obj = obj.offsetParent);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return [curleft, curtop];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var GMaps = (function(global) {&lt;br /&gt;
  &amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  var doc = document;&lt;br /&gt;
  /**&lt;br /&gt;
   * Creates a new GMaps instance, including a Google Maps map.&lt;br /&gt;
   * @class GMaps&lt;br /&gt;
   * @constructs&lt;br /&gt;
   * @param {object} options - `options` accepts all the [MapOptions](https://developers.google.com/maps/documentation/javascript/reference#MapOptions) and [events](https://developers.google.com/maps/documentation/javascript/reference#Map) listed in the Google Maps API. Also accepts:&lt;br /&gt;
   * * `lat` (number): Latitude of the map&amp;#039;s center&lt;br /&gt;
   * * `lng` (number): Longitude of the map&amp;#039;s center&lt;br /&gt;
   * * `el` (string or HTMLElement): container where the map will be rendered&lt;br /&gt;
   * * `markerClusterer` (function): A function to create a marker cluster. You can use MarkerClusterer or MarkerClustererPlus.&lt;br /&gt;
   */&lt;br /&gt;
  var GMaps = function(options) {&lt;br /&gt;
&lt;br /&gt;
    if (!(typeof window.google === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; window.google.maps)) {&lt;br /&gt;
      if (typeof window.console === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; window.console.error) {&lt;br /&gt;
        console.error(&amp;#039;Google Maps API is required. Please register the following JavaScript library https://maps.googleapis.com/maps/api/js.&amp;#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return function() {};&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!this) return new GMaps(options);&lt;br /&gt;
&lt;br /&gt;
    options.zoom = options.zoom || 15;&lt;br /&gt;
    options.mapType = options.mapType || &amp;#039;roadmap&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    var valueOrDefault = function(value, defaultValue) {&lt;br /&gt;
      return value === undefined ? defaultValue : value;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var self = this,&lt;br /&gt;
        i,&lt;br /&gt;
        events_that_hide_context_menu = [&lt;br /&gt;
          &amp;#039;bounds_changed&amp;#039;, &amp;#039;center_changed&amp;#039;, &amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;drag&amp;#039;,&lt;br /&gt;
          &amp;#039;dragend&amp;#039;, &amp;#039;dragstart&amp;#039;, &amp;#039;idle&amp;#039;, &amp;#039;maptypeid_changed&amp;#039;, &amp;#039;projection_changed&amp;#039;,&lt;br /&gt;
          &amp;#039;resize&amp;#039;, &amp;#039;tilesloaded&amp;#039;, &amp;#039;zoom_changed&amp;#039;&lt;br /&gt;
        ],&lt;br /&gt;
        events_that_doesnt_hide_context_menu = [&amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;],&lt;br /&gt;
        options_to_be_deleted = [&amp;#039;el&amp;#039;, &amp;#039;lat&amp;#039;, &amp;#039;lng&amp;#039;, &amp;#039;mapType&amp;#039;, &amp;#039;width&amp;#039;, &amp;#039;height&amp;#039;, &amp;#039;markerClusterer&amp;#039;, &amp;#039;enableNewStyle&amp;#039;],&lt;br /&gt;
        identifier = options.el || options.div,&lt;br /&gt;
        markerClustererFunction = options.markerClusterer,&lt;br /&gt;
        mapType = google.maps.MapTypeId[options.mapType.toUpperCase()],&lt;br /&gt;
        map_center = new google.maps.LatLng(options.lat, options.lng),&lt;br /&gt;
        zoomControl = valueOrDefault(options.zoomControl, true),&lt;br /&gt;
        zoomControlOpt = options.zoomControlOpt || {&lt;br /&gt;
          style: &amp;#039;DEFAULT&amp;#039;,&lt;br /&gt;
          position: &amp;#039;TOP_LEFT&amp;#039;&lt;br /&gt;
        },&lt;br /&gt;
        zoomControlStyle = zoomControlOpt.style || &amp;#039;DEFAULT&amp;#039;,&lt;br /&gt;
        zoomControlPosition = zoomControlOpt.position || &amp;#039;TOP_LEFT&amp;#039;,&lt;br /&gt;
        panControl = valueOrDefault(options.panControl, true),&lt;br /&gt;
        mapTypeControl = valueOrDefault(options.mapTypeControl, true),&lt;br /&gt;
        scaleControl = valueOrDefault(options.scaleControl, true),&lt;br /&gt;
        streetViewControl = valueOrDefault(options.streetViewControl, true),&lt;br /&gt;
        overviewMapControl = valueOrDefault(overviewMapControl, true),&lt;br /&gt;
        map_options = {},&lt;br /&gt;
        map_base_options = {&lt;br /&gt;
          zoom: this.zoom,&lt;br /&gt;
          center: map_center,&lt;br /&gt;
          mapTypeId: mapType&lt;br /&gt;
        },&lt;br /&gt;
        map_controls_options = {&lt;br /&gt;
          panControl: panControl,&lt;br /&gt;
          zoomControl: zoomControl,&lt;br /&gt;
          zoomControlOptions: {&lt;br /&gt;
            style: google.maps.ZoomControlStyle[zoomControlStyle],&lt;br /&gt;
            position: google.maps.ControlPosition[zoomControlPosition]&lt;br /&gt;
          },&lt;br /&gt;
          mapTypeControl: mapTypeControl,&lt;br /&gt;
          scaleControl: scaleControl,&lt;br /&gt;
          streetViewControl: streetViewControl,&lt;br /&gt;
          overviewMapControl: overviewMapControl&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
      if (typeof(options.el) === &amp;#039;string&amp;#039; || typeof(options.div) === &amp;#039;string&amp;#039;) {&lt;br /&gt;
        if (identifier.indexOf(&amp;quot;#&amp;quot;) &amp;gt; -1) {&lt;br /&gt;
            /**&lt;br /&gt;
             * Container element&lt;br /&gt;
             *&lt;br /&gt;
             * @type {HTMLElement}&lt;br /&gt;
             */&lt;br /&gt;
            this.el = getElementById(identifier, options.context);&lt;br /&gt;
        } else {&lt;br /&gt;
            this.el = getElementsByClassName.apply(this, [identifier, options.context]);&lt;br /&gt;
        }&lt;br /&gt;
      } else {&lt;br /&gt;
          this.el = identifier;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    if (typeof(this.el) === &amp;#039;undefined&amp;#039; || this.el === null) {&lt;br /&gt;
      throw &amp;#039;No element defined.&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    window.context_menu = window.context_menu || {};&lt;br /&gt;
    window.context_menu[self.el.id] = {};&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of custom controls in the map UI&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.controls = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s overlays&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.overlays = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of KML/GeoRSS and FusionTable layers&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.layers = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of data layers (See {@link GMaps#addLayer})&lt;br /&gt;
     *&lt;br /&gt;
     * @type {object}&lt;br /&gt;
     */&lt;br /&gt;
    this.singleLayers = {};&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s markers&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.markers = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s lines&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.polylines = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s routes requested by {@link GMaps#getRoutes}, {@link GMaps#renderRoute}, {@link GMaps#drawRoute}, {@link GMaps#travelRoute} or {@link GMaps#drawSteppedRoute}&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.routes = [];&lt;br /&gt;
    /**&lt;br /&gt;
     * Collection of map&amp;#039;s polygons&lt;br /&gt;
     *&lt;br /&gt;
     * @type {array}&lt;br /&gt;
     */&lt;br /&gt;
    this.polygons = [];&lt;br /&gt;
    this.infoWindow = null;&lt;br /&gt;
    this.overlay_el = null;&lt;br /&gt;
    /**&lt;br /&gt;
     * Current map&amp;#039;s zoom&lt;br /&gt;
     *&lt;br /&gt;
     * @type {number}&lt;br /&gt;
     */&lt;br /&gt;
    this.zoom = options.zoom;&lt;br /&gt;
    this.registered_events = {};&lt;br /&gt;
&lt;br /&gt;
    this.el.style.width = options.width || this.el.scrollWidth || this.el.offsetWidth;&lt;br /&gt;
    this.el.style.height = options.height || this.el.scrollHeight || this.el.offsetHeight;&lt;br /&gt;
&lt;br /&gt;
    google.maps.visualRefresh = options.enableNewStyle;&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; options_to_be_deleted.length; i++) {&lt;br /&gt;
      delete options[options_to_be_deleted[i]];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(options.disableDefaultUI != true) {&lt;br /&gt;
      map_base_options = extend_object(map_base_options, map_controls_options);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    map_options = extend_object(map_base_options, options);&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; events_that_hide_context_menu.length; i++) {&lt;br /&gt;
      delete map_options[events_that_hide_context_menu[i]];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; events_that_doesnt_hide_context_menu.length; i++) {&lt;br /&gt;
      delete map_options[events_that_doesnt_hide_context_menu[i]];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Google Maps map instance&lt;br /&gt;
     *&lt;br /&gt;
     * @type {google.maps.Map}&lt;br /&gt;
     */&lt;br /&gt;
    this.map = new google.maps.Map(this.el, map_options);&lt;br /&gt;
&lt;br /&gt;
    if (markerClustererFunction) {&lt;br /&gt;
      /**&lt;br /&gt;
       * Marker Clusterer instance&lt;br /&gt;
       *&lt;br /&gt;
       * @type {object}&lt;br /&gt;
       */&lt;br /&gt;
      this.markerClusterer = markerClustererFunction.apply(this, [this.map]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var buildContextMenuHTML = function(control, e) {&lt;br /&gt;
      var html = &amp;#039;&amp;#039;,&lt;br /&gt;
          options = window.context_menu[self.el.id][control];&lt;br /&gt;
&lt;br /&gt;
      for (var i in options){&lt;br /&gt;
        if (options.hasOwnProperty(i)) {&lt;br /&gt;
          var option = options[i];&lt;br /&gt;
&lt;br /&gt;
          html += &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a id=&amp;quot;&amp;#039; + control + &amp;#039;_&amp;#039; + i + &amp;#039;&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;&amp;#039; + option.title + &amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (!getElementById(&amp;#039;gmaps_context_menu&amp;#039;)) return;&lt;br /&gt;
&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      context_menu_element.innerHTML = html;&lt;br /&gt;
&lt;br /&gt;
      var context_menu_items = context_menu_element.getElementsByTagName(&amp;#039;a&amp;#039;),&lt;br /&gt;
          context_menu_items_count = context_menu_items.length,&lt;br /&gt;
          i;&lt;br /&gt;
&lt;br /&gt;
      for (i = 0; i &amp;lt; context_menu_items_count; i++) {&lt;br /&gt;
        var context_menu_item = context_menu_items[i];&lt;br /&gt;
&lt;br /&gt;
        var assign_menu_item_action = function(ev){&lt;br /&gt;
          ev.preventDefault();&lt;br /&gt;
&lt;br /&gt;
          options[this.id.replace(control + &amp;#039;_&amp;#039;, &amp;#039;&amp;#039;)].action.apply(self, [e]);&lt;br /&gt;
          self.hideContextMenu();&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        google.maps.event.clearListeners(context_menu_item, &amp;#039;click&amp;#039;);&lt;br /&gt;
        google.maps.event.addDomListenerOnce(context_menu_item, &amp;#039;click&amp;#039;, assign_menu_item_action, false);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var position = findAbsolutePosition.apply(this, [self.el]),&lt;br /&gt;
          left = position[0] + e.pixel.x - 15,&lt;br /&gt;
          top = position[1] + e.pixel.y- 15;&lt;br /&gt;
&lt;br /&gt;
      context_menu_element.style.left = left + &amp;quot;px&amp;quot;;&lt;br /&gt;
      context_menu_element.style.top = top + &amp;quot;px&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      // context_menu_element.style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    this.buildContextMenu = function(control, e) {&lt;br /&gt;
      if (control === &amp;#039;marker&amp;#039;) {&lt;br /&gt;
        e.pixel = {};&lt;br /&gt;
&lt;br /&gt;
        var overlay = new google.maps.OverlayView();&lt;br /&gt;
        overlay.setMap(self.map);&lt;br /&gt;
&lt;br /&gt;
        overlay.draw = function() {&lt;br /&gt;
          var projection = overlay.getProjection(),&lt;br /&gt;
              position = e.marker.getPosition();&lt;br /&gt;
&lt;br /&gt;
          e.pixel = projection.fromLatLngToContainerPixel(position);&lt;br /&gt;
&lt;br /&gt;
          buildContextMenuHTML(control, e);&lt;br /&gt;
        };&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        buildContextMenuHTML(control, e);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      setTimeout(function() {&lt;br /&gt;
        context_menu_element.style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;
      }, 0);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Add a context menu for a map or a marker.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {object} options - The `options` object should contain:&lt;br /&gt;
     * * `control` (string): Kind of control the context menu will be attached. Can be &amp;quot;map&amp;quot; or &amp;quot;marker&amp;quot;.&lt;br /&gt;
     * * `options` (array): A collection of context menu items:&lt;br /&gt;
     *   * `title` (string): Item&amp;#039;s title shown in the context menu.&lt;br /&gt;
     *   * `name` (string): Item&amp;#039;s identifier.&lt;br /&gt;
     *   * `action` (function): Function triggered after selecting the context menu item.&lt;br /&gt;
     */&lt;br /&gt;
    this.setContextMenu = function(options) {&lt;br /&gt;
      window.context_menu[self.el.id][options.control] = {};&lt;br /&gt;
&lt;br /&gt;
      var i,&lt;br /&gt;
          ul = doc.createElement(&amp;#039;ul&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      for (i in options.options) {&lt;br /&gt;
        if (options.options.hasOwnProperty(i)) {&lt;br /&gt;
          var option = options.options[i];&lt;br /&gt;
&lt;br /&gt;
          window.context_menu[self.el.id][options.control][option.name] = {&lt;br /&gt;
            title: option.title,&lt;br /&gt;
            action: option.action&lt;br /&gt;
          };&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      ul.id = &amp;#039;gmaps_context_menu&amp;#039;;&lt;br /&gt;
      ul.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
      ul.style.position = &amp;#039;absolute&amp;#039;;&lt;br /&gt;
      ul.style.minWidth = &amp;#039;100px&amp;#039;;&lt;br /&gt;
      ul.style.background = &amp;#039;white&amp;#039;;&lt;br /&gt;
      ul.style.listStyle = &amp;#039;none&amp;#039;;&lt;br /&gt;
      ul.style.padding = &amp;#039;8px&amp;#039;;&lt;br /&gt;
      ul.style.boxShadow = &amp;#039;2px 2px 6px #ccc&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      if (!getElementById(&amp;#039;gmaps_context_menu&amp;#039;)) {&lt;br /&gt;
        doc.body.appendChild(ul);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      google.maps.event.addDomListener(context_menu_element, &amp;#039;mouseout&amp;#039;, function(ev) {&lt;br /&gt;
        if (!ev.relatedTarget || !this.contains(ev.relatedTarget)) {&lt;br /&gt;
          window.setTimeout(function(){&lt;br /&gt;
            context_menu_element.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
          }, 400);&lt;br /&gt;
        }&lt;br /&gt;
      }, false);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Hide the current context menu&lt;br /&gt;
     */&lt;br /&gt;
    this.hideContextMenu = function() {&lt;br /&gt;
      var context_menu_element = getElementById(&amp;#039;gmaps_context_menu&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      if (context_menu_element) {&lt;br /&gt;
        context_menu_element.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var setupListener = function(object, name) {&lt;br /&gt;
      google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
        if (e == undefined) {&lt;br /&gt;
          e = this;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        options[name].apply(this, [e]);&lt;br /&gt;
&lt;br /&gt;
        self.hideContextMenu();&lt;br /&gt;
      });&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    //google.maps.event.addListener(this.map, &amp;#039;idle&amp;#039;, this.hideContextMenu);&lt;br /&gt;
    google.maps.event.addListener(this.map, &amp;#039;zoom_changed&amp;#039;, this.hideContextMenu);&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; events_that_hide_context_menu.length; ev++) {&lt;br /&gt;
      var name = events_that_hide_context_menu[ev];&lt;br /&gt;
&lt;br /&gt;
      if (name in options) {&lt;br /&gt;
        setupListener(this.map, name);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; events_that_doesnt_hide_context_menu.length; ev++) {&lt;br /&gt;
      var name = events_that_doesnt_hide_context_menu[ev];&lt;br /&gt;
&lt;br /&gt;
      if (name in options) {&lt;br /&gt;
        setupListener(this.map, name);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    google.maps.event.addListener(this.map, &amp;#039;rightclick&amp;#039;, function(e) {&lt;br /&gt;
      if (options.rightclick) {&lt;br /&gt;
        options.rightclick.apply(this, [e]);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if(window.context_menu[self.el.id][&amp;#039;map&amp;#039;] != undefined) {&lt;br /&gt;
        self.buildContextMenu(&amp;#039;map&amp;#039;, e);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Trigger a `resize` event, useful if you need to repaint the current map (for changes in the viewport or display / hide actions).&lt;br /&gt;
     */&lt;br /&gt;
    this.refresh = function() {&lt;br /&gt;
      google.maps.event.trigger(this.map, &amp;#039;resize&amp;#039;);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Adjust the map zoom to include all the markers added in the map.&lt;br /&gt;
     */&lt;br /&gt;
    this.fitZoom = function() {&lt;br /&gt;
      var latLngs = [],&lt;br /&gt;
          markers_length = this.markers.length,&lt;br /&gt;
          i;&lt;br /&gt;
&lt;br /&gt;
      for (i = 0; i &amp;lt; markers_length; i++) {&lt;br /&gt;
        if(typeof(this.markers[i].visible) === &amp;#039;boolean&amp;#039; &amp;amp;&amp;amp; this.markers[i].visible) {&lt;br /&gt;
          latLngs.push(this.markers[i].getPosition());&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      this.fitLatLngBounds(latLngs);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Adjust the map zoom to include all the coordinates in the `latLngs` array.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {array} latLngs - Collection of `google.maps.LatLng` objects.&lt;br /&gt;
     */&lt;br /&gt;
    this.fitLatLngBounds = function(latLngs) {&lt;br /&gt;
      var total = latLngs.length,&lt;br /&gt;
          bounds = new google.maps.LatLngBounds(),&lt;br /&gt;
          i;&lt;br /&gt;
&lt;br /&gt;
      for(i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
        bounds.extend(latLngs[i]);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      this.map.fitBounds(bounds);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Center the map using the `lat` and `lng` coordinates.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {number} lat - Latitude of the coordinate.&lt;br /&gt;
     * @param {number} lng - Longitude of the coordinate.&lt;br /&gt;
     * @param {function} [callback] - Callback that will be executed after the map is centered.&lt;br /&gt;
     */&lt;br /&gt;
    this.setCenter = function(lat, lng, callback) {&lt;br /&gt;
      this.map.panTo(new google.maps.LatLng(lat, lng));&lt;br /&gt;
&lt;br /&gt;
      if (callback) {&lt;br /&gt;
        callback();&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Return the HTML element container of the map.&lt;br /&gt;
     *&lt;br /&gt;
     * @returns {HTMLElement} the element container.&lt;br /&gt;
     */&lt;br /&gt;
    this.getElement = function() {&lt;br /&gt;
      return this.el;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Increase the map&amp;#039;s zoom.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {number} [magnitude] - The number of times the map will be zoomed in.&lt;br /&gt;
     */&lt;br /&gt;
    this.zoomIn = function(value) {&lt;br /&gt;
      value = value || 1;&lt;br /&gt;
&lt;br /&gt;
      this.zoom = this.map.getZoom() + value;&lt;br /&gt;
      this.map.setZoom(this.zoom);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Decrease the map&amp;#039;s zoom.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {number} [magnitude] - The number of times the map will be zoomed out.&lt;br /&gt;
     */&lt;br /&gt;
    this.zoomOut = function(value) {&lt;br /&gt;
      value = value || 1;&lt;br /&gt;
&lt;br /&gt;
      this.zoom = this.map.getZoom() - value;&lt;br /&gt;
      this.map.setZoom(this.zoom);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var native_methods = [],&lt;br /&gt;
        method;&lt;br /&gt;
&lt;br /&gt;
    for (method in this.map) {&lt;br /&gt;
      if (typeof(this.map[method]) == &amp;#039;function&amp;#039; &amp;amp;&amp;amp; !this[method]) {&lt;br /&gt;
        native_methods.push(method);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; native_methods.length; i++) {&lt;br /&gt;
      (function(gmaps, scope, method_name) {&lt;br /&gt;
        gmaps[method_name] = function(){&lt;br /&gt;
          return scope[method_name].apply(scope, arguments);&lt;br /&gt;
        };&lt;br /&gt;
      })(this, this.map, native_methods[i]);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return GMaps;&lt;br /&gt;
})(this);&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.createControl = function(options) {&lt;br /&gt;
  var control = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  control.style.cursor = &amp;#039;pointer&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  if (options.disableDefaultStyles !== true) {&lt;br /&gt;
    control.style.fontFamily = &amp;#039;Roboto, Arial, sans-serif&amp;#039;;&lt;br /&gt;
    control.style.fontSize = &amp;#039;11px&amp;#039;;&lt;br /&gt;
    control.style.boxShadow = &amp;#039;rgba(0, 0, 0, 0.298039) 0px 1px 4px -1px&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (var option in options.style) {&lt;br /&gt;
    control.style[option] = options.style[option];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.id) {&lt;br /&gt;
    control.id = options.id;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.title) {&lt;br /&gt;
    control.title = options.title;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.classes) {&lt;br /&gt;
    control.className = options.classes;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.content) {&lt;br /&gt;
    if (typeof options.content === &amp;#039;string&amp;#039;) {&lt;br /&gt;
      control.innerHTML = options.content;&lt;br /&gt;
    }&lt;br /&gt;
    else if (options.content instanceof HTMLElement) {&lt;br /&gt;
      control.appendChild(options.content);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.position) {&lt;br /&gt;
    control.position = google.maps.ControlPosition[options.position.toUpperCase()];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (var ev in options.events) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      google.maps.event.addDomListener(object, name, function(){&lt;br /&gt;
        options.events[name].apply(this, [this]);&lt;br /&gt;
      });&lt;br /&gt;
    })(control, ev);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  control.index = 1;&lt;br /&gt;
&lt;br /&gt;
  return control;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Add a custom control to the map UI.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {object} options - The `options` object should contain:&lt;br /&gt;
 * * `style` (object): The keys and values of this object should be valid CSS properties and values.&lt;br /&gt;
 * * `id` (string): The HTML id for the custom control.&lt;br /&gt;
 * * `classes` (string): A string containing all the HTML classes for the custom control.&lt;br /&gt;
 * * `content` (string or HTML element): The content of the custom control.&lt;br /&gt;
 * * `position` (string): Any valid [`google.maps.ControlPosition`](https://developers.google.com/maps/documentation/javascript/controls#ControlPositioning) value, in lower or upper case.&lt;br /&gt;
 * * `events` (object): The keys of this object should be valid DOM events. The values should be functions.&lt;br /&gt;
 * * `disableDefaultStyles` (boolean): If false, removes the default styles for the controls like font (family and size), and box shadow.&lt;br /&gt;
 * @returns {HTMLElement}&lt;br /&gt;
 */&lt;br /&gt;
GMaps.prototype.addControl = function(options) {&lt;br /&gt;
  var control = this.createControl(options);&lt;br /&gt;
&lt;br /&gt;
  this.controls.push(control);&lt;br /&gt;
  this.map.controls[control.position].push(control);&lt;br /&gt;
&lt;br /&gt;
  return control;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Remove a control from the map. `control` should be a control returned by `addControl()`.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {HTMLElement} control - One of the controls returned by `addControl()`.&lt;br /&gt;
 * @returns {HTMLElement} the removed control.&lt;br /&gt;
 */&lt;br /&gt;
GMaps.prototype.removeControl = function(control) {&lt;br /&gt;
  var position = null,&lt;br /&gt;
      i;&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; this.controls.length; i++) {&lt;br /&gt;
    if (this.controls[i] == control) {&lt;br /&gt;
      position = this.controls[i].position;&lt;br /&gt;
      this.controls.splice(i, 1);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (position) {&lt;br /&gt;
    for (i = 0; i &amp;lt; this.map.controls.length; i++) {&lt;br /&gt;
      var controlsForPosition = this.map.controls[control.position];&lt;br /&gt;
&lt;br /&gt;
      if (controlsForPosition.getAt(i) == control) {&lt;br /&gt;
        controlsForPosition.removeAt(i);&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return control;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.createMarker = function(options) {&lt;br /&gt;
  if (options.lat == undefined &amp;amp;&amp;amp; options.lng == undefined &amp;amp;&amp;amp; options.position == undefined) {&lt;br /&gt;
    throw &amp;#039;No latitude or longitude defined.&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var self = this,&lt;br /&gt;
      details = options.details,&lt;br /&gt;
      fences = options.fences,&lt;br /&gt;
      outside = options.outside,&lt;br /&gt;
      base_options = {&lt;br /&gt;
        position: new google.maps.LatLng(options.lat, options.lng),&lt;br /&gt;
        map: null&lt;br /&gt;
      },&lt;br /&gt;
      marker_options = extend_object(base_options, options);&lt;br /&gt;
&lt;br /&gt;
  delete marker_options.lat;&lt;br /&gt;
  delete marker_options.lng;&lt;br /&gt;
  delete marker_options.fences;&lt;br /&gt;
  delete marker_options.outside;&lt;br /&gt;
&lt;br /&gt;
  var marker = new google.maps.Marker(marker_options);&lt;br /&gt;
&lt;br /&gt;
  marker.fences = fences;&lt;br /&gt;
&lt;br /&gt;
  if (options.infoWindow) {&lt;br /&gt;
    marker.infoWindow = new google.maps.InfoWindow(options.infoWindow);&lt;br /&gt;
&lt;br /&gt;
    var info_window_events = [&amp;#039;closeclick&amp;#039;, &amp;#039;content_changed&amp;#039;, &amp;#039;domready&amp;#039;, &amp;#039;position_changed&amp;#039;, &amp;#039;zindex_changed&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; info_window_events.length; ev++) {&lt;br /&gt;
      (function(object, name) {&lt;br /&gt;
        if (options.infoWindow[name]) {&lt;br /&gt;
          google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
            options.infoWindow[name].apply(this, [e]);&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
      })(marker.infoWindow, info_window_events[ev]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var marker_events = [&amp;#039;animation_changed&amp;#039;, &amp;#039;clickable_changed&amp;#039;, &amp;#039;cursor_changed&amp;#039;, &amp;#039;draggable_changed&amp;#039;, &amp;#039;flat_changed&amp;#039;, &amp;#039;icon_changed&amp;#039;, &amp;#039;position_changed&amp;#039;, &amp;#039;shadow_changed&amp;#039;, &amp;#039;shape_changed&amp;#039;, &amp;#039;title_changed&amp;#039;, &amp;#039;visible_changed&amp;#039;, &amp;#039;zindex_changed&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  var marker_events_with_mouse = [&amp;#039;dblclick&amp;#039;, &amp;#039;drag&amp;#039;, &amp;#039;dragend&amp;#039;, &amp;#039;dragstart&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; marker_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(){&lt;br /&gt;
          options[name].apply(this, [this]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(marker, marker_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; marker_events_with_mouse.length; ev++) {&lt;br /&gt;
    (function(map, object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(me){&lt;br /&gt;
          if(!me.pixel){&lt;br /&gt;
            me.pixel = map.getProjection().fromLatLngToPoint(me.latLng)&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          options[name].apply(this, [me]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(this.map, marker, marker_events_with_mouse[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  google.maps.event.addListener(marker, &amp;#039;click&amp;#039;, function() {&lt;br /&gt;
    this.details = details;&lt;br /&gt;
&lt;br /&gt;
    if (options.click) {&lt;br /&gt;
      options.click.apply(this, [this]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (marker.infoWindow) {&lt;br /&gt;
      self.hideInfoWindows();&lt;br /&gt;
      marker.infoWindow.open(self.map, marker);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  google.maps.event.addListener(marker, &amp;#039;rightclick&amp;#039;, function(e) {&lt;br /&gt;
    e.marker = this;&lt;br /&gt;
&lt;br /&gt;
    if (options.rightclick) {&lt;br /&gt;
      options.rightclick.apply(this, [e]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (window.context_menu[self.el.id][&amp;#039;marker&amp;#039;] != undefined) {&lt;br /&gt;
      self.buildContextMenu(&amp;#039;marker&amp;#039;, e);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  if (marker.fences) {&lt;br /&gt;
    google.maps.event.addListener(marker, &amp;#039;dragend&amp;#039;, function() {&lt;br /&gt;
      self.checkMarkerGeofence(marker, function(m, f) {&lt;br /&gt;
        outside(m, f);&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return marker;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addMarker = function(options) {&lt;br /&gt;
  var marker;&lt;br /&gt;
  if(options.hasOwnProperty(&amp;#039;gm_accessors_&amp;#039;)) {&lt;br /&gt;
    // Native google.maps.Marker object&lt;br /&gt;
    marker = options;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    if ((options.hasOwnProperty(&amp;#039;lat&amp;#039;) &amp;amp;&amp;amp; options.hasOwnProperty(&amp;#039;lng&amp;#039;)) || options.position) {&lt;br /&gt;
      marker = this.createMarker(options);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      throw &amp;#039;No latitude or longitude defined.&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  marker.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  if(this.markerClusterer) {&lt;br /&gt;
    this.markerClusterer.addMarker(marker);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.markers.push(marker);&lt;br /&gt;
&lt;br /&gt;
  GMaps.fire(&amp;#039;marker_added&amp;#039;, marker, this);&lt;br /&gt;
&lt;br /&gt;
  return marker;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addMarkers = function(array) {&lt;br /&gt;
  for (var i = 0, marker; marker=array[i]; i++) {&lt;br /&gt;
    this.addMarker(marker);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return this.markers;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.hideInfoWindows = function() {&lt;br /&gt;
  for (var i = 0, marker; marker = this.markers[i]; i++){&lt;br /&gt;
    if (marker.infoWindow) {&lt;br /&gt;
      marker.infoWindow.close();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeMarker = function(marker) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
    if (this.markers[i] === marker) {&lt;br /&gt;
      this.markers[i].setMap(null);&lt;br /&gt;
      this.markers.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      if(this.markerClusterer) {&lt;br /&gt;
        this.markerClusterer.removeMarker(marker);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;marker_removed&amp;#039;, marker, this);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return marker;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeMarkers = function (collection) {&lt;br /&gt;
  var new_markers = [];&lt;br /&gt;
&lt;br /&gt;
  if (typeof collection == &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
      var marker = this.markers[i];&lt;br /&gt;
      marker.setMap(null);&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;marker_removed&amp;#039;, marker, this);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(this.markerClusterer &amp;amp;&amp;amp; this.markerClusterer.clearMarkers) {&lt;br /&gt;
      this.markerClusterer.clearMarkers();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    this.markers = new_markers;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    for (var i = 0; i &amp;lt; collection.length; i++) {&lt;br /&gt;
      var index = this.markers.indexOf(collection[i]);&lt;br /&gt;
&lt;br /&gt;
      if (index &amp;gt; -1) {&lt;br /&gt;
        var marker = this.markers[index];&lt;br /&gt;
        marker.setMap(null);&lt;br /&gt;
&lt;br /&gt;
        if(this.markerClusterer) {&lt;br /&gt;
          this.markerClusterer.removeMarker(marker);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        GMaps.fire(&amp;#039;marker_removed&amp;#039;, marker, this);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
      var marker = this.markers[i];&lt;br /&gt;
      if (marker.getMap() != null) {&lt;br /&gt;
        new_markers.push(marker);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    this.markers = new_markers;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawOverlay = function(options) {&lt;br /&gt;
  var overlay = new google.maps.OverlayView(),&lt;br /&gt;
      auto_show = true;&lt;br /&gt;
&lt;br /&gt;
  overlay.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  if (options.auto_show != null) {&lt;br /&gt;
    auto_show = options.auto_show;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  overlay.onAdd = function() {&lt;br /&gt;
    var el = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    el.style.borderStyle = &amp;quot;none&amp;quot;;&lt;br /&gt;
    el.style.borderWidth = &amp;quot;0px&amp;quot;;&lt;br /&gt;
    el.style.position = &amp;quot;absolute&amp;quot;;&lt;br /&gt;
    el.style.zIndex = 100;&lt;br /&gt;
    el.innerHTML = options.content;&lt;br /&gt;
&lt;br /&gt;
    overlay.el = el;&lt;br /&gt;
&lt;br /&gt;
    if (!options.layer) {&lt;br /&gt;
      options.layer = &amp;#039;overlayLayer&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var panes = this.getPanes(),&lt;br /&gt;
        overlayLayer = panes[options.layer],&lt;br /&gt;
        stop_overlay_events = [&amp;#039;contextmenu&amp;#039;, &amp;#039;DOMMouseScroll&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
    overlayLayer.appendChild(el);&lt;br /&gt;
&lt;br /&gt;
    for (var ev = 0; ev &amp;lt; stop_overlay_events.length; ev++) {&lt;br /&gt;
      (function(object, name) {&lt;br /&gt;
        google.maps.event.addDomListener(object, name, function(e){&lt;br /&gt;
          if (navigator.userAgent.toLowerCase().indexOf(&amp;#039;msie&amp;#039;) != -1 &amp;amp;&amp;amp; document.all) {&lt;br /&gt;
            e.cancelBubble = true;&lt;br /&gt;
            e.returnValue = false;&lt;br /&gt;
          }&lt;br /&gt;
          else {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
      })(el, stop_overlay_events[ev]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (options.click) {&lt;br /&gt;
      panes.overlayMouseTarget.appendChild(overlay.el);&lt;br /&gt;
      google.maps.event.addDomListener(overlay.el, &amp;#039;click&amp;#039;, function() {&lt;br /&gt;
        options.click.apply(overlay, [overlay]);&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    google.maps.event.trigger(this, &amp;#039;ready&amp;#039;);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  overlay.draw = function() {&lt;br /&gt;
    var projection = this.getProjection(),&lt;br /&gt;
        pixel = projection.fromLatLngToDivPixel(new google.maps.LatLng(options.lat, options.lng));&lt;br /&gt;
&lt;br /&gt;
    options.horizontalOffset = options.horizontalOffset || 0;&lt;br /&gt;
    options.verticalOffset = options.verticalOffset || 0;&lt;br /&gt;
&lt;br /&gt;
    var el = overlay.el,&lt;br /&gt;
        content = el.children[0],&lt;br /&gt;
        content_height = content.clientHeight,&lt;br /&gt;
        content_width = content.clientWidth;&lt;br /&gt;
&lt;br /&gt;
    switch (options.verticalAlign) {&lt;br /&gt;
      case &amp;#039;top&amp;#039;:&lt;br /&gt;
        el.style.top = (pixel.y - content_height + options.verticalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      default:&lt;br /&gt;
      case &amp;#039;middle&amp;#039;:&lt;br /&gt;
        el.style.top = (pixel.y - (content_height / 2) + options.verticalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      case &amp;#039;bottom&amp;#039;:&lt;br /&gt;
        el.style.top = (pixel.y + options.verticalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    switch (options.horizontalAlign) {&lt;br /&gt;
      case &amp;#039;left&amp;#039;:&lt;br /&gt;
        el.style.left = (pixel.x - content_width + options.horizontalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      default:&lt;br /&gt;
      case &amp;#039;center&amp;#039;:&lt;br /&gt;
        el.style.left = (pixel.x - (content_width / 2) + options.horizontalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
      case &amp;#039;right&amp;#039;:&lt;br /&gt;
        el.style.left = (pixel.x + options.horizontalOffset) + &amp;#039;px&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    el.style.display = auto_show ? &amp;#039;block&amp;#039; : &amp;#039;none&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    if (!auto_show) {&lt;br /&gt;
      options.show.apply(this, [el]);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  overlay.onRemove = function() {&lt;br /&gt;
    var el = overlay.el;&lt;br /&gt;
&lt;br /&gt;
    if (options.remove) {&lt;br /&gt;
      options.remove.apply(this, [el]);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      overlay.el.parentNode.removeChild(overlay.el);&lt;br /&gt;
      overlay.el = null;&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  this.overlays.push(overlay);&lt;br /&gt;
  return overlay;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeOverlay = function(overlay) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.overlays.length; i++) {&lt;br /&gt;
    if (this.overlays[i] === overlay) {&lt;br /&gt;
      this.overlays[i].setMap(null);&lt;br /&gt;
      this.overlays.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeOverlays = function() {&lt;br /&gt;
  for (var i = 0, item; item = this.overlays[i]; i++) {&lt;br /&gt;
    item.setMap(null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.overlays = [];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawPolyline = function(options) {&lt;br /&gt;
  var path = [],&lt;br /&gt;
      points = options.path;&lt;br /&gt;
&lt;br /&gt;
  if (points.length) {&lt;br /&gt;
    if (points[0][0] === undefined) {&lt;br /&gt;
      path = points;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      for (var i = 0, latlng; latlng = points[i]; i++) {&lt;br /&gt;
        path.push(new google.maps.LatLng(latlng[0], latlng[1]));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var polyline_options = {&lt;br /&gt;
    map: this.map,&lt;br /&gt;
    path: path,&lt;br /&gt;
    strokeColor: options.strokeColor,&lt;br /&gt;
    strokeOpacity: options.strokeOpacity,&lt;br /&gt;
    strokeWeight: options.strokeWeight,&lt;br /&gt;
    geodesic: options.geodesic,&lt;br /&gt;
    clickable: true,&lt;br /&gt;
    editable: false,&lt;br /&gt;
    visible: true&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;clickable&amp;quot;)) {&lt;br /&gt;
    polyline_options.clickable = options.clickable;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;editable&amp;quot;)) {&lt;br /&gt;
    polyline_options.editable = options.editable;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
    polyline_options.icons = options.icons;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;zIndex&amp;quot;)) {&lt;br /&gt;
    polyline_options.zIndex = options.zIndex;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var polyline = new google.maps.Polyline(polyline_options);&lt;br /&gt;
&lt;br /&gt;
  var polyline_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polyline_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polyline, polyline_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polylines.push(polyline);&lt;br /&gt;
&lt;br /&gt;
  GMaps.fire(&amp;#039;polyline_added&amp;#039;, polyline, this);&lt;br /&gt;
&lt;br /&gt;
  return polyline;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolyline = function(polyline) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.polylines.length; i++) {&lt;br /&gt;
    if (this.polylines[i] === polyline) {&lt;br /&gt;
      this.polylines[i].setMap(null);&lt;br /&gt;
      this.polylines.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;polyline_removed&amp;#039;, polyline, this);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolylines = function() {&lt;br /&gt;
  for (var i = 0, item; item = this.polylines[i]; i++) {&lt;br /&gt;
    item.setMap(null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polylines = [];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawCircle = function(options) {&lt;br /&gt;
  options =  extend_object({&lt;br /&gt;
    map: this.map,&lt;br /&gt;
    center: new google.maps.LatLng(options.lat, options.lng)&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  delete options.lat;&lt;br /&gt;
  delete options.lng;&lt;br /&gt;
&lt;br /&gt;
  var polygon = new google.maps.Circle(options),&lt;br /&gt;
      polygon_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polygon_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polygon, polygon_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons.push(polygon);&lt;br /&gt;
&lt;br /&gt;
  return polygon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawRectangle = function(options) {&lt;br /&gt;
  options = extend_object({&lt;br /&gt;
    map: this.map&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  var latLngBounds = new google.maps.LatLngBounds(&lt;br /&gt;
    new google.maps.LatLng(options.bounds[0][0], options.bounds[0][1]),&lt;br /&gt;
    new google.maps.LatLng(options.bounds[1][0], options.bounds[1][1])&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  options.bounds = latLngBounds;&lt;br /&gt;
&lt;br /&gt;
  var polygon = new google.maps.Rectangle(options),&lt;br /&gt;
      polygon_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polygon_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polygon, polygon_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons.push(polygon);&lt;br /&gt;
&lt;br /&gt;
  return polygon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawPolygon = function(options) {&lt;br /&gt;
  var useGeoJSON = false;&lt;br /&gt;
&lt;br /&gt;
  if(options.hasOwnProperty(&amp;quot;useGeoJSON&amp;quot;)) {&lt;br /&gt;
    useGeoJSON = options.useGeoJSON;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delete options.useGeoJSON;&lt;br /&gt;
&lt;br /&gt;
  options = extend_object({&lt;br /&gt;
    map: this.map&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  if (useGeoJSON == false) {&lt;br /&gt;
    options.paths = [options.paths.slice(0)];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.paths.length &amp;gt; 0) {&lt;br /&gt;
    if (options.paths[0].length &amp;gt; 0) {&lt;br /&gt;
      options.paths = array_flat(array_map(options.paths, arrayToLatLng, useGeoJSON));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var polygon = new google.maps.Polygon(options),&lt;br /&gt;
      polygon_events = [&amp;#039;click&amp;#039;, &amp;#039;dblclick&amp;#039;, &amp;#039;mousedown&amp;#039;, &amp;#039;mousemove&amp;#039;, &amp;#039;mouseout&amp;#039;, &amp;#039;mouseover&amp;#039;, &amp;#039;mouseup&amp;#039;, &amp;#039;rightclick&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var ev = 0; ev &amp;lt; polygon_events.length; ev++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(e){&lt;br /&gt;
          options[name].apply(this, [e]);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(polygon, polygon_events[ev]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons.push(polygon);&lt;br /&gt;
&lt;br /&gt;
  GMaps.fire(&amp;#039;polygon_added&amp;#039;, polygon, this);&lt;br /&gt;
&lt;br /&gt;
  return polygon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolygon = function(polygon) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; this.polygons.length; i++) {&lt;br /&gt;
    if (this.polygons[i] === polygon) {&lt;br /&gt;
      this.polygons[i].setMap(null);&lt;br /&gt;
      this.polygons.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
      GMaps.fire(&amp;#039;polygon_removed&amp;#039;, polygon, this);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removePolygons = function() {&lt;br /&gt;
  for (var i = 0, item; item = this.polygons[i]; i++) {&lt;br /&gt;
    item.setMap(null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polygons = [];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getFromFusionTables = function(options) {&lt;br /&gt;
  var events = options.events;&lt;br /&gt;
&lt;br /&gt;
  delete options.events;&lt;br /&gt;
&lt;br /&gt;
  var fusion_tables_options = options,&lt;br /&gt;
      layer = new google.maps.FusionTablesLayer(fusion_tables_options);&lt;br /&gt;
&lt;br /&gt;
  for (var ev in events) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      google.maps.event.addListener(object, name, function(e) {&lt;br /&gt;
        events[name].apply(this, [e]);&lt;br /&gt;
      });&lt;br /&gt;
    })(layer, ev);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.layers.push(layer);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.loadFromFusionTables = function(options) {&lt;br /&gt;
  var layer = this.getFromFusionTables(options);&lt;br /&gt;
  layer.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getFromKML = function(options) {&lt;br /&gt;
  var url = options.url,&lt;br /&gt;
      events = options.events;&lt;br /&gt;
&lt;br /&gt;
  delete options.url;&lt;br /&gt;
  delete options.events;&lt;br /&gt;
&lt;br /&gt;
  var kml_options = options,&lt;br /&gt;
      layer = new google.maps.KmlLayer(url, kml_options);&lt;br /&gt;
&lt;br /&gt;
  for (var ev in events) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      google.maps.event.addListener(object, name, function(e) {&lt;br /&gt;
        events[name].apply(this, [e]);&lt;br /&gt;
      });&lt;br /&gt;
    })(layer, ev);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.layers.push(layer);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.loadFromKML = function(options) {&lt;br /&gt;
  var layer = this.getFromKML(options);&lt;br /&gt;
  layer.setMap(this.map);&lt;br /&gt;
&lt;br /&gt;
  return layer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addLayer = function(layerName, options) {&lt;br /&gt;
  //var default_layers = [&amp;#039;weather&amp;#039;, &amp;#039;clouds&amp;#039;, &amp;#039;traffic&amp;#039;, &amp;#039;transit&amp;#039;, &amp;#039;bicycling&amp;#039;, &amp;#039;panoramio&amp;#039;, &amp;#039;places&amp;#039;];&lt;br /&gt;
  options = options || {};&lt;br /&gt;
  var layer;&lt;br /&gt;
&lt;br /&gt;
  switch(layerName) {&lt;br /&gt;
    case &amp;#039;weather&amp;#039;: this.singleLayers.weather = layer = new google.maps.weather.WeatherLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;clouds&amp;#039;: this.singleLayers.clouds = layer = new google.maps.weather.CloudLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;traffic&amp;#039;: this.singleLayers.traffic = layer = new google.maps.TrafficLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;transit&amp;#039;: this.singleLayers.transit = layer = new google.maps.TransitLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;bicycling&amp;#039;: this.singleLayers.bicycling = layer = new google.maps.BicyclingLayer();&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;panoramio&amp;#039;:&lt;br /&gt;
        this.singleLayers.panoramio = layer = new google.maps.panoramio.PanoramioLayer();&lt;br /&gt;
        layer.setTag(options.filter);&lt;br /&gt;
        delete options.filter;&lt;br /&gt;
&lt;br /&gt;
        //click event&lt;br /&gt;
        if (options.click) {&lt;br /&gt;
          google.maps.event.addListener(layer, &amp;#039;click&amp;#039;, function(event) {&lt;br /&gt;
            options.click(event);&lt;br /&gt;
            delete options.click;&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
      break;&lt;br /&gt;
      case &amp;#039;places&amp;#039;:&lt;br /&gt;
        this.singleLayers.places = layer = new google.maps.places.PlacesService(this.map);&lt;br /&gt;
&lt;br /&gt;
        //search, nearbySearch, radarSearch callback, Both are the same&lt;br /&gt;
        if (options.search || options.nearbySearch || options.radarSearch) {&lt;br /&gt;
          var placeSearchRequest  = {&lt;br /&gt;
            bounds : options.bounds || null,&lt;br /&gt;
            keyword : options.keyword || null,&lt;br /&gt;
            location : options.location || null,&lt;br /&gt;
            name : options.name || null,&lt;br /&gt;
            radius : options.radius || null,&lt;br /&gt;
            rankBy : options.rankBy || null,&lt;br /&gt;
            types : options.types || null&lt;br /&gt;
          };&lt;br /&gt;
&lt;br /&gt;
          if (options.radarSearch) {&lt;br /&gt;
            layer.radarSearch(placeSearchRequest, options.radarSearch);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (options.search) {&lt;br /&gt;
            layer.search(placeSearchRequest, options.search);&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          if (options.nearbySearch) {&lt;br /&gt;
            layer.nearbySearch(placeSearchRequest, options.nearbySearch);&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //textSearch callback&lt;br /&gt;
        if (options.textSearch) {&lt;br /&gt;
          var textSearchRequest  = {&lt;br /&gt;
            bounds : options.bounds || null,&lt;br /&gt;
            location : options.location || null,&lt;br /&gt;
            query : options.query || null,&lt;br /&gt;
            radius : options.radius || null&lt;br /&gt;
          };&lt;br /&gt;
&lt;br /&gt;
          layer.textSearch(textSearchRequest, options.textSearch);&lt;br /&gt;
        }&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (layer !== undefined) {&lt;br /&gt;
    if (typeof layer.setOptions == &amp;#039;function&amp;#039;) {&lt;br /&gt;
      layer.setOptions(options);&lt;br /&gt;
    }&lt;br /&gt;
    if (typeof layer.setMap == &amp;#039;function&amp;#039;) {&lt;br /&gt;
      layer.setMap(this.map);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return layer;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeLayer = function(layer) {&lt;br /&gt;
  if (typeof(layer) == &amp;quot;string&amp;quot; &amp;amp;&amp;amp; this.singleLayers[layer] !== undefined) {&lt;br /&gt;
     this.singleLayers[layer].setMap(null);&lt;br /&gt;
&lt;br /&gt;
     delete this.singleLayers[layer];&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    for (var i = 0; i &amp;lt; this.layers.length; i++) {&lt;br /&gt;
      if (this.layers[i] === layer) {&lt;br /&gt;
        this.layers[i].setMap(null);&lt;br /&gt;
        this.layers.splice(i, 1);&lt;br /&gt;
&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var travelMode, unitSystem;&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getRoutes = function(options) {&lt;br /&gt;
  switch (options.travelMode) {&lt;br /&gt;
    case &amp;#039;bicycling&amp;#039;:&lt;br /&gt;
      travelMode = google.maps.TravelMode.BICYCLING;&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;transit&amp;#039;:&lt;br /&gt;
      travelMode = google.maps.TravelMode.TRANSIT;&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;driving&amp;#039;:&lt;br /&gt;
      travelMode = google.maps.TravelMode.DRIVING;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      travelMode = google.maps.TravelMode.WALKING;&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (options.unitSystem === &amp;#039;imperial&amp;#039;) {&lt;br /&gt;
    unitSystem = google.maps.UnitSystem.IMPERIAL;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    unitSystem = google.maps.UnitSystem.METRIC;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var base_options = {&lt;br /&gt;
        avoidHighways: false,&lt;br /&gt;
        avoidTolls: false,&lt;br /&gt;
        optimizeWaypoints: false,&lt;br /&gt;
        waypoints: []&lt;br /&gt;
      },&lt;br /&gt;
      request_options =  extend_object(base_options, options);&lt;br /&gt;
&lt;br /&gt;
  request_options.origin = /string/.test(typeof options.origin) ? options.origin : new google.maps.LatLng(options.origin[0], options.origin[1]);&lt;br /&gt;
  request_options.destination = /string/.test(typeof options.destination) ? options.destination : new google.maps.LatLng(options.destination[0], options.destination[1]);&lt;br /&gt;
  request_options.travelMode = travelMode;&lt;br /&gt;
  request_options.unitSystem = unitSystem;&lt;br /&gt;
&lt;br /&gt;
  delete request_options.callback;&lt;br /&gt;
  delete request_options.error;&lt;br /&gt;
&lt;br /&gt;
  var self = this,&lt;br /&gt;
      routes = [],&lt;br /&gt;
      service = new google.maps.DirectionsService();&lt;br /&gt;
&lt;br /&gt;
  service.route(request_options, function(result, status) {&lt;br /&gt;
    if (status === google.maps.DirectionsStatus.OK) {&lt;br /&gt;
      for (var r in result.routes) {&lt;br /&gt;
        if (result.routes.hasOwnProperty(r)) {&lt;br /&gt;
          routes.push(result.routes[r]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (options.callback) {&lt;br /&gt;
        options.callback(routes, result, status);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      if (options.error) {&lt;br /&gt;
        options.error(result, status);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeRoutes = function() {&lt;br /&gt;
  this.routes.length = 0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.getElevations = function(options) {&lt;br /&gt;
  options = extend_object({&lt;br /&gt;
    locations: [],&lt;br /&gt;
    path : false,&lt;br /&gt;
    samples : 256&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
  if (options.locations.length &amp;gt; 0) {&lt;br /&gt;
    if (options.locations[0].length &amp;gt; 0) {&lt;br /&gt;
      options.locations = array_flat(array_map([options.locations], arrayToLatLng,  false));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var callback = options.callback;&lt;br /&gt;
  delete options.callback;&lt;br /&gt;
&lt;br /&gt;
  var service = new google.maps.ElevationService();&lt;br /&gt;
&lt;br /&gt;
  //location request&lt;br /&gt;
  if (!options.path) {&lt;br /&gt;
    delete options.path;&lt;br /&gt;
    delete options.samples;&lt;br /&gt;
&lt;br /&gt;
    service.getElevationForLocations(options, function(result, status) {&lt;br /&gt;
      if (callback &amp;amp;&amp;amp; typeof(callback) === &amp;quot;function&amp;quot;) {&lt;br /&gt;
        callback(result, status);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  //path request&lt;br /&gt;
  } else {&lt;br /&gt;
    var pathRequest = {&lt;br /&gt;
      path : options.locations,&lt;br /&gt;
      samples : options.samples&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    service.getElevationAlongPath(pathRequest, function(result, status) {&lt;br /&gt;
     if (callback &amp;amp;&amp;amp; typeof(callback) === &amp;quot;function&amp;quot;) {&lt;br /&gt;
        callback(result, status);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.cleanRoute = GMaps.prototype.removePolylines;&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.renderRoute = function(options, renderOptions) {&lt;br /&gt;
  var self = this,&lt;br /&gt;
      panel = ((typeof renderOptions.panel === &amp;#039;string&amp;#039;) ? document.getElementById(renderOptions.panel.replace(&amp;#039;#&amp;#039;, &amp;#039;&amp;#039;)) : renderOptions.panel),&lt;br /&gt;
      display;&lt;br /&gt;
&lt;br /&gt;
  renderOptions.panel = panel;&lt;br /&gt;
  renderOptions = extend_object({&lt;br /&gt;
    map: this.map&lt;br /&gt;
  }, renderOptions);&lt;br /&gt;
  display = new google.maps.DirectionsRenderer(renderOptions);&lt;br /&gt;
&lt;br /&gt;
  this.getRoutes({&lt;br /&gt;
    origin: options.origin,&lt;br /&gt;
    destination: options.destination,&lt;br /&gt;
    travelMode: options.travelMode,&lt;br /&gt;
    waypoints: options.waypoints,&lt;br /&gt;
    unitSystem: options.unitSystem,&lt;br /&gt;
    error: options.error,&lt;br /&gt;
    avoidHighways: options.avoidHighways,&lt;br /&gt;
    avoidTolls: options.avoidTolls,&lt;br /&gt;
    optimizeWaypoints: options.optimizeWaypoints,&lt;br /&gt;
    callback: function(routes, response, status) {&lt;br /&gt;
      if (status === google.maps.DirectionsStatus.OK) {&lt;br /&gt;
        display.setDirections(response);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawRoute = function(options) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  this.getRoutes({&lt;br /&gt;
    origin: options.origin,&lt;br /&gt;
    destination: options.destination,&lt;br /&gt;
    travelMode: options.travelMode,&lt;br /&gt;
    waypoints: options.waypoints,&lt;br /&gt;
    unitSystem: options.unitSystem,&lt;br /&gt;
    error: options.error,&lt;br /&gt;
    avoidHighways: options.avoidHighways,&lt;br /&gt;
    avoidTolls: options.avoidTolls,&lt;br /&gt;
    optimizeWaypoints: options.optimizeWaypoints,&lt;br /&gt;
    callback: function(routes) {&lt;br /&gt;
      if (routes.length &amp;gt; 0) {&lt;br /&gt;
        var polyline_options = {&lt;br /&gt;
          path: routes[routes.length - 1].overview_path,&lt;br /&gt;
          strokeColor: options.strokeColor,&lt;br /&gt;
          strokeOpacity: options.strokeOpacity,&lt;br /&gt;
          strokeWeight: options.strokeWeight&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
          polyline_options.icons = options.icons;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        self.drawPolyline(polyline_options);&lt;br /&gt;
&lt;br /&gt;
        if (options.callback) {&lt;br /&gt;
          options.callback(routes[routes.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.travelRoute = function(options) {&lt;br /&gt;
  if (options.origin &amp;amp;&amp;amp; options.destination) {&lt;br /&gt;
    this.getRoutes({&lt;br /&gt;
      origin: options.origin,&lt;br /&gt;
      destination: options.destination,&lt;br /&gt;
      travelMode: options.travelMode,&lt;br /&gt;
      waypoints : options.waypoints,&lt;br /&gt;
      unitSystem: options.unitSystem,&lt;br /&gt;
      error: options.error,&lt;br /&gt;
      callback: function(e) {&lt;br /&gt;
        //start callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.start) {&lt;br /&gt;
          options.start(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //step callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.step) {&lt;br /&gt;
          var route = e[e.length - 1];&lt;br /&gt;
          if (route.legs.length &amp;gt; 0) {&lt;br /&gt;
            var steps = route.legs[0].steps;&lt;br /&gt;
            for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
              step.step_number = i;&lt;br /&gt;
              options.step(step, (route.legs[0].steps.length - 1));&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //end callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.end) {&lt;br /&gt;
           options.end(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.route) {&lt;br /&gt;
    if (options.route.legs.length &amp;gt; 0) {&lt;br /&gt;
      var steps = options.route.legs[0].steps;&lt;br /&gt;
      for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
        step.step_number = i;&lt;br /&gt;
        options.step(step);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.drawSteppedRoute = function(options) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  if (options.origin &amp;amp;&amp;amp; options.destination) {&lt;br /&gt;
    this.getRoutes({&lt;br /&gt;
      origin: options.origin,&lt;br /&gt;
      destination: options.destination,&lt;br /&gt;
      travelMode: options.travelMode,&lt;br /&gt;
      waypoints : options.waypoints,&lt;br /&gt;
      error: options.error,&lt;br /&gt;
      callback: function(e) {&lt;br /&gt;
        //start callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.start) {&lt;br /&gt;
          options.start(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //step callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.step) {&lt;br /&gt;
          var route = e[e.length - 1];&lt;br /&gt;
          if (route.legs.length &amp;gt; 0) {&lt;br /&gt;
            var steps = route.legs[0].steps;&lt;br /&gt;
            for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
              step.step_number = i;&lt;br /&gt;
              var polyline_options = {&lt;br /&gt;
                path: step.path,&lt;br /&gt;
                strokeColor: options.strokeColor,&lt;br /&gt;
                strokeOpacity: options.strokeOpacity,&lt;br /&gt;
                strokeWeight: options.strokeWeight&lt;br /&gt;
              };&lt;br /&gt;
&lt;br /&gt;
              if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
                polyline_options.icons = options.icons;&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              self.drawPolyline(polyline_options);&lt;br /&gt;
              options.step(step, (route.legs[0].steps.length - 1));&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //end callback&lt;br /&gt;
        if (e.length &amp;gt; 0 &amp;amp;&amp;amp; options.end) {&lt;br /&gt;
           options.end(e[e.length - 1]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.route) {&lt;br /&gt;
    if (options.route.legs.length &amp;gt; 0) {&lt;br /&gt;
      var steps = options.route.legs[0].steps;&lt;br /&gt;
      for (var i = 0, step; step = steps[i]; i++) {&lt;br /&gt;
        step.step_number = i;&lt;br /&gt;
        var polyline_options = {&lt;br /&gt;
          path: step.path,&lt;br /&gt;
          strokeColor: options.strokeColor,&lt;br /&gt;
          strokeOpacity: options.strokeOpacity,&lt;br /&gt;
          strokeWeight: options.strokeWeight&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
          polyline_options.icons = options.icons;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        self.drawPolyline(polyline_options);&lt;br /&gt;
        options.step(step);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route = function(options) {&lt;br /&gt;
  this.origin = options.origin;&lt;br /&gt;
  this.destination = options.destination;&lt;br /&gt;
  this.waypoints = options.waypoints;&lt;br /&gt;
&lt;br /&gt;
  this.map = options.map;&lt;br /&gt;
  this.route = options.route;&lt;br /&gt;
  this.step_count = 0;&lt;br /&gt;
  this.steps = this.route.legs[0].steps;&lt;br /&gt;
  this.steps_length = this.steps.length;&lt;br /&gt;
&lt;br /&gt;
  var polyline_options = {&lt;br /&gt;
    path: new google.maps.MVCArray(),&lt;br /&gt;
    strokeColor: options.strokeColor,&lt;br /&gt;
    strokeOpacity: options.strokeOpacity,&lt;br /&gt;
    strokeWeight: options.strokeWeight&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;icons&amp;quot;)) {&lt;br /&gt;
    polyline_options.icons = options.icons;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.polyline = this.map.drawPolyline(polyline_options).getPath();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route.prototype.getRoute = function(options) {&lt;br /&gt;
  var self = this;&lt;br /&gt;
&lt;br /&gt;
  this.map.getRoutes({&lt;br /&gt;
    origin : this.origin,&lt;br /&gt;
    destination : this.destination,&lt;br /&gt;
    travelMode : options.travelMode,&lt;br /&gt;
    waypoints : this.waypoints || [],&lt;br /&gt;
    error: options.error,&lt;br /&gt;
    callback : function() {&lt;br /&gt;
      self.route = e[0];&lt;br /&gt;
&lt;br /&gt;
      if (options.callback) {&lt;br /&gt;
        options.callback.call(self);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route.prototype.back = function() {&lt;br /&gt;
  if (this.step_count &amp;gt; 0) {&lt;br /&gt;
    this.step_count--;&lt;br /&gt;
    var path = this.route.legs[0].steps[this.step_count].path;&lt;br /&gt;
&lt;br /&gt;
    for (var p in path){&lt;br /&gt;
      if (path.hasOwnProperty(p)){&lt;br /&gt;
        this.polyline.pop();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.Route.prototype.forward = function() {&lt;br /&gt;
  if (this.step_count &amp;lt; this.steps_length) {&lt;br /&gt;
    var path = this.route.legs[0].steps[this.step_count].path;&lt;br /&gt;
&lt;br /&gt;
    for (var p in path){&lt;br /&gt;
      if (path.hasOwnProperty(p)){&lt;br /&gt;
        this.polyline.push(path[p]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    this.step_count++;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.checkGeofence = function(lat, lng, fence) {&lt;br /&gt;
  return fence.containsLatLng(new google.maps.LatLng(lat, lng));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.checkMarkerGeofence = function(marker, outside_callback) {&lt;br /&gt;
  if (marker.fences) {&lt;br /&gt;
    for (var i = 0, fence; fence = marker.fences[i]; i++) {&lt;br /&gt;
      var pos = marker.getPosition();&lt;br /&gt;
      if (!this.checkGeofence(pos.lat(), pos.lng(), fence)) {&lt;br /&gt;
        outside_callback(marker, fence);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.toImage = function(options) {&lt;br /&gt;
  var options = options || {},&lt;br /&gt;
      static_map_options = {};&lt;br /&gt;
&lt;br /&gt;
  static_map_options[&amp;#039;size&amp;#039;] = options[&amp;#039;size&amp;#039;] || [this.el.clientWidth, this.el.clientHeight];&lt;br /&gt;
  static_map_options[&amp;#039;lat&amp;#039;] = this.getCenter().lat();&lt;br /&gt;
  static_map_options[&amp;#039;lng&amp;#039;] = this.getCenter().lng();&lt;br /&gt;
&lt;br /&gt;
  if (this.markers.length &amp;gt; 0) {&lt;br /&gt;
    static_map_options[&amp;#039;markers&amp;#039;] = [];&lt;br /&gt;
    &lt;br /&gt;
    for (var i = 0; i &amp;lt; this.markers.length; i++) {&lt;br /&gt;
      static_map_options[&amp;#039;markers&amp;#039;].push({&lt;br /&gt;
        lat: this.markers[i].getPosition().lat(),&lt;br /&gt;
        lng: this.markers[i].getPosition().lng()&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (this.polylines.length &amp;gt; 0) {&lt;br /&gt;
    var polyline = this.polylines[0];&lt;br /&gt;
    &lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;] = {};&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;path&amp;#039;] = google.maps.geometry.encoding.encodePath(polyline.getPath());&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;strokeColor&amp;#039;] = polyline.strokeColor&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;strokeOpacity&amp;#039;] = polyline.strokeOpacity&lt;br /&gt;
    static_map_options[&amp;#039;polyline&amp;#039;][&amp;#039;strokeWeight&amp;#039;] = polyline.strokeWeight&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return GMaps.staticMapURL(static_map_options);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.staticMapURL = function(options){&lt;br /&gt;
  var parameters = [],&lt;br /&gt;
      data,&lt;br /&gt;
      static_root = (location.protocol === &amp;#039;file:&amp;#039; ? &amp;#039;http:&amp;#039; : location.protocol ) + &amp;#039;//maps.googleapis.com/maps/api/staticmap&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  if (options.url) {&lt;br /&gt;
    static_root = options.url;&lt;br /&gt;
    delete options.url;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  static_root += &amp;#039;?&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  var markers = options.markers;&lt;br /&gt;
  &lt;br /&gt;
  delete options.markers;&lt;br /&gt;
&lt;br /&gt;
  if (!markers &amp;amp;&amp;amp; options.marker) {&lt;br /&gt;
    markers = [options.marker];&lt;br /&gt;
    delete options.marker;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var styles = options.styles;&lt;br /&gt;
&lt;br /&gt;
  delete options.styles;&lt;br /&gt;
&lt;br /&gt;
  var polyline = options.polyline;&lt;br /&gt;
  delete options.polyline;&lt;br /&gt;
&lt;br /&gt;
  /** Map options **/&lt;br /&gt;
  if (options.center) {&lt;br /&gt;
    parameters.push(&amp;#039;center=&amp;#039; + options.center);&lt;br /&gt;
    delete options.center;&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.address) {&lt;br /&gt;
    parameters.push(&amp;#039;center=&amp;#039; + options.address);&lt;br /&gt;
    delete options.address;&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.lat) {&lt;br /&gt;
    parameters.push([&amp;#039;center=&amp;#039;, options.lat, &amp;#039;,&amp;#039;, options.lng].join(&amp;#039;&amp;#039;));&lt;br /&gt;
    delete options.lat;&lt;br /&gt;
    delete options.lng;&lt;br /&gt;
  }&lt;br /&gt;
  else if (options.visible) {&lt;br /&gt;
    var visible = encodeURI(options.visible.join(&amp;#039;|&amp;#039;));&lt;br /&gt;
    parameters.push(&amp;#039;visible=&amp;#039; + visible);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var size = options.size;&lt;br /&gt;
  if (size) {&lt;br /&gt;
    if (size.join) {&lt;br /&gt;
      size = size.join(&amp;#039;x&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
    delete options.size;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    size = &amp;#039;630x300&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
  parameters.push(&amp;#039;size=&amp;#039; + size);&lt;br /&gt;
&lt;br /&gt;
  if (!options.zoom &amp;amp;&amp;amp; options.zoom !== false) {&lt;br /&gt;
    options.zoom = 15;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var sensor = options.hasOwnProperty(&amp;#039;sensor&amp;#039;) ? !!options.sensor : true;&lt;br /&gt;
  delete options.sensor;&lt;br /&gt;
  parameters.push(&amp;#039;sensor=&amp;#039; + sensor);&lt;br /&gt;
&lt;br /&gt;
  for (var param in options) {&lt;br /&gt;
    if (options.hasOwnProperty(param)) {&lt;br /&gt;
      parameters.push(param + &amp;#039;=&amp;#039; + options[param]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Markers **/&lt;br /&gt;
  if (markers) {&lt;br /&gt;
    var marker, loc;&lt;br /&gt;
&lt;br /&gt;
    for (var i = 0; data = markers[i]; i++) {&lt;br /&gt;
      marker = [];&lt;br /&gt;
&lt;br /&gt;
      if (data.size &amp;amp;&amp;amp; data.size !== &amp;#039;normal&amp;#039;) {&lt;br /&gt;
        marker.push(&amp;#039;size:&amp;#039; + data.size);&lt;br /&gt;
        delete data.size;&lt;br /&gt;
      }&lt;br /&gt;
      else if (data.icon) {&lt;br /&gt;
        marker.push(&amp;#039;icon:&amp;#039; + encodeURI(data.icon));&lt;br /&gt;
        delete data.icon;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (data.color) {&lt;br /&gt;
        marker.push(&amp;#039;color:&amp;#039; + data.color.replace(&amp;#039;#&amp;#039;, &amp;#039;0x&amp;#039;));&lt;br /&gt;
        delete data.color;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (data.label) {&lt;br /&gt;
        marker.push(&amp;#039;label:&amp;#039; + data.label[0].toUpperCase());&lt;br /&gt;
        delete data.label;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      loc = (data.address ? data.address : data.lat + &amp;#039;,&amp;#039; + data.lng);&lt;br /&gt;
      delete data.address;&lt;br /&gt;
      delete data.lat;&lt;br /&gt;
      delete data.lng;&lt;br /&gt;
&lt;br /&gt;
      for(var param in data){&lt;br /&gt;
        if (data.hasOwnProperty(param)) {&lt;br /&gt;
          marker.push(param + &amp;#039;:&amp;#039; + data[param]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (marker.length || i === 0) {&lt;br /&gt;
        marker.push(loc);&lt;br /&gt;
        marker = marker.join(&amp;#039;|&amp;#039;);&lt;br /&gt;
        parameters.push(&amp;#039;markers=&amp;#039; + encodeURI(marker));&lt;br /&gt;
      }&lt;br /&gt;
      // New marker without styles&lt;br /&gt;
      else {&lt;br /&gt;
        marker = parameters.pop() + encodeURI(&amp;#039;|&amp;#039; + loc);&lt;br /&gt;
        parameters.push(marker);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Map Styles **/&lt;br /&gt;
  if (styles) {&lt;br /&gt;
    for (var i = 0; i &amp;lt; styles.length; i++) {&lt;br /&gt;
      var styleRule = [];&lt;br /&gt;
      if (styles[i].featureType){&lt;br /&gt;
        styleRule.push(&amp;#039;feature:&amp;#039; + styles[i].featureType.toLowerCase());&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (styles[i].elementType) {&lt;br /&gt;
        styleRule.push(&amp;#039;element:&amp;#039; + styles[i].elementType.toLowerCase());&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      for (var j = 0; j &amp;lt; styles[i].stylers.length; j++) {&lt;br /&gt;
        for (var p in styles[i].stylers[j]) {&lt;br /&gt;
          var ruleArg = styles[i].stylers[j][p];&lt;br /&gt;
          if (p == &amp;#039;hue&amp;#039; || p == &amp;#039;color&amp;#039;) {&lt;br /&gt;
            ruleArg = &amp;#039;0x&amp;#039; + ruleArg.substring(1);&lt;br /&gt;
          }&lt;br /&gt;
          styleRule.push(p + &amp;#039;:&amp;#039; + ruleArg);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var rule = styleRule.join(&amp;#039;|&amp;#039;);&lt;br /&gt;
      if (rule != &amp;#039;&amp;#039;) {&lt;br /&gt;
        parameters.push(&amp;#039;style=&amp;#039; + rule);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Polylines **/&lt;br /&gt;
  function parseColor(color, opacity) {&lt;br /&gt;
    if (color[0] === &amp;#039;#&amp;#039;){&lt;br /&gt;
      color = color.replace(&amp;#039;#&amp;#039;, &amp;#039;0x&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
      if (opacity) {&lt;br /&gt;
        opacity = parseFloat(opacity);&lt;br /&gt;
        opacity = Math.min(1, Math.max(opacity, 0));&lt;br /&gt;
        if (opacity === 0) {&lt;br /&gt;
          return &amp;#039;0x00000000&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
        opacity = (opacity * 255).toString(16);&lt;br /&gt;
        if (opacity.length === 1) {&lt;br /&gt;
          opacity += opacity;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        color = color.slice(0,8) + opacity;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return color;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (polyline) {&lt;br /&gt;
    data = polyline;&lt;br /&gt;
    polyline = [];&lt;br /&gt;
&lt;br /&gt;
    if (data.strokeWeight) {&lt;br /&gt;
      polyline.push(&amp;#039;weight:&amp;#039; + parseInt(data.strokeWeight, 10));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (data.strokeColor) {&lt;br /&gt;
      var color = parseColor(data.strokeColor, data.strokeOpacity);&lt;br /&gt;
      polyline.push(&amp;#039;color:&amp;#039; + color);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (data.fillColor) {&lt;br /&gt;
      var fillcolor = parseColor(data.fillColor, data.fillOpacity);&lt;br /&gt;
      polyline.push(&amp;#039;fillcolor:&amp;#039; + fillcolor);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var path = data.path;&lt;br /&gt;
    if (path.join) {&lt;br /&gt;
      for (var j=0, pos; pos=path[j]; j++) {&lt;br /&gt;
        polyline.push(pos.join(&amp;#039;,&amp;#039;));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      polyline.push(&amp;#039;enc:&amp;#039; + path);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    polyline = polyline.join(&amp;#039;|&amp;#039;);&lt;br /&gt;
    parameters.push(&amp;#039;path=&amp;#039; + encodeURI(polyline));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /** Retina support **/&lt;br /&gt;
  var dpi = window.devicePixelRatio || 1;&lt;br /&gt;
  parameters.push(&amp;#039;scale=&amp;#039; + dpi);&lt;br /&gt;
&lt;br /&gt;
  parameters = parameters.join(&amp;#039;&amp;amp;&amp;#039;);&lt;br /&gt;
  return static_root + parameters;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addMapType = function(mapTypeId, options) {&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;getTileUrl&amp;quot;) &amp;amp;&amp;amp; typeof(options[&amp;quot;getTileUrl&amp;quot;]) == &amp;quot;function&amp;quot;) {&lt;br /&gt;
    options.tileSize = options.tileSize || new google.maps.Size(256, 256);&lt;br /&gt;
&lt;br /&gt;
    var mapType = new google.maps.ImageMapType(options);&lt;br /&gt;
&lt;br /&gt;
    this.map.mapTypes.set(mapTypeId, mapType);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    throw &amp;quot;&amp;#039;getTileUrl&amp;#039; function required.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addOverlayMapType = function(options) {&lt;br /&gt;
  if (options.hasOwnProperty(&amp;quot;getTile&amp;quot;) &amp;amp;&amp;amp; typeof(options[&amp;quot;getTile&amp;quot;]) == &amp;quot;function&amp;quot;) {&lt;br /&gt;
    var overlayMapTypeIndex = options.index;&lt;br /&gt;
&lt;br /&gt;
    delete options.index;&lt;br /&gt;
&lt;br /&gt;
    this.map.overlayMapTypes.insertAt(overlayMapTypeIndex, options);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    throw &amp;quot;&amp;#039;getTile&amp;#039; function required.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.removeOverlayMapType = function(overlayMapTypeIndex) {&lt;br /&gt;
  this.map.overlayMapTypes.removeAt(overlayMapTypeIndex);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.addStyle = function(options) {&lt;br /&gt;
  var styledMapType = new google.maps.StyledMapType(options.styles, { name: options.styledMapName });&lt;br /&gt;
&lt;br /&gt;
  this.map.mapTypes.set(options.mapTypeId, styledMapType);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.setStyle = function(mapTypeId) {&lt;br /&gt;
  this.map.setMapTypeId(mapTypeId);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.createPanorama = function(streetview_options) {&lt;br /&gt;
  if (!streetview_options.hasOwnProperty(&amp;#039;lat&amp;#039;) || !streetview_options.hasOwnProperty(&amp;#039;lng&amp;#039;)) {&lt;br /&gt;
    streetview_options.lat = this.getCenter().lat();&lt;br /&gt;
    streetview_options.lng = this.getCenter().lng();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  this.panorama = GMaps.createPanorama(streetview_options);&lt;br /&gt;
&lt;br /&gt;
  this.map.setStreetView(this.panorama);&lt;br /&gt;
&lt;br /&gt;
  return this.panorama;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.createPanorama = function(options) {&lt;br /&gt;
  var el = getElementById(options.el, options.context);&lt;br /&gt;
&lt;br /&gt;
  options.position = new google.maps.LatLng(options.lat, options.lng);&lt;br /&gt;
&lt;br /&gt;
  delete options.el;&lt;br /&gt;
  delete options.context;&lt;br /&gt;
  delete options.lat;&lt;br /&gt;
  delete options.lng;&lt;br /&gt;
&lt;br /&gt;
  var streetview_events = [&amp;#039;closeclick&amp;#039;, &amp;#039;links_changed&amp;#039;, &amp;#039;pano_changed&amp;#039;, &amp;#039;position_changed&amp;#039;, &amp;#039;pov_changed&amp;#039;, &amp;#039;resize&amp;#039;, &amp;#039;visible_changed&amp;#039;],&lt;br /&gt;
      streetview_options = extend_object({visible : true}, options);&lt;br /&gt;
&lt;br /&gt;
  for (var i = 0; i &amp;lt; streetview_events.length; i++) {&lt;br /&gt;
    delete streetview_options[streetview_events[i]];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var panorama = new google.maps.StreetViewPanorama(el, streetview_options);&lt;br /&gt;
&lt;br /&gt;
  for (var i = 0; i &amp;lt; streetview_events.length; i++) {&lt;br /&gt;
    (function(object, name) {&lt;br /&gt;
      if (options[name]) {&lt;br /&gt;
        google.maps.event.addListener(object, name, function(){&lt;br /&gt;
          options[name].apply(this);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    })(panorama, streetview_events[i]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return panorama;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.on = function(event_name, handler) {&lt;br /&gt;
  return GMaps.on(event_name, this, handler);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.off = function(event_name) {&lt;br /&gt;
  GMaps.off(event_name, this);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.prototype.once = function(event_name, handler) {&lt;br /&gt;
  return GMaps.once(event_name, this, handler);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.custom_events = [&amp;#039;marker_added&amp;#039;, &amp;#039;marker_removed&amp;#039;, &amp;#039;polyline_added&amp;#039;, &amp;#039;polyline_removed&amp;#039;, &amp;#039;polygon_added&amp;#039;, &amp;#039;polygon_removed&amp;#039;, &amp;#039;geolocated&amp;#039;, &amp;#039;geolocation_failed&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
GMaps.on = function(event_name, object, handler) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    if(object instanceof GMaps) object = object.map; &lt;br /&gt;
    return google.maps.event.addListener(object, event_name, handler);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    var registered_event = {&lt;br /&gt;
      handler : handler,&lt;br /&gt;
      eventName : event_name&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    object.registered_events[event_name] = object.registered_events[event_name] || [];&lt;br /&gt;
    object.registered_events[event_name].push(registered_event);&lt;br /&gt;
&lt;br /&gt;
    return registered_event;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.off = function(event_name, object) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    if(object instanceof GMaps) object = object.map; &lt;br /&gt;
    google.maps.event.clearListeners(object, event_name);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    object.registered_events[event_name] = [];&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.once = function(event_name, object, handler) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    if(object instanceof GMaps) object = object.map;&lt;br /&gt;
    return google.maps.event.addListenerOnce(object, event_name, handler);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.fire = function(event_name, object, scope) {&lt;br /&gt;
  if (GMaps.custom_events.indexOf(event_name) == -1) {&lt;br /&gt;
    google.maps.event.trigger(object, event_name, Array.prototype.slice.apply(arguments).slice(2));&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    if(event_name in scope.registered_events) {&lt;br /&gt;
      var firing_events = scope.registered_events[event_name];&lt;br /&gt;
&lt;br /&gt;
      for(var i = 0; i &amp;lt; firing_events.length; i++) {&lt;br /&gt;
        (function(handler, scope, object) {&lt;br /&gt;
          handler.apply(scope, [object]);&lt;br /&gt;
        })(firing_events[i][&amp;#039;handler&amp;#039;], scope, object);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.geolocate = function(options) {&lt;br /&gt;
  var complete_callback = options.always || options.complete;&lt;br /&gt;
&lt;br /&gt;
  if (navigator.geolocation) {&lt;br /&gt;
    navigator.geolocation.getCurrentPosition(function(position) {&lt;br /&gt;
      options.success(position);&lt;br /&gt;
&lt;br /&gt;
      if (complete_callback) {&lt;br /&gt;
        complete_callback();&lt;br /&gt;
      }&lt;br /&gt;
    }, function(error) {&lt;br /&gt;
      options.error(error);&lt;br /&gt;
&lt;br /&gt;
      if (complete_callback) {&lt;br /&gt;
        complete_callback();&lt;br /&gt;
      }&lt;br /&gt;
    }, options.options);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    options.not_supported();&lt;br /&gt;
&lt;br /&gt;
    if (complete_callback) {&lt;br /&gt;
      complete_callback();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
GMaps.geocode = function(options) {&lt;br /&gt;
  this.geocoder = new google.maps.Geocoder();&lt;br /&gt;
  var callback = options.callback;&lt;br /&gt;
  if (options.hasOwnProperty(&amp;#039;lat&amp;#039;) &amp;amp;&amp;amp; options.hasOwnProperty(&amp;#039;lng&amp;#039;)) {&lt;br /&gt;
    options.latLng = new google.maps.LatLng(options.lat, options.lng);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delete options.lat;&lt;br /&gt;
  delete options.lng;&lt;br /&gt;
  delete options.callback;&lt;br /&gt;
  &lt;br /&gt;
  this.geocoder.geocode(options, function(results, status) {&lt;br /&gt;
    callback(results, status);&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
if (typeof window.google === &amp;#039;object&amp;#039; &amp;amp;&amp;amp; window.google.maps) {&lt;br /&gt;
  //==========================&lt;br /&gt;
  // Polygon containsLatLng&lt;br /&gt;
  // https://github.com/tparkin/Google-Maps-Point-in-Polygon&lt;br /&gt;
  // Poygon getBounds extension - google-maps-extensions&lt;br /&gt;
  // http://code.google.com/p/google-maps-extensions/source/browse/google.maps.Polygon.getBounds.js&lt;br /&gt;
  if (!google.maps.Polygon.prototype.getBounds) {&lt;br /&gt;
    google.maps.Polygon.prototype.getBounds = function(latLng) {&lt;br /&gt;
      var bounds = new google.maps.LatLngBounds();&lt;br /&gt;
      var paths = this.getPaths();&lt;br /&gt;
      var path;&lt;br /&gt;
&lt;br /&gt;
      for (var p = 0; p &amp;lt; paths.getLength(); p++) {&lt;br /&gt;
        path = paths.getAt(p);&lt;br /&gt;
        for (var i = 0; i &amp;lt; path.getLength(); i++) {&lt;br /&gt;
          bounds.extend(path.getAt(i));&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return bounds;&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!google.maps.Polygon.prototype.containsLatLng) {&lt;br /&gt;
    // Polygon containsLatLng - method to determine if a latLng is within a polygon&lt;br /&gt;
    google.maps.Polygon.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
      // Exclude points outside of bounds as there is no way they are in the poly&lt;br /&gt;
      var bounds = this.getBounds();&lt;br /&gt;
&lt;br /&gt;
      if (bounds !== null &amp;amp;&amp;amp; !bounds.contains(latLng)) {&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Raycast point in polygon method&lt;br /&gt;
      var inPoly = false;&lt;br /&gt;
&lt;br /&gt;
      var numPaths = this.getPaths().getLength();&lt;br /&gt;
      for (var p = 0; p &amp;lt; numPaths; p++) {&lt;br /&gt;
        var path = this.getPaths().getAt(p);&lt;br /&gt;
        var numPoints = path.getLength();&lt;br /&gt;
        var j = numPoints - 1;&lt;br /&gt;
&lt;br /&gt;
        for (var i = 0; i &amp;lt; numPoints; i++) {&lt;br /&gt;
          var vertex1 = path.getAt(i);&lt;br /&gt;
          var vertex2 = path.getAt(j);&lt;br /&gt;
&lt;br /&gt;
          if (vertex1.lng() &amp;lt; latLng.lng() &amp;amp;&amp;amp; vertex2.lng() &amp;gt;= latLng.lng() || vertex2.lng() &amp;lt; latLng.lng() &amp;amp;&amp;amp; vertex1.lng() &amp;gt;= latLng.lng()) {&lt;br /&gt;
            if (vertex1.lat() + (latLng.lng() - vertex1.lng()) / (vertex2.lng() - vertex1.lng()) * (vertex2.lat() - vertex1.lat()) &amp;lt; latLng.lat()) {&lt;br /&gt;
              inPoly = !inPoly;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          j = i;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return inPoly;&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!google.maps.Circle.prototype.containsLatLng) {&lt;br /&gt;
    google.maps.Circle.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
      if (google.maps.geometry) {&lt;br /&gt;
        return google.maps.geometry.spherical.computeDistanceBetween(this.getCenter(), latLng) &amp;lt;= this.getRadius();&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        return true;&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  google.maps.Rectangle.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
    return this.getBounds().contains(latLng);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.LatLngBounds.prototype.containsLatLng = function(latLng) {&lt;br /&gt;
    return this.contains(latLng);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.Marker.prototype.setFences = function(fences) {&lt;br /&gt;
    this.fences = fences;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.Marker.prototype.addFence = function(fence) {&lt;br /&gt;
    this.fences.push(fence);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  google.maps.Marker.prototype.getId = function() {&lt;br /&gt;
    return this[&amp;#039;__gm_id&amp;#039;];&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//==========================&lt;br /&gt;
// Array indexOf&lt;br /&gt;
// https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf&lt;br /&gt;
if (!Array.prototype.indexOf) {&lt;br /&gt;
  Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {&lt;br /&gt;
      &amp;quot;use strict&amp;quot;;&lt;br /&gt;
      if (this == null) {&lt;br /&gt;
          throw new TypeError();&lt;br /&gt;
      }&lt;br /&gt;
      var t = Object(this);&lt;br /&gt;
      var len = t.length &amp;gt;&amp;gt;&amp;gt; 0;&lt;br /&gt;
      if (len === 0) {&lt;br /&gt;
          return -1;&lt;br /&gt;
      }&lt;br /&gt;
      var n = 0;&lt;br /&gt;
      if (arguments.length &amp;gt; 1) {&lt;br /&gt;
          n = Number(arguments[1]);&lt;br /&gt;
          if (n != n) { // shortcut for verifying if it&amp;#039;s NaN&lt;br /&gt;
              n = 0;&lt;br /&gt;
          } else if (n != 0 &amp;amp;&amp;amp; n != Infinity &amp;amp;&amp;amp; n != -Infinity) {&lt;br /&gt;
              n = (n &amp;gt; 0 || -1) * Math.floor(Math.abs(n));&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
      if (n &amp;gt;= len) {&lt;br /&gt;
          return -1;&lt;br /&gt;
      }&lt;br /&gt;
      var k = n &amp;gt;= 0 ? n : Math.max(len - Math.abs(n), 0);&lt;br /&gt;
      for (; k &amp;lt; len; k++) {&lt;br /&gt;
          if (k in t &amp;amp;&amp;amp; t[k] === searchElement) {&lt;br /&gt;
              return k;&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
      return -1;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return GMaps;&lt;br /&gt;
}));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Validation ==&lt;br /&gt;
approve.js&lt;br /&gt;
&lt;br /&gt;
== Audio ==&lt;br /&gt;
howlerjs.com - Cross Plattform Audio&lt;br /&gt;
&lt;br /&gt;
== Browser Fixing ==&lt;br /&gt;
[[JavaScript - iOS Orientation Change Fix]]&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Arduino_Zubeh%C3%B6r&amp;diff=22548</id>
		<title>Arduino Zubehör</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Arduino_Zubeh%C3%B6r&amp;diff=22548"/>
		<updated>2017-10-30T07:32:20Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Displays ==&lt;br /&gt;
https://www.youtube.com/watch?v=E6quVf1_BIg&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SW ===&lt;br /&gt;
* Nokia 5110 - geringe Auflösung aber leicht zu programmieren guter Library Support und extrem sparsam im Verbrauch. Im Sonnenlicht ablesbar. Nicht so einfach zu kriegen. Sollte günstig sein wird aber oft teuer verkauft.&lt;br /&gt;
&lt;br /&gt;
=== Color ===&lt;br /&gt;
* SPI Color OLED&lt;br /&gt;
===e-Ink===&lt;br /&gt;
&lt;br /&gt;
=== Touch ===&lt;br /&gt;
Nextion -&amp;gt; inkl. Controller&lt;br /&gt;
&lt;br /&gt;
* Serial&lt;br /&gt;
* Einfach zu programmieren&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Arduino_Zubeh%C3%B6r&amp;diff=22547</id>
		<title>Arduino Zubehör</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Arduino_Zubeh%C3%B6r&amp;diff=22547"/>
		<updated>2017-10-29T18:41:29Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: Die Seite wurde neu angelegt: „== Displays == === SW === * Nokia 51110 - geringe Auflösung aber leicht zu programmieren guter Library Support und extrem sparsam im Verbrauch. Im Sonnenlicht…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Displays ==&lt;br /&gt;
=== SW ===&lt;br /&gt;
* Nokia 51110 - geringe Auflösung aber leicht zu programmieren guter Library Support und extrem sparsam im Verbrauch. Im Sonnenlicht ablesbar.&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Arduino&amp;diff=22546</id>
		<title>Arduino</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Arduino&amp;diff=22546"/>
		<updated>2017-10-29T18:40:30Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
Arduino Homepage: http://arduino.cc&lt;br /&gt;
&lt;br /&gt;
Fritzing Software, Links zu Anleitungen, Beispielprojekte, etc. http://fritzing.org&lt;br /&gt;
&lt;br /&gt;
Fritzing Creator Kit Beispiele: http://fritzing.org/creatorkit-code&lt;br /&gt;
&lt;br /&gt;
Graphical Arduino Programming with QM http://www.youtube.com/watch?v=OdX_-6f6-OY&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
Gutes Starter Kit: http://www.fritzing.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kompatible Versionen ==&lt;br /&gt;
=== Chipsized ===&lt;br /&gt;
Gute kleine Versionen für verschiedene Projekte: https://www.youtube.com/watch?v=WCv_GnxZjtw&lt;br /&gt;
* Microview -&amp;gt; mit Minidisplay&lt;br /&gt;
* RFDuino -&amp;gt; für iPhone optimiert mit Bluetooth Module, dive abgestimmte Module.&lt;br /&gt;
Kekepad -&amp;gt; Verbindungssystem der Shields mit abgestimmtem Kabel&lt;br /&gt;
Digispark -&amp;gt; Münzgroß aber trotzdem mit USB&lt;br /&gt;
Tinyduino -&amp;gt; mit stackable shields -&amp;gt; Münzgroß&lt;br /&gt;
&lt;br /&gt;
==Programmieren==&lt;br /&gt;
[[Arduino Programmieren]]&lt;br /&gt;
&lt;br /&gt;
== Arduino Projekte ==&lt;br /&gt;
[[Arduino Projekte]]&lt;br /&gt;
&lt;br /&gt;
== Arduino Firmware Flashen  ==&lt;br /&gt;
[[Arduino Firmware]]&lt;br /&gt;
&lt;br /&gt;
== Processing ==&lt;br /&gt;
Programmiersprache gedacht für Installationen. Ist im Prinzip ein abgespecktes JAVA&lt;br /&gt;
&lt;br /&gt;
[[Processing]]&lt;br /&gt;
&lt;br /&gt;
== Zubehör ==&lt;br /&gt;
[[Arduino Zubehör]]&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Arduino&amp;diff=22545</id>
		<title>Arduino</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Arduino&amp;diff=22545"/>
		<updated>2017-10-29T18:23:31Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
Arduino Homepage: http://arduino.cc&lt;br /&gt;
&lt;br /&gt;
Fritzing Software, Links zu Anleitungen, Beispielprojekte, etc. http://fritzing.org&lt;br /&gt;
&lt;br /&gt;
Fritzing Creator Kit Beispiele: http://fritzing.org/creatorkit-code&lt;br /&gt;
&lt;br /&gt;
Graphical Arduino Programming with QM http://www.youtube.com/watch?v=OdX_-6f6-OY&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
Gutes Starter Kit: http://www.fritzing.org&lt;br /&gt;
&lt;br /&gt;
Gute kleine Versionen für verschiedene Projekte: https://www.youtube.com/watch?v=WCv_GnxZjtw&lt;br /&gt;
&lt;br /&gt;
==Programmieren==&lt;br /&gt;
[[Arduino Programmieren]]&lt;br /&gt;
&lt;br /&gt;
== Arduino Projekte ==&lt;br /&gt;
[[Arduino Projekte]]&lt;br /&gt;
&lt;br /&gt;
== Arduino Firmware Flashen  ==&lt;br /&gt;
[[Arduino Firmware]]&lt;br /&gt;
&lt;br /&gt;
== Processing ==&lt;br /&gt;
Programmiersprache gedacht für Installationen. Ist im Prinzip ein abgespecktes JAVA&lt;br /&gt;
&lt;br /&gt;
[[Processing]]&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Arduino&amp;diff=22544</id>
		<title>Arduino</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Arduino&amp;diff=22544"/>
		<updated>2017-10-29T18:19:42Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Bezugsquellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
Arduino Homepage: http://arduino.cc&lt;br /&gt;
&lt;br /&gt;
Fritzing Software, Links zu Anleitungen, Beispielprojekte, etc. http://fritzing.org&lt;br /&gt;
&lt;br /&gt;
Fritzing Creator Kit Beispiele: http://fritzing.org/creatorkit-code&lt;br /&gt;
&lt;br /&gt;
Graphical Arduino Programming with QM http://www.youtube.com/watch?v=OdX_-6f6-OY&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
Gutes Starter Kit: http://www.fritzing.org&lt;br /&gt;
&lt;br /&gt;
Gute kleine Versionen: https://www.youtube.com/watch?v=WCv_GnxZjtw&lt;br /&gt;
&lt;br /&gt;
==Programmieren==&lt;br /&gt;
[[Arduino Programmieren]]&lt;br /&gt;
&lt;br /&gt;
== Arduino Projekte ==&lt;br /&gt;
[[Arduino Projekte]]&lt;br /&gt;
&lt;br /&gt;
== Arduino Firmware Flashen  ==&lt;br /&gt;
[[Arduino Firmware]]&lt;br /&gt;
&lt;br /&gt;
== Processing ==&lt;br /&gt;
Programmiersprache gedacht für Installationen. Ist im Prinzip ein abgespecktes JAVA&lt;br /&gt;
[[Processing]]&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Themes_/_Templates&amp;diff=22528</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=22528"/>
		<updated>2017-10-27T18:14:16Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
Siehe auch &lt;br /&gt;
* [[Processwire - Templates Grundausstattung]]&lt;br /&gt;
* [[ProcessWire - Field Rendering]]&lt;br /&gt;
* [[ProcessWire - Skeleton Template]]&lt;br /&gt;
* [[Processwire - Template from Scratch]]&lt;br /&gt;
&lt;br /&gt;
== Theme Strategien ==&lt;br /&gt;
&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 ===&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;
&lt;br /&gt;
[[ProcessWire - Layout Blöcke mit RepeaterMatrix]]&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;
Über prependTemplateFile und appendTemplateFile verarbeitet man die Templates wenn alle Inhalte zusammengesetzt sind.&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;
&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;
=== 3.x Strategie ===&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;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Templates_Grundausstattung&amp;diff=22525</id>
		<title>Processwire - Templates Grundausstattung</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Templates_Grundausstattung&amp;diff=22525"/>
		<updated>2017-10-27T17:20:27Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Module ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;rtest&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Sprache ===&lt;br /&gt;
&lt;br /&gt;
=== Sonstige ===&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;
&lt;br /&gt;
=== Templates mit Layoutblocks ===&lt;br /&gt;
&lt;br /&gt;
== Felder ==&lt;br /&gt;
=== Felder ===&lt;br /&gt;
* content_main (left/right/aside/sidebar)&lt;br /&gt;
* link_to_child (checkbox to link to subpage)&lt;br /&gt;
* summary&lt;br /&gt;
== Templates ==&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Mediawiki_-_Update&amp;diff=22524</id>
		<title>Mediawiki - Update</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Mediawiki_-_Update&amp;diff=22524"/>
		<updated>2017-10-27T17:14:35Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: Die Seite wurde neu angelegt: „* Updatescript läuft nur über Konsole. Deshalb muss der ssh Zugang aktiv sein * Das Script liegt in /maintenance/update.php * Vorher Extension und upload Ord…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Updatescript läuft nur über Konsole. Deshalb muss der ssh Zugang aktiv sein&lt;br /&gt;
* Das Script liegt in /maintenance/update.php&lt;br /&gt;
* Vorher Extension und upload Ordner sowie das LocalConfiguration File sichern und nach überschreiben der Dateien wieder einfügen.&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Templates_Grundausstattung&amp;diff=22523</id>
		<title>Processwire - Templates Grundausstattung</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Templates_Grundausstattung&amp;diff=22523"/>
		<updated>2017-10-27T14:48:17Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Module ==&lt;br /&gt;
&lt;br /&gt;
=== Sprache ===&lt;br /&gt;
&lt;br /&gt;
=== Sonstige ===&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;
&lt;br /&gt;
=== Templates mit Layoutblocks ===&lt;br /&gt;
&lt;br /&gt;
== Felder ==&lt;br /&gt;
=== Felder ===&lt;br /&gt;
* content_main (left/right/aside/sidebar)&lt;br /&gt;
* link_to_child (checkbox to link to subpage)&lt;br /&gt;
* summary&lt;br /&gt;
== Templates ==&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Templates_Grundausstattung&amp;diff=22522</id>
		<title>Processwire - Templates Grundausstattung</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Templates_Grundausstattung&amp;diff=22522"/>
		<updated>2017-10-27T14:47:26Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: Die Seite wurde neu angelegt: „== Module == === Defaultsprache Deutsch === === Templates mit Layoutblocks ===  == Felder == === Felder === * content_main (left/right/aside/sidebar) * link_to…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Module ==&lt;br /&gt;
=== Defaultsprache Deutsch ===&lt;br /&gt;
=== Templates mit Layoutblocks ===&lt;br /&gt;
&lt;br /&gt;
== Felder ==&lt;br /&gt;
=== Felder ===&lt;br /&gt;
* content_main (left/right/aside/sidebar)&lt;br /&gt;
* link_to_child (checkbox to link to subpage)&lt;br /&gt;
* summary&lt;br /&gt;
== Templates ==&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Themes_/_Templates&amp;diff=22521</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=22521"/>
		<updated>2017-10-27T14:45:56Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: /* Grundausstattung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
Siehe auch &lt;br /&gt;
* [[ProcessWire - Field Rendering]]&lt;br /&gt;
* [[ProcessWire - Skeleton Template]]&lt;br /&gt;
* [[Processwire - Template from Scratch]]&lt;br /&gt;
&lt;br /&gt;
== Theme Strategien ==&lt;br /&gt;
&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 ===&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;
&lt;br /&gt;
[[ProcessWire - Layout Blöcke mit RepeaterMatrix]]&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;
Über prependTemplateFile und appendTemplateFile verarbeitet man die Templates wenn alle Inhalte zusammengesetzt sind.&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;
&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;
=== 3.x Strategie ===&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;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=PhpMyAdmin&amp;diff=22520</id>
		<title>PhpMyAdmin</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=PhpMyAdmin&amp;diff=22520"/>
		<updated>2017-10-27T13:15:07Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: Die Seite wurde neu angelegt: „== Passwort für DB setzen == Die config datei heisst &amp;quot;config.inc.php&amp;quot; im phpmyadmin Ordner $cfg[&amp;#039;Servers&amp;#039;][$i][&amp;#039;password&amp;#039;] = &amp;#039;&amp;#039;; // MySQL password eintragen :)“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Passwort für DB setzen ==&lt;br /&gt;
Die config datei heisst &amp;quot;config.inc.php&amp;quot; im phpmyadmin Ordner&lt;br /&gt;
$cfg[&amp;#039;Servers&amp;#039;][$i][&amp;#039;password&amp;#039;] = &amp;#039;&amp;#039;; // MySQL password eintragen :)&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=MariaDB&amp;diff=22519</id>
		<title>MariaDB</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=MariaDB&amp;diff=22519"/>
		<updated>2017-10-27T13:12:48Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nachfolge SpinOff von mySQL nachdem dieses aufgekauft wurde. Jetzt auch Standard in XAMPP (Stand 2017). Bislang funktioniert alles wie gehabt.&lt;br /&gt;
&lt;br /&gt;
== Maria DB Root Passwort ==&lt;br /&gt;
http://localhost/dashboard/docs/reset-mysql-password.html&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=MariaDB&amp;diff=22518</id>
		<title>MariaDB</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=MariaDB&amp;diff=22518"/>
		<updated>2017-10-27T13:12:18Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: Die Seite wurde neu angelegt: „Nachfolge SpinOff von mySQL nachdem dieses aufgekauft wurde. Jetzt auch Standard in XAMPP (Stand 2017). Bislang funktioniert alles wie gehabt.“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nachfolge SpinOff von mySQL nachdem dieses aufgekauft wurde. Jetzt auch Standard in XAMPP (Stand 2017). Bislang funktioniert alles wie gehabt.&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=MySQL&amp;diff=22517</id>
		<title>MySQL</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=MySQL&amp;diff=22517"/>
		<updated>2017-10-27T13:11:22Z</updated>

		<summary type="html">&lt;p&gt;37.49.32.84: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Informationen zur Datenbank aber auch Tipps zur Bedienung etc.&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[MariaDB]]&lt;br /&gt;
== mySQL - Tips und Tricks ==&lt;br /&gt;
[[mySQL - Tips und Tricks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== mySQL - Cheat Sheet ==&lt;br /&gt;
[[mySQL - Cheat Sheet]]&lt;br /&gt;
&lt;br /&gt;
== mySQL auf der Kommandozeile ==&lt;br /&gt;
[[mySQL - Kommandozeile]]&lt;br /&gt;
&lt;br /&gt;
== Codeschnipsel ==&lt;br /&gt;
=== Typ der Tabellen festlegen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE `foo` {&lt;br /&gt;
...&lt;br /&gt;
} ENGINE=InnoDB&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `bar` {&lt;br /&gt;
...&lt;br /&gt;
} ENGINE=MyISAM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Typo aller Tabellen auf einmal ändern ====&lt;br /&gt;
Folgendes SQL-Statement erzeugt uns die notwendigen SQL-Kommandos um alle Tabellen in der Datenbank „amel“ auf InnoDB umzustellen, die derzeit noch MyISAM sind:&lt;br /&gt;
&lt;br /&gt;
 SELECT CONCAT(&amp;#039;ALTER TABLE `&amp;#039;,table_schema,&amp;#039;`.`&amp;#039;,&lt;br /&gt;
 table_name,&amp;#039;` engine=MyISAM;&amp;#039;)&lt;br /&gt;
 FROM information_schema.tables&lt;br /&gt;
 WHERE engine = &amp;#039;InnoDB&amp;#039; AND table_schema = &amp;#039;amel&amp;#039;;&lt;br /&gt;
Dann die erzeugten Statements aus der Druckansicht holen&lt;br /&gt;
&lt;br /&gt;
=== InnoDB aktivieren ===&lt;br /&gt;
&lt;br /&gt;
Zitat aus http://www.marmotli.ch/mysql/node35.html&lt;br /&gt;
&lt;br /&gt;
5.2.1 Aktivieren der InnoDB-Tabellen&lt;br /&gt;
&lt;br /&gt;
Das Arbeiten mit dem Tabellentyp &amp;#039;InnoDB&amp;#039; setzt voraus, dass der MySQL-Server mit diesem Tabellentyp hochgefahren wird.&lt;br /&gt;
&lt;br /&gt;
Unter Debian 3.0 d.h. falls wir MySQL gemäss dieser Anleitung aufgesetzt haben, steht der InnoDB-Tabellentyp zunächst nicht zur Verfügung. Nicht weil MySQL 4.0.13 das nicht unterstützen würde, sondern weil wir die my.cnf-Datei von der Version 3.23.x übernommen haben und das dort nicht aktiviert war. Um die InnoDB-Tabellen nun zu aktivieren, müssen wir einige Änderungen in der Datei &amp;#039;/etc/mysql/my.cnf&amp;#039; vornehmen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # Read the manual if you want to enable InnoDB!&lt;br /&gt;
 # skip-innodb&lt;br /&gt;
 innodb_data_home_dir =&lt;br /&gt;
 innodb_data_file_path = /var/lib/mysql/ibdata/ibdata1:100M:autoextend&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zunächst muss &amp;#039;skip-innodb&amp;#039; deaktiviert werden. Danach müssen wir den Speicherort für die Tabellen angeben. Falls wir &amp;#039;innodb_data_home_dir&amp;#039; leer belassen, verwendet MySQL den normalen Datenpfad der Datenbanken. Dort werden einige Temporär-Dateien erstellt. Den Speicherort für die InnoDB-Tabellen legen wir mit dem Wert &amp;#039;innodb_data_file_path&amp;#039; fest. Wir verwenden wiederum den Speicherort für die MySQL-Datenbanken sowie das Unterverzeichnis &amp;#039;ibdata&amp;#039;. Dieses Verzeichnis muss von Hand angelegt werden:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/lib/mysql/ibdata&lt;br /&gt;
 chown -R mysql /var/lib/mysql/ibdata&lt;br /&gt;
 chgrp -R mysql /var/lib/mysql/ibdata&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um die InnoDB-Tabellen endgültig nutzen zu können, müssen wir den MySQL-Server neu initialisieren:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 /etc/init.d/mysql restart&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Neustart dauert einige Sekunden, weil die InnoDB-Tabellen zunächst initialisiert werden müssen. Um zu überprüfen, ob die InnoDB-Tabellen nun aktiviert sind, können wir in &amp;#039;/var/lib/mysql/ibdata&amp;#039; nachsehen. Falls Sie dort eine Datei vorfinden, ist alles ok.&lt;br /&gt;
&lt;br /&gt;
=== Werte aus Komma getrennter Liste auswerten ===&lt;br /&gt;
Vor allem im Zusammenhang mit Typo3 Datenbanken kommt es oft dazu, daß man integer Werte in Komma-separierten Listen in einem Datenbank vorfindet. Auf diese Weise erzeugt Typo3 in der Standardeinstellung n:m Verknüpfungen (aber auch 1 : n Verknüpfungen).&lt;br /&gt;
&lt;br /&gt;
Beim Auslesen ist das aber eher nachteilig. Eine geschicktere Methode als IN ab mysql 4 (meines Wissens) ist der Befehl FIND_IN_SET.  &lt;br /&gt;
&lt;br /&gt;
Die IN - Abfrage ist nur für Ganze Feldlängen zutreffend, also &lt;br /&gt;
&amp;#039;1&amp;#039;,&amp;#039;2&amp;#039;,&amp;#039;3&amp;#039;,&amp;#039;4&amp;#039;,&amp;#039;5&amp;#039;,usw, ...&lt;br /&gt;
&lt;br /&gt;
Bei der Funktion FIND_IN_SET sucht MySQL in einer bestimmten Zeile und gibt die&lt;br /&gt;
Stelle zurück an der der Wert in der LISTE steht.&lt;br /&gt;
&lt;br /&gt;
 FIND_IN_SET(WERT,LISTE)&lt;br /&gt;
&lt;br /&gt;
In Typo3 gibts auch die Methode:&lt;br /&gt;
 AND &amp;#039;.$GLOBALS[&amp;#039;TYPO3_DB&amp;#039;]-&amp;gt;listQuery(&amp;#039;feldname&amp;#039;,5,&amp;#039;tabellenname&amp;#039;).&amp;#039; &lt;br /&gt;
Die aber ein kompliziertes und wenig Performantes SQL Konstrukt erzeugt.&lt;br /&gt;
&lt;br /&gt;
Vielleicht wird die Funktion ja noch umgebaut ;-)&lt;br /&gt;
&lt;br /&gt;
== MySQL - Daten importieren und exportieren ==&lt;br /&gt;
[[MySQL - Daten importieren und exportieren]]&lt;br /&gt;
&lt;br /&gt;
== MySQL Passwort zurücksetzen ==&lt;br /&gt;
http://localhost/dashboard/docs/reset-mysql-password.html&lt;br /&gt;
http://dev.mysql.com/doc/refman/5.0/en/resetting-permissions.html&lt;/div&gt;</summary>
		<author><name>37.49.32.84</name></author>
	</entry>
</feed>