[Beispiel] Verständnis Umsetzung MVC innerhalb des APF

Hier finden sich Fragen und Ergänzung zur Dokumentation. // All questions and discussions about the documentation.
Antworten
Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Re: [Beispiel] Verständnis Umsetzung MVC innerhalb des APF

Beitrag von ma2604121 » 08.04.2011, 11:42:37

Screeze hat geschrieben:Ich vermute du willst eine Methode, der du die seitenzahl übergibst, und dann die entsprechenden Einträge bekommst?
Genau, das ist beabsichtigt.

Wenn ich nach dem Kommentar-Tutorial vorgehe müsste eine Methode wie folgt vorhanden sein

Code: Alles auswählen

    public function loadEntries(){

    // Pager einbinden
    $pMF = &$this->__getServiceObject('modules::pager::biz', 'PagerManagerFabric');
    $pM = &$pMF->getPagerManager('messagePager');

    // Datenbankverbindung herstellen
    $M = &$this->getConnection();

    return $pM->loadEntriesByAppDataComponent($M,'loadArticleCommentByID',array('CategoryKey' => $this->__CategoryKey));

    } 
Allerdings habe ich keinen CategoryKey.

Meine Abfrage sieht wie folgt aus:

Code: Alles auswählen

SELECT COUNT(*) AS EntriesCount
FROM `messages` 
Müsste dann die Anweisung wie folgt lauten:

Code: Alles auswählen

    return $pM->loadEntriesByAppDataComponent($M,'loadArticleCommentByID'); 

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

Re: [Beispiel] Verständnis Umsetzung MVC innerhalb des APF

Beitrag von Megger » 08.04.2011, 11:53:52

Ja die Anweisung müsste dann passen, vielleicht musst du ein leeres Array übergeben, weiß nicht, ob das optionaler Parameter ist
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


Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Re: [Beispiel] Verständnis Umsetzung MVC innerhalb des APF

Beitrag von ma2604121 » 08.04.2011, 11:56:14

Also die Anweisung sieht nun wie folgt aus:

Code: Alles auswählen

    return $pM->loadEntriesByAppDataComponent($M,'loadArticleCommentByID'); 
Das wiederum führt zu folgendem Fehler:

Code: Alles auswählen

Exception-ID:  	01c4e8d2abb251fdb0f10382bde32427
Type: 	InvalidArgumentException
Message: 	[PagerManager->loadEntriesByAppDataComponent()] Given data component (MySQLxHandler) has no method "loadArticleCommentByID"! Thus, no entries can be loaded!
Number: 	256
File: 	/var/www/apf1/apps/modules/pager/biz/PagerManager.php
Line: 	177


Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Re: [Beispiel] Verständnis Umsetzung MVC innerhalb des APF

Beitrag von ma2604121 » 08.04.2011, 12:06:00

Stimmt...

Demnach könnte die Zeile auch wie folgt aussehen (die Methode ist derzeit zum Testen innerhalb des Mappers):

Code: Alles auswählen

    public function loadEntries(){

    // Pager einbinden
    $pMF = &$this->__getServiceObject('modules::pager::biz', 'PagerManagerFabric');
    $pM = &$pMF->getPagerManager('messagePager');

    return $pM->loadEntriesByAppDataComponent($this->loadArticleCommentByID($id),'loadArticleCommentByID');

    } 
Dazu die Methode loadArticleCommentByID

Code: Alles auswählen

    public function loadArticleCommentByID($id){
    $SQL = &$this->getConnection();
    $select = 'SELECT * FROM `messages` WHERE `messages`.`id` = \'' . $id . '\'';
    $result = $SQL->executeTextStatement($select);
    return $this->$SQL->fetchData($result);
    } 
Wenn ich das nun aufrufe hagelt es Fehler:

Code: Alles auswählen

Undefined variable: id
Only variables should be passed by reference
in_array(): Wrong datatype for second argument
[PagerManager->loadEntriesByAppDataComponent()] Given data component () has no method "loadArticleCommentByID"! Thus, no entries can be loaded!
Also ich glaube der Pager wird meine größte Herausforderung... :o

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

Re: [Beispiel] Verständnis Umsetzung MVC innerhalb des APF

Beitrag von Megger » 08.04.2011, 12:14:15

Code: Alles auswählen

