Hallo,
ich benutze ein CMS-Prozessor(XML Content Verarbeitung) als Framework für mein eigenes CMS (nextCMS, mehr unter http://www.hardcoding.net und http://sourceforge.net/projects/nextcms) und habe ein Problem:
In diesem CMS gibt es Extensions, Unterklassen der Klasse Extension. z.B. erzeugt der Aufruf in einem Template:
{ReDirect(type="action" )}
dass die Funktion getCode($paramList) Klasse ReDirect mit der Variable type=action verarbeitet wird:
Ich habe ein Formular welches als $_POST['ext'] = 'LogIn' übergibt. In der Datei login.php steht folgendes:
Also ein Login Forumular übergibt UserName, UserPassword und ext=LogIn an die Seite ReDirect in welcher die Klasse ReDirect mehrmals benutzt wird:
Wenn ich nur den ersten Aufruf im Template "{ReDirect(type="action" )}" habe, funktioniert alles doAction() aus class.LogIn wird ausgeführt. Wenn ich aber mehrere habe kommt der Fehler:
Fatal error: Cannot redeclare class login in c:\foxserv\www\...\nextcms\extensions\zuendwuerfel\login.php on line 2
Klar so ein Fehler kommt, wenn man include statt include_once benutzt. Aber in der Klasse welche die Klasse Extension und somit die Extension LogIn aufruft steht ja include_once:
Ich weiß es hört sich ein wenig kompliziert an, aber vielleicht weiß ja jemand ne Lösung.
Grüße und thx im Vorraus!
ich benutze ein CMS-Prozessor(XML Content Verarbeitung) als Framework für mein eigenes CMS (nextCMS, mehr unter http://www.hardcoding.net und http://sourceforge.net/projects/nextcms) und habe ein Problem:
In diesem CMS gibt es Extensions, Unterklassen der Klasse Extension. z.B. erzeugt der Aufruf in einem Template:
{ReDirect(type="action" )}
dass die Funktion getCode($paramList) Klasse ReDirect mit der Variable type=action verarbeitet wird:
Code:
<?php
class ReDirect extends Extension {
function getCode($paramList) {
#Klasse einbinden
if(!$ext) {
include strtolower($_POST['ext']).'.php';
$ext = new $_POST['ext']();
}
switch($paramList['type']) {
case 'action':
return $ext->doAction();
break;
case 'url':
return $ext->getURL();
break;
case 'text':
return $ext->getText();
break;
}
}
}
?>
Code:
<?php
class LogIn extends Extension {
function getCode($paramList) {
#LogIn Forumular
if(!$_SESSION['UserAccess']) {
#Template LogIn einbinden (da nicht verfügbar):
$returncode = '
<form action="redirect.html" method="post">
<b>LogIn Name: </b><input type="text" name="UserName"><br>
<b>Passwort: </b><input type="password" name="UserPassword">
<input type="hidden" name="ext" value="LogIn"><br>
<input type="submit" value="Let me in!">
</form>';
}
#User eingeloggt, Status anzeigen
elseif($_SESSION['access']) {
$returncode = '
<b>'.$_SESSION['UserName'].'</b><br>
eingeloggt. <a href=" ">Ausloggen</a>';
}
return $returncode;
}
function doAction() {
#Userdaten der Session hinzufügen
$_SESSION['UserName'] = $_POST['UserName'];
$_SESSION['UserPassword'] = md5($_POST['UserPassword']);
unset($_POST['UserName']);
unset($_POST['UserPassword']);
#tmp
$UserName = $_SESSION['UserName'];
$UserPassword = $_SESSION['UserPassword'];
#DB Verbindung herstellen
#Zugangsinformationen laden
include 'config.php';
#db Klasse laden
include 'db.php';
#Klasse und Verbindung initieren
$db = new db($sqlhost,$sqluser,$sqlpassword,$sqldb);
#Query
$result=$db->query_first("SELECT UserID FROM users WHERE UserName='$UserName' && UserPassword='$UserPassword'");
#Überprüfen
if($result['UserID']) {
#Access in Session setzen
$_SESSION['UserAccess'] = true;
return 'okay';
}
}
function getURL() {
#Gibt die Folge-URL aus
#Verbesserung: {this_url}
return './';
}
function getText() {
#Gibt eine Message aus
return 'Vielen Dank '.$_SESSION['UserName'].', sie wurden eingeloggt!';
}
}
?>
Code:
{Session}[B] {ReDirect(type="action" )} [/B] <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//DE">
<html>
<head>
<title>{sitetitle} - {title}</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="refresh" content="5;URL=[B] {ReDirect(type="url" )}[/B] ">
</head>
<body bgcolor="#BBB5AA">
<table width="100%" height="100%">
<tr valign="middle" align="center">
<td><b>[B] {ReDirect(type="text" )}[/B] </b><br>
<a href="[B] {ReDirect(type="url" )}[/B] ">Falls Sie nicht gleich weitergeleitet werden, klicken Sie bitte hier...</a></td>
</tr>
</table>
</body>
</html>
Wenn ich nur den ersten Aufruf im Template "{ReDirect(type="action" )}" habe, funktioniert alles doAction() aus class.LogIn wird ausgeführt. Wenn ich aber mehrere habe kommt der Fehler:
Fatal error: Cannot redeclare class login in c:\foxserv\www\...\nextcms\extensions\zuendwuerfel\login.php on line 2
Klar so ein Fehler kommt, wenn man include statt include_once benutzt. Aber in der Klasse welche die Klasse Extension und somit die Extension LogIn aufruft steht ja include_once:
Code:
function loadExtension($name) {
global $document_root, $settings;
if (isset($settings->EXTENSIONS[$name]))
$extension = $settings->EXTENSIONS[$name];
if (isset($extension)) {
if (!file_exists($this->document_root . $extension)) printError("Die Extension-Datei '$extension' existiert nicht.");
require_once($this->document_root . $extension);
eval("\$ext_instance = new $name(\$this);");
return $ext_instance;
}
}
Ich weiß es hört sich ein wenig kompliziert an, aber vielleicht weiß ja jemand ne Lösung.
Grüße und thx im Vorraus!
Moderator
Comment