wie läuft das mit der Page Klasse ?

Hier finden sich Fragen und Ergänzung zur Dokumentation. // All questions and discussions about the documentation.
Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: wie läuft das mit der Page Klasse ?

Beitrag von Screeze » 18.01.2010, 21:39:46

Das ist eigentlich ziemlich egal. Die Verbindungen werden sowieso gecached intern, sodass pro verbindung nur eine instanz auf der gesamten seite geladen wird. Es ist höchstens eine sache der faulheit diese im konstruktor zu laden, und z.b. in einer klassenvariable zwischenzuspeichern, um sie dann in verschiedenen funktionen der klasse benutzen zu können, ohne immer diese neuinstanzierung. Performancetechnisch sollte das glaube ich aber keinen unterschied machen.

Snoun
Beiträge: 27
Registriert: 17.01.2010, 00:26:59

Re: wie läuft das mit der Page Klasse ?

Beitrag von Snoun » 18.01.2010, 22:10:35

Code: Alles auswählen

index.php
/apps/config/core/database/testite/DEFAULT_connections.ini
Dort habe ich die Daten für die Datenbankverbindung abgespeichert.
[configurationManager->getConfiguration()] Requested configuration with name "DEFAULT_news_objects.ini" cannot be loaded from namespace "sites::news" with context "testsite"!
Dies wird mir ausgespuckt, die ini mit der Datenbank habe ich unter
/apps/sites/news/DEFAULT_news_objects.ini abgelegt.
Ich würde mal vermuten das der Error an einem falschen Context liegt, jedoch werde ich aus der beschreibung dessen nicht wirklich schlau...
Context der Applikation. Dieser wird zur Addressierung der Konfigurationsdateien verwendet und muss auf den Wert gesetzt werden, der auch in der Zielanwendung verwendet wird.
ich verstehe das so das ich den Pfad direkt von der index datei aus angeben soll? also apps::config::core::database::testsite ... was aber von mir wahrscheinlich einfach nur fehlinterpretiert wurde?

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: wie läuft das mit der Page Klasse ?

Beitrag von Screeze » 18.01.2010, 22:19:29

edit: moment ich glaub ich hab grad müll erzählt, einen moment...

edit 2:
nochmal von vorn, hab da grad was verbockt.


Das ganze namespace und context zeug hab ich anfangs selber ewig nicht durchblickt, ab und zu stolper ich da auch drüber, aber nachschauen hilft dann ;)

der config Pfad setzt sich zusammen aus {Namespace}/{Context}/{file}

als namespace setzen kannst du im endeffekt nutzen was du möchtest. Wenn du ein modul programmierst, ist es allerdings üblich als namespace den selben wie den des moduls anzugeben.
Ich bin mir grad nicht 100% sicher evtl. kann mich einer korrigieren (ich machs etwas anders als normal), aber der pfad zur config datei müsste denke ich lauten:
/config/sites/news/{Context}/{file}
wobei 'testsite' dein Context ist, also
/config/sites/news/testsite/{file}

du hast derzeit
/config/sites/news/{file}

wobei..
/apps/sites/news/DEFAULT_news_objects.ini abgelegt.
was tut das /apps/ da vornedran? das sollte /config/ sein, oder?

und im pfad zur connections.ini fehlt ein s in testsite (-> testite)

Snoun
Beiträge: 27
Registriert: 17.01.2010, 00:26:59

Re: wie läuft das mit der Page Klasse ?

Beitrag von Snoun » 18.01.2010, 23:36:26

ich liste einfach mal mein komplettes projekt auf, bin nun etwas verwirrt :)

index.php
apps/
=> config/core/database/testsite/DEFAULT_connections.ini
=> core/ (nix verändert, ist noch so wie runtergeladen :) )
=> modules/ (ebenfalls noch "neu")
=> tools/ (und nochmal neu)
=> sites/
=>=>main/ (habe ich nur das Hauptwebsiten template drin "website.html")
=>=>news/controller/list_controller.php (Mein lerncontroller ;) )
=>=>news/templates/list.html & news.html
=>=>news/testsite/DEFAULT_news_objects.ini & DEFAULT_news_relations.ini