$pM->loadEntriesByAppDataComponent($this->loadArticleCommentByID($id),'loadArticleCommentByID');
 
muss meiner Meinung nach heißen

Code: Alles auswählen

$pM->loadEntriesByAppDataComponent($this,'loadArticleCommentByID',array('id'=>$id));
 
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

Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Re: [Beispiel] Verständnis Umsetzung MVC innerhalb des APF

Beitrag von ma2604121 » 08.04.2011, 12:25:12

Da ändern bzw. reduzieren sich immerhin die Fehlermeldungen:

Code: Alles auswählen

Error-ID:  	d3157b7dac0d2c83a90368a4af0c3412
Message: 	Undefined variable: id
Number: 	8
File: 	/var/www/apf1/apps/messenger/data/messengerMapper.php
Line: 	128

Code: Alles auswählen

Exception-ID:  	95f08f134454cb3636d6b614a847faab
Type: 	DatabaseHandlerException
Message: 	[MySQLxHandler->getStatementFromFile()] There's no statement file with name "DEFAULT_load_entry_ids.sql" for given namespace "config::modules::pager" and current context "messenger"! Root cause: [StatementConfigurationProvider::loadConfiguration()] Statement with namepace "modules::pager", context "messenger", language "de", environment "DEFAULT", and name "load_entry_ids.sql" cannot be loaded!
Number: 	256
File: 	/var/www/apf1/apps/core/database/AbstractDatabaseHandler.php
Line: 	349
Ich habe jetzt die beiden SQL-Dateien nach

Code: Alles auswählen

/apps/config/modules/pager/messenger
verschoben. Damit fällt die zweite Meldung weg.

Die Id habe ich einfach mal vorbelegt, dann wäre auch die erste Meldung weg. Aber dass das nicht die Lösung ist, dürfte klar sein.
Damit erhalte ich dann ein Array, welches mit fünf Einträgen der DB bestückt ist.

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

Re: [Beispiel] Verständnis Umsetzung MVC innerhalb des APF

Beitrag von Megger » 08.04.2011, 12:32:29

Code: Alles auswählen

Exception-ID:     95f08f134454cb3636d6b614a847faab
Type:    DatabaseHandlerException
Message:    [MySQLxHandler->getStatementFromFile()] There's no statement file with name "DEFAULT_load_entry_ids.sql" for given namespace "config::modules::pager" and current context "messenger"! Root cause: [StatementConfigurationProvider::loadConfiguration()] Statement with namepace "modules::pager", context "messenger", language "de", environment "DEFAULT", and name "load_entry_ids.sql" cannot be loaded!
Number:    256
File:    /var/www/apf1/apps/core/database/AbstractDatabaseHandler.php
Line:    349
Irgendwann wurde es mal umgestellt, sodass kein Ordner "statements" mehr benötigt wird!

Code: Alles auswählen

Error-ID:     d3157b7dac0d2c83a90368a4af0c3412
Message:    Undefined variable: id
Number:    8
File:    /var/www/apf1/apps/messenger/data/messengerMapper.php
Line:    128
Dann heißt deine Variable nicht id, dass musst du natürlich anpassen

Code: Alles auswählen

public function loadEntries(){

    // Pager einbinden
    $pMF = &$this->__getServiceObject('modules::pager::biz', 'PagerManagerFabric');
    $pM = &$pMF->getPagerManager('messagePager');

    return $pM->loadEntriesByAppDataComponent($this->loadArticleCommentByID($id),'loadArticleCommentByID');

    } 
 
Da hast du nirgends eine $id, brauchst aber die MessageID für 'loadArticleCommentByID'
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

Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Re: [Beispiel] Verständnis Umsetzung MVC innerhalb des APF

Beitrag von ma2604121 » 08.04.2011, 12:41:34

Megger hat geschrieben:Irgendwann wurde es mal umgestellt, sodass kein Ordner "statements" mehr benötigt wird!
Ok, das Problem habe ich zwischenzeitlich behoben.
Megger hat geschrieben:Da hast du nirgends eine $id, brauchst aber die MessageID für 'loadArticleCommentByID'
Das ist richtig. Aber irgendwoher muss da irgendwann ein Wert kommen oder nicht? Der Pager muss doch schließlich wissen, welche Datensätze er aus der Datenbank holen muss.

Also momentan tappe ich hier völlig im Dunkeln, wie der Pager umzusetzen ist. Ich habe mir zwar schon mehrmals das Kommentar-Tutorial durchgelesen (in diesem ist die Pager-Verwendung erklärt), aber Land sehe ich immer noch nicht.

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

Re: [Beispiel] Verständnis Umsetzung MVC innerhalb des APF

Beitrag von Megger » 08.04.2011, 12:48:43

Ich schaue mir das gerade mal an, muss nur gerade die 1.13 runterladen und dann editiere ich diesen Beitrag

Edit:
Mit

Code: Alles auswählen

$pM->loadEntries();
 
bekommst du alle IDs die du benötigst. Was du dann mit diesen IDs machst, ist dir überlassen.

Wenn du es per loadEntriesByAppDataComponent machen willst, dann müsste folgendes richtig sein

Code: Alles auswählen

$pM->loadEntriesByAppDataComponent($this, 'loadArticleCommentByID');
 
Bei der Kommentar Funktion ist noch ein array vorhanden, da dort nur bestimmte ArticleComments geladen werden und nicht alle.
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

Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Re: [Beispiel] Verständnis Umsetzung MVC innerhalb des APF

Beitrag von ma2604121 » 08.04.2011, 12:50:29

Klasse!
Danke für die Mühe!

Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Re: [Beispiel] Verständnis Umsetzung MVC innerhalb des APF

Beitrag von ma2604121 » 08.04.2011, 13:33:07

Also ich habe nun im Mapper die folgendne zwei Methoden

Code: Alles auswählen

    /**
     * Lädt eine bestimmte Anzahl an Einträgen (=> Pager)
     *
     */
    public function loadEntries(){

    // Pager einbinden
    $pMF = &$this->__getServiceObject('modules::pager::biz', 'PagerManagerFabric');
    $pM = &$pMF->getPagerManager('messagePager');
    return $pM->loadEntriesByAppDataComponent($this, 'loadArticleCommentByID');

    }

    public function loadArticleCommentByID($id){ = &$this->getConnection();
    $select = 'SELECT * FROM `messages` WHERE `messages`.`id` = \'' . $id . '\'';
    $result = $SQL->executeTextStatement($select);
    return $SQL->fetchData($result);
    } 
Wenn ich die im Controller anspreche erhalte ich bei

Code: Alles auswählen

    echo "<pre>";
    var_dump($mM->loadEntries());
    echo "</pre>"; 
Ein Array mit fünf Einträgen. Ohne Fehlermeldung :!:

Diese sollen nun wiederum ausgegeben werden. Das mache ich, indem ich dem Iterator dieses Array übergebe und dieser die selektierten Einträge ausgibt.

Nur: Wie baue ich nun die Blätterfunktion des Pagers ein?

Wird das über einen Platzhalter realisiert?

Code: Alles auswählen

<html:placeholder name="Pager" /> 

Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Re: [Beispiel] Verständnis Umsetzung MVC innerhalb des APF

Beitrag von Well » 08.04.2011, 13:42:03

Genau. Die Seitennavigation bekommst du dann über »getPager()« und kannst sie in den Platzhalter einsetzen.

Code: Alles auswählen

$this->setPlaceHolder('Pager', $pM->getPager());

Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Re: [Beispiel] Verständnis Umsetzung MVC innerhalb des APF

Beitrag von ma2604121 » 08.04.2011, 13:50:38

Das mit getPager() hatte ich zwischenzeitlich auch gefunden, aber es will noch nicht so wirklich.

Wo muss ich

Code: Alles auswählen

    $this->setPlaceHolder('Pager', $pM->getPager()); 
einbinden?

Das müsste doch in den Document-Controller oder?

Muss ich dann dort folgendes einbinden

Code: Alles auswählen

    $pMF = &$this->__getServiceObject('modules::pager::biz', 'PagerManagerFabric');
    $pM = &$pMF->getPagerManager('messagePager');
    $this->setPlaceHolder('Pager', $pM->getPager()); 
Das führt nämlich zu einem Fehler

Code: Alles auswählen

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 40 bytes) in /var/www/apf1/apps/core/benchmark/BenchmarkTimer.php on line 399 
Außerdem erscheint es mir auch von der Art und Weise falsch, da damit eine neue Verbindung zum PagerManger aufgebaut wird. Eigentlich sollen die Daten aber doch schon bereitstehen.

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste