[TYPO3-german] Extbase: Model mit eigener Methode -> wie von array nach objext umwandeln?

Thomas Nussbaumer typo3 at thomasnu.ch
Tue Sep 10 10:36:19 CEST 2013


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
>>>>
>>>
>>
>



More information about the TYPO3-german mailing list