1:n Beziehungen darstellen [Gelöst]

  • NJoyLife NJoyLife
    R2-D2
    0 x
    83 Beiträge
    1 Hilfreiche Beiträge
    07. 01. 2013, 20:56

    Hallo zusammen
    Ich wage meine ersten Schritte mit Extbase/Fluid unter Typo3 6.0.
    In der Listenansicht werden Firmen angezeigt und in einer Spalte möchte ich alle Ansprechpartner (als 1:n-Beziehung im ExtensionBuilder modelliert) zu dieser Firma ausgeben.

    In etwa so
    - Firma 1
    - Ansprechpartner 1
    - Ansprechpartner 2
    - Firma 2
    - Ansprechpartner 1
    - Ansprechpartner 2

    Meine Idee:
    FirmaController.php

    1. /**
    2. * @var \Projekt\Projektname\Domain\Repository\AnsprechpartnerRepository
    3. * @inject
    4. */
    5. protected $ansprechpartnerRepository;
    6.  
    7. (...)
    8.  
    9. public function listAction() {
    10. $firmas = $this->firmaRepository->findAll();
    11. $ansprechpartners = $this->ansprechpartnerRepository->findAll();
    12. $this->view->assign('firmas', $firmas);
    13. $this->view->assign('ansprechpartners', $ansprechpartners);
    14. }

    List.html

    1. <f:for each="{ansprechpartners}" as="a">
    2. <li>{a.vorname} {a.name}</li>
    3. </f:for>

    Das gibt mir zumindest schonmal alle Ansprechpartner aus (findAll). Was ich brauche ist aber wohl findByFirma(), doch diese Methode erwartet ja die Firma als Parameter. Wo bekomme ich die her?

    Vielen Dank im Voraus für Tipps und Hinweise!

    Viele Grüße
    NJoyLife


  • 1
  • beo6 beo6
    Padawan
    0 x
    45 Beiträge
    1 Hilfreiche Beiträge
    12. 01. 2013, 20:58

    Hallo.

    wenn du die Beziehung schon korrekt im Extension Builder erstellt hast solltest du ganz einfach an die jeweiligen Ansprechpartner einer Firma kommen. Du solltest nicht einmal das Repository per inject laden müssen.

    1. (...)
    2.  
    3. public function listAction() {
    4. $firmas = $this->firmaRepository->findAll();
    5. $this->view->assign('firmas', $firmas);
    6. }

    FLuid

    1. <f:for each="{firmas}" as="firma">
    2. <li>{firma.name}
    3. <ul>
    4. <f:for each="{firma.ansprechpartners}" as="ansprechpartner">
    5. <li>{ansprechpartner.vorname} {ansprechpartner.name}</li>
    6. </f:for>
    7. </ul></li>
    8. </f:for>

    (wenn das Property in deinem Firma-Model ansprechpartners lautet.)

  • NJoyLife NJoyLife
    R2-D2
    0 x
    83 Beiträge
    1 Hilfreiche Beiträge
    14. 01. 2013, 10:52

    Hallo boe6

    >>wenn du die Beziehung schon korrekt im Extension Builder erstellt hast
    Ich schätze, das ist das Problem. Vermutlich habe ich sie [u]nicht[/u] richtig erstellt. Dummerweise habe ich schon sehr viele Änderungen am Code vorgenommen und möchte daher ungern neu modellieren...
    Wenn ich die Beziehung zwischen Firmen und Ansprechpartnern korrekt modellieren möchte - welche Anpassungen müssen dann vorgenommen werden, bzw. wie kann ich prüfen, ob sie korrekt modelliert wurde?

    Im Model Ansprechpartner gibt es die Eigenschaft "firma":

    1. /**
    2. * Firma
    3. *
    4. * @var \Projekt\Projektname\Domain\Model\Firma
    5. */
    6. protected $firma;

    Und in der TCA des Ansprechpartners:

    1. 'firma' => array(
    2. 'exclude' => 0,
    3. 'config' => array(
    4. 'type' => 'inline',
    5. 'foreign_table' => 'tx_myoffice_domain_model_firma',
    6. 'minitems' => 0,
    7. 'maxitems' => 1,
    8. 'appearance' => array(
    9. 'collapseAll' => 0,
    10. 'levelLinksPosition' => 'top',
    11. 'showSynchronizationLink' => 1,
    12. 'showPossibleLocalizationRecords' => 1,
    13. 'showAllLocalizationLink' => 1
    14. ),
    15. ),
    16. ),

    Vielen Dank schonmal im Voraus und viele Grüße!

  • beo6 beo6
    Padawan
    0 x
    45 Beiträge
    1 Hilfreiche Beiträge
    14. 01. 2013, 16:58

    Hallo,

    wenn ich das jetzt richtig verstehe hast du es genau anders herum als im ersten Post erklärt.

    Es sah nach deinem Post so aus als hättest du ein Feld im Model Firma für mehrere Ansprechpartner.

    Das sieht mir aber so aus als hättest du dem Model Ansprechpartner ein Feld Firma gegeben womit du einem Ansprechpartner mehrere Firmen zuordnen könntest.

    Du müsstest also eher im Firma-Model

    1. /**
    2. * Ansprechpartner
    3. *
    4. * @var \Projekt\Projektname\Domain\Model\Ansprechpartner
    5. */
    6. protected $ansprechpartner;
    7.  
    8. /**
    9.  * Returns the ansprechpartner
    10.  *
    11.  * @return \Projekt\Projektname\Domain\Model\Ansprechpartner $ansprechpartner
    12.  */
    13. public function getAnsprechpartner() {
    14. return $this->ansprechpartner;
    15. }
    16. /**
    17.  * Sets the ansprechpartner
    18.  *
    19.  * @param \Projekt\Projektname\Domain\Model\Ansprechpartner $ansprechpartner
    20.  * @return void
    21.  */
    22. public function setAnsprechpartner(\Projekt\Projektname\Domain\Model\Ansprechpartner $ansprechpartner) {
    23. $this->ansprechpartner = $ansprechpartner;
    24. }

    und im TCA von Firma ebenfalls

    1. 'ansprechpartner' => array(
    2. 'exclude' => 0,
    3. 'config' => array(
    4. 'type' => 'inline',
    5. 'foreign_table' => 'tx_myoffice_domain_model_ansprechpartner',
    6. 'minitems' => 0,
    7. 'maxitems' => 1,
    8. 'appearance' => array(
    9. 'collapseAll' => 0,
    10. 'levelLinksPosition' => 'top',
    11. 'showSynchronizationLink' => 1,
    12. 'showPossibleLocalizationRecords' => 1,
    13. 'showAllLocalizationLink' => 1
    14. ),
    15. ),
    16. ),

    alles ist nicht getestet. Es sieht mir nach Typo3 4.7 aus.
    Das habe ich übersprungen und bin von Typo3 4.5 im moment auf 6.0 am wechseln.

    Aber ich denke du verstehst wie ich es meine.

    Edit:
    Das Model müsste wohl eher ca. so aussehen damit auch mehrere ansprechpartner darin sind. (von Typo3 6.0)

    1. /**
    2. * Ansprechpartner
    3. *
    4. * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\Myoffice\Domain\Model\Ansprechpartner>
    5. */
    6. protected $ansprechpartner;

    Aber mache doch einfach eine Sicherheitskopie deiner Erweiterung, lade die aktuelle in den Extension Builder und übernimm nur die Models und überprüfe die TCA und pass die sql-Datei an.

  • NJoyLife NJoyLife
    R2-D2
    0 x
    83 Beiträge
    1 Hilfreiche Beiträge
    14. 01. 2013, 21:37

    Hallo beo6

    Ich schaff es einfach nicht. Die Anpassungen wie in deinem Code beschrieben habe ich vorgenommen. Keine Fehlermeldung aber auch keinerlei Auswirkungen. Die Ansprechpartner bleiben leer.

    Habe nun deinen Rat befolgt und eine neue Extension angelegt. Ganz simpel mit nur zwei Modellen:

    [b]Firma[/b]
    Property: name
    Relation: ansprechpartner (Ja, diesmal sorum - denn eigentlich ist es sinnvoller)

    [b]Ansprechpartner[/b]
    Properties: vorname, nachname

    Im Backend funktioniert die Zuordnung Firma zu Ansprechpartner. Aber im Frontend wird es nicht angezeigt...

    Ich habe als einzige Codeanpassung in der List.html der Firma folgendes vorgenommen:

    1. <f:for each="{firma.ansprechpartner}" as="a">
    2. {a.nachname}, {a.vorname}
    3. </f:for>

    Es ist wie verhext... Cache leeren bringt nichts, auch nicht das manuelle Leeren aller Typo3-Cachetabellen in der Datenbank. Wo könnte es da nur haken?

    Achja: Ich nutze Typo3 6.0 und den Extension Builder 2.5.1...

    Viele Grüße und vielen Dank für deine Geduld!

  • beo6 beo6
    Padawan
    0 x
    45 Beiträge
    1 Hilfreiche Beiträge
    14. 01. 2013, 21:59

    Hallo NJoyLife.

    Ich habe es gerade extra noch einmal selber ausprobiert.

    Ich habe eine Extension mit dem Extension Builder 2.5.1 in Typo3 6.0 erstellt.

    als target-version: Typo3 4.7

    und die zwei Models wie im Screenshot:
    [img]http://bytewiese.de/fileadmin/_media/images/testextension_help1.png[/img]

    dann entsprechend im Backend testinhalte eingefügt und in der List.html alles zwischen <f:section> entfernt und mit

    1. <ul>
    2. <f:for each="{firmas}" as="firma">
    3. <li>{firma.name}
    4. <ul>
    5. <f:for each="{firma.ansprechpartner}" as="a">
    6. <li>{a.vorname} {a.nachname}</li>
    7. </f:for>
    8. </ul>
    9. </li>
    10. </f:for>
    11. </ul>

    ersetzt.

    Funktioniert ohne probleme.

  • NJoyLife NJoyLife
    R2-D2
    0 x
    83 Beiträge
    1 Hilfreiche Beiträge
    15. 01. 2013, 09:14

    Hi boe6

    Vielen Dank für die Unterstützung. Habe es heute morgen neu geladen und schon ging es. Ich bin echt verunsichert was das Caching angeht. Hast du einen Tipp, wie man das beim Entwickeln unterbinden kann?

    Nochmals danke und viele Grüße!
    NJoyLife

  • beo6 beo6
    Padawan
    0 x
    45 Beiträge
    1 Hilfreiche Beiträge
    15. 01. 2013, 12:41

    Hallo.
    Freut mich das es jetzt funktioniert.

    Du kannst vielleicht den cache während der Entwicklung mit

    config.no_cache = 1

    Im TS deaktivieren. Jedoch nicht vergessen ihn später wieder zu aktivieren.

  • 1