So das war mein Projekt.
index.php

Code: Alles auswählen

//PageController includen
include_once('./apps/core/pagecontroller/pagecontroller.php');

//connectionManager einbinden
import('core::database', 'connectionManager');

//Setup des ORMappers einbinden
import('modules::genericormapper::data::tools', 'GenericORMapperSetup');
//Mapper Instanziieren
$SetupMapper = new GenericORMapperSetup();

//Setzen des Context der Application
$SetupMapper->set('Context', 'config::core::database::testsite');
//Datenbanklayout erstellen
$SetupMapper->setupDatabase('sites::news', 'news');

//Neues Page-Objekt instanzieren.
$page = new Page();
//Festlegen des Haupttemplates
$page->loadDesign('sites::main', 'website');
//Ausgabe der Mainseite
echo $page->transform();
list_controller.php

Code: Alles auswählen

class list_controller extends baseController
{
    function list_controller() {
        import('modules::genericormapper::data', 'GenericORMapperFactory');

        $ORMFactory = $this->__getServiceObject('modules::genericormapper::data', 'GenericORMapperFactory');

        $this->ORM = &$ORMFactory->getGenericORMapper(
            'sites::news',
            'news',
            'db',
            'SINGLETON');
        
    }
    
    function transformContent() {
        $List = new GenericCriterionObject();
        $List->addPropertyIndicator('ListID',1);
        $liste = $this->ORM->loadObjectByCriterion('List', $List);
        $this->setPlaceHolder('Test', $liste);
        $this->setPlaceHolder('Ausgabeirgendwas', 'Dies ist eine andere ausgabe');
    }

}
DEFAULT_news_objects.ini

Code: Alles auswählen

[List]
ListID = VARCHAR(100)
Text = TEXT
ist halt alles sehr anfängermäßig und bestimmt massig zum verbessern, jedoch sollte es ja halbwegs verständlich sein für einen Anfänger :/

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: wie läuft das mit der Page Klasse ?

Beitrag von Screeze » 18.01.2010, 23:50:54

Ok da sehe ich mehrere Fehler, fangen wir mal oben an:
apps/
=> config/core/database/testsite/DEFAULT_connections.ini
=> core/ (nix verändert, ist noch so wie runtergeladen :) )
=> modules/ (ebenfalls noch "neu")
=> tools/ (und nochmal neu)
=> sites/
=>=>main/ (habe ich nur das Hauptwebsiten template drin "website.html")
=>=>news/controller/list_controller.php (Mein lerncontroller ;) )
=>=>news/templates/list.html & news.html
=>=>news/testsite/DEFAULT_news_objects.ini & DEFAULT_news_relations.ini
Die letzteren (die .ini dateien) haben hier nichts verloren.
Alle .ini Dateien kommen in den Ordner /apps/config/
Das ist der zentrale sammelpunkt für die Konfigurationsdateien. (genauen Pfad siehe weiter unten in meinem post)

------

Code: Alles auswählen

//Setup des ORMappers einbinden
import('modules::genericormapper::data::tools', 'GenericORMapperSetup');
//Mapper Instanziieren
$SetupMapper = new GenericORMapperSetup();

//Setzen des Context der Application
$SetupMapper->set('Context', 'config::core::database::testsite');
//Datenbanklayout erstellen
$SetupMapper->setupDatabase('sites::news', 'news');
Das hat eigentlich nichts in der index datei zu suchen, jedenfalls nicht im betrieb. Die Datenbank aufsetzen musst du nur 1 mal. Das setup generiert die tabellen in der Datenbank etc. Wenn die 1 mal generiert sind brauchst du das nichtmehr.
wobei dein Context vom setupmapper sowieso nicht hinhaut. 'config::' benötigst du da garnicht, 'core::database' ist der namespace des datenbankmoduls, und wird automatisch beim laden der konfigurationen eingebunden, dein context müsste dann nurnoch 'testwebsite' lauten.

