Zum Inhalt springen

1:n Beziehungen darstellen

Erstellt am 7. Januar 2013 · 7 Antworten · letzte Antwort am 15. Januar 2013

Tags: Fluid, Frage

NJoyLife ·

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

	/**
	 * @var \Projekt\Projektname\Domain\Repository\AnsprechpartnerRepository
	 * @inject
	 */
	protected $ansprechpartnerRepository;	

	(...)

	public function listAction() {
		$firmas = $this->firmaRepository->findAll();
		$ansprechpartners = $this->ansprechpartnerRepository->findAll();
		$this->view->assign('firmas', $firmas);
		$this->view->assign('ansprechpartners', $ansprechpartners);
	}

List.html

<f:for each="{ansprechpartners}" as="a">
  <li>{a.vorname} {a.name}</li>
</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

beo6 ·

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.

	(...)
 
	public function listAction() {
		$firmas = $this->firmaRepository->findAll();
		$this->view->assign('firmas', $firmas);
	}

FLuid

<f:for each="{firmas}" as="firma">
  <li>{firma.name}
  <ul>
    <f:for each="{firma.ansprechpartners}" as="ansprechpartner">
      <li>{ansprechpartner.vorname} {ansprechpartner.name}</li>
    </f:for>
  </ul></li>
</f:for>

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

NJoyLife ·

Hallo boe6

>>wenn du die Beziehung schon korrekt im Extension Builder erstellt hast
Ich schätze, das ist das Problem. Vermutlich habe ich sie nicht 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":

/**
* Firma
*
* @var \Projekt\Projektname\Domain\Model\Firma
*/
protected $firma;

Und in der TCA des Ansprechpartners:

		'firma' => array(
			'exclude' => 0,
			'config' => array(
				'type' => 'inline',
				'foreign_table' => 'tx_myoffice_domain_model_firma',
				'minitems' => 0,
				'maxitems' => 1,
				'appearance' => array(
					'collapseAll' => 0,
					'levelLinksPosition' => 'top',
					'showSynchronizationLink' => 1,
					'showPossibleLocalizationRecords' => 1,
					'showAllLocalizationLink' => 1
				),
			),
		),

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

beo6 ·

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

/**
* Ansprechpartner
*
* @var \Projekt\Projektname\Domain\Model\Ansprechpartner
*/
protected $ansprechpartner;

/**
 * Returns the ansprechpartner
 *
 * @return \Projekt\Projektname\Domain\Model\Ansprechpartner $ansprechpartner
 */
public function getAnsprechpartner() {
	return $this->ansprechpartner;
}
/**
 * Sets the ansprechpartner
 *
 * @param \Projekt\Projektname\Domain\Model\Ansprechpartner $ansprechpartner
 * @return void
 */
public function setAnsprechpartner(\Projekt\Projektname\Domain\Model\Ansprechpartner $ansprechpartner) {
	$this->ansprechpartner = $ansprechpartner;
}

und im TCA von Firma ebenfalls

'ansprechpartner' => array(
			'exclude' => 0,
			'config' => array(
				'type' => 'inline',
				'foreign_table' => 'tx_myoffice_domain_model_ansprechpartner',
				'minitems' => 0,
				'maxitems' => 1,
				'appearance' => array(
					'collapseAll' => 0,
					'levelLinksPosition' => 'top',
					'showSynchronizationLink' => 1,
					'showPossibleLocalizationRecords' => 1,
					'showAllLocalizationLink' => 1
				),
			),
		),

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)

	/**
	 * Ansprechpartner
	 *
	 * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\Myoffice\Domain\Model\Ansprechpartner>
	 */
	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 ·

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:

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

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

<f:for each="{firma.ansprechpartner}" as="a">
  {a.nachname}, {a.vorname}
</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 ·

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:
Bild: bytewiese.de/…/testextension_help1.png

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

<ul>
<f:for each="{firmas}" as="firma">
	<li>{firma.name}
		<ul>
			<f:for each="{firma.ansprechpartner}" as="a">
			<li>{a.vorname} {a.nachname}</li>
			</f:for>
		</ul>
	</li>
</f:for>
</ul>

ersetzt.

Funktioniert ohne probleme.

NJoyLife ·

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 ·

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.