Hi Robert

Extbase ist sehr vielfältig einsetzbar. Meine Ext enthält mehrere Plugins. Eines heisst News und enthält zB im newsController die calendarAction:

Tx_Extbase_Utility_Extension::configurePlugin(
        $_EXTKEY, 'News',
        array(
'News' => 'index, banner, calendar, info, detail, edit, update, new, create, delete',
                'Mail' => 'index, edit, update, new, create, delete'
        ),
        array(
                'News' => 'edit, update, new, create, delete',
                'Mail' => 'index, edit, update, new, create, delete'
        )
);
In meine Ext (thomasnu im TER) packe ich alles was ich an Extbase und Fluid brauche (und einiges mehr). Natürlich kann nur ich sie direkt brauchen. Ist auch nicht dokumentiert. Aber als Vorlage kann sie dienen.

Zum Beispielcode: Natürlich liefert findAll() alle $events. Es fehlt noch getPerformances($event). Also eine weitere Schleife, wenn du nicht nur alle Stücke eines bestimmten Events brauchst. Das Prinzip bleibt jedoch gleich. Solche Fehler zeigen sich sofort beim schrittweisen Testen.

LG Thomas

Am 09.09.2013 19:23, schrieb Robert Wildling:
Hallo, lieber Thomas,

Danke für deine ausführliche Antwort und deinen Input! iterator_to_array
kannte ich nicht!!

Zum EventController:
Bis jetzt war mir noch nicht klar, wie ich 2 oder mehrere controller
verwenden kann. Ich hab so das Gefühl, dass dein Code Snippet mir da ein
Lämpchen anschaltet! Werde das gleich mal probieren! Herzlichen Dank
dafür!!!

Schönen Abend noch!
Robert

Hi Robert

Ja, ich hatte hatte eine solche Anforderung noch nie. Auch keine
Erfahrung mit m:m Beziehungen. Meine Ext basieren auf 1:n wie Blog
Example und dem Buch von Jochen Rau. Ich nehme an du hast drei
Modelle: Event, Performance und Piece. Mir ist nicht klar wieso du
nicht für die separate Seite im EventController eine eigene Action
erstellen kannst (mit switchableControllerActions). Ich denke etwa so:

$performances = iterator_to_array($this->eventRepository->FindAll());
foreach ($performances as $performance)
  $pieces =
iterator_to_array($this->performanceRepository->getPices($performace));
  foreach ($pieces as $piece)
     $allPieces[] = array('title' => $piece['title'], ...);

Das ist nur eine Idee. Habs nicht getestet. Weiss nicht ob
iterator_to_array() nötig ist. Im groupedForViewHelper ist sie noch, im
forViewHelper nicht mehr. Übrigens sind die ViewHelper nützliche
Vorlagen für PHP mit Objekten. Meine schreibe ich wenns in Fluid zu
komplizert oder unmöglich ist. Das Ergebnis meiner Codeschnipsel
kannst du bei http://ga.thomasnu.ch/index.php?id=89 anschauen. Da
diese Agenda nicht mehr aktiv ist fehlen die Links bei den Tagen.

Liebe Grüsse. Thomas

Am 08.09.2013 10:35, schrieb Robert Wildling:
Hallo, Thomas,

Danke für's Teilen deines Code-Snippets! Definitiv etwas, das ich mir
merken werde! Welche ViewHelper verwendest du da? Eigene?

Im deinem Beispiel allerdings wird nicht ein Objekt in ein Array
verwandelt, wenn ich das richtig erkenne. Zusätzlich wäre es mir
wichtig, dass sich diese Arbeitsschritte alle im Model (oder Repository?
wo ist's besser?) befinden, weil ich keinen extra Controller anwerfen
kann (zuviele andere Daten, Zerstückelung der View).

So eine Anforderung hast du wohl nicht zufällig auch schon mal gehabt??

Jedenfalls danke! Dein Snippet schau ich mir mal ganz unäbhängig davon
an. (Kannst du mir vielleicht noch etwas zu den ViewHelpern verraten?
Was macht tnu:calendarDay? Das Attribut "add"?)

Beste Grüße!
Robert

Hi Robert

Für einen Kalender baute ich ein Array $weeks auf, das als Extbase
Objekt verwendet werden kann:

Controller:
$weeks = array();
for ($i = 0; $i < 3; $i++) {
    $m = $month + $i;
    if ($m > 12) {
        $m -= 12;
        if ($y == $year) $y++;
    }
    $first = mktime(0, 0, 0, $m, 1, $y);
    $w = date('w', $first);
    $monday = $first - 86400 * (($w == 0) ? 6 : $w - 1);
    while (date('Ym', $monday) <= 100 * $y + $m) {
        $weeks[] = array('monday' => $monday, 'month' => $m, 'first'
=> $first);
        $monday += 7 * 86400;
    }
}
$this->view->assign('weeks', $weeks);

View:
<f:groupedFor each="{weeks}" as="weekOfThisFirst" groupBy="first"
groupKey="first">
  <tr>
    <td width="160" align="right" bgcolor="#FFDDBB"
colspan="8"><b><tnu:term format="M Y">{first}</tnu:term></b></td>
  </tr>
  <f:for each="{weekOfThisFirst}" as="week" iteration="iter">
    <f:if condition="{iter.isFirst}">
      <tr>
        <td width="13" class="mini" bgcolor="#EEEECC">&nbsp;</td>
        <f:for each="{0:0, 1:1, 2:2, 3:3, 4:4, 5:5, 6:6}" as="wday">
          <td width="21" class="mini" align="right"
bgcolor="#EEEECC"><font color="#800000">
          <tnu:term format="D2"><tnu:calendarDay
add="{wday}">{week.monday}</tnu:calendarDay></tnu:term></font></td>
        </f:for>
      </tr>
    </f:if>
      <tr>
        <td width="13" align="right" class="mini"
bgcolor="#EEEECC"><font color="#800000"><tnu:term
format="W">{week.monday}</tnu:term></font></td>
        <tnu:calendarDay add="0" month="{week.month}"
links="{dayLinks}">{week.monday}</tnu:calendarDay>
        <tnu:calendarDay add="1" month="{week.month}"
links="{dayLinks}">{week.monday}</tnu:calendarDay>
        <tnu:calendarDay add="2"
month="{week.$this->productRepository->FindAll()month}"
links="{dayLinks}">{week.monday}</tnu:calendarDay>
        <tnu:calendarDay add="3" month="{week.month}"
links="{dayLinks}">{week.monday}</tnu:calendarDay>
        <tnu:calendarDay add="4" month="{week.month}"
links="{dayLinks}">{week.monday}</tnu:calendarDay>
        <tnu:calendarDay add="5" month="{week.month}"
links="{dayLinks}">{week.monday}</tnu:calendarDay>
        <tnu:calendarDay add="6" month="{week.month}"
links="{dayLinks}">{week.monday}</tnu:calendarDay>
      </tr>
  </f:for>
</f:groupedFor>

Ich hoffe du hast mit diesen Ausschnitten einige Anregungen für die
Lösung deines Problems.

LG Thomas


Am 07.09.2013 19:22, schrieb Robert Wildling:
Hi, liebe ExtbaselerInnen,

In meiner kleinen Event-Extension sieht es so aus, dass innerhalb
eines
Events (zB ein Theaterfestival) mehrere Veranstaltungen (theatre
perfomances) sein können. Jede Performance wiederum kann aus einer
Aneinanderreihung einzelner kleiner Stücke bestehen. Das ganze ist mit
m:m-Realtionen gelöst:

Event <-m:m-> Performaces <-m:m-> Pieces

Schematische Darstellung des gewünschten Zielergebnisses:

Event
- Performance 2
-- piece 1
-- piece 2
-- piece 3
- Performance 2
-- piece 1
-- piece 2
-- piece 3

Nun sollen auf einer separaten Seite *alle* "pieces" angezeigt werden,
möglichst in alphabetischer Reigenfolge (die Performances sollen
*nicht*
angezeigt werden):

Event
- piece 1
- piece 2
- piece 3
- piece 4
- piece 5
- piece 6

Dazu versuche ich nun, im Event-Model eine Methode einzubauen, die
getPieces heißt und die aus allen zu diesem Event gehörnenden
Performaces alle Stücke lesen und sortieren soll. Da häng ich jetzt
aber: denn soweit ich weiß, muss das Objekt zunächst mal in ein Array
umgewandelt, dann durch die Array-Funktionen geschickt und schließlich
wieder in ein Objekt umgewandelt werden. Ich weiß nicht, wie das in
Extbase 6.1 gehen soll. Bisher habe ich nur das - die Kommentare
beschreiben meine Probleme:

class Events extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
     /**
      * Performances that take place within this event
      * @var
\TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Rowild\Theaterevents\Domain\Model\Performances>



      */
     protected $performances;

     /**
      * pieces: get all the pieces from all the performances
      * @var
\TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Rowild\Theaterevents\Domain\Model\Pieces>



      */
     protected $pieces;

     [...]
     protected function initStorageObjects() {
         $this->performaces = new
\TYPO3\CMS\Extbase\Persistence\ObjectStorage();
         // muss hier für pieces noch ein eigenes storage initiiert
werden??
     }

         /**
      * Returns the performaces
      * @return
\TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Rowild\Theaterevents\Domain\Model\Concerts>


$performacesafter
      */
     public function getPerformaces() {
         return $this->performaces;
     }

     /**
      * Returns the pieces
      *
      * @ return
\TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Rowild\Theaterevents\Domain\Model\Compositions>


$premieres
      */
     public function getPieces() {
         $pieces = $this->getPieces();
        // $pieces = $this->getPieces()->toArray(); // ? toArray
scheint
es nicht mehr zu geben in Extbase 6.*

         foreach ($pieces as $piece) {
             var_dump(get_object_vars($piece)); // spuckt nichts aus
             $array[] = json_decode(json_encode($piece), true); //
detto

             //$ua[] = $this['pieces']['title']; // das ist der
Array-Ansatz, der bei Objekten aber nicht funktioniert
             // TODO: Doppelte entfernen.
         }
         //print_r($array);
         return $pieces;
     }
}


Wie muss ich denn diese Funktion getPieces gestalten, um zunöchst ein
Array und dann wieder ein Objekt zu bekommen?
Ich bitte um Tipps, Links, etc!

Vielen Dank!
Beste Grüße
Robert





_______________________________________________
TYPO3-german mailing list
TYPO3-german@lists.typo3.org
http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german

Antwort per Email an