Tutorial Mini CMS (Content Management System)

von Webbausteine.de in NetObjects Fusion (NOF) integrieren

Mini-CMS Version vom: 27.01.2015 - hier mit leicht veränderten Skripten und veränderter CSS zur Anpassung an meinen Site-Style.

Ich beschreibe hier den direkten Einbau in NOF, so wie ich es hier gemacht habe. Es gibt natürlich immer viele Möglichkeiten, wie z.B. die Skripte grundsätzlich anders einzubauen oder z.B. aus dem Original-Skript den Header zu entfernen und dann die so abgeänderte Startseite von Webbausteine.de mittels Iframe einzubinden, denn diese ist responsive.

Bitte ladet Euch zunächst hier die ZIP-Datei für das Skript und die SQLite-Datenbank bei Webbausteine.de herunter.

Ihr entpackt diese ZIP-Datei und erhaltet:

  • index.php - Startseite ‘index.php’
  • db - Verzeichnis mit der SQLite-Datenbank inklusive einer .htaccess Datei zum Schutz von diesem Verzeichnis
  • upload - Verzeichnis zum Upload von Bildern und Dateien

Ihr solltet als allererstes oben in der Datei ‘index.php’ Euer Passwort ändert - dort wo jetzt lediglich “0000” steht, damit niemand Zugriff auf dieses CMS bekommt.

Dann solltet Ihr ein Testverzeichnis auf dem Server mittels FTP-Progamm anlegen, die ‘index.php’ sowie das Verzeichnis ‘db’ in dieses Testverzeichnis kopieren und die Seite zunächst einmal aufrufen. Ihr könnt sofort loslegen und neue Einträge vornehmen, ändern und löschen. So bekommt Ihr zunächst ein Verständnis für die Arbeitsweise dieses Skriptes.

Der Einbau in NOF:

Da ich ja hier bereits mein eigenes Design in meiner NOF-Seite verwende, will ich natürlich meinen Banner-Bereich und den Stil meiner Seite beibehalten. Daher habe ich das Original-Skript (index.php) von Webbausteine.de mit einem Editor geöffnet und mir die Teile, die ich benötige heraus kopiert.

CSS

Hier meine CSS speziell für die Inhalte des CMS. Ich habe diesen Style als CSS-Datei abgespeichert, die Ihr hier sehen und Euch downloaden oder den Inhalt kopieren könnt: stylesheet.css. Diese CSS-Datei habe ich mit meinem FTP-Programm auf den Server in ein Verzeichnis ‘css’ kopiert. Achtet also immer auf die korrekte relative Pfadangabe zu dieser und allen anderen Dateien.

> Layout markieren > Fenster “Layout-Eigenschaften” > Button “HTML” >  “Zwischen Head Tags” einfügen (relative Pfadangabe beachten)

<link rel="stylesheet" href="./css/stylesheet.css" type="text/css" media="screen" />

Das Skript selbst habe ich in 5 Teile zerlegt, damit ich die einzelnen Bereiche besser platzieren kann.

1. Zugang zur Datenbank und SESSION starten

Bitte tragt Euer Administrator Passwort ein und achtet darauf, dass dieses Passwort mindestens 8-10 Zeichen hat und nicht leicht zu erraten ist.

Weiterhin tragt Ihr die Kategorie und die ID für die Seite ein, die als Startseite zuerst angezeigt werden soll. Der Eintrag mit der angegebenen ID wird dann komplett auf der Startseite erscheinen.

Dieser Teil des Skriptes gehört ganz an den Beginn der Seite auf der Ihr das CMS einbauen wollt.

> Layout markieren > Fenster “Layout-Eigenschaften” > Button “HTML” > erste Reiter “Beginn der Seite” einfügen (keine Leerzeile lassen)

