PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP Inhalt einer CSS Datei auslesen, und in Textfeld ändern



Movert
26.03.2012, 11:31
Hallo

Ich lerne nun doch PHP (HTML und CSS kann ich nun, hab eingesehen, dass ich nicht drumrum komme :D) Die Grundlagen, Variablen und so weiter kenne ich nun, Array und sowas alles.

Ich arbeite an einem Namensgenerator PHP System, also man soll aus mehreren txt datein die Namen generieren. Da ich diese Seite gleich als CMS System programmieren möchte, da er für mehrere verschiedene Seiten und Projekte gerbaucht werden kann, soll man auch gleich das Design mittels CSS und HTML gestalten können.


EDIT:

Also so hab ich das bis jetzt, der Code wird übernommen, und auch so gespeichert. Ist es mit PHP möglich einen Button (Backup erstellen) einzubauen, denn dann eine Kopie des Styles auf dem Webspace speichert? stylesheet-backup-1.css?


<?php
$filename = 'stylesheet.css';

if(isset($_POST['text'])){
$handle = fopen($filename, 'w');
fputs($handle, $_POST['text']);
fclose($handle);
}

echo '<form action="'.$PHP_SELF.'" method="POST"><textarea name="text">';

$handle = fopen($filename, 'r');
$txt = fgets($handle, filesize($filename)+1);
fclose($handle);

echo $txt.'</textarea><br><input type="submit" value="speichern"></form>';
?>

MfG. Movert

devZero
26.03.2012, 14:18
100% ungetestet.

<?php
$filename = 'stylesheet.css';
$filename_bak = 'stylesheet-backup-1.css';

if(isset($_GET['backup'])){
$handle = fopen($filename, 'r');
$txt = fgets($handle, filesize($filename)+1);
fclose($handle);

$handle = fopen($filename_bak, 'w');
fputs($handle, $txt);
fclose($handle);
}

if(isset($_POST['text'])){
$handle = fopen($filename, 'w');
fputs($handle, $_POST['text']);
fclose($handle);
}

echo '<form action="'.$PHP_SELF.'" method="POST"><textarea name="text">';

$handle = fopen($filename, 'r');
$txt = fgets($handle, filesize($filename)+1);
fclose($handle);

echo $txt.'</textarea><br><input type="submit" value="speichern"></form><a href="?backup">Backup erstellen</a>';
?>
So in der Art?

Ach ja:
1. Einrücken mit Tab/4 Leerzeichen und nicht einrücken nach "<?php"
2. " ?>" lässt man bestenfalls weg.

Red_wolf
26.03.2012, 14:45
Oha, meinen alten Account gibt es noch hier :D

So wollte mich ma wieder beteiligen, also es ist möglich.

Frage: Willst du jederzeit ein backup erstellen können oder nur dann wenn du die Datei bearbeitest und auf speichern klickst?

Wenn du es vor der Bearbeitung haben willst, wäre meine Vorschlag du baust neben dem speicher button ein checkbox Feld ein, du könntest denn immer bestimmen ob ein backup geschrieben werden soll oder nicht.

Dann baust du noch eine If bedingung in dder vorhanden bedingung rein und schreibst den text aus der alten datei in eine neuen.

EDIT: Mist zu spät.
Wenn du PHP gerade lernst, ist dieser LInk vielleicht interessant für dich. Etwas infos zu den Codestandards von PHP.

