Hallo,
Das Problem besteht darin, dass mir nicht vorhandene Parameter in die URL geschmuggelt werden welche dafür sorgen, dass ein nicht vorhandenes Objekt gebaut werden soll und der Controller gibt die entsprechende Fehlermeldung aus. Leider muss ich für die Erklärung weiter ausholen.
Die Extension besteht aus einer Übersichtsliste von Referenzen die über ein Formular mit 2 Parametern gefiltert werden muss. Dies geschieht mit dem Model Filter das einen zusätzlichen 3 Parameter enthält der hier im Formular aber nicht verwendet wird aber im Model vorhanden ist (siehe Erklärung später) immer über ein Post und läuft ohne Probleme.
Den Detailseiten wird der Filter mit <f:link.action arguments="{filter: filter}}" /> übergeben, weil dort "weiter" und "zurück" Buttons für die Navigation innerhalb der Filterung verwendet werden. Hier gibt es keine Probleme den Filter zu übergeben und zu verwenden.
Nun gibt es aber einen weiteren Link auf den Detailseiten der zurück auf die Listenansicht verweist, aber einen weiteren Filter für die entsprechende Firma setzt (und die anderen 2 Parameter auf default belässt). Da ich zwei verschiedene Filter verwende initialisiere ich den Firmenfilter über $filterFachbetrieb = new Filter() und setze die Firmenid. Die anderen 2 Parameter sind über Defaultwerte automatisch gesetzt.
Wenn ich diesen Filter jetzt allerdings an einen Link übergebe, habe ich dort zusätzliche Parameter die ich nicht brauche bzw. mir die Ausgabe auf der Übersichtsseite zerstören, weil nun eine leere uid übergeben wird, zu der natürlich kein Objekt gebaut werden kann.
Das ganze hier einmal mit Code:
Filter Model
<?php class Tx_WeruReferenzen_Domain_Model_Filter extends Tx_Extbase_DomainObject_AbstractValueObject { /** * @var integer */ protected $objektArt = -1; /** * @var integer */ protected $objektArbeitsTyp = -1; /** * @var integer */ protected $fachbetriebId = 0; public function getObjektArt() { return $this->objektArt; } public function setObjektArt($objektArt) { $this->objektArt = $objektArt; } public function getObjektArbeitsTyp() { return $this->objektArbeitsTyp; } public function setObjektArbeitsTyp($objektArbeitsTyp) { $this->objektArbeitsTyp = $objektArbeitsTyp; } public function getFachbetriebId() { return $this->fachbetriebId; } public function setFachbetriebId($fachbetriebId) { $this->fachbetriebId = $fachbetriebId; } } ?>
Controller mit ‹bersichtsseite (list) und Detailseite (preview)
<?php /** * action list * * @param Tx_WeruReferenzen_Domain_Model_Filter $filter * @dontverifyrequesthash * * @return void */ public function listAction(Tx_WeruReferenzen_Domain_Model_Filter $filter = null) { $this->response->addAdditionalHeaderData('<script type="text/javascript" src="typo3conf/ext/weru_referenzen/Resources/Public/Javascripts/referenzen.js"></script>'); // search the results if($filter != null){ //echo 'YES'; $referenzs = $this->referenzRepository->findFiltered($filter); } else{ //echo 'NO'; $filter = new Tx_WeruReferenzen_Domain_Model_Filter(); $referenzs = $this->referenzRepository->findAll(); } // select field options $gebaeudeartenObjekt = $this->objektArtRepository->findAll(); $gebaeudeartenObjekt->toArray() ); -1=>Tx_Extbase_Utility_Localization::translate('list.filter.all', 'weru_referenzen'), 0=>Tx_Extbase_Utility_Localization::translate('list.objektArbeitsTyp.0', 'weru_referenzen'), 1=>Tx_Extbase_Utility_Localization::translate('list.objektArbeitsTyp.1', 'weru_referenzen') ); $this->view->assign('filter', $filter); $this->view->assign('referenzs', $referenzs); $this->view->assign('gebaeudearten', $gebaeudearten); $this->view->assign('arbeitsTyp', $arbeitsTyp); } /** * action preview * * @param Tx_WeruReferenzen_Domain_Model_Referenz $referenz * @param Tx_WeruReferenzen_Domain_Model_Filter $filter * @dontverifyrequesthash * @return void */ public function previewAction(Tx_WeruReferenzen_Domain_Model_Referenz $referenz, Tx_WeruReferenzen_Domain_Model_Filter $filter = null) { $this->response->addAdditionalHeaderData('<script type="text/javascript" src="typo3conf/ext/weru_referenzen/Resources/Public/Javascripts/galleria-1.2.9.min.js"></script>'); $this->response->addAdditionalHeaderData('<script type="text/javascript" src="typo3conf/ext/weru_referenzen/Resources/Public/Javascripts/referenzen.js"></script>'); $next = $this->referenzRepository->getNext($referenz); $prev = $this->referenzRepository->getPrev($referenz); if($filter == null){ $filter = new Tx_WeruReferenzen_Domain_Model_Filter(); } $filterBetrieb = new Tx_WeruReferenzen_Domain_Model_Filter(); $filterBetrieb->setFachbetriebId($referenz->getFachbetrieb()->getUid()); $this->view->assign('filter', $filter); $this->view->assign('filterBetrieb', $filterBetrieb); $this->view->assign('referenz', $referenz); $this->view->assign('next', $next); $this->view->assign('prev', $prev); } ?>
Die Detailseite
<f:link.action action="list" pageUid="{settings.listPid}" arguments="{filter: filterBetrieb}" class="internal-link">Nur Referenzen dieses Fachbetriebs</f:link.action>
Der genereirte Link enthält zusätzlich zu den Filter Paramatern objektArt=-1, objektArbeitsTyp=-1 und fachbetriebId=14 auf einmal filter[uid]= und filter[pid]= . Dadurch versucht die Listenübersicht das Filterobjekt anhand der uid wieder zusammen zu bauen was natürlich fehlschlägt. Aber selbst wenn ich das Filterobjekt debugge, enthält es diese zwei uid und pid Parameter nicht. Das Model ist auch ein ValueObjekt und keine Entity. Ich habe keine Ahnung woher die Parameter kommen oder wie ich sie deaktiviere.
Ich weiß das der Sachverhalt etwas schwierig nachzuvollziehen ist. Wenn noch weitere Infos gebraucht werden, poste ich sie natürlich gerne.
Danke im voraus :)

