Kontakt aufnehmen

Ordnerfunktion bei Seiten (CMS)

In diesem Artikel des CMS-Tutorials werden wir eine Möglichkeit schaffen die Seiten in Ordnern einzuteilen. Als Basis hierzu wird die Klasse FileServer genommen, welche wir auch bereits bei den Dateien einsetzen.

Bei der Ansicht der Seiten werden nun die Seiten nicht mehr aus der Datenbank sondern über die Dateien ausgelesen. Weitere Informationen werden pro Seite ausgelesen. Ein Großteil der neuen /admin/includes/sites.php ähnelt der files.php:

<h1>Seiten</h1>
<?php
  $dir = $_GET['dir'];
  if($_POST['newFolder']){
    FileServer::createFolder("../content/articles/".$dir,$_POST['name']);
  }
  if($_GET['rmdir']){
    rmdir("../content/articles/".$_GET['rmdir']);
    echo "<p>Verzeichnis ".$_GET['rmdir']." wurde gelöscht!</p>";
  }
  $verzeichnis = openDir("../content/articles/".$dir);
?>
<p>
  <?PHP
    if($dir){
      ?>
        <a href="/admin/index.php?page=site-new&dir=<?PHP echo substr($dir,1); ?>">Neue Seite</a>
      <?PHP
        }
        else{
      ?>
        <a href="/admin/index.php?page=site-new">Neue Seite</a>
      <?PHP
    }
  ?>
</p>
 <form action="/admin/index.php?page=sites&dir=<?PHP echo $_GET['dir']; ?>" method="POST">
  <p>Path: <?PHP 
        $pre = "";
        foreach(split("/",$dir) as $cDir){
          $path .= "/".$cDir;
          if($path == "/"){
            echo " <a href="/admin/index.php?page=sites">/</a>";
            $path = "";
          }
          else{
              echo " <a href="/admin/index.php?page=sites&dir=".$path."">".$cDir."/</a>";
          }
        }
      ?>
      <input name="name" style="width:100px;" />
      <input name="newFolder" type="submit" value="Neu" />
  </p>
  </form>
  <ul style="list-style-type:none;">
  <?PHP
    $subFolders = FileServer::getFolders("../content/articles/".$dir);
    if($subFolders){
      foreach($subFolders as $folder){
        echo "<li>
                <img src="/system/images/icons/folder.png" />
                <a href="/admin/index.php?page=sites&dir=".$dir."/".$folder."">".$folder."</a>
              </li>";
      }
    }
  ?>
  </ul>

   <?PHP
    if(trim($_GET['dir']) != "" & trim($_GET['dir']) != "/"){
      echo "<a href="/admin/index.php?page=sites&rmdir=".$_GET['dir']."">Ordner löschen</a>";
    }
    $files = FileServer::getFiles("../content/articles/".$dir);
    if($files){
      ?>
        <table>
          <thead>
            <td><strong>Titel</strong></td>
            <td><strong>Alias</strong></td>
            <td><strong>Aktionen</strong></td>
          </thead>
          <tbody>
      <?PHP
      foreach($files as $file){
        if($dir){
          $file = substr($dir,1)."/".substr($file,0,strlen($file)-4);
        }
        else{
          $file = substr($file,0,strlen($file)-4);
        }
        $page = $db->ReadRow("SELECT * FROM {'dbprefix'}pagesWHERE alias = '".$db->EscapeString($file)."'");
          if($page){
          echo "<tr>
                  <td>".$page->title."</td>
                  <td>".$page->alias."</td>
                  <td>
                    <a title="Bearbeiten" 
                       href="index.php?page=site-edit&site=".$page->alias."">
                      <img src="/system/images/icons/page_edit.png" />
                      </a>
                   <a title="Löschen" 
                      href="index.php?page=site-delete&site=".$page->alias."">
                      <img src="/system/images/icons/cross.png" />
                   </a>
                 </td>
               </tr>";
               }
      }
      ?>
        </tbody>
        </table>
      <?PHP
       }
    else{
      echo "<p>Es sind keine Seiten vorhanden.</p>";
    }
  ?>

