Zum Inhalt springen

Zwei Domain Models mit MM-Relation

Erstellt am 30. Mai 2011 · 1 Antwort · letzte Antwort am 30. Mai 2011

Tags: TCA, Frage

Typo3Cuckoo ·

Hi,

ich hab etwas Schwierigkeiten mit der Relation zweier Domain Models. Es geht um folgendes:

Bisher hatte ich ein Domain Model, welches schon sauber funktioniert (speichern und ausgeben der Daten geht problemlos). Nun möchte ich ein zweites Domain Model erstellen, welches mit dem Ersten über einen m:n Relation verkettet wird.

Das zweite Domain Model sollen Kategorien sein. Es beinhaltet hauptsächlich ein Feld für den Namen der Kategorie und hat den Klassennamen "Tx_MyExt_Domain_Model_Category".

Das erste Domain Model soll nun ein Select-Feld erhalten, in dem eine Kategorie ausgewählt werden kann. Klassennamen soll bsplw. "Tx_MyExt_Domain_Model_Car" sein. Die Kategorien sollen jetzt natürlich aus den angelegten Datensätzen des zweiten Domain Models kommen und könnten z.B. die Namen aller Autohersteller sein.

Das Domain Model "Category" sieht nun wie folgt aus (Domain/Model/Category.php):

<?php

class Tx_MyExt_Domain_Model_Category extends Tx_Extbase_DomainObject_AbstractEntity {
	
	/**
	 * @var string
	 **/
	protected $name;
    
	public function __construct($name='') {
		$this->setName($name);
	}
	
	/**
	 * 
	 * @param string $name
	 */
	public function setName($name) {
		$this->name = (string)$name;
	}
	
	/**
	 * 
	 * @return string
	 */
	public function getName() {
		return $this->name;
	}
	
}

Das Domain Model "Car" habe ich um folgendes erweitert (Domain/Model/Car.php):

<?php

class Tx_MyExt_Domain_Model_Car extends Tx_Extbase_DomainObject_AbstractEntity {

	[...]

	/**
	 * 
	 * @var Tx_MyExt_Domain_Model_Category
	 */
	protected $categories;
	
	
	public function __construct($categories=0) {
		
		[...]
		
		$this->setCategories($categories);
		
		[...]
	}
	
	[...]
	
	/**
	 * 
	 * @param int $categories
	 */
	public function setCategories($categories) {
	  $this->categories = $categories;
	}
	
	/**
	 * 
	 * @return Tx_MyExt_Domain_Model_Category
	 */
	public function getCategories() {
	  return $this->categories;
	}
	
}

?>

Die tca.php hab ich folgendermaßen erweitert:

<?php
$TCA['tx_myext_domain_model_car'] = array (
	
	[...]
	
	'columns' => array(
		'categories' => array(
			'exclude' => 1,
			'label' => 'Kategorien',
			'config' => array(
				'type' => 'select',
				'size' => 1,
				'minitems' => 1,
				'maxitems' => 1,
				'multiple' => 0,
				'default' => 0,
				'foreign_table' => 'tx_myext_domain_model_category',
				'MM' => 'tx_myext_car_category_mm',
			)
		),
	)
	
	[...]
	
);
?>

Ok, nun zum eigentlichen Problem:

im Backend kann ich alles anlegen, die m:n Relation scheint also funktioniert zu haben. Die angelegten Kategorien werden im neuen Select Feld in einem Datensatz des Domain Models "Car" angezeigt. In der Datenbanktabelle der MM-Relation werden auch die passenden Einträge erstellt.

Geh ich jetzt ins Frontend, dann erhalte ich diese Fehlermeldung:

Tx_Extbase_Persistence_Exception_UnexpectedTypeException
Could not determine the type of the contained objects.

Ich versteh die Fehlermeldung nicht. Wenn ich in Google danach sucher erhalte ich keine hilfreichen Ergebnisse! 🙁

Was bedeutet die Fehlermeldung und was hab ich falsch gemacht?

Danke schon mal! 🙂

Typo3Cuckoo ·

Umm ... ich hab grad ganz stupide eine solche Implementation aus der Extension "SjrOffers" kopiert.

Problem war, dass ich die Variable $categories im Domain Model "Car" nicht als Persistence Object Storage definiert hatte!

<?php
/**
 * 
 * @var Tx_Extbase_Persistence_ObjectStorage<Tx_MyExt_Domain_Model_Category>
 * @lazy
 */
protected $categories;
?>

Dementsprechend musste ich auch die dazugehörigen get/set Funktionen anpassen

<?php
/**
 * 
 * @param Tx_Extbase_Persistence_ObjectStorage $categories
 */
public function setCategories($categories) {
  $this->categories = $categories;
}

/**
 * 
 * @return Tx_Extbase_Persistence_ObjectStorage<Tx_MyExt_Domain_Model_Category>
 */
public function getCategories() {
  return clone $this->categories;
}
?>

Im der Funktion __construct() steht nun das hier:

<?php
$this->categories = new Tx_Extbase_Persistence_ObjectStorage;
?>

Die oben beschriebene Fehlermeldung taucht nun nicht mehr auf.

Was ist ein Persistence Object Storage und warum ist das hier notwendig?

Danke für jede Hilfe! 🙂