<?php
/* Mini-CMS mit SQLite -
 Webbausteine.de

 Version vom: 27.01.2015
 Eine aktuelle Version finden Sie unter:
 www.webbausteine.de/blog/php/minicms_mit_sqlite.php
 Dort können Sie auch Verbesserungsvorschläge, Hinweise und Fehler eintragen.

 Im Mini-CMS Anmelden über: index.php?aktion=anmelden
 */

// Einstellungen
$passwort = "0000"; // Passwort
$datenbank = "./db/datenbank.sqt"; // Verzeichnis benötigt Schreib. und Leserechte!
$eintraege_seite = 4; // Einträge pro Seite
$max_woerter = 25; // Max. Anzahl der Wörter in der Vorschau.
$link_anmeldung = "ja"; // Link zur Anmeldung anzeigen (ja/nein)
$kategorie_start = "CMS"; // Diese Kategorie beim Starten anzeigen.
$id_start = 10; // Diesen Eintrag (ID) beim Starten komplett anzeigen.
$datum_anzeigen = "nein"; // Datum anzeigen (ja/nein)
$media = "./upload/"; // Verzeichnis für das Hochladen von Dateien.


// Verbindung zur SQLite-Datenbank
if (!file_exists($datenbank)):
 // Datenbank-Datei erstellen
 $db = new PDO('sqlite:' . $datenbank);
 $db->exec("CREATE TABLE miniCMS(
  `id` INTEGER PRIMARY KEY,
  `titel` CHAR(255),
  `text` TEXT,
  `kategorie` CHAR(255),
  `anzeige` INTEGER,
  `datum` DATETIME)");
else:
 $db = new PDO('sqlite:' . $datenbank);
endif;

// Verbindung zur MySQL-Datenbank (Optional)
// $DB_HOST = "localhost"; // Datenbank-Host
// $DB_NAME = "test"; // Datenbank-Name
// $DB_BENUTZER = "root"; // Datenbank-Benutzer
// $DB_PASSWORT = ""; // Datenbank-Passwort
// try {
//  $OPTION = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
//  $db = new PDO("mysql:host=" . $DB_HOST . ";dbname=" . $DB_NAME,
//   $DB_BENUTZER, $DB_PASSWORT, $OPTION);
// }
// catch (PDOException $e) {
//  exit("Verbindung fehlgeschlagen! ");
// }

session_start();
$scriptName = basename($_SERVER["SCRIPT_NAME"]);

// Anmeldung überprüfen
if (isset($_GET["anmeldung"])):
 if ($passwort === $_POST["passwort"]):
  $_SESSION["MiniCMS_admin"] = true;
 endif;
endif;

// Abmeldung
if (isset($_GET["abmelden"])):
 unset($_SESSION["MiniCMS_admin"]);
endif;
?>

2. Formular zur Suche im CMS

Für dieses und die folgenden Skripte zieht Ihr Euch jeweils ein Textfeld auf und kopiert die Skripte in den HTML Code-Editor des Textfeldes.

Das Attribut pattern weicht hier vom Original ab sowie auch das title Attribut.

> Textfeld doppelklicken (Cursor blinkt) > Fenster “Text-Eigenschaften” > mittlere Button oben “Textfeld” > Button ”HTML” > Code einfügen

<form action="<?php echo $scriptName;?>" method="get" style="display:inline">
   <input type="text" name="suchbegriff" required="required" pattern="^[a-zA-ZäöüßÄÖÜ0-9()][a-zA-ZäöüßÄÖÜ0-9- _\.()]{3,49}$" placeholder="Suche in Datenbank ..." title="Suchbegriff 4-50 Zeichen!" x-moz-errormessage="Suchbegriff 4-50 Zeichen!" />
   <input type="hidden" name="aktion" value="suche">
</form>

3. Navigation innerhalb des CMS - Achtung, dieses Skript weicht vom Original ab und bezieht sich auf meine CSS für die Navigation.

