0251 / 590 837 15
info@a-coding-project.de
;

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&ouml;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&ouml;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&ouml;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&ouml;scht!</p>";
  }
  if($_GET['rmdir']){
    rmdir("../content/uploads/".$_GET['rmdir']);
    echo "<p>Verzeichnis ".$_GET['rmdir']." wurde gel&ouml;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&ouml;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>";
    }
  ?>

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...