---

Nochmal zu den configs, wenn du das hier so benutzt:

Code: Alles auswählen

$SetupMapper->setupDatabase('sites::news', 'news');
müssen die .ini dateien die ich oben "bemängelt" habe, hier liegen:
/apps/config/sites/news/testsite/[DEFAULT_news_objects.ini|DEFAULT_news_relations.ini]
und zwar weil:

Code: Alles auswählen

/apps -> root Ordner des APF
=>/config -> zentraler sammelpunkt der konfigurationen
=>=>/sites/news -> Der namespace den du dem setup als 1. parameter übergibst
=>=>=>/testsite -> der context deiner seite
=>=>=>=>/[DEFAULT_news_objects.ini|DEFAULT_news_relations.ini] -> Deine Dateien [entweder|oder]
---

Den Rest hatte ich grad keine Zeit mehr mir anzusehen, aber evtl. kommst du da mit den Infos hier schon weiter, ansonsten meld dich, dann erklär ichs morgen (oder es ist noch jemand anderes online).

Screeze

Snoun
Beiträge: 27
Registriert: 17.01.2010, 00:26:59

Re: wie läuft das mit der Page Klasse ?

Beitrag von Snoun » 19.01.2010, 00:31:57

Ok da sehe ich mehrere Fehler, fangen wir mal oben an:
Wie gesagt, blutiger anfänger mit dem APF. Daher Danke für die netten Antworten auf die doch ein bisschen blöden Fragen :)
Alle .ini Dateien kommen in den Ordner /apps/config/
und schon sind sie verschoben, danke für den Hinweis :)
Das hat eigentlich nichts in der index datei zu suchen, jedenfalls nicht im betrieb.
Wo gehört das denn normalerweise sonst hin?
Das setup generiert die tabellen in der Datenbank etc.
Also müssen die Tabellen die ich in den Inis angebe noch nicht existieren?
Wie lege ich denn dann Primärschlüssel, uniques etc. bei den einzelnen Feldern fest?


Und wo gehört dann die Datenbank instanziierung hin, wenn nicht in die Index Datei?
Und noch besser, wie krieg ich dann die Datenbankverbindung in die Controller. Ich habe mir nun das Guestbook2009 beispiel im module Ordner angeschaut, jedoch ist dort wieder was anderes anscheinend - zumindest mir unbekanntes ;)

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: wie läuft das mit der Page Klasse ?

Beitrag von dr.e. » 19.01.2010, 08:51:45

Hallo Snoun,
Also müssen die Tabellen die ich in den Inis angebe noch nicht existieren?
Wie lege ich denn dann Primärschlüssel, uniques etc. bei den einzelnen Feldern fest?
Nein, die Tabellen müssen noch nicht existieren. Zum Setup kannst du das mitgelieferte Tool nutzen (siehe http://adventure-php-framework.org/Seit ... bank-Setup) oder ein manuelles Setup durchführen (siehe http://adventure-php-framework.org/Seit ... -Datenbank). Letzteres setzt das tiefe Verständnis für die Komponente voraus und ist in 99% der Fälle ohnehin nicht notwendig. Du kannst sehr einfach - z.B. per PHPMyAdmin - anschließend Indizes vergeben. Mehr brauchst du in der Regel auch nicht zu tun.
Und wo gehört dann die Datenbank instanziierung hin, wenn nicht in die Index Datei?
Hierzu solltest du eine eigene PHP-Setup-Datei erstellen - wie die, die mitgeliefert ist im Release - und möglichst nicht im Livesystem ablegen. Diese kannst du beim Start der Entwicklung einmal aufrufen - nachdem du die Konfiguration der Objekte und Beziehungen fertig hast - und dann ist die Datenbank erzeugt. Alles andere erledigt nun der Mapper. Möchtest du Änderungen an der Konfiguration vornehmen, kannst du das Update-Tool nutzen. Die Funktion ist identisch, auch hier ist ein Beispiel im Release enthalten. Die Doku erscheint in 1-2 Wochen mit dem Relaunch der Seite auch online. Soltest du sie vorab brauchen, sag Bescheid, dann stelle ich hier ein PDF zur Verfügung.
Und noch besser, wie krieg ich dann die Datenbankverbindung in die Controller. Ich habe mir nun das Guestbook2009 beispiel im module Ordner angeschaut, jedoch ist dort wieder was anderes anscheinend - zumindest mir unbekanntes ;)
Die Datenbank-Verbindung definierst du wie unter http://adventure-php-framework.org/Seit ... figuration beschrieben einfach in einer ini-Datei under dem angegebenen Ordner. Beim Erzeugen des Mappers - siehe Beispiel Screeze - übergibst du dann den Schlüssel der definierten Sektion an die Methode getGenericORMapper() und der Mapper kümmerst sich intern selbst darum.
Viele Grüße,
Christian

Snoun
Beiträge: 27
Registriert: 17.01.2010, 00:26:59

Re: wie läuft das mit der Page Klasse ?

Beitrag von Snoun » 19.01.2010, 21:17:32

jutjut, da bin ich wieder :geek:
Das mit dem Setup, habe ich zumindest in der Theorie verstanden. Der Rest bleibt mir jedoch noch verborgen. Ich habe die Doku nun desöfteren gelesen, sowie von anderen auch lesen lassen welche das auch nicht so ganz durchblickt haben.
Im Controller baue ich die Datenbankverbindung also bei jedem Controller neu auf mit:

Code: Alles auswählen

    function list_controller() {
        import('core::database','connectionManager');
        
        $cM = &$this->__getServiceObject('core::database','connectionManager');  
        $DBTreiber = &$cM->getConnection('Sektionsname');  
    }
richtig soweit?
Jedoch erstelle ich die Variablen doch nur innerhalb der Funktion und kriege somit in zb der Transorn Funktion kein Zugrif auf diese.
Auch auf die gefahr hin, dass es nun etwas arg dreist klingen mag, aber wäre ein Beispiel zu erstellen ein großer Aufwand?

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: wie läuft das mit der Page Klasse ?

Beitrag von Screeze » 19.01.2010, 21:30:19

Das ist schon richtig so, du beziehst wie du geschrieben hast die DB verbindung in jeder funktion wo du sie benötigst.
Wenn du mit dem GORM arbeitest, ist das allerdings nicht sehr oft, da beziehst du eher den GORM jedesmal aufs neue.

Ein Problem performancetechnisch stellt das nicht dar, denn die Verbindung selber wird pro request nur 1 mal geladen. Danach wird sie gespeichert, bis alle arbeiten des requests fertig sind. Dadurch dass er immer als Referenz übergeben wird, wird er auch nicht x mal in verschiedenen variablen gespeichert, sondern die neuen variablen zeigen auf den selben Speicherbereich, wo die verbindung liegt. (wenn ich das richtig verstanden habe)

Snoun
Beiträge: 27
Registriert: 17.01.2010, 00:26:59

Re: wie läuft das mit der Page Klasse ?

Beitrag von Snoun » 21.01.2010, 00:49:47

So, nach einer kleinen zwangspause durch den besten Provider der Welt (telekom :roll: ) kann ich mich endlich wieder melden :)

Inzwischen habe ich auch einen kleinen "erfolg" zu verzeichnen, ich habe endlich den connectionManager in den Controller bekommen und habe ein Datensatz aus der Datenbank auslesen können :geek:

Code: Alles auswählen

    function transformContent() {
        $SQL = $this->__getServiceObject('core::database', 'MySQLHandler');

        $select = 'SELECT * FROM list';
        $result = $SQL->executeTextStatement($select);
        $ausgabe = "Keine Einträge";
//        while($data = $SQL->fetchData($result)){
//            $ausgabe .= $data['Text'];
//        }
        $ausgabe = $SQL->fetchData($result);

        $this->setPlaceHolder('Test', $ausgabe['Text']);
    }
Die Ausgeklammerte while schleife sollte eigentlich rein, wenn mehrere Datensätze abgefragt werden müssen.. Jedoch wird so immer nur der letzte Datensatz ausgegeben, wie kriege ich nun eine komplette auflistung hin? :/

mit dem GORM selbst habe ich mich nun ehrlich gesagt noch nicht weiter beschäftigt, aber ich denke mal ich gehe recht in der annahme das ich theoretisch den connectionManager teil mit dem des GORMS austauschen müsste ?

Zudem hab ich noch eine zwischenfrage die mir gerade so in den Sinn gekommen ist, ich frage mich wo der unterschied ist zwischen Module und "normalen" Seiten? - Was ist sinnvoller zu erstellen, bzw. wann sollte man was erstellen? Kann man diese Module später genauso nutzen wie normale Seiten?

Gut, das wäre dann glaub ich erstmal wieder etwas was ich ab arbeiten werde :)

@dr.e:
Obwohl, da wäre noch eine (vielleicht etwas dreiste) Frage. Ich habe in einem deiner Posts hier gelesen, dass du ein Relaunch der Seite planst... Ich gehe mal davon aus, dass der Quellcode der aktuellen Seite unter verschluss bleibt? Oder wäre es vielleicht möglich dort mal reinschauen zu können, ich habe festgestellt einfach besser lernen zu können indem ich einfach bereits funktionierenden Code step-by-step modifiziere und somit direkt die Auswirkungen sehen kann. Wobei es auch nur ein nettes schmankerl wäre, denn mein Listen "Projekt" ist ja im Prinzip auch eine gute Lernaufgabe :)

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: wie läuft das mit der Page Klasse ?

Beitrag von dr.e. » 21.01.2010, 10:50:28

Hi,
Die Ausgeklammerte while schleife sollte eigentlich rein, wenn mehrere Datensätze abgefragt werden müssen.. Jedoch wird so immer nur der letzte Datensatz ausgegeben, wie kriege ich nun eine komplette auflistung hin? :/
Du hast doch die While-Schleife schon korrekt ausgeführt. Nun noch ein

Code: Alles auswählen

$this->setPlaceHolder('Test', $ausgabe);
und alles ist gut.
mit dem GORM selbst habe ich mich nun ehrlich gesagt noch nicht weiter beschäftigt, aber ich denke mal ich gehe recht in der annahme das ich theoretisch den connectionManager teil mit dem des GORMS austauschen müsste ?
Korrekt. Der GORM setzt auf dem connectionManager auf und liefert dir direkt Objekte zurück, während der connectionManager "nur" Arrays mit Datenbank-Ergebnissen liefert.
Zudem hab ich noch eine zwischenfrage die mir gerade so in den Sinn gekommen ist, ich frage mich wo der unterschied ist zwischen Module und "normalen" Seiten? - Was ist sinnvoller zu erstellen, bzw. wann sollte man was erstellen? Kann man diese Module später genauso nutzen wie normale Seiten?
Technisch ist ein "Modul" im APF nichts anderes als du heute schon baust. Der begriff wird immer dann gebraucht, wenn du ein Stück Software so schreibst, dass es in allen deinen Seiten eingebaut werden kann, ohne dass du die Software selbst ändern muss.
@dr.e:
Obwohl, da wäre noch eine (vielleicht etwas dreiste) Frage. Ich habe in einem deiner Posts hier gelesen, dass du ein Relaunch der Seite planst... Ich gehe mal davon aus, dass der Quellcode der aktuellen Seite unter verschluss bleibt? Oder wäre es vielleicht möglich dort mal reinschauen zu können, ich habe festgestellt einfach besser lernen zu können indem ich einfach bereits funktionierenden Code step-by-step modifiziere und somit direkt die Auswirkungen sehen kann. Wobei es auch nur ein nettes schmankerl wäre, denn mein Listen "Projekt" ist ja im Prinzip auch eine gute Lernaufgabe :)
Der Relaunch ist nicht mehr so lange hin, wir arbeiten grade an den letzten Kleinigkeiten hinsichtlich Darstellung und Texte. Der Quellcode bleibt natürlich nicht unter Verschluss, das APF ist schließlich ein Open Source Projekt! Den Code findest du heute schon im SVN unter http://adventurephpfra.svn.sourceforge. ... fdocupage/. Einfach auschecken/exportieren/herunterladen und stöbern.
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: wie läuft das mit der Page Klasse ?

