Felix Riesterer: Zeitzonen in PHP5 - Auswahl wie zusammenstellen?

Beitrag lesen

Lieber Sven Rautenberg,

danke für Deinen Denkanstoß!

Mein persönlicher Favorit ist, wie zu Beginn grandios ein "Template" für das Select-Feld definiert wird, und am Ende mit einem recht opulenten regulären Ausdruck die erzeugte Optionsliste hineingequetscht wird. WTF?

Das "grandiose" Template ist in wirklichkeit ein vollständiges HTML-Dokument, welches für die Einstellungen-Seite aus einer HTML-Datei geladen wird. Im obigen Beispiel wurde das Dokument auf das <select>-Element verkürzt.

Meine Lösung nutzt nun SimpleXML, um diese lästige verschachtelte Stringerzeugung etwas besser zu strukturieren. Ob das Konstrukt letzten Endes besser lesbar ist (also der PHP-Code, nicht der erzeugte HTML-Code) ist eine andere Frage.

$template = file_get_contents('template-settings-menue.html');  
  
$timezone_list = simplexml_load_string('<?xml version="1.0" encoding="UTF-8"?><select name="timezone"></select>');  
$og = null;  
  
foreach (DateTimeZone::listIdentifiers() as $v) {  
    if (preg_match('~^(America|Antartica|Arctic|Asia|Atlantic|Europe|Indian|Pacific)/(.*)$~', $v, $e)) {  
        if ($og === null || $og['label'] != $e[1]) {  
            $og = $timezone_list->addChild('optgroup');  
            $og->addAttribute('label', $e[1]);  
        }  
  
        $o = $og->addChild('option', $e[2]);  
        $o->addAttribute('value', $e[0]);  
    }  
}  
  
$timezone_list = preg_replace('~(?is)^[^\r\n]*[\r\n]*~', '', $timezone_list->asXML());  
  
$template = preg_replace(  
    '~(?is)<select name="timezone".*?</select>~',  
    $timezone_list,  
    $template  
);

Liebe Grüße,

Felix Riesterer.

--
ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)