Zend (http://framework.zend.com/manual/de/coding-standard.html)

Movert
26.03.2012, 15:52
Danke, DevZero dein Skript funktionert so, bis auf eine sache, wenn ich auf den Backup Link klicke, wird der Inhalt des Textfeldes Entfernt :(
Wie müsste das Korrigiert aussehen? das hat bestimmt was mit der reihenfolge zu tun.

Eine andere Frage: Ich hab XAMPP installiert, wenn ich in das Controlpanel gehe, und bei Apache auf Starten klicke, startet dieser nicht. MySQL funktioniert, aber Apache nicht, was mache ich falsch?

EDIT: ja ich will jederzeit ein Backup erstellen können. Am liebsten noch eine liste mit denen, so dass man die immer übernehmen kann, aber das kommt später, esseiden jemand hätte dafür auch ne idee oder einen Schnipsel, wie das gehen könnte

Red_wolf
26.03.2012, 15:59
Da könnte ich dir vielleicht weiter helfen.
Hast du vielleicht Skype an? Falls ja, dann mach Skype mal aus und starte dann den Apache und danach Skype.
Es könnte aber auch an einem anderen Programm liegen, es hängt damit zusammen, das schon irgendwas den Port vom Apache benutzt.

Jedenfalls ist es so bei mir immer gewesen.

EDIT: Vielleicht hilft dir der Link hier weiter
http://www.flexib.de/xampp-und-skype-port-80-problem/

devZero
26.03.2012, 16:00
Überhaupt nicht, die Formulardaten werden beim Wechsel der Seite natürlich vergessen. Alternativ kannst du das nur als Checkbox machen wie Red_wolf schon sagte.

http://aktuell.de.selfhtml.org/artikel/php/checkboxen/

Und läuft Apache als Service? Damit hatte ich auch schon öfters schwierigkeiten, nimm mal den Haken raus. Wenn es dann noch immer nicht geht, schau mal in der Logdatei nach.

Movert
26.03.2012, 16:03
Da könnte ich dir vielleicht weiter helfen.
Hast du vielleicht Skype an? Falls ja, dann mach Skype mal aus und starte dann den Apache und danach Skype.
Es könnte aber auch an einem anderen Programm liegen, es hängt damit zusammen, das schon irgendwas den Port vom Apache benutzt.

Jedenfalls ist es so bei mir immer gewesen.

Jo volltreffer, vielen vielen Dank! Skype war schuld.

Das mit den Checkboxen und der Backup Liste dürfte aber schwieriger werden, oder?

EDIT: nun ging Apache kurz und nun gehts wieder nicht :(

devZero
26.03.2012, 16:09
Warum schwieriger? Das ist ganz einfach.

<?php
$filename = 'stylesheet.css';
$filename_bak = 'stylesheet-backup-1.css';

if(isset($_POST['backup'])){
$handle = fopen($filename, 'r');
$txt = fgets($handle, filesize($filename)+1);
fclose($handle);

$handle = fopen($filename_bak, 'w');
fputs($handle, $txt);
fclose($handle);
}

if(isset($_POST['text'])){
$handle = fopen($filename, 'w');
fputs($handle, $_POST['text']);
fclose($handle);
}

$handle = fopen($filename, 'r');
$txt = fgets($handle, filesize($filename)+1);
fclose($handle);

echo '<form action="'.$PHP_SELF.'" method="POST">
<textarea name="text">'.$txt.'</textarea>
<input type="checkbox" name="backup" value="1">Backup erstellen<br><br><input type="submit" value="speichern">
</form>';
?>
Wieder ungetestet, aber schwer war das ja wohl nicht. ;)

Movert
26.03.2012, 16:10
naja, man müsste nun natürlich +1 und so einbauen, also Math Operatoren, damit man Beim 2. BAckupp auch eune 2 datei erstellt, und nicht die erste überschreibt.

Das ganze werde ich dann ja sowieso umschreiben müssen, denn man soll ja den Admin bereich öffnen, und im Textfeld steht der INhalt der CSS. Den Inhalt soll man ändern und speichern können, und in einem anderen bereich ein und mehrere BAckups der CSS verwalten können. Das ganze muss ich also trennen.

devZero
26.03.2012, 16:19
Achso das meinst du. Naja das schaffst du doch sicher auch selbst, du hast doch sogar schon einen Plan wie man es machen könnte. §wink

Movert
26.03.2012, 16:22
jo, nur Apache startet noch nicht, das ist das problem. Es ist lästig immer alles auf den server zu laden

devZero
26.03.2012, 16:26
Also ich habe zwar kaum Ahnung von XAMPP da das Entwickeln unter Linux viel angenehmer ist, aber unter Windows hat EasyPHP (http://www.easyphp.org/) bei mir immer die besten Dienste geleistet.

Ansonsten kann man mit Notepad++ per Plugin auch direkt auf den FTP zugreifen, immer noch besser als jede Datei jedesmal hochzuladen.

Red_wolf
26.03.2012, 16:27
Also als Tipp für die Programmierung würde ich dir empfehlen Funktionen zu verwenden, falls du das schon gelernt hast.

http://tut.php-quake.net/de/function.html

Ich versuche auch gerade eine Klasse dafür zu schreiben, wird zwar quick & dirty, aber ich stell die gerne hier rein. Kannst es dir dann ja vielleicht angucken.

Und zu dem Apache problem, hast du noch irgendein Programm welches auf Port 80 laufen könnte? Irgendein Chat Programm etc.
Ansonsten in dem Control Panel, ist doch unten eine kleine Log Übersicht, was sagt er da wenn du versuchst Apache zu starten?

Movert
26.03.2012, 16:38
ICQ und Skype hab ich beender, ansonsten läuft nur Opera, Firefox, FireFTP und Notepad++
bei mit steht Apache started [Port 80] so ähnlich, aber es startet nicht :(

Den Code kannst du ruhig posten, es bringt immer etwas, wenn man mal beispiele und so sieht, davon lernt man auch.

Delta 38
26.03.2012, 16:45
ICQ und Skype hab ich beender, ansonsten läuft nur Opera, Firefox, FireFTP und Notepad++
bei mit steht Apache started [Port 80] so ähnlich, aber es startet nicht :(

Den Code kannst du ruhig posten, es bringt immer etwas, wenn man mal beispiele und so sieht, davon lernt man auch.

beender? Also keine Ahnung was das heißt, aber wenn das heißt, das du beides hast, dann musst du (zumindest bei Skype, bei ICQ weiß ich das nicht) unter Optionen->Erweitert->Verbindung das Häckchen bei "Port 80 und 443 als Alternative für eingehende Verbindungen" rausnehmen.

Gruß Delta

Movert
26.03.2012, 16:46
Ich meinte, dass ich beides Beendet habe.

Red_wolf
26.03.2012, 16:51
Es kann aber noch andere Gründe haben, hast du Apache (xampp) mit der Firewall blockiert? Oder bist du mit einem eingeschränkten Account in Windows angemeldet bzw. benutzt du Windows 7. Da könnte zum Beispiel auch noch dieses UAC (heißt das so). Dieses wo man immer gefragt wird ob man es ausführen möchte. Daran könnte es auch liegen.

Ansonsten weiß ich jedenfalls gerade nicht weiter.

Movert
26.03.2012, 16:54
Ja Windows 7, was muss ich da ausführen? eine meldung kommt bei mir eigendlich nicht. Hab übrigens Administrationskonto also voller Zugriff.

devZero
26.03.2012, 17:02
hast du Apache (xampp) mit der Firewall blockiert?

Um lokalen Zugriff zu erhalten ist es völlig egal ob Apache von einer Firewall blockiert oder ob Port 80 belegt ist. Sollte es zumindest sein.

@Movert
Poste mal was in der \xampp\apache\logs\error.log steht.

Movert
26.03.2012, 17:29
Nichts, die ist leer! :(

Movert
26.03.2012, 18:03
Also nun hab ich easy PHP drauf, selbes Problem. Apache läuft nun aber. PHP Seite geht in Browser, aber Includiertes Meü wird nicht übernommen. Ich werde noch verrückt, hätt ich PHP bloß nie angefangen :D :(

devZero
26.03.2012, 18:06
Includiertes Meü wird nicht übernommen

Ähm was??
Erklär das mal etwas genauer und poste den betroffenen Code...

Movert
26.03.2012, 18:09
Also der Code ist einfach ein <?php include("backendmenu.php") ?> dieses includierte menü wird aber in meinem Browser nicht angezeigt :(

devZero
26.03.2012, 18:21
Also wenn du wirklich willst dass man dir hilft musst du schon ein wenig mehr posten, ein möglichst kurzes Codefragment dass das Problem demonstriert beispielsweise. :o

Red_wolf
26.03.2012, 18:24
Ich übernehme es mal für ihn, er hat es mir über ICQ etwas erklärt. Also am Code ist nichts, bei mir funktioniert es bei Xampp einwandfrei. Er hat sich nun easyphp installiert und anscheiend spinnt der PHP Interpreter, denn wenn er versucht eine php Datei aufzurufen dann versucht der Browser diese zu downloaden und nicht zu interpretieren.

Leider kenn ich mich mit dem easyphp server nicht aus :D

EDIT:
Ich habe nun mal schnell eine klasse hingeklatscht um das mit der CSS Datei alles zu machen, ist wirklicher quick & dirty code. Aber den sollte man nicht zu produktiven einsätzen verwenden sondern nur mal als Beispiel ansehen.

Klasse

class CSS {

// Das sind die einzelnen Variablen die ich in der Klasse verwende
public $path = ''; # Pfad zur Datei
public $css_file = ''; # name der CSS Datei
public $css_text = array(); # Inhalt aus der orig. CSS Datei'
public $backuplist = array(); # Die Liste aller Backup Dateien
public $backup_number = ''; # fortlaufende Nummer für die backup datei

// Das ist der Konstuktor, damit wird das Objekt erstellt und der Pfad
// und Dateinamen wird übergeben an das Object
public function __construct($file_path, $file_name) {
$this->css_file = $file_name;
$this->path = $file_path;

}

// Mit dieser Funktion hole ich mir den Text aus der originalen stylesheet.css
// Datei heraus
public function getCSSText() {
$this->css_text = file_get_contents($this->path.$this->css_file);

return $this->css_text;
}


// An diese Funktion gebe ich die ganzen POST Daten und speichere sie in der
// orig. CSS Datei (Stylesheet.css)
public function saveCSSFile($post) {
file_put_contents($this->css_file, $post['css']);
}

// Mit dieser Funktion erstelle ich die Backup datei mit dem Text aus
// der stylesheet.css datei. Und nicht aus dem Formular
public function createBackup($path, $file_name) {
file_put_contents($path.$file_name, $this->getCSSText());
}

// Hier schaue ich im root Ordner nach ob es eine stylesheet.backup.css datei
// gibt und wenn ja gibt er mir die Anzahl in einem Array zurück
public function getBackupList($path='') {
$this->backuplist = glob($path."stylesheet.*.css");

return $this->backuplist;
}

// Diese Funktion verwende ich um zu bestimmen der wie viele backup es ist
// sprich stylesheet.backup1.css, stylesheet.backup2.css etc
public function getBackupNumber() {
$zahl = count(glob($this->path."stylesheet.*.css"));
if($zahl == 0) {
$zahl = '';
}

return $zahl;
}
}


// hiermit erstellt man das Objekt. Wenn dies in einer anderen Datei gemacht wird,
// muss die CSS Klasse ausgelagert werden und am besten mit einem include eingebunden werden
$CSS = new CSS('', 'stylesheet.css');



// Hier wird bestimmt was ausgeführt wird, entweder wird ein backup gespeichert
// oder in der originalen styleshee.css datei gespeichert
if(isset($_POST['css']) && isset($_POST['Backup'])) {
$CSS->createBackup('', 'stylesheet.backup'.$CSS->getBackupNumber().'.css');
}elseif(isset($_POST['css']) ) {
$CSS->saveCSSFile($_POST);
}

// Hiermit wird bestimmt was angezeigt werden soll, entweder die Liste oder das Forumlar um die CSS Datei
// zu bearbeiten dafür muss man in der url nur ?site=backuplist oder ?site=editcss angeben
if($_GET['site']=="backuplist") {
if(count($CSS->getBackuplist())<0) {
echo "keine Backups gefunden";
}else{
echo "<pre>";
print_r($CSS->getBackuplist());
echo "</pre>";
}
}elseif($_GET['site']=="editcss") {
echo '<form action="" method="post">
<textarea name="css" style="width: 500px; height: 500px">'. $CSS->getCSSText().'</textarea>
<input type="submit" value="Speichern" />
<input type="submit" value="backup" name="Backup" />
</form>';
}


Falls Fragen sind, stehe ich gern zur Verfügung, ansonsten findet man auch spezielle Informationen zu einzelnen PHP Funktionen auf php.net

Movert
26.03.2012, 18:28
Also dann nochmal genauer:

Backend index.php

<html>
<head>
<title>Namegenerator Admin Panel</title>
<link rel="stylesheet" type="text/css" href="backendstylesheet.css"/>
</head>
<body>
<div class="box" >
<div class="boxheader" >
<b>Navigation</b>
</div>
<div class="boxcontent" >
<?php include ('backendmenu.php') ?>
</div>
</div>



<div class="box_big" >
<div class="boxheader" >
<b>Admin Control Panel</b>
</div>
<div class="boxcontent" >
Content
</div>
</div>
</body>
</html>

backendmenu.php

<style type="text/css">.navigation {font-size: 15px;
font-family: arial; }</style>
<div class="navigation">
<b>Allgemeines</b><br/>
- Startseite<br/>
- News<br/>
- Mitwirkende<br/>
<b>Namen bearbeiten</b><br/>
- Männl. Namen<br/>
- Weibl. Namen<br/>
- Nachnamen<br/>
<b>Styles Bearbeiten</b><br/>
- CSS Bearbeiten<br/>
- HTML Bearbeiten
</div>

backendstylesheet.css

body {
background: #7B92B3;
font-size: 15px;
font-family: arial;
}
.box {
margin-bottom: 20px;
border: 1px solid #00000;
z-index: 1;
border: 1px solid black;
width: 200px !important;
float:left;
margin: 0px auto;
margin-left: 10px;
margin-right: 10px;
}

.box .boxheader {
color: #000000 !important;
padding: 4px 4px 4px 4px;
z-index: 4;
position: relative;
background: #ffffff;
border-bottom: 1px solid black;
background-image: url(img_backendbg1.jpg);
font-family: arial;
font-size: 15px;
}

.box .boxcontent {
background: #D5DBE3;
z-index: 1;
padding: 4px 4px 4px 4px;
font-size: 15px;
font-family: arial;
}

.box_big {
margin-bottom: 20px;
border: 1px solid #00000;
z-index: 1;
border: 1px solid black;
width: 800px !important;
float:left;
margin: 0px auto;
}

.box_big .boxheader {
color: #000000 !important;
padding: 4px 4px 4px 4px;
z-index: 4;
position: relative;
background: #ffffff;
border-bottom: 1px solid black;
background-image: url(img_backendbg1.jpg);
font-family: arial;
font-size: 17px;
}

.box_big .boxcontent {
background: #D5DBE3;
z-index: 1;
padding: 4px 4px 4px 4px;
font-size: 15px;
font-family: arial;
}

Also die Index.php wird geöffnet:
Opera: Die seite ist weiß, Opera versucht die Index.php zu downloaden. Beim neu laden istd as ACP sichtbar, aber dafür die includeierung nicht, Opera versucht immernoch die Index.php zu Downloaden.

Firefox: Das indey.php wird ohne Probleme angezeigt, die includierte php jedoch wird nicht angezeigt.

EDIT: Solange das Backend teil nicht geht bei mir, kann ich auch die Funktionen nicht einbauen, die Navi fehlt.

Satans Krümelmonster
26.03.2012, 20:41
Ich habe nun mal schnell eine klasse hingeklatscht

das ist natürlich genau das richtige für einen neueinsteiger. :A

Red_wolf
26.03.2012, 20:45
Naja es geht.
klar für einen richtigen Anfänger kann dies schon etwas erschlagen, aber theoretisch sind eigentlich nur drei Funktionen für ihn wichtig.

- file_put_contents
- file_get_contents
- glob

Außerdem bringt es auch nichts einen Anfänger mit Sanfthandschuhen anzufassen, man muss sie einfach ins kalte Wasser schmeißen :D

Movert
26.03.2012, 21:50
So ich hab nun das Login Skript und das Gästebuch Skript (noch sehr spartanisch) fertig.
Der Admin bereich kann nun die CSS Datei bearbeiten, und auch Gästebucheinträge berabeiten (liste ist noch unaufgeräumt). Jetzt habe ich natürlich für den Login eine textdatei user.txt mit dem Accountnamen und einem md5 vetrschlüsselten Passwort. Nun möchte ich in der Administration in einem Bereich hinzufügen, dass ein neuer User Registriert werden kann, und das Standart Passwort Bearbeitet werden kann, also

- Standart Account bearbeiten
- Neuen Account Hinzufügen
- Liste der Accountnamen und Passwörter

Die Struktur ist so:

AKCPADMIN|fd3faa1df9f9868ec1d0456957838563

Login Skript ist:

<?php
session_start();
?>
<html>
<head>
<title>Backend Login</title>
<link rel="stylesheet" type="text/css" href="backendstylesheet.css"/>
</head>
<body>
<div class="box_big"><div class="boxheader">Backend Login</div><div class="boxcontent>
<?php
$username = $_POST["username"];
$passwort = $_POST["password"];
$passwort = md5($passwort);
$log=0;

$userdatei = fopen ("user.txt","r");
while (!feof($userdatei))
{
$zeile = fgets($userdatei,500);
$userdata = explode("|", $zeile);

if ($userdata[0]==$username and $passwort==trim($userdata[1]))
{
$_SESSION['username'] = $username;
echo "Login erfolgreich zum <a href=\"backendindex.php\">Admin Bereich</a>";
$log = 1;
}
}
fclose($userdatei);

if ($log==0)
{
echo "Login Fehlgeschlagen <a href=\"login.html\">Zurück zum Gästebuch</a>";
}
?>
</div></div>
</body>
</html>

Kann mir da jemand helfen, wie sich das realisieren lässt? Ich weiß nicht, was besser wäre, direkt in der Liste bearbeiten zu können, oder in einem extra fenster, also über URL

@Satans Krümelmonster: Das ist ja nicht so schlimm, für mich ist das Hilfreich. Ich schaue mir nun die Befehle an, und die Kommentare, und lerne es solange, bis ich es kenne, und die einzelnen Funktionen weiß, dann versteht man es ja fast von selbst.