Beitrag von Megger » 21.01.2010, 10:59:29

In Modulen fasst du sozusagen alles zusammengehörige zusammen (komischer Satz)

Du hast dann zum Beispiel ein Modul für das Forum, ein Modul für die News usw. In den Modulen hast du dann alles zusammengefasst von Manager über Mapper bis hin zu den Templates und Controllern.

So versuche ich das zumindestens immer zu realisieren. Am besten noch mit gar keiner oder nur einer geringen Abhängigkeit, sodass man schnell und einfach Module austauschen kann oder auch diese Module in andere Seiten einbauen kann.
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Snoun
Beiträge: 27
Registriert: 17.01.2010, 00:26:59

Re: wie läuft das mit der Page Klasse ?

Beitrag von Snoun » 21.01.2010, 23:30:57

Okay, vergessen wir einfach was ich oben geschrieben habe :oops: Wird doch als "liste" angezeigt.
gibt es eigtl eine schönere variante einen zeilenumbruch nach dem Datensatz zu haben als:

Code: Alles auswählen

        while($data = $SQL->fetchData($result)){
            $ausgabe .= $data['Text']. "<br />";
        }
?

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: wie läuft das mit der Page Klasse ?

Beitrag von Screeze » 21.01.2010, 23:45:01

Hi,
Ich denke der (oder das?) Iterator-taglib sollte sein was du suchst.

http://adventure-php-framework.org/Seit ... 1-Iterator

Damit definierst du im template ein element des datensatzes, und wie es ausgegeben werden soll. setzt einen platzhalter mit name des Array Index, und übergibst dem iterator ein array aus assoziativen arrays. Für jedes assoziative array wird dann das template einmal geparst, und am ende kannst du dann alle gemeinsam ausgeben. zugegeben - kürzer als deine variante ist es bei weitem nicht, aber ich denke das war auch nur ein beispiel, es ist auf jedenfall schöner von der trennung des codes und templates her.

Hoffe das hilft weiter,
Ralf

Snoun
Beiträge: 27
Registriert: 17.01.2010, 00:26:59

Re: wie läuft das mit der Page Klasse ?

Beitrag von Snoun » 23.01.2010, 22:53:41

Gut, nachdem ich ein bisschen rumspielen konnte nun, kommt die nächste frage... Keine Angst, nur eine kleine ;)
Ist es möglich, im Template eine art Fallunterscheidung einzubauen? Ich habe z.B. sowas in der art vor:
Meine Navbar hat eine "aktiv"-Leiste unter dem Menüpunkt wo man gerade surft. Nun hab ich mir gedacht, ich frag im Template einfach ab welcher parameter gesetzt wurde als view, und wenn es das entsprechende Template ist soll er dort die css klasse auf "visitsite" o.ä. ändern.

Ansonsten kann ich gerade nur nochmal ein Lob aussprechen, nachdem ich anfangs ziemlich skeptisch war ob das APF wirklich "nützlich" ist sind inzwischen alle Zweifel beseitigt. Nicht nur wegen dem tollem Framework (was wirklich toll ist), sondern auch wegen dem Klasse support hier im Forum :)
Werde am Montag mal im Meeting das APF vorschlagen, suchen im moment eh etwas "neues" :)

edit:
Da fällt mir gerade noch etwas ein, ist es möglich bzw. wie ist es möglich auf dem "Haupt"-Template Platzhalter zu setzen... Das, wenn ich auf den "richtigen" Server gehen sollte, nur den pfad zum css verzeichnis in der index datei oder sonstwo ändern muss und nicht im HTML stelbst bei jeder seite :)

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast