Fragen zum Iterator

Hier dreht sich alles um die auf der Webseite veröffentlichten Tutorials. // This forum is all about the APF tutorials.
Antworten
Benutzeravatar
ma2604121
Beiträge: 349
Registriert: 24.01.2011, 23:42:18

Fragen zum Iterator

Beitrag von ma2604121 » 26.09.2011, 18:18:04

Ich verwende gerade den Iterator um Listen auszugeben. Eine dieser Listen enthält die registrierten Benutzer. Zu diesen soll u.a. das Datum der Registrierung ausgegeben werden. Dies wird in der DB als "CreationTimestamp" gespeichert.

Ich kann mir das nun einfach wie folgt ausgeben lassen:

Template

Code: Alles auswählen

<h1>Mitgliederliste</h1>
<table>
    <tr>
    <th>#</th>
    <th>Benutzername</th>
    <th>Registriert</th>
    </tr>
<html:iterator name="MemberList">
    <iterator:item getter="getProperty">
    <tr>
        <td><item:placeholder name="UserID"/></td>
        <td><item:placeholder name="Username"/></td>
        <td><item:placeholder name="CreationTimestamp"/></td>
    </tr>
    </iterator:item>
</html:iterator>
</table> 
Controller

Code: Alles auswählen

    public function  transformContent() {
    $uM = &$this->getManager();
    $group = $uM->loadGroupById(8);
    $users = $uM->loadUsersWithGroup($group);
    $usersIterator = &$this->getIterator('MemberList');
    $usersIterator->fillDataContainer($users);
    $usersIterator->transformOnPlace();
    } 
Nun erscheint natürlich im Feld "Registriert" der Tabelle etwas in der folgenden Art:

Code: Alles auswählen

2011-09-23 14:08:54
Das ist natürlich keine sonderlich leserliche Sache. Wie kann ich im Controller in den Ablauf eingreifen, um diese Daten vor Ausgabe in ein leserliches Format zu bringen? Oder ist das auf einfache Art und Weise gar nicht möglich?

EDIT
Was ich auch noch nicht genau nachvollziehen kann, ist folgende Zeile:

Code: Alles auswählen

    <iterator:item getter="getProperty"> 
Entferne ich sie, erhalte ich Fehlermeldungen. Ändere ich getProperty, gibt es auch einen Fehler. Was genau verbirgt sich dahinter? Die Doku hat mir hier auch noch nicht so weitergeholfen, dass ich schlauer geworden bin...

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Fragen zum Iterator

Beitrag von dave » 26.09.2011, 18:46:59

Zum Iterator selbst kann ich mich nicht weiter äussern, dieses Feature ist bei mir bisher nicht zur Anwendung gekommen, sieht aber dennoch sehr interessant aus.

Zur Darstellung des Datums:

Im Controller kannst du ja via

Code: Alles auswählen

$users->getProperty('CreationTimestamp'); 
auf den in der DB gespeicherten Wert zugreifen. Diesen kannst du anschliessend soweit bearbeiten, wie du willst und ihn anschliessend ja mit

Code: Alles auswählen

$users->setProperty('CreationTimestamp'); 
überschreiben.

Wie soll das Datum denn genau aussehen?

Das erinnert mich glatt an einen Kollegen von heute: Dem hat die Anzeige der Daten an der Visu für ein Prozessleitsystem auch nicht gefallen, jedoch konnte er mir auch nicht genau sagen, wie er es denn gerne hätte :lol:

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

Re: Fragen zum Iterator

Beitrag von ma2604121 » 26.09.2011, 20:45:37

Wie das Datum aussehen soll?

Etwa so:

Code: Alles auswählen

26.09.2011, 20:45
Allerdings scheint es mit einem einfachen ->getProperty bzw. ->setProperty nicht getan...

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

Re: Fragen zum Iterator

Beitrag von ma2604121 » 26.09.2011, 20:55:15

Der Versuch

Code: Alles auswählen

    $uM = &$this->getManager();
    $group = $uM->loadGroupById(8);
    $users = $uM->loadUsersWithGroup($group);
    foreach ($users as $user){
        $user['RegDate'] = '26.09.2011';
    } 
scheitert leider auch.

Code: Alles auswählen

Fatal error: Cannot use object of type UmgtUser as array in /var/www/beta/apps/rl/pres/biz/memberListController.php on line 15 

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

Re: Fragen zum Iterator

Beitrag von Megger » 26.09.2011, 21:11:05

Was ich auch noch nicht genau nachvollziehen kann, ist folgende Zeile:
CODE: ALLES AUSWÄHLEN
<iterator:item getter="getProperty">

Entferne ich sie, erhalte ich Fehlermeldungen. Ändere ich getProperty, gibt es auch einen Fehler. Was genau verbirgt sich dahinter? Die Doku hat mir hier auch noch nicht so weitergeholfen, dass ich schlauer geworden bin...
Das bezeichnet einfach die Methode, mit der die Daten abgefragt werden, bei GenericDomainObjects ist das getProperty, wenn du zum Beispiel APFObjects übergibst, dann wäre das getAttribute
Der Versuch
CODE: ALLES AUSWÄHLEN
$uM = &$this->getManager();
$group = $uM->loadGroupById(8);
$users = $uM->loadUsersWithGroup($group);
foreach ($users as $user){
$user['RegDate'] = '26.09.2011';
}

