• Hallöle,

    Ich mach mir grad ne eigene Seite, doch irgendwie sieht die nicht so aus wie ich es gerne hätte. Der Submit Button ist irgendwie ganz oben und obwohl ich
    {include file='footer'} drinn hab, wird mir keiner angezeigt. Wenn ichs mit der Entwicklerkonsole überprüfe ist der footer irgendwie mitten drinn in der Page, jedoch "unsichtbar". Was mach ich da so falsch? :S


    Danke für Hilfe :)


    ~LG Fabi

  • Meine Form-Pages sind soweit "fertig", wie übergebe ich die Daten jetzt der Datenbank?

    Hab jetzt in verschiedenen Plugins gesehen das im data Ordner immer wieder name.class, nameAction.class und nameEditor.class auftauchen, nur hab ich kein Plan was was macht. Das eine verwaist auf das, das andere wieder auf das usw.

    Und in welchem Teil übergebe ich den Acc Namen und die Uhrzeit mit?

  • Mhmm... Also in der Aktion Klasse befindet sich so ziemlich überall mal

    PHP
    class NameAction extends AbstractDatabaseObjectAction
    PHP
    /**
    	 * @see	\wcf\data\AbstractDatabaseObjectAction::$className
    	 */
    	protected $className = 'news\data\name\NameEditor';

    Danach ein paar Permissions und dann verstehe ich nurnoch Bahnhof.


    Im Editor fast überall

    PHP
    class NameEditor extends DatabaseObjectEditor {
    	/**
    	 * @see	\wcf\data\DatabaseObjectEditor::$baseClass
    	 */
    	protected static $baseClass = '\data\name\Name';


    In der Grund Klasse wird die Datenbank Tabelle ausgewählt

    PHP
    class Name extends DatabaseObject {
    
    
    
    
        protected static $databaseTableName = 'Tabelle';
        protected static $databaseTableIndexName = 'ID';


    Seh ich das alles soweit richtig?
    Jetzt weiß ich trotzdem nicht mehr weiter. Ich wurde aber bisher nicht schlau draus, wo user & UserID und Zeit übergeben werden... :/
    Die Allgemeine ID kommt denke ich automatisch.

    • Offizieller Beitrag

    Im Grunde ist es ganz einfach.

    Ich zeige dir das ganze mal an dem User-Objekt aus dem WCF (welches ich ein bisschen zusammenkürze):

    Du brauchst einmal die Standard-Datei (in diesem Fall User.class.php). Diese repräsentiert einen Datenbankeintrag.

    Das Grundgerüst dafür sieht im Grunde eigentlich immer gleich aus:


    Da hast du halt eine Klasse die auf einem DatabaseObject basiert. Was die Klasse alles so kann, kannst du dir hier mal anschauen. In dieser Klasse brauchst du einmal den Tabellen-Namen in Klassen-Variable databaseTableName und einmal den Index-Name, angelegt mit der Variable databaseTableIndexName.

    Nun kannst du mithilfe der Klasse schon Einträge aus der Datenbank abbilden.

    Ein $object = new \wcf\data\user\User(1); würde bspw. den Eintrag mit der userID 1 aus der Datenbank auslesen. Dann könntest du durch die __get-Methode (Magische Methoden) auf die einzelnen Felder zugreifen.

    Sieht deine Tabelle also bspw. so aus:


    SQL
    CREATE TABLE wcf1_user (
    	userID			      	INT(10) 		    	NOT NULL AUTO_INCREMENT PRIMARY KEY,
    	username 			VARCHAR(255)			NOT NULL,
    	registrationDate		INT(10)				NOT NULL DEFAULT 0
    );

    könntest du mittels $object->username auf das Feld username des Benutzers mit der userID 1 zurückgreifen.

    Nun brauchst du noch eine Editor-Klasse. Diese stellt create, update, etc. Methoden zu verfügung. Damit kannst du also theoretisch die Einträge generieren. Empfohlen wird dies aber nicht. Für unser Beispiel sieht das ganze dann so aus:


    Dort hast du dann wieder die Variable baseClass, welches du mit der vorhin erstellten Klasse füllen musst. Das ganze basiert übrigens auf dem DatabaseObjectDecorator. Das wars schon, die restliche Implementation (Datenbankeinträge erstellen, etc.) wird durch die abstrakte Klasse DatabaseObjectEditor bereits bereitgestellt.

    Nun kommen wir zur Action-Klasse. Mit dieser Klasse solltest du Datenbankeinträge erstellen. Es werden automatisch Events dafür abgefeuert (wenn du mit einem dritten Plugin dich dort reinhängen willst ist dies bspw. ganz nützlich ; mein Plugin JCoins nutzt bspw. diese Schnittstellen relativ intensiv).

    Ich habe hier mal wieder eine Beispiel-Klasse gebastelt:


    Die Variable className gibt wieder den UserEditor (von gerade) an. Damit ist, zumindest theoretisch, die Implementation für Datenbank-Objekte abgeschlossen. Theoretisch könntest du das ganze noch in der Datenbank-Action validieren, wir gehen aber mal davon aus, dass du das in dem Formular machst und das dort nicht weiter benötigst.

    Nun kannst du Objekte erstellen, wie bspw. hier (den FQN musst du natürlich mit angeben in deinem Form):


    PHP
    $action = new UserAction([], 'create', [
    	'data' => [
    		'username' => 'Josh', 
    		'registrationDate' => TIME_NOW
    	]
    ]);
    $action->executeAction();

    Mit diesem Code wird dann dein neues Objekt erstellt. Möchtest du ein Objekt bearbeiten, kannst du das auch mit der Action machen:


    PHP
    $action = new UserAction([1], 'update', [
    	'data' => [
    		'username' => 'Josh_',
    	]
    ]);
    $action->executeAction();

    Damit bearbeitest du dann den Benutzer mit der userID 1 und setzt den Benutzernamen auf Josh_.

    Natürlich sind wir Faul und wissen, dass das Feld registrationDate immer das aktuelle Datum ist. Das wollen wir bei der Erstellung gar nicht mehr mit angeben. Wie lösen wir das also? Dafür schauen wir uns nochmal die ObjectAction an und bearbeiten diese wie folgt:

    Damit wird dann das registrationDate, falls das Feld noch nicht ausgefüllt wurde, auf das aktuelle Datum gesetzt.

    Ich hoffe das hilft ein bisschen und war verständlich.

  • Ich hoffe das hilft ein bisschen und war verständlich.


    Ein bisschen? Am liebsten würde ich dir dafür gleich 100 Likes geben! <3 :thumbup:

    Nur verstehe ich das Zahlenwirrwarr unter time nicht. Abgesendet hab ichs am 27.12.15 um ~ 22:00 Uhr

    Was ich nicht ganz so verstanden hab war userID und username, wie ich diese automatisch ohne eingaben im Formular in die DB schreibe.

    Schau ich mir das mal bei nem anderen Plugin an, sieht das ganze so aus:



    Also muss ja irgendwie die UserID und der Username irgendwo abgegriffen werden, bzw. beim Abschicken im Hintergrund mitgeschickt werden oder nicht?

    Dazu kommt ja noch, dass ich bei state immer automatisch ein ... in Bearbeitung mitschicken möchte, sozusagen als Label. Dieses Label soll dann später von einer bestimmten Benutzergruppe bearbeitet werden, aber dazu dann, wenn es soweit ist.

    • Offizieller Beitrag

    Nur verstehe ich das Zahlenwirrwarr unter time nicht. Abgesendet hab ichs am 27.12.15 um ~ 22:00 Uhr

    Das ganze ist eine Unix-Timestamp. Im Template kannst du das ganze mit dem time-Modifer in eine richtige Uhrzeit umwandeln.

    Was ich nicht ganz so verstanden hab war userID und username, wie ich diese automatisch ohne eingaben im Formular in die DB schreibe.

    Ich habe dir das ganze ja mit der Uhrzeit (in der Action-Klasse) vorgemacht, da kannst du dann auch anstelle von registrationDate einfach userID bzw. username einsetzen. (userID ist \wcf\system\WCF::getUser()->userID bzw. \wcf\system\WCF::getUser()->username.

    Das ist mehr oder weniger böse. Das machst du schon mittels der Action-Klasse, wie ich dir das oben vorgemacht habe. Du kannst im data-Array beliebige Felder ergänzen. Also bspw. message, wie hier:


    PHP
    $action = new UserAction([1], 'update', [
    	'data' => [
    		'username' => 'Josh_',
    		'message' => 'Bla Bla',
    	]
    ]);
    $action->executeAction();

    Dazu kommt ja noch, dass ich bei state immer automatisch ein ... in Bearbeitung mitschicken möchte, sozusagen als Label. Dieses Label soll dann später von einer bestimmten Benutzergruppe bearbeitet werden, aber dazu dann, wenn es soweit ist.

    Das kannst du, wie oben, auch in der Action-Klasse bei create machen.

  • Oh man, da hätte ich auch wirklich selbst drauf kommen können :D :D

    Wenn man weiß wie's geht, dann ist es echt einfach. Wie kann ich das nur wieder gut machen @Josh ? <3

    Vielen herzlichen Dank :thumbup:


    Ok, was brauche ich nun, um die Daten die da in der DB stehen, wieder auszugeben?
    Zum anfang soll auf der Übersichtsseite eine kleine "Tabelle" sein, in der dann der Name des Users steht, für was er sich beworben hat, sowie Datum / Uhrzeit und Status.

    Vorgestellt hätte ich mir einfach, das ich ein Template erstelle und diese auf der Übersicht include. Geht sowas?

  • schau dir am besten mal wcf\page\MultipleLinkPage und wcf\page\FollowingPage an, und dazu noch die data klasse wcf\data\user\UserList...
    Dürfte der einfachste weg sein und du hast dann sogar ohne was zu tun ne blätter funktion dabei wenn die liste mal etwas länger wird ;)

  • Okay...


    Ich kapier das mit der Ausgabe nicht so ganz. Theoretisch was ich so gesehen hab, könnte es mit {$__wcf->application_mod->username} funktionieren, aber da kommt ein Fehler mit
    Error Message method 'getApplication_mod' does not exist in class WCF 


    Muss ich da erst irgend ne Klasse erstellen oder wie seh ich das? Wenn ja, was für einen Inhalt braucht man dazu?
    Dazu kommt, dass ich meine UserID mit der aus der Tabelle vergleichen muss, damit nur meine Inhalte angezeigt werden und nicht die der Anderen.

    • Offizieller Beitrag

    Du solltest dich dringend mit den Grundlagen von MVC vertraut machen und erstmal deinen Code verstehen, welchen du geschrieben hast.

    Ohne diese, könnte ich dir auch direkt den Code schreiben. Ich bin zwar auch ein Fan von „Learning by Doing“, allerdings muss man sich dafür Beispiele anschauen. Schaue dir doch einfach mal beliebige Formulare aus dem WCF an und versuche da erstmal zu verstehen, was gemacht wird. Dann kommst du schon ein großes Stück weiter.

  • Hmpf.. Ok.

    MVC = Model, Controller, View.

    Fang ich mal leicht an. View sind also die Dateien, welche für die Templates notwendig sind. Also ich brauch eine infoPage.class.php und darauf folg die info.tpl

    die infoPage Klasse holt, bzw bekommt das notwendige Zeug aus dem Model bzw dem Controller.

    Controller sind die klassen, was Infos etc. verteilt. Also kann ich ja sagen, dass bei einem Formular der Controller die eingegebenen Daten auffasst und an das Model weitergibt. In dem Fall die infoAddForm.class.php

    Ah, also muss das also auch dafür zuständig sein, sich die Daten wieder vom Model zu holen und an den View weitergeben. Bin mir aber bei dem allgemein nicht so sicher. Habs noch nicht so ganz verstanden... :/

    Model ist dann welches dann die DB Verbindung hat und die Daten in die DB schreibt, bzw. wieder herausnimmt. Hier in unserem Fall die Grund Klasse im Data Ordner.


    Jetzt brauch ich also einen weiteren View, um die Daten die in der DB stehen auf meiner Seite anzeigen zu lassen.
    Hab jedoch grad das Problem: Finde ein plugin welches wirklich einfach geschrieben ist, ohne viel Wirr Warr den ich net brauch.
    Aber ich denke, der TS Viewer von Grex... Es werden ja Teildaten im ACP in einer Liste ausgegeben, also welche Server ich "registriert" hab.

    Im Template werden die Daten mit z. B. {$ts3->serverAddress} ausgegeben. Folge ich jetzt dem Pfad, so gehe ich über die ListPage Klasse über die List Klasse im Data bis zur Grund Klasse, doch finde ich nirgends wo ein ts3 definiert ist. Also wie und wo kommt er an die Daten die in der DB stehen?

    Man muss doch zugeben, dass es als Anfänger hier wirklich nicht leicht ist... :/

  • Im Template werden die Daten mit z. B. {$ts3->serverAddress} ausgegeben. Folge ich jetzt dem Pfad, so gehe ich über die ListPage Klasse über die List Klasse im Data bis zur Grund Klasse, doch finde ich nirgends wo ein ts3 definiert ist. Also wie und wo kommt er an die Daten die in der DB stehen?

    Ich kenne das Plugin zwar nicht, aber ich wette du findest im Template ein Konstrukt wie {foreach from=$servers item=ts3}…{/foreach}. ts3 ist das gerade durchlaufende Item aus dem Server-Array. $servers wird in der assignVariables()-Methode übergeben und beinhaltet die Instanz aus der *List-Klasse.

  • {foreach from=$objects item=ts3} Ok, Aber ich finde in keiner *list klasse etwas mit assignVariables()

    In der List.class.php im Data Ordner ist das der inhalt:

    Spoiler anzeigen
    PHP
    class TeamSpeak3ViewerList extends DatabaseObjectList {
    	/**
    	 * @see	\wcf\data\DatabaseObjectList::$className
    	 */
    	public $className = 'wcf\data\teamspeak3viewer\TeamSpeak3Viewer';
    }

    Und die ListPage


    Spoiler anzeigen
    PHP
    class TeamSpeak3ViewerListPage extends SortablePage {
        public $templateName = 'teamspeak3viewerList';
        public $defaultSortField = 'serverID';
        public $objectListClassName = 'wcf\data\teamspeak3viewer\TeamSpeak3ViewerList';
        public $activeMenuItem = 'wcf.acp.menu.link.community.teamspeak3viewer.list';
    }
    ?>

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!