Okay, 2 Probleme, 1 Lösung:

Problem 1

Seit gestern hatte ich bei mir den Fall, dass meine Lesezeichenordner und teilweise auch die Lesezeichen in den Ordnern keine Namen mehr hatten. Siehe Screenshot. Vermutlich eine fehlerhafte oder unterbrochene Synchronisation. Wobei das komisch wäre da alle Lesezeichen in einer Dictionary-Array-Struktur stehen und ein partieller oder unterbrochener Schreibvorgang eher darin resultiert hätte, dass ab einem bestimmten Lesezeichen komplett Schluss ist. Bzw. die XML dort abrupt endet und direkt unbrauchbar wird. Egal.
Durch die feine Synchronisierung war das Problem jedenfalls kurzer Hand auf all meinen Rechnern verbreitet. Also Tipp 1 wenn jemand das Problem hat: erstmal Synchronisierung stoppen damit das Problem auf dem einen PC bleibt.

Problem 2

Vor der Lösung noch Problem 2 was ebenfalls dadurch gelöst wird: das ungewollte Löschen von Lesezeichen kann sehr ärgerlich sein. Zumal Chrome einen Löschvorgang nicht bestätigt haben will sondern einfach ausführt und es auch keine „Undo“ Funktion gibt. Fälschlicherweise etwas gelöscht empfiehlt sich folgendes:

Die Lösung

Am besten schließt ihr den Chrome nicht!
Geht direkt in euer Chrome Profilordner, meistens C:\Users\[user]\AppData\Local\Google\Chrome\User Data\Default\. „Default“ ist euer Profilname, falls ihr mit unterschiedlichen Profilen arbeitet.
Kopiert euch die Dateien Bookmarks und Bookmarks.bak an einen anderen Ort.
Das Bild zeigt den Speicherort der 2 Dateien "bookmarks" und "bookmarks.bak": c:\Users\Hannes\AppData\Local\Google\Chrome\User Data\Default\

Schließt den Chrome, benennt die Bookmarks in Bookmarks_alt um und die Bookmarks.bak in Bookmarks. Damit sollte der Stand der Lesezeichen der letzten Chrome Nutzung wieder aktiv sein. Seit dem erstellte Lesezeichen sind natürlich hinüber.

Ihr könnt die Dateien auch in einem Editor öffnen und zwischen der Bookmarks, Bookmarks.bak und anderen Sicherungen, die ihr vielleicht habt, manuell rumkopieren. Aber Finger weg wenn ihr den Aufbau der Datei nicht versteht sonst geht am Ende gar nichts mehr.

Info

Die html7bar ermöglicht eine attraktive Platzierung von Weblinks und anderen Informationen in einer Windows 7 nachempfundenen Footer-Leiste.
Der Orb lässt sich anklicken und ein Fenster mit weiteren Links und einem Profilfoto öffnet sich. Wenn dieses Fenster geöffnet ist reicht ein Klick auf den Orb oder irgendwo außerhalb des Fensters um es zu schließen.

Voraussetzung: Auf der Seite muss jQuery eingebunden sein.

Installation

Ich erkläre die Installation der html7bar kurz in textform und weiter unten gibt es noch ein Video zum Nachmachen.

Kurz: .zip Archiv von unten downloaden, lokal entpacken, die Dateien auf den Server hochladen, Pfade in der

html7bar.html

anpassen und die .html mit php includen. Dann Links, Icons und Profilbild anpassen. Das Profilbild sollte 60x60px, Icons 16x16px bzw 32x32px groß sein.

Szenario: Ich möchte die html7bar in einem anderen Projekt einbauen. Um den Code des Projekts nicht unnötig zu vergrößern werde ich darauf hin arbeiten, dass am Ende in diesem Projekt nur noch mit

<?php include("http://url.zur/html7bar/html7bar.html"); ?>

die html7bar eingebaut wird. Somit bleibt eine eindeutige Trennung der html7bar und des ursprünglichen Projekts, der Code bleibt übersichtlich und aktivieren/deaktivieren ist durch das Auskommentieren dieser Zeile vollbracht.

In diesem Video zeige ich die Installation in weniger als 2 Minuten:

Konfiguration

Links ändern:
Sowohl die Links der Orb-Fensters als auch die Links der Taskbar sind in der

html7bar.html

enthalten. Dort könnt ihr URL und Linktext normal abändern.
Icons:
Die Icons müssen alle im

img

Unterordner liegen.
Die Maße sollten 16x16px für die Taskbaricons und 32x32px für die Orb-Fenstericons sein. Hintergrund transparent.
Die Icons werden ebenfalls in der html7bar.html entsprechend angepasst.
Profilfoto:
Das Profilfoto muss ebenfalls im

img

Ordner liegen, sollte 60x60px groß sein und wird in der

html7bar.css

in Zeile 91 (

background: url("img/profilfoto.png") no-repeat;

) angepasst.

Screenshots:

html7bar als Lesezeichen-/Linkleiste:

html7bar als persönlicher, öffentlicher Newsfeed:

Demo

Demo
aktive Version: 2.3

Testnutzung:

<?php include("http://public.hannes-schurig.de/html7bar/html7bar.html"); ?>
Download

html7bar [.zip] (100KB)
aktive Version: 2.3

Changelog


v1.0 – release
v1.0.1 – html7bar credits postlink, fix credits padding
v1.0.2 – fix bar margin (left)
v1.0.3 – several css fixes, almost no css resets anymore (3 left)
v1.1 – using sprite images instead of multiple images (where it is possible) for better performance
v1.2 – it’s now possible to hide the html7bar
v1.3 – better graphics and css, hover everywhere
v1.4 – better sliding trick for hiding the bar (http://bit.ly/oYRoBF)
v1.5 – save html7bar visibility in cookie (if possible), show/hide html7bar on revisit
a.k.a. v2.0 – bugfixes, design optimization, show/hide html7bar with cookie-saving support
v2.1 – search field in orb window now searches the blog
v2.1.1 – code cleaning in html and css, 1 error in transitional xhtml left (has to)
v2.2 – buttons for configs, about and deactivate … i’m not really into this popping-out window myself because of the colors, thinking about something different
v2.3 – finished design for config/about/deactivate-window with shadow-background

Mein neuestes Projekt könnt ihr seit Kurzem in meinem Blog sehen. Die html7bar getaufte Windows 7 nachempfundene Web Taskbar platziert sich am unteren Rand einer Webseite und sieht dort einfach mal gut aus 😉

Genutzt Techniken: HTML, CSS, jQuery

Testnutzung:

<?php include("http://public.hannes-schurig.de/html7bar/html7bar.html"); ?>

Morgen gibt’s den Download, Code, bla. Heute erstmal nur als Preview.

Ich bin positiv überrascht, das neue WordPress Update 3.2 – „Gershwin“ hat es in sich!

Dem Backend wurde ein neues Aussehen verpasst, dass mir sehr gut gefällt.

Die Admin Bar im Blog hat bei „Add New“ ein paar zusätzliche Punkte bekommen.
Der Editor bekommt einen ziemlich coolen Vollbildmodus.

Entgegen anderer Updates wurde stark an der Performance gearbeitet. Das kann ich durchaus bestätigen, das Backend reagiert jetzt wesentlich schneller als zuvor. Aufgrund einiger Plugins war mein Backend recht langsam geworden.
Ich glaube auch, dass das Hinzufügen von Bildern in Artikel jetzt schneller läuft. Das war für mich immer einer der größten Flaschenhälse von WordPress, dieser halb CSS halb Flash realisierte Image Uploader.

Dann gibt es noch ein neues Standarddesign, realisiert in HTML5, zusätzliche Codeoptimierungen im System und vieles mehr.

All diese Änderungen blasen WordPress diesmal aber nicht so sehr auf wie die letzten Updates, der RAM Verbrauch von WordPress steigt um gerade mal 0,4MB.

Hier noch der offizielle Release Post und ein kurzes Video mit allen Neuerungen und Features:
https://www.youtube.com/watch?v=http://www.youtube.com/watch?v=oOvUf-1jjyo&hd=1[/embed]

Letztens habe ich über ein auf PHP Arrays basierendes Mehrsprachigkeitssystem bei Webseiten gesprochen.
Einer der Nachteile bei diesem System ist, dass jeglicher Webseiteninhalt in die Seite ge‘

echo

‚t wird. Möchte man jetzt interaktive PHP Inhalte auf die Seite bringen, wird es kompliziert.

Denn durch

echo

ausgegebene Inhalte werden einfach nur wiedergegeben, nicht noch einmal verarbeitet. Das führt dazu, dass durch

echo

ausgegebene PHP Codezeilen einfach ignoriert bzw. auskommentiert (Chrome) werden.

Beispiel:

<?php
$string='Dies <?php echo("ist ein"); ?> Test!'; 
echo($string);
?>

Ausgegeben wird:
Dies Test!

Der PHP Code wurde ignoriert.

Lösung:
Ich habe eine Funktion geschrieben, mit der PHP Code selbst durch ein

echo

noch funktioniert.
Der Funktion wird ein Text übergeben, der sowohl einfach nur ausgegeben werden soll, als auch PHP Code enthält, der ausgeführt werden soll. Die Funktion teilt einfachen Text und PHP Code auf, gibt den Text normal aus und führt den PHP Code aus.

Code

Code anzeigen

<?php
$arr['a']='dies <em>ist <?php echo("ein");?> test</em> und gleich 
<?php 
$test="<b>noch ein"; 
$mark="!!";
echo($test." test".$mark); 
?></b>
<hr />
ja ja, so geht das';

function printcontent($page) {
	if(strpos($page,"<?php")!==false) {
		$temp = split("(<\?php|\?>)",$page);
		for($i = 0; $temp[$i]; $i++) {
			if(strrpos($temp[$i],";")>=strlen($temp[$i])-3) {
				echo(eval($temp[$i]));
			} else { 
				echo($temp[$i]); 
			}
		}
	}
}
?>

<html>
<body>
<?php printcontent($arr['a']); ?>
</body></html>

Usage:

<?php printcontent($string); ?>

Wobei $string eine Zeichenkette ist, die einen

< ?php ... ?>

Part enthält. Wichtig ist, dass ihr tatsächlich mit

< ?php

beginnt, nicht nur

< ?

und dass das

?>

spätestens 3 Zeichen nach dem letzten Semikolon der letzten PHP Zeile kommt. So wird jeder PHP Part erkannt.
Setzt ihr also vor dem abschließendem

?>

5 Absätze oder Leerzeichen schlägt die korrekte Interpretation fehl.

Demo

Demo

Download

echo-php-code [.zip]

Changelog


v1.1: Performance mit schneller strpos() Vorabfrage erhöht. Regex kommt jetzt nur noch zum Einsatz wenn im String überhaupt ein < ?php gefunden wird.

Letzte Woche habe ich die Mehrsprachigkeit einer Webseite in PHP mit einigen zusätzlichen Extras und Debuginformationen veröffentlicht. Ich zeige jetzt nochmal eine gekürzte Produktivversion ohne Schnick-schnack und Kommentare.

Code

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

<?php
/*
   ###################
    PHP Multilanguage (minified version)
   ###################
   Desc: This page detects your browserlanguage, cookie or chosen language with PHP and displays the right content.
   Author: Hannes Schurig
   Date: 20.06.2011
   Edited: 20.06.2011 (v1.5)
   based on 1.4 of the long version
   1.5: * Code minified
   1.6: + header(Location) URL correction, no more .php?lang=?? after choosing lang
   URL (min version): http://hannes-schurig.de/21/06/2011/php-mehrsprachigkeitssystem-minified/
   URL (long version): http://hannes-schurig.de/17/06/2011/php-mehrsprachigkeitssystem-mit-einigen-extras/
 */

$lang = detectlang();
function langanalyse($new_lang) {
	switch($new_lang) {
		case ("de"): case ("en"): 
			$lang = $new_lang; 
			setcookie("lang", $lang, time()+31536000); break;
		case ("delete"):
			setcookie("lang", $lang, time()-3600); break;
		default:
			$lang = "de"; 
			setcookie("lang", $lang, time()+31536000); break;
	}
	return $lang;
}
function detectlang() {
	//https Erkennung
	$s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : "";
	if(isset($_GET["lang"])) { 
		$lang = langanalyse($_GET["lang"]);
		header('Location: http'.$s.'://'.$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME']); 
	}
	elseif(isset($_COOKIE["lang"])) { $lang = langanalyse($_COOKIE["lang"]); }
	elseif(isset($_POST["lang"])) { 
		$lang = langanalyse($_POST["lang"]);
		header('Location: http'.$s.'://'.$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME']);
	}
	else {
		$cutstring = explode("-", $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
		$detectlang = $cutstring[0];
		$lang = langanalyse($detectlang);
	}
	return $lang;
}

echo('
<a href="'.$_SERVER['SCRIPT_NAME'].'?lang=de">De</a>  
<a href="'.$_SERVER['SCRIPT_NAME'].'?lang=en">En</a>  
<a href="'.$_SERVER['SCRIPT_NAME'].'?lang=delete">Del</a>
');

// PHP Array mit den eigentlichen Inhalten der erlaubten Sprachen
$content["de"]["text"]="Hallo, dies ist nur ein Test";
$content["en"]["text"]="Hello, this is just a test";
$content["de"]["menu"]="
<ul>
 <li>Autos</li>
 <li>Frauen</li>
 <li>Alkohol</li>
</ul>";
$content["en"]["menu"]="
<ul>
 <li>Sex</li>
 <li>Drugs</li>
 <li>Rock'n'Roll</li>
</ul>";
$content["de"]["info"]="Zu Ihrer Information:<br/>
News 1: bla<br/>
News 2: bla<br/>
Test";
$content["en"]["info"]="For Your Information:<br/>
News 1: Foo<br/>
News 2: Bar<br/>
foobar";

?>
<html>
 <head>
  <title>Mehrsprachigkeit mit PHP, Array und COOKIES</title>
  <style type="text/css">
  div {
    margin: 20px;
	padding: 15px;
	float: left; }
  #langdebug {
    border: 1px solid black;
    font-size: 0.8em; }
  </style>
 </head>
<body>
 
 <div id="menu">
  <? echo($content[$lang]["menu"]); ?>
 </div>
 <div id="text">
  <? echo($content[$lang]["text"]); ?>
 </div>
 <div id="info">
  <? echo($content[$lang]["info"]); ?>
 </div>

</body>
</html>

Der eigentliche Codeteil (ohne Kommentare, Array und Sprachwahllinks) ist also nur noch 20 Zeilen lang aber trotzdem noch gut lesbar.

Demo

Demo Link

Download

min [.zip]

long version: Link

Heute früh direkt bemerkt: Google hat eine kleine Designänderung auf der Mainpage:

Modern, einfach, Google 🙂

Auch an der Suchseite und den Suchergebnissen wurde gearbeitet:

Die linke Sidebar hat sich verändert: Abstände, Linien(farben) und Positionen der Elemente wurden überarbeitet. Die Icons links sind ebenfalls neu und farblos; darüber lässt sich streiten finde ich, Google ist bei mir grundsätzlich eher bunt. Der ganze Seitenheader ist ein wenig neu arrangiert und designed. Die Suchergebnisse haben jetzt angenehmere Abstände (wodurch aber weniger Ergebnisse ins Sichtfeld passen), das Grün der Links ist (meiner Meinung nach) angenehmer und die Links stehen jetzt direkt unter dem Seitentitel.

Das wären so die auffälligsten Änderungen. Momentan sehe ich das neue Google Design nur im Chrome, im Firefox ist das alte Design noch aktiv. Ich kann also noch sehr gut Vorher-Nachher-Bilder zeigen 🙂