scheitert leider auch.
$user ist ja dann auch ein GenericDomainObject, du könntest das über $user->setProperty() setzen. Viel eine andere Möglichkeit wirst du da nicht haben denke ich
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
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Fragen zum Iterator

Beitrag von dave » 26.09.2011, 21:32:21

Also

Code: Alles auswählen

$users->setProperty('CreationTimestamp', '26.09.2011') 
sollte grundsätzlich erstmal dein Datum zum Probieren immer anpassen. Ich nutze das so in meiner Klasse auch und da gibts kein Problem ;)

Ich poste dir hier mal meine Function, um aus der APF-Zeit einen Timestamp zu erzeugen. Das an deine Bedürfnisse anzupassen sollte kein Problem werden. Die Kommentare sind ja sehr hilfreich ;)

Code: Alles auswählen

    /*
     * create Timestamp
     * ertsellt anhand des CreationTimestamp vom APF einen Unix-Timestamp und füllt mit 0 auf 13 Stellen auf
     */
    protected function createTimestamp($timestamp) {
        //anhand des leerzeicehn aufbrechen
        //2011-08-18 19:16:28
        $datumZeit = explode(' ', $timestamp); //-> $datumZeit[0] = 2011-08-18, $datumZeit[1] = 19:16:28
        //anhand der '-' aufbrechen
        $datum = explode('-', $datumZeit[0]); //-> $datum[0] = 2011, $datum[1] = 08, $datum[2] = 18
        //anhand der ':' aufbrechen
        $zeit = explode(':', $datumZeit[1]); //-> $zeit[0] = 19, $zeit[1] = 16, $zeit[2] = 28
        //mktime (stunde, minute, sekunde, monat, tag, jahr);
        $time = mktime($zeit[0], $zeit[1], $zeit[2], $datum[1], $datum[2], $datum[0]) . '000';
        //Return time mit aufgefüllten Nullen auf Länge 13 Zeichen
        return str_pad($time, 13, '00000');
    } 

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

Re: Fragen zum Iterator

Beitrag von ma2604121 » 26.09.2011, 22:03:10

Ja! So geht alles! Danke.

Die weiteren Fragen folgen mit Sicherheit... ;)

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

Re: Fragen zum Iterator

Beitrag von ma2604121 » 07.10.2011, 23:46:43

Habe eine neue Problemstellung, an der ich derzeit nicht weiterkomme:

Ich lade mittels

Code: Alles auswählen

$BooksList = $orm->loadRelatedObjects($User, 'Authors2Books', $BooksCrit); 
die dem Autor zugeordneten Bücher. Das funktioniert. Jedoch haben manche der Autoren so viele Bücher, dass ich gerne den Pager verwenden würde, um die Sache übersichtlicher zu gestalten.

Trotz zahlreicher Versuche ist es mir bislang nicht gelungen, den Pager hier sinnvoll einzubinden.

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

Re: Fragen zum Iterator

Beitrag von Well » 08.10.2011, 09:15:48

Code: Alles auswählen

    /*
     * create Timestamp
     * ertsellt anhand des CreationTimestamp vom APF einen Unix-Timestamp und füllt mit 0 auf 13 Stellen auf
     */
    protected function createTimestamp($timestamp) {
        //anhand des leerzeicehn aufbrechen
        //2011-08-18 19:16:28
        $datumZeit = explode(' ', $timestamp); //-> $datumZeit[0] = 2011-08-18, $datumZeit[1] = 19:16:28
        //anhand der '-' aufbrechen
        $datum = explode('-', $datumZeit[0]); //-> $datum[0] = 2011, $datum[1] = 08, $datum[2] = 18
        //anhand der ':' aufbrechen
        $zeit = explode(':', $datumZeit[1]); //-> $zeit[0] = 19, $zeit[1] = 16, $zeit[2] = 28
        //mktime (stunde, minute, sekunde, monat, tag, jahr);
        $time = mktime($zeit[0], $zeit[1], $zeit[2], $datum[1], $datum[2], $datum[0]) . '000';
        //Return time mit aufgefüllten Nullen auf Länge 13 Zeichen
        return str_pad($time, 13, '00000');
 
Schlag mal strtotime() nach. ;)

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Fragen zum Iterator

Beitrag von dave » 09.10.2011, 19:11:53

Well hat geschrieben: Schlag mal strtotime() nach. ;)
Aha, danke! ;) Wieso einfach, wenns auch schwer geht? :lol:


Zum Topic:
Ich verwende nur den ArrayPager, aber der ist ähnlich. Poste doch mal den Controller, dann können wir dir besser helfen. Besser als in der Doku lässt es sich nicht erklären.

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

Re: Fragen zum Iterator

Beitrag von ma2604121 » 09.10.2011, 19:41:09

Ich werde mich erst noch am Array-Pager versuchen. Über den bin ich jetzt nur durch Deinen Hinweis gestolpert...

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

Re: Fragen zum Iterator

Beitrag von Megger » 16.10.2011, 18:25:54

Habe das Thema 'ArrayPager' mal ausgelagert: -> hier
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

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast