Seite 1 von 1

Fragen zur Technik

Verfasst: 21.10.2006 22:18
von Ambience
Hallo, also ich habe mal ne frage...

Ich bin gerade dabei ein Template system für mich zu schreiben, welches immer 3 dateien compiliert und in einem ordner als php speichert...

also spich eine header, content und footer datei... header und footer wird automatisch dazucompiliert.... wie schaff ich das nun zu überprüfen, ob sich inhaltlich einer template datei was geändert hat, um diese dann neu zu compilieren....

also man kann die klasse erstellen, und einen subdir angeben, in der die tpl dann liegt die aufgerufen wird...

und ich wollte das eigentlich so prüfen:

header
tpl
footer

das ganze als md5 file...

also so: header_5 . tpl_5 . footer_5

und dann gucken ob so eine datei schon existiert, aber irgenwie scheint das nicht so ganz zu klappen.


oder wie würdet ihr das machen?

ich mache es in meinem fall so:

Code: Alles auswählen

/**
  * Check if template is compiled or compile it
  *
  * @param string $_tpl
  * @return
  *
  **/
  function display($_tpl)
  {
    if ($this->_is_compiled($_tpl))
    {
      $hash_header = md5_file($this->templates_dir . $this->subdir . $this->header . $this->_tpl_Ex);
      $hash_footer = md5_file($this->templates_dir . $this->subdir . $this->footer . $this->_tpl_Ex);
      $hash_tpl_file = md5_file($this->templates_dir . $this->subdir . $_tpl . $this->_tpl_Ex);
    
      $end_hash = substr($hash_header . $hash_tpl_file . $hash_footer, 10, -60);
      
      include($this->compile_dir . $end_hash . $_tpl . $this->_tpl_Ex . '.php');
    }
    else
    {
      die('datei_noch_nicht_compiliert');
      if ($this->_compile_file($_tpl))
      {
        die('compilation erfolgreich');
      }
    }
  }
  
  /**
  * Check if Template already compiled
  *
  * @param string $_tpl
  * @return true/false
  *
  **/
  private function _is_compiled($_tpl)
  {
    $hash_header = md5_file($this->templates_dir . $this->subdir . $this->header . $this->_tpl_Ex);
    $hash_footer = md5_file($this->templates_dir . $this->subdir . $this->footer . $this->_tpl_Ex);
    $hash_tpl_file = md5_file($this->templates_dir . $this->subdir . $_tpl . $this->_tpl_Ex);
    
    $end_hash = substr($hash_header . $hash_tpl_file . $hash_footer, 10, -60);
    
    if (file_exists($this->compile_dir . $end_hash . $_tpl . $this->_tpl_Ex . '.php'))
    {
      return true;
    }
    else
    {
      return false;
    }
  }
aber so will es nicht klappen...

Verfasst: 21.10.2006 22:54
von S2B
Schau dir mal [php:filemtime] an. :wink:

Verfasst: 21.10.2006 23:17
von Ambience
hmm und wie soll ich das dann prüfen? wenn die datei in den letzen 5 min erstellt worden ist, dann includen andernfalls neu compilieren? das nützt nicht viel, weil wenn ich gerade was geändert habe, muss ich die 5 min warten...

oder wie stellst du dir das genau vor?

Verfasst: 22.10.2006 10:56
von S2B
Du vergleichst die Zeiten der compillierten und der nicht compillierten Dateien. Wenn die nicht compillierte neuer ist, wird neu compilliert, ansonsten wird die bereits compillierte verwendet.

Verfasst: 22.10.2006 11:51
von Ambience
aha, sehr schlaue technik.... hmm aber.... ja mal gucken...

Verfasst: 22.10.2006 11:52
von OnFire
Oder du kompilierst es von Hand neu, wenn du was geändert hast, was ja auch nicht alle 5 Minuten passieren sollte, daher ist der Aufwand eigentlich nich sooooo groß und es wird weit weniger Fehler geben.

Verfasst: 22.10.2006 11:54
von Ambience
hmm das ist eine template classe die selbst kompilieren sollte... das ist dafür gut, da ich ein gästebuch habe, das dann auf diese classe geupdatet wird, und wenn jemand was verändert, und nicht weiß wie das ganze geht, compiliert sich das ding von selber neu.

Verfasst: 22.10.2006 12:12
von Ambience
ehm S2B, funzt das auch wenn man die datei nur geändert hat? wäre da nicht besser zu suchen, nach last modified oderso?

EDIT: oh sry, das macht die funktion ja schon.

meinst du das dann so?

Code: Alles auswählen

private function _is_compiled($_tpl)
  {
    if (file_exists($this->compile_dir . $this->subdir . $_tpl . $this->_tpl_Ex . '.php'))
    {
      $get_update_header = filemtime($this->templates_dir . $this->header . $this->_tpl_Ex);
      $get_update_content = filemtime($this->templates_dir . $this->subdir . $_tpl . $this->_tpl_Ex);
      $get_update_footer = filemtime($this->templates_dir . $this->footer . $this->_tpl_Ex);
      
      $get_update_c = filemtime($this->compile_dir . $this->subbdir . $_tpl . $this->_tpl_Ex . '.php');
      
      if ($get_update_header >= $get_update_c OR $get_update_content >= $get_update_c OR $get_update_footer >= $get_update_c)
      {
        return false;
      }
      else
      {
        return true;
      }
    }
    else
    {
      return false;
    }
  }

Verfasst: 22.10.2006 12:50
von S2B
Das sollte normal passen, ich würde allerdings von der Logik her eher > anstatt >= verwenden, auch wenn der Fall = wahrscheinlich nie eintreten wird. :wink: