<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Yoda Condition &#187; PHP</title>
	<atom:link href="http://yoda.neun12.de/artikel-tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://yoda.neun12.de</link>
	<description>Debuggen du musst</description>
	<lastBuildDate>Sun, 18 May 2014 13:49:01 +0000</lastBuildDate>
	<language>de-DE</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>PHP-Daten in JavaScript einschleusen</title>
		<link>http://yoda.neun12.de/artikel-10</link>
		<comments>http://yoda.neun12.de/artikel-10#comments</comments>
		<pubDate>Sat, 19 Feb 2011 22:17:27 +0000</pubDate>
		<dc:creator><![CDATA[Ralf]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Anfänger]]></category>
		<category><![CDATA[Fortgeschrittene]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[Lokalisation]]></category>

		<guid isPermaLink="false">http://yoda.neun12.de/?p=10</guid>
		<description><![CDATA[Nein, dies wird kein Hacker-Artikel wie man mit PHP und JavaScript Webseiten klein bekommt. Vielmehr geht es mir darum, wie man Daten von PHP zu einem JavaScript übertragen kann. Am Anfang solcher Artikel steht meistens die Frage wozu das gut sein soll. Die Antwort ist zumindest im Fall von WordPress relativ einfach: Um Daten aus [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Nein, dies wird kein Hacker-Artikel wie man mit PHP und JavaScript Webseiten klein bekommt. Vielmehr geht es mir darum, wie man Daten von PHP zu einem JavaScript übertragen kann. Am Anfang solcher Artikel steht meistens die Frage wozu das gut sein soll. Die Antwort ist zumindest im Fall von WordPress relativ einfach: Um Daten aus WordPress in ein JavaScript (JS) zu bekommen. Ob das nun der Benutzername eines Besuchers ist der irgendwo dynamisch eingefügt werden soll oder Texte die Übersetzt werden müssen. Es gibt häufig Situationen wo man die im folgenden beschrieben Techniken ganz gut gebrauchen kann. Ich selber stand z.B. vor dem Problem das ich mit jQuery ein Akkordeon  umsetzen musste und dieses einen Button hatte mit dem sich alle Felder öffnen bzw. schließen ließen. Nun fügte das jQuery-Script je nach Zustand der Felder ein &#8220;Öffne alle&#8221; bzw. &#8220;Schließe alle&#8221; an eine bestimmte Stelle ein. Da ich etwas faul bin, habe ich beide Zeichenketten direkt im JS abgelegt, was zur Folge hatte das man diese nicht mehr über die Funktionen zur Lokalisation übersetzen konnte. Also musste ein Weg her wie ich erst die Zeichenketten in PHP mittels <code>gettext</code> übersetzen und dann in das JS einfügen konnte.</p>
<p>Der folgende Artikel wird etwas länger, deshalb habe ich ihn auf mehrere Seiten aufgeteilt. Diejenigen die sich mit WordPress auskennen, können den Artikel quer lesen da ich auch Grundlagen beschreibe. Interessante Sachen werden dann auf den letzten Seiten zu lesen sein. Diejenigen die sich nicht so gut mit WordPress auskennen, sollten zumindest die Grundlagen von WordPress und guter Programmierung beherrschen. Ich werde nicht jedes mal darauf hinweisen das man normalerweise definitiv nicht <code>echo $_GET['blah'];</code> schreibt, sondern alles auf seine Richtigkeit und Gültigkeit in prüft. Dann mal los&#8230;</p>
<h4>Inhalt</h4>
<ol>
<li><a href="http://yoda.neun12.de/artikel-10/2">Die Vorraussetzungen</a></li>
<li><a href="http://yoda.neun12.de/artikel-10/3">Eleganter mit GET</a></li>
<li><a href="http://yoda.neun12.de/artikel-10/4">JavaScript mal ganz objektiv </a></li>
<li><a href="http://yoda.neun12.de/artikel-10/5">Mein Freund Jason</a></li>
<li><a href="http://yoda.neun12.de/artikel-10/6">Da gibt es doch bestimmt eine App für…?</a></li>
<li><a href="http://yoda.neun12.de/artikel-10/7">DIY – Jsonifice</a></li>
<li><a href="http://yoda.neun12.de/artikel-10/8">Und Action!</a></li>
<li><a href="http://yoda.neun12.de/artikel-10/9">Letzte Anmerkungen</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://yoda.neun12.de/artikel-10/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Login überall</title>
		<link>http://yoda.neun12.de/artikel-21</link>
		<comments>http://yoda.neun12.de/artikel-21#comments</comments>
		<pubDate>Sun, 06 Feb 2011 00:09:51 +0000</pubDate>
		<dc:creator><![CDATA[Ralf]]></dc:creator>
				<category><![CDATA[Code-Snippets]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Tipps&Tricks]]></category>

		<guid isPermaLink="false">http://yoda.neun12.de/?p=21</guid>
		<description><![CDATA[Nicht wenige WordPress-Nutzer wünschen sich die Möglichkeit sich auch z.B. auf der Startseite einloggen zu können anstatt erst die Login-Seite aufrufen zu müssen. WordPress trägt dem Rechnung und stellt die Funktion wp_login_form zur Verfügung. Für einfacher gelagerte Fälle keine schlechte Lösung, jedoch für etwas anspruchsvollere Geister nicht unbedingt das was sie suchen. Denn im Fehlerfall, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Nicht wenige WordPress-Nutzer wünschen sich die Möglichkeit sich auch z.B. auf der Startseite einloggen zu können anstatt erst die Login-Seite aufrufen zu müssen. WordPress trägt dem Rechnung und stellt die Funktion <a href="http://codex.wordpress.org/Function_Reference/wp_login_form">wp_login_form</a> zur Verfügung. Für einfacher gelagerte Fälle keine schlechte Lösung, jedoch für etwas anspruchsvollere Geister nicht unbedingt das was sie suchen. Denn im Fehlerfall, z.B. bei einem falschen Passwort, landet man doch wieder auf der Login-Seite.<br />
Schöner wäre es, würde der komplette Login-Prozess genau dort statt findet, wo das Login-Formular angezeigt wird. Wer sich nicht scheut ein Iframe zu benutzen, der kann folgende vergleichsweise einfache Lösung benutzen.</p>
<h3>Login im Iframe</h3>
<p>Im Grunde genommen kann man den ganzen Login-Prozess in einem Iframe ablaufen lassen. Man muss sich dabei lediglich vor Augen halten das ein Iframe mit einem neuen Tab im Browser vergleichbar ist. Dem Server ist es jedoch egal ob man den Login in einem neuen Tab oder Iframe vornimmt. Ob ein Benutzer eingeloggt ist oder nicht, wird in einem Cookie gespeichert. Dadurch ist der &#8220;Ort&#8221; wo man sich einloggt uninteressant, so lange er vom gleichen Server aus erfolgt.</p>
<p>Fangen wir also gleich damit an die <code>wp-login.php</code> in einem Iframe anzuzeigen. Damit dies ein wenig komfortabler wird, legen wir uns eine Funktion an die wir in der <code>functions.php</code> oder einem Plugin ablegen können.</p>
<pre class="brush:php">function my_login_form( $args ){

	extract( $args );

	if( !isset( $width ) ){
		$width = 300;
	}

	if( !isset( $height ) ){
		$height = 300;
	}

	if( !isset( $redirect ) ){
		$redirect = content_url() . '/themes/my_theme/logout.php';
	}

	echo '&lt;iframe src="http://www.example.com/wp-login.php?redirect_to=' . $redirect . '&amp;iframe_mode=true" width="' . $width . '" height="' . $height . '"&gt;';
}</pre>
<p>Diese Funktion macht eigentlich nichts anderes als ein Iframe anzuzeigen welches als Source die <code>wp-login.php</code> hat. Die Zeilen 3-16 dienen lediglich dazu ein paar Parameter an die Funktion zu übergeben. Im Beispiel oben sind das <code>width</code> (Breite des Iframe), <code>height</code> (Höhe des Iframe) und <code>redirect_to</code> (Ziel-URL zu der nach dem Login umgeleitet werden soll). Diese Parameter werden per Array übergeben:</p>
<pre class="brush:php">if( function_exists('my_login_form') ){
	$args = array( 'width'=&gt;300,
		       'height'=&gt;200,
			redirect_to=&gt; content_url().'/themes/my_theme/mylogin_redirect.php' );
	my_login_form( $args );
}</pre>
<p>Fügen wir obigen Code-Schnipsel in unser Blog ein, z.B. in der Sidebar, dann fügt die Funktion an dieser Stelle ein Iframe mit der Breite 300px und Höhe 200px ein. Bis hierhin nichts wirklich aufregendes, einzig der Parameter <code>redirect_to</code> tanzt ein wenig aus der Reihe.<br />
Wir erinnern uns, die Anzeige im Iframe ist mit einem neuen Tab vergleichbar. Die Situation ist nun folgende: Innerhalb des Blogs wird die <code>wp-login.php</code> angezeigt, beim Betätigen des  Submit-Buttons leitet die <code>wp-login.php</code>, sofern die Login-Daten korrekt sind, automatisch auf eine andere Seite um. Diese Seite wird dann ebenfalls im Iframe angezeigt! Normalerweise wird auf die Profil-Seite des Benutzers bzw. ins Dashboard umgelietet, in einem kleinen Iframe dargestellt sieht dies eher unbrauchbar aus. Diese Umleitung kann man jedoch beim Aufruf der <code>wp-login.php</code> mit dem Parameter <code>redirect_to</code> beeinflussen.<br />
Dies machen wir uns zu nutzen und zeigen einfach eine eigene Seite an deren Inhalt besser in das Iframe passt. Diese Datei hat noch eine weitere recht wichtige Aufgabe. Denn durch den Aufruf von <code>wp-login.php</code> würden wir eine weitere Instanz von WordPress erzeugen was zu unschönen Nebeneffekten führen könnte. Ich habe hier als Beispiel mal den Benutzernamen und einen Logout-Link ausgegeben. Wichtig ist, dass das Script mit einem <code>exit;</code> beendet wird:</p>
<pre class="brush:php">&lt;?php
global $current_user;

echo $current_user-&gt;user_name . '&lt;br /&gt;';
echo '&lt;a href="' . wp_logout_url( site_url().'/wp-login.php' ) . '" title="Logout"&gt;' . __('Logout') . '&lt;/a&gt;';
exit;
?&gt;
</pre>
<p>Durch die Angabe von <code>site_url . '/wp-login.php'</code> wird beim Betätigen des Logout-Links (innerhalb des Iframes) wieder auf die Login-Seite umgeleitet.</p>
<h3>Fehlende Optik</h3>
<p>Damit haben wir uns bis jetzt ein schönes Karussell gebastelt.  Im Iframe wird die <code>wp-login.php</code> angezeigt, nach einem erfolgreichen Login wird unsere eigene Seite angezeigt und nach dem Ausloggen wieder die <code>wp-login.php</code>.<br />
Jetzt bleibt noch ein kleines aber nicht unbedeutendes Problem übrig. Die <code>wp-login.php</code> würde im Iframe mit dem originalem Stylesheet angezeigt werden, dieses ist aber nicht auf Miniformate wie z.B. 300x200px ausgelegt. Zudem haben wir nun ein paar Elemente drin auf die wir gerne verzichten würden. Ein angepasstes Stylesheet muss also her. Wie man den Login-Screen optisch an seine eigenen Bedürfnisse anpasst, dazu finden sich im Internet massig Anleitungen. Zur Not einfach Bei <a href="http://bueltge.de/wordpress-login-seite-anpassen-3/1214/http://bueltge.de/wordpress-login-seite-anpassen-3/1214/">Frank Bültge</a> vorbei schauen, dort findet sich (fast) immer etwas passendes.<br />
Ein kleines Problem gibt es dabei allerdings. Bei Verwendung des Hooks würde ein Benutzer der die <code>wp-login.php</code> &#8220;normal&#8221; aufrufen würde (z.B. über ein Bookmark), ebenfalls das angepasste Stylesheet zu sehen bekommen. Es muss also ein Kriterium her anhand dessen man unterscheiden kann ob die <code>wp-login.php</code> im Iframe oder in einem normalen Fenster angezeigt wird. Im Script selber können wir das (leider) nicht überprüfen, deswegen geben wir diese Information beim Aufruf der <code>wp-login.php</code> als GET-Parameter mit: <code>&amp;iframe_mode=true</code> sorgt dafür das wir im Hook überprüfen können ob dieser Parameter gesetzt ist. Ist dem so, dann wird das angepasste Stylesheet geladen, ansonsten passiert nichts.</p>
<pre class="brush:php">function check_iframe_mode(){

	if( isset( $_REQUEST['iframe_mode'] ) &amp;&amp; true === $_REQUEST['iframe_mode'] ){
		echo '&lt;style type="text/css"&gt;
		@import url("' . site_url().'/themes/my_theme/my_login_style.css");
		&lt;/style&gt;';
	}

}

add_action( 'login_head', 'check_iframe_mode' );</pre>
<p>Das Stylesheet liegt in diesen Beispiel im Themes-Ordner &#8216;my_theme&#8217; und hat den Namen &#8216;my_login_style.css&#8217;. Man kann das CSS auch direkt ausgeben, jedoch lässt sich eine separate Datei leichter pflegen und anpassen.</p>
<h3>Fazit</h3>
<p>Mit diesem letzten Schritt wären wir nun am Ziel angekommen. Nun findet der Login-Prozess komplett im Iframe statt. Allerdings hat diese Methode auch ein paar Nachteile die ich hier nicht verschweigen möchte.<br />
Zum einen wird keine Rücksicht auf die Seite genommen in der das Iframe eingebettet ist. Sind hier Elemente vorhanden die vom Login abhängig sind, z.B. Anzeige des Benutzernamens, dann werden diese Elemente erst dann sichtbar bzw. aktualisiert wenn die Seite erneut geladen wird. Diesen Mangel kann man zur Not noch mit etwas zusätzlichem JavaScript beheben indem man einen Reload der Hauptseite erzwingt.<br />
Zum anderen geht diese Methode nicht sehr schonend mit den Resourcen um. Denn alleine durch die Anzeige der <code>wp-login.php</code> werden Datenbankverbindungen aufgebaut, Variablen angelegt und damit letztendlich auch Speicher verbraucht. Für Blogs mit hohen Besucheraufkommen sollte man deswegen besser auf andere Lösungen, sprich komplexere Plugins, zurück greifen.<br />
Für kleinere Blogs und den Hobby-Bastler jedoch eine Anregung für einen weiteren Ausbau. Ein Workaround könnte so aussehen, dass man nach dem Logout nicht direkt wieder auf die <code>wp-login.php</code> umleitet, sondern auf eine dritte &#8220;Zwischenseite&#8221; die einen Link zur <code>wp-login.php</code> enthält.</p>
<p>Ich hoffe dem einen oder anderem mit diesem Artikel ein paar Anregungen gegeben zu haben und freue mich über etwas Feedback in den Kommentaren.</p>
]]></content:encoded>
			<wfw:commentRss>http://yoda.neun12.de/artikel-21/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zahlen-Zahlen-Zahlen</title>
		<link>http://yoda.neun12.de/artikel-4</link>
		<comments>http://yoda.neun12.de/artikel-4#comments</comments>
		<pubDate>Fri, 07 Jan 2011 00:07:10 +0000</pubDate>
		<dc:creator><![CDATA[Ralf]]></dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://yoda.neun12.de/?p=4</guid>
		<description><![CDATA[Michael Kliewe hatte vor einiger Zeit erneut zu einem Wettbewerb aufgerufen. Diesmal galt es die Zahlen von 1 bis 10.000 als Zahlworte auszugeben. Relativ schnell kamen dann auch die ersten Lösungen rein die binnen 10-30 Minuten geschrieben worden sind. Ich als reiner Hobby-PHP&#8217;ler kann da nicht mithalten, dennoch hatte mich das Thema gereizt. Vor gut [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.phpgangsta.de/">Michael Kliewe</a> hatte vor einiger Zeit erneut zu einem <a href="http://www.phpgangsta.de/wettbewerb-10-000-zahlen-ausschreiben">Wettbewerb aufgerufen</a>. Diesmal galt es die Zahlen von 1 bis 10.000 als Zahlworte auszugeben. Relativ schnell kamen dann auch die ersten Lösungen rein die binnen 10-30 Minuten geschrieben worden sind. Ich als reiner Hobby-PHP&#8217;ler kann da nicht mithalten, dennoch hatte mich das Thema gereizt.</p>
<p>Vor gut 20 Jahren hatte ich nämlich genau dieses Problem, Zahlen als Wort ausschreiben, mal auf einen Amiga in Basic umgesetzt. Wenn ich mich richtig erinnere, war der Grund dafür irgendwelche Scheckeinreichungen wo der Betrag jeweils ausgeschrieben werden musste. Ich dachte mir, wenn ich es damals geschafft hatte, dann wird es diesmal wohl kein Problem sein. Die ersten drei Anläufe gingen schief, so einfach ist das Thema dann nämlich doch nicht. Dies wird auch deutlich, wenn man sich mal die bei Michael Kliewe geposteten Lösungen anschaut. Nicht wenige der Lösungen patzen bei den vielen kleinen und großen Stolperfallen die diese Aufgabe beinhaltet. Es wird z.B. tatsächlich &#8220;siebzehn&#8221; und nicht &#8220;sieb<strong>en</strong>zehn&#8221; geschrieben, genauso wie es &#8220;siebzig&#8221; und nicht &#8220;sieb<strong>en</strong>zig&#8221; geschrieben wird. Dafür schreibt sich die 77 jedoch &#8220;sieben-und-siebzig&#8221;. Dagegen war die Problematik das die Zahlen 13-19 ohne &#8220;und&#8221;, die Zahlen ab 21 jedoch mit &#8220;und&#8221; geschrieben werden eher harmlos.</p>
<p>Ich hatte die Anzahl an Sonderfällen auch stark unterschätzt, weswegen Versuch 1 und 2 mal glatt in die Hose gingen. Versuch 3 scheiterte in der Umsetzung des angeblich vorhandenen Systems welches hinter der Zahlenbenennung stecken soll.<br />
Mittlerweile war der Wettbewerb quasi gelaufen, es gab viele gute und schlechte Lösungen und obendrein gab es bereits eine Zusammenfassung. Viel neues hätte ich somit nicht zu den Wettbewerb beitragen können, weshalb ich mich dazu entschied den Wettbewerb Wettbewerb sein zu lassen und nur für mich an dem Problem rumzuprokeln.</p>
<p>Beim vierten Versuch startete ich also mit einem komplett anderen Ansatz. Zum einen wollte ich die Lösung möglichst flexibel gestalten, sie sollte sich ohne großen Aufwand auch an andere Sprachen anpassen lassen (daran arbeite ich übrigens noch). Zum anderen war mir das gesteckte Ziel von 10.000 nun zu wenig. Warum sich mit 10.000 begnügen wenn ich auch eine Fantastilliarde umsetzen kann?<br />
Fantastilliarden gibt es zwar nicht, jedoch Oktilliarden. Eine Oktilliarde ist eine 1 gefolgt von 51 Nullen. 999 Oktilliaraden ist bei meiner Lösung die derzeit größtmögliche darstellbare Zahl, übrigens eine Zahl mit 54 Stellen. Noch größere Zahlen sind theoretisch möglich, man müsste lediglich die Zahlnamen erweitern. Die Grenze dürfte bei einer Zentilliarde erreicht sein, dies ist eine 1 gefolgt von 603 Nullen. Das ist wohl weniger eine technische Grenze, sondern ich habe bisher keine Zahlnamen für noch größere Zahlen gefunden.</p>
<p>Stand der Dinge ist derzeit der, dass ich eine Klasse habe die eine 54 stellige Zahl in ein Zahlwort umwandeln kann. Die Klasse ist in den für mich üblichen Pidgin-PHP geschrieben. Sprich: Nicht schön, funktioniert aber.<br />
Da ich dieses Weblog unter anderem deswegen eingerichtet habe um irgendwann mal von diesem Pidgin-PHP weg zu kommen, ist diese Klasse quasi ein längerfristiges Projekt für mich an dem ich wachsen und neue Erkenntnisse gewinnen will. Die Klasse wird also in Zukunft noch das eine oder andere mal Erwähnung finden. Vor allem aber werde ich den Code der Klasse weiterhin ständig optimieren und verbessern. Falls jemand trotzdem schon mal einen Blick auf den Code werfen will, bitte in den Kommentaren melden. <span style="text-decoration: line-through;">Bisher ist es mir nämlich noch völlig unklar wie ich hier halbwegs vernünftig Code posten kann. Wenn denn überhaupt.</span></p>
<p><span style="text-decoration: line-through;">Wenn ich mich bei tumblr ein wenig eingewöhnt habe, werde ich auch noch ein paar Worte dazu schreiben was es mit dem Blog usw. auf sich hat.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://yoda.neun12.de/artikel-4/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
