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

Thomas Nussbaumer typo3 at thomasnu.ch
Sat Sep 7 23:57:54 CEST 2013


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