Grundlegende Frage zur Ausgabe anhand eines einfachen Beispiels [Gelöst]

  • 0 x
    12 Beiträge
    0 Hilfreiche Beiträge
    18. 03. 2012, 20:58

    Hallo zusammen.

    Ich habe gerade das Buch Zukunftssichere Extensions mit Extbase und Fluid durchgearbeitet bzw. bin dabei. Ich hatte Probleme mit der Beispiel Extension, sjr_offers. Darum sind mir ein paar Dinge noch nicht ganz klar. Es ein paar Basics die ich noch nicht verstanden hab. Vielleicht könnt ihr mir bitte weiterhelfen. Nur ein kleines Beispiel. Ich habe ein Model, das aus 2 Klassen besteht, eine Entity und ein Value Object. Die Entity heisst partner und das Value object heisst description. In der Entity ist eine Property, die auf das Value Object referenziert. Es besteht in 1:n Beziehung zwischen dem Eltern Objekt Partner und Kind Objekt Description. Ich habe ein Repository für die entity partner gemacht, also die Klasse die von der Repository Klasse TX_Extbase_Persistence_Repository erbt. Dann habe ich einen Controller für die Entity partner. Wenn ich nun einen View generieren will und einfach alles ausgeben möchte, was im Repository steht, konkret alle partner und für jeden partner x-Beschreibungen, die jeder partner haben kann, kann ich das dann alles mit dem partner controller machen ? mit findAll() kann ich ja z.b. alles was im repository partner steht finden dann gibt er mir aber auch nur die UID's der beschreibungen, also der klasse description aus, wenn ich das dann dem view zum rendern übergebe. wie macht man das denn nun richtig wenn man alle partner und alle dazugehörigen descriptions ausgeben möchte also nicht nur die UIDs der descriptions ? Mit der listAction(), in den nächsten Zeilen dargestellt, werden alle Objekte aus dem Partner Repository dem View übergeben, dabei werden nur die UID's der Description Objekte (Description ist ein ValueObject, im Partner Objekt ist ein Fremdschlüssel zum Description Objekt) mitübergeben, ich möchte aber dass die Description Objekte selber ausgegeben werden, also zu jedem Partner Objekt alle Description Objekte, die dazugehören, nicht nur die UID's. So, ich hoffe meine Erklärung kann man so verstehen.

    1. class Tx_PartnerFinder_Controller_Partner_Controller extends Tx_Extbase_MVC_Controller_ActionController {
    2. public function listAction(){
    3. $partnerRepository = t3lib_div::makeInstance('Tx_PartnerFinder_Domain_Repository_PartnerRepository');
    4. $partners = $partnerRepository->findAll();
    5. $this->view->assign('partners',$partners)
    6. }
    7.  
    8. }

    Vielen Dank vorab und einen guten Start in die Woche.

    Gruss Thomas


  • 1
  • BFSven BFSven
    R2-D2
    0 x
    106 Beiträge
    2 Hilfreiche Beiträge
    19. 03. 2012, 09:47

    Hallo Thomas,

    Könntest Du vielleicht noch Deine Models posten?

    Ansonsten kann ich nur raten:

    1. <f:for each="{partners}" as="partner">
    2. <h2>{partner.name}</h2>
    3. <f:for each="{partner.descriptions}" as="partnerDescription">
    4. <li>{partnerDescription.text}</li>
    5. </f:for>
    6. </f:for>

    Ein ObjectStorage implementiert Countable, Iterator und ArrayAccess, also kannst Du es wie ein Array behandeln und durchiterieren.

    Ich hoffe mit meinem blinden Beispiel weitergeholfen zu haben, ansonsten wären die Models nicht schlecht.

    Gruß, Sven

  • 0 x
    12 Beiträge
    0 Hilfreiche Beiträge
    19. 03. 2012, 11:22

    Hallo Sven,

    Danke für deine Antwort. Das ist mir klar, dass ich das durchiterieren kann, wenn ich ein Objekt zurückbekomme. Aber nochmal kurz erläutert. Ich habe 2 Klassen, eine Klasse als Aggregate Root Objekt Partner und eine Klasse als Kind Objekt Services, sorry hab das weiter oben falsch geschrieben, ich meinte anstatt Descriptions, Services. Jetzt heisst es so allgemein, dass man auf Kind Objekte für das Aggregate Root, also Elternobjekt zugreifen sollte. Ich möchte jetzt nicht nur alle Partner Objekte ausgeben lassen sondern auch alle Services und zwar so dass nacheinander ein Partner Objekt mit allen dazugehörigen Services Objekten ausgegeben wird. Anbei noch meine Models:

    1. <?php
    2.  
    3. /***************************************************************
    4.  * Copyright notice
    5.  *
    6.  * (c) 2012 Thomas Schallert <schallert@begasoft.ch>, Begasoft Informatik AG
    7.  *
    8.  * All rights reserved
    9.  *
    10.  * This script is part of the TYPO3 project. The TYPO3 project is
    11.  * free software; you can redistribute it and/or modify
    12.  * it under the terms of the GNU General Public License as published by
    13.  * the Free Software Foundation; either version 3 of the License, or
    14.  * (at your option) any later version.
    15.  *
    16.  * The GNU General Public License can be found at
    17.  * http://www.gnu.org/copyleft/gpl.html.
    18.  *
    19.  * This script is distributed in the hope that it will be useful,
    20.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    21.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    22.  * GNU General Public License for more details.
    23.  *
    24.  * This copyright notice MUST APPEAR in all copies of the script!
    25.  ***************************************************************/
    26.  
    27. /**
    28.  *
    29.  *
    30.  * @package partnerfinder
    31.  * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3 or later
    32.  *
    33.  */
    34. class Tx_Partnerfinder_Domain_Model_Partner extends Tx_Extbase_DomainObject_AbstractEntity {
    35.  
    36. /**
    37. * Name of the Begasoft Partner
    38. *
    39. * @var string
    40. * @validate NotEmpty
    41. */
    42. protected $name;
    43.  
    44. /**
    45. * Name of the Person who stands for this Partner
    46. *
    47. * @var string
    48. * @validate NotEmpty
    49. */
    50. protected $person;
    51.  
    52. /**
    53. * Street and Nr.
    54. *
    55. * @var string
    56. * @validate NotEmpty
    57. */
    58. protected $address;
    59.  
    60. /**
    61. * Zip Code
    62. *
    63. * @var integer
    64. * @validate NotEmpty
    65. */
    66. protected $zip;
    67.  
    68. /**
    69. * City of the Begasoft Partner
    70. *
    71. * @var string
    72. * @validate NotEmpty
    73. */
    74. protected $city;
    75.  
    76. /**
    77. * Services of the Begasoft Partner
    78. *
    79. * @var Tx_Extbase_Persistence_ObjectStorage<Tx_Partnerfinder_Domain_Model_Services>
    80. */
    81. protected $services;
    82.  
    83. /**
    84. * __construct
    85. *
    86. * @return void
    87. */
    88. public function __construct() {
    89. //Do not remove the next line: It would break the functionality
    90. $this->initStorageObjects();
    91. }
    92.  
    93. /**
    94. * Initializes all Tx_Extbase_Persistence_ObjectStorage properties.
    95. *
    96. * @return void
    97. */
    98. protected function initStorageObjects() {
    99. /**
    100. * Do not modify this method!
    101. * It will be rewritten on each save in the extension builder
    102. * You may modify the constructor of this class instead
    103. */
    104. $this->services = new Tx_Extbase_Persistence_ObjectStorage();
    105. }
    106.  
    107. /**
    108. * Returns the name
    109. *
    110. * @return string $name
    111. */
    112. public function getName() {
    113. return $this->name;
    114. }
    115.  
    116. /**
    117. * Sets the name
    118. *
    119. * @param string $name
    120. * @return void
    121. */
    122. public function setName($name) {
    123. $this->name = $name;
    124. }
    125.  
    126. /**
    127. * Returns the person
    128. *
    129. * @return string $person
    130. */
    131. public function getPerson() {
    132. return $this->person;
    133. }
    134.  
    135. /**
    136. * Sets the person
    137. *
    138. * @param string $person
    139. * @return void
    140. */
    141. public function setPerson($person) {
    142. $this->person = $person;
    143. }
    144.  
    145. /**
    146. * Returns the address
    147. *
    148. * @return string $address
    149. */
    150. public function getAddress() {
    151. return $this->address;
    152. }
    153.  
    154. /**
    155. * Sets the address
    156. *
    157. * @param string $address
    158. * @return void
    159. */
    160. public function setAddress($address) {
    161. $this->address = $address;
    162. }
    163.  
    164. /**
    165. * Returns the zip
    166. *
    167. * @return integer $zip
    168. */
    169. public function getZip() {
    170. return $this->zip;
    171. }
    172.  
    173. /**
    174. * Sets the zip
    175. *
    176. * @param integer $zip
    177. * @return void
    178. */
    179. public function setZip($zip) {
    180. $this->zip = $zip;
    181. }
    182.  
    183. /**
    184. * Returns the city
    185. *
    186. * @return string $city
    187. */
    188. public function getCity() {
    189. return $this->city;
    190. }
    191.  
    192. /**
    193. * Sets the city
    194. *
    195. * @param string $city
    196. * @return void
    197. */
    198. public function setCity($city) {
    199. $this->city = $city;
    200. }
    201.  
    202. /**
    203. * Adds a Services
    204. *
    205. * @param Tx_Partnerfinder_Domain_Model_Services $service
    206. * @return void
    207. */
    208. public function addService(Tx_Partnerfinder_Domain_Model_Services $service) {
    209. $this->services->attach($service);
    210. }
    211.  
    212. /**
    213. * Removes a Services
    214. *
    215. * @param Tx_Partnerfinder_Domain_Model_Services $serviceToRemove The Services to be removed
    216. * @return void
    217. */
    218. public function removeService(Tx_Partnerfinder_Domain_Model_Services $serviceToRemove) {
    219. $this->services->detach($serviceToRemove);
    220. }
    221.  
    222. /**
    223. * Returns the services
    224. *
    225. * @return Tx_Extbase_Persistence_ObjectStorage<Tx_Partnerfinder_Domain_Model_Services> $services
    226. */
    227. public function getServices() {
    228. return $this->services;
    229. }
    230.  
    231. /**
    232. * Sets the services
    233. *
    234. * @param Tx_Extbase_Persistence_ObjectStorage<Tx_Partnerfinder_Domain_Model_Services> $services
    235. * @return void
    236. */
    237. public function setServices(Tx_Extbase_Persistence_ObjectStorage $services) {
    238. $this->services = $services;
    239. }
    240.  
    241. }
    242. ?>

    1. <?php
    2.  
    3. /***************************************************************
    4.  * Copyright notice
    5.  *
    6.  * (c) 2012 Thomas Schallert <schallert@begasoft.ch>, Begasoft Informatik AG
    7.  *
    8.  * All rights reserved
    9.  *
    10.  * This script is part of the TYPO3 project. The TYPO3 project is
    11.  * free software; you can redistribute it and/or modify
    12.  * it under the terms of the GNU General Public License as published by
    13.  * the Free Software Foundation; either version 3 of the License, or
    14.  * (at your option) any later version.
    15.  *
    16.  * The GNU General Public License can be found at
    17.  * http://www.gnu.org/copyleft/gpl.html.
    18.  *
    19.  * This script is distributed in the hope that it will be useful,
    20.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    21.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    22.  * GNU General Public License for more details.
    23.  *
    24.  * This copyright notice MUST APPEAR in all copies of the script!
    25.  ***************************************************************/
    26.  
    27. /**
    28.  *
    29.  *
    30.  * @package partnerfinder
    31.  * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3 or later
    32.  *
    33.  */
    34. class Tx_Partnerfinder_Domain_Model_Services extends Tx_Extbase_DomainObject_AbstractValueObject {
    35.  
    36. /**
    37. * Titel of the Service
    38. *
    39. * @var string
    40. * @validate NotEmpty
    41. */
    42. protected $title;
    43.  
    44. /**
    45. * Description of the Service
    46. *
    47. * @var string
    48. * @validate NotEmpty
    49. */
    50. protected $description;
    51.  
    52. /**
    53. * Returns the title
    54. *
    55. * @return string $title
    56. */
    57. public function getTitle() {
    58. return $this->title;
    59. }
    60.  
    61. /**
    62. * Sets the title
    63. *
    64. * @param string $title
    65. * @return void
    66. */
    67. public function setTitle($title) {
    68. $this->title = $title;
    69. }
    70.  
    71. /**
    72. * Returns the description
    73. *
    74. * @return string $description
    75. */
    76. public function getDescription() {
    77. return $this->description;
    78. }
    79.  
    80. /**
    81. * Sets the description
    82. *
    83. * @param string $description
    84. * @return void
    85. */
    86. public function setDescription($description) {
    87. $this->description = $description;
    88. }
    89.  
    90. }
    91. ?>

    Vielen Dank für deine Hilfe.

    Gruss Thomas

  • 0 x
    12 Beiträge
    0 Hilfreiche Beiträge
    19. 03. 2012, 11:52

    Hallo Sven, so wie du es mir geschrieben hast, hat's funktioniert, vielen Dank für deine Mühe. Ich hab da noch eine Frage an Dich. Ich habe es so wie unten dargestellt gemacht. Kannst du mir bitte noch sagen, was diese argumente bedeuten ?

    1. arguments="{partner : partner}"

    1. <f:layout name="Default" />
    2.  
    3. This Template is responsible for creating a table of domain objects.
    4.  
    5. If you modify this template, do not forget to change the overwrite settings
    6. in /Configuration/ExtensionBuilder/settings.yaml:
    7. Resources:
    8. Private:
    9. Templates:
    10. List.html: keep
    11.  
    12. Otherwise your changes will be overwritten the next time you save the extension in the extension builder
    13.  
    14. <f:section name="main">
    15. <h1>Listing for Partner</h1>
    16.  
    17. <f:flashMessages />
    18.  
    19. <table class="tx_partnerfinder" >
    20. <tr>
    21. <th><f:translate key="tx_partnerfinder_domain_model_partner.name" /></th>
    22. <th><f:translate key="tx_partnerfinder_domain_model_partner.person" /></th>
    23. <th><f:translate key="tx_partnerfinder_domain_model_partner.address" /></th>
    24. <th><f:translate key="tx_partnerfinder_domain_model_partner.zip" /></th>
    25. <th><f:translate key="tx_partnerfinder_domain_model_partner.city" /></th>
    26. <th>Services:</th>
    27. <th> </th>
    28. <th> </th>
    29. </tr>
    30.  
    31. <f:for each="{partners}" as="partner">
    32. <tr>
    33. <td><f:link.action action="show" arguments="{partner : partner}"> {partner.name}</f:link.action></td>
    34. <td><f:link.action action="show" arguments="{partner : partner}"> {partner.person}</f:link.action></td>
    35. <td><f:link.action action="show" arguments="{partner : partner}"> {partner.address}</f:link.action></td>
    36. <td><f:link.action action="show" arguments="{partner : partner}"> {partner.zip}</f:link.action></td>
    37. <td><f:link.action action="show" arguments="{partner : partner}"> {partner.city}</f:link.action></td>
    38. <td><table><f:for each="{partner.services}" as="partnerservices">
    39. <tr><td>{partnerservices.title}</td><td>{partnerservices.description}</td></tr>
    40. </f:for></table></td>
    41. <td><f:link.action action="edit" arguments="{partner : partner}">Edit</f:link.action></td>
    42. <td><f:link.action action="delete" arguments="{partner : partner}">Delete</f:link.action></td>
    43. </tr>
    44. </f:for>
    45. </table>
    46.  
    47. <f:link.action action="new">New Partner</f:link.action>
    48. </f:section>

    Nochmals vielen Dank für deine Mühe. Arbeitest du schon lange mit Extbase und Fluid ? Ich möchte gerne eine Schulung zu dem Thema machen. Im Netz hab ich bis jetzt nur so Schulungen gefunden, die das Thema von Anfang an behandeln. Ich habe aber z.B. schon das ganze Buch "Zukunftssichere Extensions mit Extbase und Fluid" durchgearbeitet, darum erscheint es mir nicht sinnvoll bei 0 anzufangen.

    Gruss Thomas

  • jank jank
    Sternenflotten-Admiral
    0 x
    158 Beiträge
    0 Hilfreiche Beiträge
    19. 03. 2012, 12:10

    [quote="duke_loop"]
    ...

    1. arguments="{partner : partner}"

    ...
    [/quote]
    Das übergibt das jeweilige Partner Object an die show action im Controller.

    Somit weiß die showAction welches object sie anzeigen soll.

    Die müsste bei dir im PartnerController ja in etwa so aussehen:

    1. showAction(Tx_Partnerfinder_Domain_Model_Partner $partner){
    2. $this->view->assign('partner', $partner);
    3. }

  • 0 x
    12 Beiträge
    0 Hilfreiche Beiträge
    19. 03. 2012, 14:15

    ja, so sieht sie aus.

    danke jank....

    :-)

  • BFSven BFSven
    R2-D2
    0 x
    106 Beiträge
    2 Hilfreiche Beiträge
    19. 03. 2012, 14:39

    :( Jan war mal wieder schneller als ich :D

  • 0 x
    12 Beiträge
    0 Hilfreiche Beiträge
    19. 03. 2012, 14:45

    Arbeitet ihr schon lange mit Extbase und Fluid ? Ich möchte gerne eine Schulung zu dem Thema machen. Im Netz hab ich bis jetzt nur so Schulungen gefunden, die das Thema von Anfang an behandeln. Ich habe aber z.B. schon das ganze Buch "Zukunftssichere Extensions mit Extbase und Fluid" durchgearbeitet, darum erscheint es mir nicht sinnvoll bei 0 anzufangen. Was denkt ihr ?

  • jank jank
    Sternenflotten-Admiral
    0 x
    158 Beiträge
    0 Hilfreiche Beiträge
    19. 03. 2012, 15:20

    [quote="BFSven"]
    :( Jan war mal wieder schneller als ich :D
    [/quote]
    Sorry... wenn du möchtest halte ich mich mit meinem Halbwissen zurück :)

    @duke_loop
    Zur Schulung:
    Wenn du das Buch durchgearbeitet hast und du dir trotzdem nicht sicher bist, dass

    1. arguments="{partner : partner}"
    das Object an die Action im Controller weiter gibt, kann eine Schulung nicht schaden. Ist nicht böse gemeint!!! ;)

    Ich spiele auch mit dem Gedanken auf eine Schulung zu gehen, obwohl ich schon ein paar kleine eigene Extbase/Fluid Erweiterungen in Verwendung habe.
    Eine vernünftige Schulung kann nie schaden, auch wenn von 0 angefangen wird.

  • 1