Changeset 254 in t29-www


Ignore:
Timestamp:
May 25, 2012, 7:58:22 AM (7 years ago)
Author:
sven
Message:

Weiterarbeit an t29v6 (5 Stunden):

  • News werden dynamisch als YAML aus einem Heredoc aus news.php rausgelesen und in das Menü eingepflegt (String-Ersetzung)
  • Caching-System: Jede generierte Seite wird nun gecacht
  • Objektorientierung: Der Library-Code ist pseudo-OOP
  • PHP 5.3-Abhängigkeit - keine create_function-Aufrufe mehr sondern Closures
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • de-v6/hauptnavigation.xml

    r251 r254  
    99        <li class="has-submenu"><a seiten_id="news" href="/de-v6/news.php">Neues</a>
    1010                <ul class="u2 rich-text">
     11                        <!-- magic comment (do not replace): -->
     12                        <!--# INSERT_NEWS #-->
     13                        <!-- format:
    1114                        <li><a href="/de-v6/news.php#Februar_2012"><img src="/shared/img-v6/topnav-neues1.jpg" />
    1215                                Unterstützung von Schulen<span class="hidden">: </span>
    1316                                <em>Das technikum29-Team unterstützt Schulprojekte</em></a></li>
    14                         <li><a href="/de-v6/news.php#August_2011"><img src="/shared/img-v6/topnav-neues2.jpg" />
    15                                 Neue Anlage: LPG-21<span class="hidden">: </span>
    16                                 <em>Ein neuer seltener Rechner im Museum</em></a></li>
    17                         <li><a href="/de-v6/news.php#Juli_2011"><img src="/shared/img-v6/topnav-neues3.jpg" />
    18                                 Neue Anlage: Nova 2<span class="hidden">: </span>
    19                                 <em>Wissenschaftlicher Rechner ab 1969</em></a></li>
     17                        -->
    2018                </ul>
    2119        </li>
  • de-v6/news.php

    r251 r254  
    44        $titel = 'Was gibt es Neues?';
    55       
    6         require "../lib/technikum29.php";
     6        $neues_menu = <<< MENU
     7
     8- titel: "Unterstützung von Schulen"
     9  text: "Das technikum29-Team unterstützt Schulprojekte"
     10  link: "#Februar_2012"
     11  bild: "/shared/img-v6/topnav-neues1.jpg"
     12 
     13- titel: "Neue Anlage: LPG-21"
     14  text: "Ein neuer seltener Rechner im Museum"
     15  link: "#August_2011"
     16  bild: "/shared/img-v6/topnav-neues2.jpg"
     17
     18- titel: "Neue Anlage: Nova 2"
     19  text: "Wissenschaftlicher Rechner ab 1969"
     20  link: "#Juli_2011"
     21  bild: "/shared/img-v6/topnav-neues3.jpg"
     22
     23MENU;
     24// ende der menue-Eintraege
     25
     26        if(!require("../lib/technikum29.php")) return;
    727?>
    828    <h2>Was gibt es Neues?</h2>
  • lib/menu.php

    r251 r254  
    11<?php
    22
    3 require "$lib/spyc.php";
     3class t29Menu {
     4        public $conf;
    45
    5 class t29Menu {
    6         public $menu_file = "$lib/../$lang/menu.txt";
    7         public $horizontal_keyword = 'Horizontal';
    8         public $sidebar_keyword = 'Sidebar';
    9        
    10         function __construct() {
    11                 $rawmenu = Spyc::YAMLLoad($this->menu_file);
    12                
    13                
     6        public $horizontal_menu = 'hauptnavigation.xml';
     7        public $sidebar_menu = 'sidebar.xml';
     8        public $news_file = 'news.php';
     9
     10        function __construct($conf_array) {
     11                $this->conf = $conf_array;
     12                $this->conf['lang_path'] = $this->conf['lib'].'/../'.$this->conf['lang'];
    1413        }
    1514       
    16         private function resort_menu($a, $tab)  {
     15        function load_news_data() {
     16                $newsfile = $this->conf['lang_path']."/".$this->news_file;
     17                $newsdir = dirname(realpath($newsfile));
     18                // include path wird ignoriert wenn include relativ ist, was in der
     19                // eingebundenen Datei der Fall ist
     20                // set_include_path( get_include_path(). PATH_SEPARATOR . dirname($newsfile));
     21                $pwd = getcwd(); chdir($newsdir);
     22                include($this->news_file);
     23                chdir($pwd);
     24                return $neues_menu;
    1725        }
     26
     27        function convert_news_data() {
     28                require $this->conf['lib'].'/spyc.php';
     29                $data = Spyc::YAMLLoad($this->load_news_data());
     30                $fields = array('titel', 'text', 'link', 'bild');
     31
     32                $news_ul_content = '';
     33                foreach($data as $e) {
     34                        if(!array_reduce(array_map(function($x) use ($fields,$e){ return isset($e[$x]); }, $fields),
     35                                        function($a,$b){ return $a && $b;}, true)) {
     36                                $li = "<li>Fehler in Formatierung!";
     37                        } else {
     38                                $url = ($e['link']{0} == '#' ? '/'.$this->conf['lang'].'/'.$this->news_file : '').$e['link'];
     39                                $li = "<li><a href='$url'><img src='$e[bild]' /> $e[titel]<span class='hidden'>: </span><em>$e[text]</em></a></li>";
     40                        }
     41                        $news_ul_content .= "\t".$li."\n";
     42                }
     43
     44                return $news_ul_content;
     45        }
     46
     47        // helper method
     48        public static function dom_add_class($simplexml_element, $value) {
     49                $dom = dom_import_simplexml($simplexml_element);
     50                $simplexml_element['class'] =
     51                        ($dom->hasAttribute("class") ? ($simplexml_element['class'].' '):'').$value;
     52        }
     53
     54        function print_menu($file) {
     55                $seiten_id = $this->conf['seiten_id'];
     56                $xml = simplexml_load_file($this->conf['lang_path'] . '/' . $file);
     57       
     58                // aktuelle Seite anmarkern und Hierarchie hochgehen
     59                // (<ul><li>bla<ul><li>bla<ul><li>hierbin ich <- hochgehen.)
     60                $current_a = $xml->xpath("//a[@seiten_id='$seiten_id']");
     61                if(count($current_a)) {
     62                        $current_li = $current_a[0]->xpath("parent::li");
     63                        $this->dom_add_class($current_li[0], "current");
     64                        $ancestors = $current_li[0]->xpath("ancestor-or-self::li");
     65                        array_walk($ancestors, create_function('$i', 't29Menu::dom_add_class($i, "active");'));
     66                }
     67
     68                // Seiten-IDs (ungueltiges HTML) ummoddeln
     69                $all_ids = $xml->xpath("//a[@seiten_id]");
     70                foreach($all_ids as $a) {
     71                        $a['id'] = "sidebar_link_".$a['seiten_id'];
     72                        // umweg ueber DOM um Node zu loeschen
     73                        $adom = dom_import_simplexml($a);
     74                        $adom->removeAttribute('seiten_id');
     75                }
     76       
     77                if($file == $this->horizontal_menu) {
     78                        # inject news
     79                        $news_ul_content = $this->convert_news_data();
     80                        $magic_comment = '<!--# INSERT_NEWS #-->';
     81                        $menu = $xml->ul->asXML();
     82                        print str_replace($magic_comment, $news_ul_content, $menu);
     83                } else {
     84                        print $xml->ul->asXML();
     85                }
     86        }
     87
     88        function print_relations() {
     89                $seiten_id = $this->conf['seiten_id'];
     90       
     91                $sidebar = simplexml_load_file($this->conf['lang_path'] . '/' . $this->sidebar_menu);
     92                $current_a = $sidebar->xpath("//a[@seiten_id='$seiten_id']");
     93                if(count($current_a)) {
     94                        $prev = $current_a[0]->xpath("preceding::a[@seiten_id][1]");
     95                        if(count($prev)) {
     96                                $a = $prev[0];
     97                                print "<li class='prev'><a href='$a[href]'>vorherige Seite <strong>$a</strong></a></li>";
     98                        }
     99                        $next = $current_a[0]->xpath("following::a[@seiten_id][1]");
     100                        if(count($next)) {
     101                                $a = $next[0];
     102                                print "<li class='next'><a href='$a[href]'>nächste Seite <strong>$a</strong></a></li>";
     103                        }
     104                } else {
     105                        print '<li class="start"><a href="#">Starte Führung <strong>Blabla</strong></a>';
     106                }
     107        }
     108
    18109} // class
    19 
    20 print "<pre>";
    21 
    22 $horizontal = $rawmenu["Horizontal-Menü"];
    23 $sidebar = $rawmenu["Sidebar"];
    24 
    25 function print_menuitem($a, $tab) {
    26         if(!is_array($a)) print "$tab error: $a";
    27         reset($a); list($k, $v) = each($a);
    28         if(!$v) $v='';
    29         print "$tab * $k => $v\n";
    30         array_shift($a); // delete that first entry
    31        
    32         if(count($a) >= 1) {
    33                 foreach($a as $v)
    34                         print_menuitem($v, $tab."\t");
    35         }
    36 }
    37 
    38 foreach($horizontal as $v)
    39         print_menuitem($v, "");
    40 
    41 print "<hr><pre>";
    42 print_r($rawmenu);
  • lib/technikum29.php

    r252 r254  
    66 *
    77 **/
    8  
     8
     9if(defined('T29')) return false; // no nesting
     10define('T29', true);
     11
    912$lib = dirname(__FILE__);
    10 $lang = "de";
     13$lang = "de-v6";
    1114$root = "/"; # webroot
     15$file = substr($_SERVER['SCRIPT_FILENAME'], strlen($_SERVER['DOCUMENT_ROOT']));
    1216
    13 require "$lib/template.php";
     17$skip_cache = isset($_GET['skip_cache']);
     18$purge_cache = isset($_GET['purge_cache']);
    1419
    15 register_shutdown_function('print_footer');
    16 print_header();
     20$cache_dir = "$lib/../shared/cache";
    1721
    18 #include("$lib/menu.php");
     22# lightweight caching system
     23$test_programs = array(
     24        __FILE__,
     25        $_SERVER['SCRIPT_FILENAME'],
     26        "$lib/template.php",
     27        "$lib/menu.php",
     28        "$lib/../de-v6/hauptnavigation.xml",
     29        "$lib/../de-v6/sidebar.xml",
     30        "$lib/../de-v6/news.php",
     31);
    1932
    20 function t29dom_add_class($simplexml_element, $value) {
    21         $dom = dom_import_simplexml($simplexml_element);
    22         $simplexml_element['class'] =
    23                 ($dom->hasAttribute("class") ? ($simplexml_element['class'].' '):'').$value;
     33$cache_file = $cache_dir . $file;
     34$last_cache = @filemtime($cache_dir.$file);
     35$last_program = array_reduce(array_map(function($x){return @filemtime($x);}, $test_programs), 'max');
     36$cache_valid = $last_cache && $last_program < $last_cache;
     37
     38if(!$cache_valid || $skip_cache || $purge_cache) {
     39        // rebuild cache
     40        require "$lib/template.php";
     41        $tmpl = new t29Template($GLOBALS);
     42        $tmpl->create_cache();
     43} else {
     44        // use cache
     45        header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_cache)." GMT");
     46        //header("Etag: $etag");
     47
     48        if(@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_cache) {
     49                // client already has page cached locally
     50                header("HTTP/1.1 304 Not Modified");
     51        } else {
     52                readfile($cache_file);
     53        }
     54        exit;
    2455}
    2556
    26 function print_menu($file) {
    27         global $lib,$seiten_id;
    28         $xml = simplexml_load_file("$lib/../de-v6/$file.xml");
    29        
    30         // aktuelle Seite anmarkern und Hierarchie hochgehen
    31         // (<ul><li>bla<ul><li>bla<ul><li>hierbin ich <- hochgehen.)
    32         $current_a = $xml->xpath("//a[@seiten_id='$seiten_id']");
    33         if(count($current_a)) {
    34                 $current_li = $current_a[0]->xpath("parent::li");
    35                 t29dom_add_class($current_li[0], "current");
    36                 $ancestors = $current_li[0]->xpath("ancestor-or-self::li");
    37                 array_walk($ancestors, create_function('$i', 't29dom_add_class($i, "active");'));
    38         }
    39 
    40         // Seiten-IDs (ungueltiges HTML) ummoddeln
    41         $all_ids = $xml->xpath("//a[@seiten_id]");
    42         foreach($all_ids as $a) {
    43                 $a['id'] = "sidebar_link_".$a['seiten_id'];
    44                 // umweg ueber DOM um Node zu loeschen
    45                 $adom = dom_import_simplexml($a);
    46                 $adom->removeAttribute('seiten_id');
    47         }
    48        
    49         print $xml->ul->asXML();
    50 }
    51 
    52 function print_relations() {
    53         global $lib, $seiten_id;
    54        
    55         $sidebar = simplexml_load_file("$lib/../de-v6/sidebar.xml");
    56         $current_a = $sidebar->xpath("//a[@seiten_id='$seiten_id']");
    57         if(count($current_a)) {
    58                 $prev = $current_a[0]->xpath("preceding::a[@seiten_id][1]");
    59                 if(count($prev)) {
    60                         $a = $prev[0];
    61                         print "<li class='prev'><a href='$a[href]'>vorherige Seite <strong>$a</strong></a></li>";
    62                 }
    63                 $next = $current_a[0]->xpath("following::a[@seiten_id][1]");
    64                 if(count($next)) {
    65                         $a = $next[0];
    66                         print "<li class='next'><a href='$a[href]'>nächste Seite <strong>$a</strong></a></li>";
    67                 }
    68         } else {
    69                 print '<li class="start"><a href="#">Starte Führung <strong>Blabla</strong></a>';
    70         }
    71 }
     57// end of technikum29.php
  • lib/template.php

    r252 r254  
    77 *  $seiten_id = kurzkennung der aktuellen seite
    88 *  $root = Seiten-Root fuer URLs ($root/de, $root/shared, etc.)
     9 *  $titel = Seitentitel
     10 *  $header_cache_file, $footer_cache_file.
    911 **/
     12 
     13class t29Template {
     14        public $conf;
     15        public $menu;
    1016
    11 function print_header() {
    12         global $lang, $seiten_id, $root, $lib;
     17        function __construct($conf_array) {
     18                $this->conf = $conf_array;
     19               
     20                // create a menu:
     21                require_once $this->conf['lib'].'/menu.php';
     22                $this->menu = new t29Menu($this->conf);
     23        }
     24       
     25        /**
     26         * Main caching and output system.
     27         * Parameters (global configuration):
     28         *    skip_cache  -  if true, skips writing output to cache file
     29         *    purge_cache -  if true, forces creation of new cache file
     30         *                   (does not change behaviour of this file's code)
     31         **/
     32        function create_cache() {
     33                ob_start();
     34                $this->print_header();
     35                register_shutdown_function(array($this, 'create_cache_shutdown'));
     36        }
     37       
     38        function create_cache_shutdown() {
     39                $this->print_footer();
     40                $whole_page = ob_get_flush();
     41                if($this->conf['skip_cache']) {
     42                        echo "<!-- debug mode, skipped cache and cache saving. -->";
     43                        return; // do not save anything
     44                }
     45               
     46                if(!file_exists($this->conf['cache_file'])) {
     47                        t29Template::mkdir_recursive(dirname($this->conf['cache_file']));
     48                }
    1349
     50                file_put_contents($this->conf['cache_file'], $whole_page);
     51        }
     52
     53        public static function mkdir_recursive($pathname) {
     54                is_dir(dirname($pathname)) || t29Template::mkdir_recursive(dirname($pathname));
     55                return is_dir($pathname) || @mkdir($pathname);
     56        }
     57
     58        function print_header() {
    1459?>
    1560<!doctype html>
     
    1762<head>
    1863  <meta charset="utf-8">
    19 
    20   <title>Mockup t29v6</title>
     64  <title><?php isset($this->conf['titel']) ? $this->conf['titel'].' - ' : ''; ?> technikum29</title>
    2165  <meta name="description" content="Produziert am 08.01.2012">
    2266  <meta name="author" content="Sven">
     67  <meta name="generator" content="t29v6 $Id$">
     68  <meta name="t29.cachedate" content="<?php print date('r'); ?>">
    2369  <meta name="viewport" content="width=device-width,initial-scale=1">
    2470  <link rel="stylesheet" href="/shared/css-v6/boiler.css">
     
    3581        <div id="background-color-container"><!-- helper -->
    3682        <section class="main content" role="main" id="content">
    37         <!--### START EXAMPLE CONTENT ###-->
    3883                <!--<header class="teaser">
    3984                        <h2 id="pdp8L">Wissenschaftliche Rechner und Minicomputer</h2>
    4085                        <img width=880 src="http://www.technikum29.de/shared/photos/rechnertechnik/univac/panorama-rechts.jpg">
    4186                </header>-->
     87        <!-- start content -->
    4288<?php
    4389} // function print_header().
     
    4591function print_footer() {
    4692?>
    47         <!--### END EXAMPLE CONTENT ###-->
     93        <!-- end content -->
    4894        </section>
    4995        <hr>
     
    5197                        <h2 class="visuallyhidden">Museumstour</h2>
    5298                        <nav class="side">
    53                                 <?php print_menu("sidebar") ?>
     99                                <?php $this->menu->print_menu($this->menu->sidebar_menu); ?>
    54100                                <span class="button collapse-menu">Menü ausklappen</span>
    55101                        </nav>
     
    63109                <h2 class="visuallyhidden">Hauptnavigation</h2>
    64110                <nav class="horizontal">
    65                         <?php print_menu("hauptnavigation"); ?>
     111                        <?php $this->menu->print_menu($this->menu->horizontal_menu); ?>
    66112                </nav>
    67113                <nav class="top">
     
    85131                <nav class="rel clearfix">
    86132                <ul>
    87                         <?php print_relations(); ?>
     133                        <?php $this->menu->print_relations(); ?>
    88134                        <!--
    89135                        <li class="prev"><a href="#">vorherige Seite <strong>Univac 9200</strong></a>
     
    98144                        <div class="icons">
    99145                                <a href="/de-v6/impressum.php#image-copyright"><img src="/shared/img-v6/cc-icon.png"></a>
    100                                 <a href="http://ufopixel.de" title="Designed by Ufopixel"><img src="http://svenk.homeip.net/dropbox/Ufopixel/Ufopixel-Design/logo_90x30/ufopixel_logo_90x30_version2.png"></a>
     146                                <!--<a href="http://ufopixel.de" title="Designed by Ufopixel"><img src="http://svenk.homeip.net/dropbox/Ufopixel/Ufopixel-Design/logo_90x30/ufopixel_logo_90x30_version2.png"></a>-->
    101147                        </div>
    102148                        <!--CC<br>Viele Bilder können unter einer CreativeCommons-Lizenz
     
    125171</html>
    126172<?php
    127 } // function print_footer()
    128 ?>
     173        } // function print_footer()
     174       
     175} // class t29Template
Note: See TracChangeset for help on using the changeset viewer.
© 2008 - 2013 technikum29 • Sven Köppel • Some rights reserved
Powered by Trac
Expect where otherwise noted, content on this site is licensed under a Creative Commons 3.0 License