Nun muss die Klasse /system/classes/page.php erweitert werden. Da wir jetzt immer eine Datei erstellen müssen, wird das auch in der Funktion create gemacht. Diese Funktion benötigt nun zusätzlich den Parameter $dirpraefix. Des Weiteren wurde die Funktion writeContent um den Parameter $alias erweitert:

  function writeContent($dirpraefix,$content,$alias){
    if(!$alias){
      $alias = $this->alias;
    }
    $filename = $dirpraefix."content/articles/".$alias.".php";
    $handle = fopen ($filename, "a");
    $res = fwrite ($handle, $content);
    fclose ($handle);
    if($res){
      $args['alias'] = $alias;
      $args['filename']  = $filename;
      $args['content'] = $content;
      EventManager::raiseEvent("pagecontent_writed","../",$args);
    }
    return $res;
  }

  function create($dirpraefix,$alias){
    $res = $GLOBALS['db']->Execute("INSERT INTO {'dbprefix'}pages (alias) VALUES ('".$alias."')");
    self::writeContent($dirpraefix,"",$alias);
    if($res){
      $args['id']    = $GLOBALS['db']->InsertID();
      $args['alias'] = $alias;
      EventManager::raiseEvent("page_created","../",$args);
    }
    return $GLOBALS['db']->InsertID();
  }

Nun muss die Datei /admin/includes/site-new.php diese Funktionen auch nutzen. Sie wird nun übrigens mit dem GET-Paramter dir aufgerufen:

<h1>Seite erstellen</h1>
<?PHP
  if(!$_POST['alias']){
?>
  <form action="/admin/index.php?page=site-new&dir=<?PHP echo $_GET['dir']; ?>" method="post">
    Alias: <input name="alias" /><br />
    <input type="submit" value="Erstellen" />
  </form>
<?PHP
  }
  else{
   if($_GET['dir']){
     $dir = $db->EscapeString($_GET['dir'])."/";
   }
   else{
     $dir = "";
   }
   $id = Page::create("../",$dir.$db->EscapeString($_POST['alias']));
   if($id){
  ?>
    <p>Die Seite wurde erfolgreich erstellt.</p>
    <form action="/admin/index.php" method="GET">
      <input type="hidden" name="page" value="site-edit" />
      <input type="hidden" name="site" value="<?PHP echo $_POST['alias']; ?>" />
      <input type="submit" value="Seite Bearbeiten" />
    </form>
  <?PHP
    }
    else{
   ?>
      <p>Die Seite konnte leider nicht erstellt werden.</p>
   <?PHP
    }
  }
?>

Zu guter letzt muss noch die Datei /system/site-edit.phpden neuen writeContent aufruf benutzen:

<?PHP
  $page = new Page();
  $page->loadProperties($GLOBALS['db']->EscapeString($_GET['site']));
  if($_POST['save']){
    $page->deleteContent("../");
    $page->title = $_POST['title'];
    $page->menu = $_POST['menu'];
    $page->meta->description = $_POST['meta-description'];
    $page->meta->keywords = $_POST['meta-keywords'];
    $page->meta->robots = $_POST['meta-robots'];
    $page->save();
    $page->writeContent("../",$_POST['content'],$page->alias);
    $content = $_POST['content'];
  }
  else if(isset($_POST['menu'])){
    $page->title = $_POST['title'];
    $page->alias = $_POST['alias'];
    $page->menu = $_POST['menu'];
    $content = $_POST['content'];
  }
  else{
    $content = $page->readContent("../");
  }
?>

Außerdem müssen wir noch die Klasse /system/classes/fileserver.php anpassen:

<?PHP
  class FileServer{

    function getFiles($dir){
      $oDir = openDir($dir);
      
      while($item = readDir($oDir)){
        if(is_file($dir."/".$item)){
          $res[] = $item;
        }
      }

      closeDir($oDir);
      
      return $res;
    }

    function getFolders($dir){
      $oDir = openDir($dir);
      
      while($item = readDir($oDir)){
        if(is_dir($dir."/".$item)){
          if($item != "." && $item != ".."){
            $res[] = $item;
          }
        }
      }

      closeDir($oDir);
      
      return $res;
    }

    function createFolder($base,$name){
      $res = mkdir($base."/".$name,0777);
      $args['name'] = $base."/".$name;
      if($res) EventManager::raiseEvent("folder_created","../",$args);
      return $res;
    }
    
    function upload($base,$file){
      $tempname = $file['tmp_name'];
      $name = $file['name'];
      $res = copy($tempname, $base."/".$name);
      $args['name'] = $base."/".$name;
      if($res) EventManager::raiseEvent("file_uploaded","../",$args);
      return $res;
    }

  }