<nav>
<?php
// Kategorien auslesen und ausgeben
$admin = isset($_SESSION["MiniCMS_admin"]) ? "" : " WHERE `anzeige` = '1'";
$select = $db->query("SELECT `kategorie`
   FROM `miniCMS` " . $admin . "
   GROUP BY `kategorie`");
$kategorien = array();
foreach ($select->fetchAll(PDO::FETCH_OBJ) as $spalte):
 $kategorien[] = $spalte->kategorie;
 if (isset($_GET["kategorie"]) && $spalte->kategorie == $_GET["kategorie"] OR
 !isset($_GET["kategorie"]) && $spalte->kategorie == $kategorie_start):
  print '<div><a class="exnavi" href="' . $scriptName . '?kategorie=' . $spalte->kategorie . '"><b>' . $spalte->kategorie . '</b></a></div>';
 else:
  print '<div><a class="exnavi" href="' . $scriptName . '?kategorie=' . $spalte->kategorie . '">' . $spalte->kategorie . '</a></div>';
 endif;
 print '<hr>';
endforeach;
$kategorien = array_unique($kategorien);
sort($kategorien);
?>
</nav>

4. Anzeige sowie Administrator - hier habe ich noch eine leichte Änderung für einen Hinweistext vorgenommen

<article>
<?php
// Link zum Anmelden/Abmelden
if (isset($_SESSION["MiniCMS_admin"])):
 print '<p><a href="' . $scriptName . '?aktion=neu">Neuer Eintrag</a>' .
  ' - <a href="' . $scriptName . '?aktion=media">Media</a>' .
  ' - <a href="' . $scriptName . '?aktion=info">Info</a>' .
  ' - <a href="' . $scriptName . '?abmelden">Abmelden</a></p>';
elseif ($link_anmeldung == "ja"):
 print '<p><a href="' . $scriptName . '?aktion=anmelden">Anmelden</a></p>';
endif;


// Aktionen ausführen
switch (isset($_GET["aktion"]) ? $_GET["aktion"] : 'default'):

 // Neu (Formular)
 case 'neu':
  print '<form name="Form" action="' . $scriptName . '?aktion=neu_sichern" method="post">
   <h3>Neuer Eintrag</h3>
   <p>
<label>Titel:
<input type="text" name="titel" size="55" required="required" autofocus="autofocus"></label>
   </p>
   <p>
<label>Kategorie:
<input type="text" name="kategorie" size="30" list="datalist" required="required"></label>
<datalist id="datalist"><option>' . implode('</option><option> ', $kategorien) . '</option></datalist>
   </p>
   <p>
<label for="text">Text:</label> ' . tasten() . '<br>
<textarea name="text" id="text" rows="10" cols="50" required="required"></textarea>
   </p>
   <p>
<label><input type="checkbox" name="anzeige"> Anzeigen</label> &emsp;
<input type="button" value="Abbrechen" onDBLclick="javascript:history.back();" title="Zum Abbrechen doppelt klicken!"> &emsp;
<input type="submit" value="Absenden">
   </p>
  </form>';
 break;

 // Neu
 case 'neu_sichern':
  if (isset($_SESSION["MiniCMS_admin"])):
   $insert = $db -> prepare("INSERT INTO `miniCMS` (`titel`, `text`, `kategorie`, `anzeige`, `datum`)
  VALUES (:titel, :text, :kategorie, :anzeige, :datum)");
   $anzeige = isset($_POST["anzeige"]) ? 1 : 0;
   if ($insert->execute(array(
':titel' => $_POST["titel"],
':text' => $_POST["text"],
':kategorie' => $_POST["kategorie"],
':anzeige' => $anzeige,
':datum' => date("Y-m-d H:i")))):
print '<p>Der <a href="' . $scriptName . '?aktion=details&amp;id=' . $db->lastInsertId() . '&amp;noreturn">Eintrag</a> wurde gespeichert.</p>';
   endif;
  endif;
 break;

 // Bearbeiten (Formular)
 case 'bearbeiten':
  $select = $db->prepare("SELECT `id`, `titel`, `text`, `kategorie`, `anzeige`, `datum`
   FROM `miniCMS` WHERE `id` = :id");
  $select->bindValue(':id', $_GET["id"]);
  $select->execute();
  $eintrag = $select->fetch();
  if ($eintrag["id"] == $_GET["id"]):
   $anzeigeCK = ($eintrag["anzeige"] == "1") ? ' checked="checked"' : '';
   print '<form name="Form" action="' . $scriptName . '?aktion=bearbeiten_sichern" method="post">
<h3>Eintrag bearbeiten</h3>
<p>
 <label>Titel: <input type="text" name="titel" value="' . $eintrag["titel"] . '" size="55" required="required" autofocus="autofocus"></label>
</p>
<p>
 <label>Kategorie:
 <input type="text" name="kategorie" value="' . $eintrag["kategorie"] . '" size="30" list="datalist" required="required"></label>
 <datalist id="datalist"><option>' . implode('</option><option> ', $kategorien) . '</option></datalist>
</p>
<p>
 <label>Datum:
 <input type="text" name="datum" value="' . $eintrag["datum"] . '" size="20" pattern="^[0-9- :]{16}$" required="required" placeholder="JJJJ-MM-TT SS:MM"> <small>(JJJJ-MM-TT SS:MM)</small></label>
</p>
<p>
 <label for="text">Text:</label> ' . tasten() . '<br>
 <textarea name="text" id="text" rows="10" cols="50" required="required">' . $eintrag["text"] . '</textarea>
</p>
<p>
 <label><input type="checkbox" name="anzeige"' . $anzeigeCK . '> Anzeigen</label>  &emsp;
 <input type="button" value="Abbrechen" onDBLclick="javascript:history.back();" title="Zum Abbrechen doppelt klicken!"> &emsp;
 <input type="hidden" name="id" value="' . $eintrag["id"] . '">
 <input type="submit" value="Absenden">
</p>
   </form>';
  endif;
 break;

  // Bearbeiten
 case 'bearbeiten_sichern':
  if (isset($_SESSION["MiniCMS_admin"])):
   $update = $db -> prepare("UPDATE `miniCMS`
SET `titel` = :titel, `text` = :text, `kategorie` = :kategorie,
   `anzeige` = :anzeige, `datum` = :datum
WHERE `id` = :id");
   $anzeige = isset($_POST["anzeige"]) ? 1 : 0;
   if ($update->execute(array(
':titel' => $_POST["titel"],
':text' => $_POST["text"],
':kategorie' => $_POST["kategorie"],
':anzeige' => $anzeige,
':datum' => $_POST["datum"],
':id' => $_POST["id"]))):
print '<p>Der <a href="' . $scriptName . '?aktion=details&amp;id=' . $_POST["id"] . '&amp;noreturn">Eintrag</a> wurde überschrieben.</p>';
   endif;
  endif;
 break;

 // Löschen (Formular)
 case 'loeschen':
  print '<form action="' . $scriptName . '?aktion=loeschen_sichern" method="post">
   <h3>Eintrag löschen</h3>
   <p>Möchten Sie den Eintrag: &bdquo;<i>' . rawurlDEcode($_GET["titel"]) . '</i>&rdquo; wirklich löschen?<br><br>
   <input type="button" value="Abbrechen" onClick="javascript:history.back();"> &emsp;
   <input type="hidden" name="id" value="' . $_GET["id"] . '">
   <input type="submit" value="Ausführen">
   </p>
  </form>';
 break;

 // Löschen
 case 'loeschen_sichern':
  if (isset($_SESSION["MiniCMS_admin"])):
   $delete = $db->prepare("DELETE FROM `miniCMS`
 WHERE `id` = :id");
   if ($delete->execute(array(':id' => $_POST["id"]))):
print '<p>Der Eintrag wurde gelöscht.</p>';
   endif;
  endif;
 break;

 // Details
 case 'details':
  $select = $db->prepare("SELECT `id`, `titel`, `text`, `kategorie`, `anzeige`, `datum`
   FROM `miniCMS` WHERE `id` = :id");
  $select->execute(array(':id' => $_GET["id"]));
  $eintrag = $select->fetch();
  if ($eintrag["id"] == $_GET["id"]):
   sscanf($eintrag["datum"], "%4s-%2s-%2s", $jahr, $monat, $tag);
   print '<h2>' . $eintrag["titel"] . '</h2>' .
   ($datum_anzeigen == "ja" || isset($_SESSION["MiniCMS_admin"]) ? '<h5>' . $tag . '.' . $monat . '.' . $jahr . '</h5>' : '') .
'<p>' . nl2br($eintrag["text"]);
   if (isset($_SESSION["MiniCMS_admin"])):
print '<br>Anzeige: ' . ($eintrag["anzeige"] =="1" ? '&#10004;' : '&#10008;') .
 ' - <a href="' . $scriptName . '?aktion=loeschen&amp;id=' . $eintrag["id"] . '&amp;titel=' . rawurlENcode($eintrag["titel"]) . '">Löschen</a>' .
 ' - <a href="' . $scriptName . '?aktion=bearbeiten&amp;id=' . $eintrag["id"] . '">Bearbeiten</a>';
   endif;
   print '</p>';
   if (!isset($_GET["noreturn"])):
print '<p><a href="javascript:history.back();">&lt; Zurück</a></p>';
   endif;
  endif;
 break;

 // Suche
 case 'suche':
  if (strlen(strip_tags($_GET["suchbegriff"])) > 3):
   $_GET["suchbegriff"] = strip_tags($_GET["suchbegriff"]);
   $admin = isset($_SESSION["MiniCMS_admin"]) ? "" : "AND `anzeige` = '1'";
   $select = $db->prepare("SELECT `id`, `titel`, `text`,`kategorie`, `anzeige`, `datum`
FROM `miniCMS`
WHERE (`titel` LIKE :suchbegriff OR `text` LIKE :suchbegriff OR
 `kategorie` LIKE :suchbegriff OR `datum` LIKE :suchbegriff)
" . $admin . "
ORDER BY `datum` DESC
LIMIT 0, 25");
   $select->bindValue(':suchbegriff', '%' . $_GET["suchbegriff"] . '%');
   $select->execute();
   $eintraege = $select->fetchAll(PDO::FETCH_ASSOC);
   if (count($eintraege) > 0):
print '<p>' . count($eintraege) . (count($eintraege) == 1 ? ' Eintrag' : ' Einträge') . ' zu &bdquo;<i>' .
 $_GET["suchbegriff"] . '</i>&rdquo; gefunden.</p>';
foreach ($eintraege as $eintrag):
 extract($eintrag);
 $text = strip_tags($text);
 $start = strpos(strtolower($text), strtolower($_GET["suchbegriff"])) - 100;
 if ($start < 0) $start = 0;
 $ende = strlen($_GET["suchbegriff"]) + 200;
 $text = preg_replace('/(' . $_GET["suchbegriff"] . ')/i', "<mark>\$1</mark>", mb_substr($text, $start, $ende));
 sscanf($datum, "%4s-%2s-%2s", $jahr, $monat, $tag);
 print '<p><a href="' . $scriptName . '?aktion=details&amp;id=' . $id . '&amp;kategorie=' . $kategorie . '">' .
  '<b>' . $titel . '</b></a> &emsp;' .
  ($datum_anzeigen == "ja" || isset($_SESSION["MiniCMS_admin"]) ? ' &emsp;<small>' . $tag . '.' . $monat . '.' . $jahr . '</small>' : '') . '<br>' .
  ($start > 0 ? '&hellip; ' : '') . nl2br($text) . ' &hellip;</p>';
endforeach;
   else:
print '<p>Es wurde leider kein Eintrag zu &bdquo;<i>' . $_GET["suchbegriff"] . '</i>&rdquo; gefunden!</p>';
   endif;
  endif;
 break;

 // Anmeldung (Formular)
 case 'anmelden':
  print '<form action="' . $scriptName . '?anmeldung" method="post">
  <h3>Anmeldung</h3>
  <p>
   <label>Passwort: <input type="password" name="passwort" required="required" autofocus="autofocus"></label>
<input type="submit" value="OK">
<p style="color: red; font-size: small;">Nur für den Administrator,<br>bei falschem Passwort wird auf die Startseite zurückgekehrt</p>
   </p>
  </form>';
 break;

 // Info
 case 'info':
  if (isset($_SESSION["MiniCMS_admin"])):
   if (file_exists($datenbank)):
$select = $db->query("SELECT `id`
   FROM `miniCMS`");
$eintraege = count($select->fetchAll(PDO::FETCH_OBJ));
print '<h3>Info</h3><p><b>Datenbank:</b> ' . $datenbank . '<br>' .
'<b>Dateigröße:</b> ' . filesize($datenbank) . ' Bytes (' . number_format((filesize($datenbank)/1024), 2, ",", ".") . ' KB)<br>' .
'<b>Einträge:</b> ' . $eintraege . '<br>' .
'<b>Änderung:</b> ' . date("d.m.Y - H:i", filemtime($datenbank)) . ' Uhr</p>';
   endif;
  endif;
 break;

 // Media (Formular)
 case 'media':
  print '<h3>Media</h3>' .
   '<form action="' . $scriptName . '?aktion=media_sichern" method="post" enctype="multipart/form-data">' .
   '<label>Datei hochladen: <input type="file" name="datei"></label>' .
   ' <input type="submit" value="OK">' .
   '</form>';
  print '<p>';
  $verzeichnis = array_slice(scanDir($media), 2);
  foreach ($verzeichnis as $element):
   $de = explode(".", $element);
   $de = end($de);
   echo '<a href="' . $media . $element . '">' . $element . '</a>:';
   if (in_array($de, array("png", "jpg", "gif"))):
print ' <code><samp>&lt;img src="' . $media . $element . '" class="dyn"&gt;</samp></code>';
   else:
print ' <code>&lt;a href="' . $media . $element . '"&gt;Text&lt;/a&gt;</code>';
   endif;
   print ' <span ondblclick="location.href=\'' . $scriptName . '?aktion=media_loeschen&dateiname=' . $element . '\'" style="cursor: pointer; color: #FF0000" title="Löschen (Doppelklick)">&#10008;</span><br>';
  endforeach;
  print '</p>';
 break;

 case 'media_sichern':
  if (isset($_SESSION["MiniCMS_admin"])):
   $fehler = "";
   if (!isset($_FILES["datei"]["name"]) || $_FILES["datei"]["name"] == "" ||
   !move_uploaded_file($_FILES["datei"]["tmp_name"], $media . $_FILES["datei"]["name"])):
print '<p>Fehler beim hochladen!</p>';
   else:
print '<p>Erfolgreich hochgeladen.</p>';
   endif;
  endif;
 break;

 case 'media_loeschen':
  if (isset($_SESSION["MiniCMS_admin"])):
   if (unlink($media . $_GET["dateiname"])):
print '<p>Erfolgreich gelöscht.</p>';
   endif;
  endif;
 break;

endswitch;


if (!isset($_GET["aktion"])):

 // Navigation der Seiten
 $kategorie_start = $kategorie_start != "" && in_array($kategorie_start, $kategorien) ? $kategorie_start : @$kategorien[0];
 $kategorie = isset($_GET["kategorie"]) ? $_GET["kategorie"] : $kategorie_start;
 $admin = isset($_SESSION["MiniCMS_admin"]) ? "" : " AND `anzeige` = '1'";
 $select = $db->prepare("SELECT `kategorie`
  FROM `miniCMS`
  WHERE `kategorie`= :kategorie" . $admin);
 $select -> execute(array(':kategorie' => $kategorie));
 $anzahl = count($select->fetchAll(PDO::FETCH_ASSOC));
 $seiten = ceil($anzahl / $eintraege_seite);
 $seite = isset($_GET["seite"]) ? $_GET["seite"] : 1;
 $seite = ctype_digit($seite) ? $seite : 1;
 $seite = $seite < 1 || $seite > $seiten ? 1 : $seite;
 $versatz = $seite * $eintraege_seite - $eintraege_seite;
 
 // Einträge auslesen
 $select = $db->prepare("SELECT `id`, `titel`, `text`, `kategorie`, `anzeige`, `datum`
  FROM `miniCMS`
  WHERE `kategorie`= :kategorie " . $admin . "
  ORDER BY `datum` DESC
  LIMIT " . $versatz . ", " . $eintraege_seite);
 $select -> execute(array(':kategorie' => $kategorie));
 $eintraege = $select->fetchAll(PDO::FETCH_ASSOC);

 // Einträge ausgeben
 foreach ($eintraege as $eintrag):
  extract($eintrag);
  sscanf($datum, "%4s-%2s-%2s", $jahr, $monat, $tag);
  if ($id == $id_start):
   print '<h2>' . $titel . '</h2>';
  else:
   print detailLink($text, $max_woerter, $scriptName, $id, $kategorie, $titel) .
($datum_anzeigen == "ja" || isset($_SESSION["MiniCMS_admin"]) ? ' &emsp;<small>' . $tag . '.' . $monat . '.' . $jahr . '</small>' : '') . '</p>';
  endif;
  print '<p>' . trunc(nl2br($text), $max_woerter, $id, $id_start);
  if (isset($_SESSION["MiniCMS_admin"])):
   print '<br>Kategorie: <i>' . $kategorie . '</i> - Einträge: ' . $anzahl . ' - ID: ' . $id .
' - Anzeige: ' . ($anzeige =="1" ? '&#10004;' : '&#10008;') .
' - <a href="' . $scriptName . '?aktion=loeschen&amp;id=' . $id . '&amp;titel=' . rawurlENcode($titel) . '">Löschen</a>' .
' - <a href="' . $scriptName . '?aktion=bearbeiten&amp;id=' . $id . '">Bearbeiten</a>';
  endif;
  print '</p>';
 endforeach;


 // Navigation (Zurück/Weiter)
 print '<p>';
 if (($seite - 1) >= 1)
  print ' <a href="' . $scriptName . '?seite=' . ($seite - 1) . '&amp;kategorie=' . $kategorie . '" title="Zurück zur vorherigen Seite.">&lt; Zurück</a>';
 if (($seite + 1) <= $seiten)
  print ' <a href="' . $scriptName . '?seite=' . ($seite + 1) . '&amp;kategorie=' . $kategorie . '" title="Weiter zur nächsten Seite.">Weiter &gt;</a>';
 print '</p>';
endif;


// Funktionen
// Wörter begrenzen
function trunc($text, $max_woerter, $id, $id_start) {
 if ($id == $id_start) return $text;
 $phrase_array = explode(' ', strip_tags($text));
 if  (count($phrase_array) > $max_woerter && $max_woerter > 0)
  $text = implode(' ',array_slice($phrase_array, 0, $max_woerter)) . ' &hellip;';
 return $text;
}

// Link zur Detail-Ansicht
function detailLink($text, $max_woerter, $scriptName, $id, $kategorie, $titel) {
 $phrase_array = explode(' ', $text);
 if  (count($phrase_array) > $max_woerter):
  return '<p><a href="' . $scriptName . '?aktion=details&amp;id=' . $id . '&amp;kategorie=' . $kategorie . '"><b>' . $titel . '</b></a>';
 else:
  return '<p><b>' . $titel . '</b>';
 endif;
}

// Tasten erzeugen
function tasten() {
 $tasten = '<script>function button(tag) {
   if (document.getSelection) { var field = document.Form.text, startPos = field.selectionStart, endPos = field.selectionEnd, txt = field.value.substring(startPos, endPos);
if (txt != "") { field.value = field.value.substring(0, startPos) + "<" + tag + ">" + txt + "</" + tag + ">" + field.value.substring(endPos, field.length);
} else { document.Form.text.value=document.Form.text.value += "<" + tag + "></" + tag + ">";
}}}</script>';
 foreach (array("a", "b", "i", "s", "u", ) as $tag):
  $tasten .= '<input type="button" value="<' . $tag . '>" onClick="button(\'' . $tag . '\')" class="button" title="<' . $tag . '>-Element einfügen"> ';
 endforeach;
 return $tasten;
}
?>
</article>

5. Footer - den Text vom Footer habe ich an meine Bedürfnisse angepasst

Diesen Footer benötigt Ihr natürlich nicht unbedingt und könnt diesen weglassen oder gestalten wie Ihr wollt. Der © Copyright Hinweis ist lediglich als Beispiel zu verstehen und kann entfernt oder durch Euren eigenen ersetzt werden.

<footer>
&copy; <?php echo date("Y");?> Mini-CMS | <a style="text-decoration: none;" href="http://www.nof-tutorials.com/" target="_blank">NOF-Tutorials.com</a> | <a style="text-decoration: none;" href="http://www.nof-schule.de/forum/" target="_blank">NOF-Forum</a> | <a style="text-decoration: none;" href="?aktion=anmelden">Login</a>
</footer

Screenshots

Hier noch einige Screenshots von diesem Projekt:

Ihr könnt dieses CMS auf jeder beliebigen Seite Eures NOF-Projektes einbauen. Achtet nur darauf, damit Ihr nicht sämtliche Skripte umschreiben müsst, dass Ihr das Verzeichnis ‘db’ (mit der SQLite- Datenbank) immer in das gleiche Verzeichnis kopiert indem sich die Seite, auf der Ihr die Skripte einbaut, auch befindet. Natürlich müsst Ihr diese NOF-Seite mit der Dateierweiterung .php publizieren.

> oben im Menü > Bearbeiten > Benutzerdefinierte Namen > Dateierweiterung > .php wählen

Arbeitsseiten-Ansicht - hier ist das CMS gleich auf meiner Startseite (index.php) eingebaut

Seitenansicht

Administrator-Ansicht

Administrator

Editor-Ansicht

Editor

Tipp

Wer die SQLite Datenbank-Datei bearbeiten will, dem empfehle ich Adminer zur Datenbank-Verwaltung.

Ladet Euch am Download-Button von Adminer diese PHP-Datei herunter. Adminer arbeitet mit einer einzigen Datei.

Legt Euch mittels .htaccess ein passwortgeschütztes Verzeichnis auf dem Server an und kopiert die .php Datei von Adminer in dieses geschützte Verzeichnis.

Kopiert dann die SQLite Datenbank-Datei (hier “datenbank.sqt”) ebenfalls in dieses Verzeichnis oder tragt den Pfad zur Original-Datei ein.

Ruft die .php Datei von Adminer mit Eurem Browser auf, wählt “SQLite 3” und Ihr könnt die Datenbank bearbeiten, umbenennen, exportieren, importieren, usw. - eben alles was Ihr wollt.

Hier eine Teilansicht von Adminer.

Adminer Datenbank Verwaltung

Viel Erfolg!


Tutorials von Thomas Frei-Herrmann

diese Seite weiter empfehlen


Counter Statistik