?>

Und zu guter letzt die /admin/includes/files.php:

<h1>Dateien</h1>
<form enctype="multipart/form-data" action="/admin/index.php?page=upload" method="post">
<input type="hidden" name="dir" value="<?PHP echo  $_GET['dir']; ?>" />
Datei: <input type="file" name="file">
<input type="submit" value="Datei hochladen">
</form>

<?php
  $dir = $_GET['dir'];
  if($_POST['newFolder']){
    FileServer::createFolder("../content/uploads/".$dir,$_POST['name']);
  }
  if($_GET['unlink']){
    unlink("../content/uploads/".$_GET['dir']."/".$_GET['unlink']);
    echo "<p>Datei ".$_GET['unlink']." wurde gelöscht!</p>";
  }
  if($_GET['rmdir']){
    rmdir("../content/uploads/".$_GET['rmdir']);
    echo "<p>Verzeichnis ".$_GET['rmdir']." wurde gelöscht!</p>";
  }
  $verzeichnis = openDir("../content/uploads/".$dir);
?>
  <form action="/admin/index.php?page=files&dir=<?PHP echo $_GET['dir']; ?>" method="POST">
  <p>
    Path:
      <?PHP 
        $pre = "";
        foreach(split("/",$dir) as $cDir){
          $path .= "/".$cDir;
          if($path == "/"){
            echo " <a href="/admin/index.php?page=files">/</a>";
            $path = "";
          }
          else{
              echo " <a href="/admin/index.php?page=files&dir=".$path."">".$cDir."/</a>";
          }
        }
      ?>
      <input name="name" style="width:100px;" />
      <input name="newFolder" type="submit" value="Neu" />
  </p>
  </form>
  <ul style="list-style-type:none;">
  <?PHP
    $subFolders = FileServer::getFolders("../content/uploads/".$dir);
    if($subFolders){
      foreach($subFolders as $folder){
        echo "<li>
                <img src="/system/images/icons/folder.png" />
                <a href="/admin/index.php?page=files&dir=".$dir."/".$folder."">".$folder."</a>
              </li>";
      }
    }
  ?>
  </ul>
  <?PHP
    if(trim($_GET['dir']) != "" & trim($_GET['dir']) != "/"){
      echo "<a href="/admin/index.php?page=files&rmdir=".$_GET['dir']."">Ordner löschen</a>";
    }
    $files = FileServer::getFiles("../content/uploads/".$dir);
    if($files){
      ?>
        <table>
          <thead>
            <td>Vorschau</td>
            <td>Dateiname</td>
            <td>Aktionen</td>
          </thead>
          <tbody>
      <?PHP
      foreach($files as $file){
        echo "<tr><td>";
        $path_info = pathinfo("../content/uploads/".$dir."/".$file);
        if(strtolower($path_info['extension'] == 'jpg') or
           strtolower($path_info['extension'] == 'jpeg') or
           strtolower($path_info['extension'] == 'gif') or
           strtolower($path_info['extension'] == 'png') or
           strtolower($path_info['extension'] == 'bmp')){
           echo "<img src="/content/uploads/".$dir."/".$file."" style="max-width:100px;max-height:100px;" />";
        }
        echo "</td><td><a href="../content/uploads".$dir."/".$file."">".$file."</a></td>
              <td><a href="/admin/index.php?page=files&dir=".urlencode($_GET['dir'])."&unlink=".urlencode($file).""><img src="/system/images/icons/cross.png" /></a></td>
              </tr>";
      }
      ?>
        </tbody>
        </table>
      <?PHP
       }
    else{
      echo "<p>Es sind keine Dateien vorhanden.</p>";
    }
  ?>

Du arbeitest in einer Agentur oder als Freelancer?
Dann wirf doch mal einen Blick auf unsere Software FeatValue.

Kommentare

Daniel schrieb am 29.03.2010:

Wollten wir nicht eine Suche einbauen die den Content durchsuchen kann (Text in DB speichern)?

Stefan Wienströer schrieb am 29.03.2010:

später...

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Cookie-Einstellungen

Helfen Sie dabei, uns noch besser zu machen. Wir nutzen Cookies und ähnliche Technologien, um die Website auf Ihre Bedürfnisse anzupassen. Zur Datenschutzerklärung

Auswahl speichern