Hallo,
ich steh absolut auf dem Schlauch, folgender Sachverhalt:
Ich will eine eigene Extension schreiben, Kleinanzeigen für Autos,
Dazu hab ich per Extensionbuilder zwei Domainmodels (also Tabellen erstellt)
- Anzeigen Tabelle (Properties: Text, Relation Kategorie)
- Kategorie Tabelle (Properties: typ)
Jetzt will ich im frontend einfach eine Anzeige aufgeben, dazu den Text eingeben und die Kategorie (den Typ) des Autos auswählen.
Ich bearbeite dazu die Datei FormFields.html
Da tut sich dann auch was, allerdings krieg ich es nicht hin, dass in der SelectBox auch was steht. Die bleibt leer.
<f:form.select property="kategorie" options="{kategorie}" optionLabelField="typ" />
Kann man das so nicht machen? Muss ich sonst noch irgendwas berücksichtigen/verändern/eintragen?!?!
Bin für jeden Hinweis dankbar!
Debugge mal die Variable "kategorie" und schau ob Sie auch an den View übergeben wird.
<f:debug>{kategorie}</f:debug>
ist NULL, also leer,
ich denke ich hab irgendwas noch falsch gemacht beziehungsweise vergessen was die dependencies injection angeht.
- ich hab die repository Klasse erzeugt (ist im ordner repository, Kategorie.php)
- ich im Anzeigen Controller die Repository Klasse instanziert
/**
* kategorieRepository
*
* @var \RPS\meine_EXT\Domain\Repository\KategorieRepository
* @inject
*/
protected $kategorieRepository;
Bin mir da aber nicht sicher ob ich nicht noch was machen muss um eine Instanz des Objekts zu erzeugen, und blick da bei den vielen Dokus zu extbase vers 1.3 bis 6.1 nicht mehr durch was aktuell ist.
Ich habe typo 6.1.7 installiert das ist mit extbase 6.1 wenn ichs richtig weis.
Danke!!!!
Zeig mir mal den Controller für die Ansicht in der die Kategorien angezeigt werden sollen.
Erst mal Danke für deine Mühe...
hier mal der die AnzeigenController.php
class AnzeigenController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
/**
* anzeigenRepository
*
* @var \HH\TestAnzeigen\Domain\Repository\AnzeigenRepository
* @inject
*/
protected $anzeigenRepository;
/**
* anzeigenRepository
*
* @var \HH\TestAnzeigen\Domain\Repository\AnzeigenRepository
* @inject
*/
protected $kategorieRepository;
/**
* action list
*
* @return void
*/
public function listAction() {
$anzeigens = $this->anzeigenRepository->findAll();
$this->view->assign('anzeigens', $anzeigens);
}
/**
* action show
*
* @param \HH\TestAnzeigen\Domain\Model\Anzeigen $anzeigen
* @return void
*/
public function showAction(\HH\TestAnzeigen\Domain\Model\Anzeigen $anzeigen) {
$this->view->assign('anzeigen', $anzeigen);
}
/**
* action new
*
* @param \HH\TestAnzeigen\Domain\Model\Anzeigen $newAnzeigen
* @dontvalidate $newAnzeigen
* @return void
*/
public function newAction(\HH\TestAnzeigen\Domain\Model\Anzeigen $newAnzeigen = NULL) {
$this->view->assign('newAnzeigen', $newAnzeigen);
$this->view->assign('alleKategorien', $this->kategorieRepository->findAll());
}
/**
* action create
*
* @param \HH\TestAnzeigen\Domain\Model\Anzeigen $newAnzeigen
* @return void
*/
public function createAction(\HH\TestAnzeigen\Domain\Model\Anzeigen $newAnzeigen) {
$this->anzeigenRepository->add($newAnzeigen);
$this->flashMessageContainer->add('Your new Anzeigen was created.');
$this->redirect('list');
}
/**
* action edit
*
* @param \HH\TestAnzeigen\Domain\Model\Anzeigen $anzeigen
* @return void
*/
public function editAction(\HH\TestAnzeigen\Domain\Model\Anzeigen $anzeigen) {
$this->view->assign('anzeigen', $anzeigen);
}
/**
* action update
*
* @param \HH\TestAnzeigen\Domain\Model\Anzeigen $anzeigen
* @return void
*/
public function updateAction(\HH\TestAnzeigen\Domain\Model\Anzeigen $anzeigen) {
$this->anzeigenRepository->update($anzeigen);
$this->flashMessageContainer->add('Your Anzeigen was updated.');
$this->redirect('list');
}
/**
* action delete
*
* @param \HH\TestAnzeigen\Domain\Model\Anzeigen $anzeigen
* @return void
*/
public function deleteAction(\HH\TestAnzeigen\Domain\Model\Anzeigen $anzeigen) {
$this->anzeigenRepository->remove($anzeigen);
$this->flashMessageContainer->add('Your Anzeigen was removed.');
$this->redirect('list');
}
}
und die FormFields.html
<label for="anzeigenText">
<f:translate key="tx_testanzeigen_domain_model_anzeigen.anzeigen_text" />
</label><br />
<f:form.textarea property="anzeigenText" cols="80" rows="15" /><br />
<f:form.select property="fach" options="{alleKategorien}" optionValueField="uid" optionLabelField="kategorie" /><br/>
danke!!!
sorry, gehört natürlich so:
/**
* anzeigenRepository
*
* @var \HH\TestAnzeigen\Domain\Repository\KategorieRepository
* @inject
*/
protected $kategorieRepository;
funktioniert aber immer noch nicht
das ist bestimmt noch wichtig,
ich hatte bisher noch nicht versucht eine Anzeigen aufzugeben (selectbox war ja leer)
wenn ich trotzdem ne anzeige aufgeben bekomme ich folgenden Fehler:
Uncaught TYPO3 Exception
#1297759968: Exception while property mapping at property path ""😛HP Catchable Fatal Error: Argument 1 passed to HH\TestAnzeigen\Domain\Model\Anzeigen::setKategorie() must be an instance of HH\TestAnzeigen\Domain\Model\Kategorie, null given, called in /Applications/MAMP/htdocs/rps/typo3_src-6.1.7/typo3/sysext/extbase/Classes/Reflection/ObjectAccess.php on line 215 and defined in /Applications/MAMP/htdocs/rps/typo3conf/ext/test_anzeigen/Classes/Domain/Model/Anzeigen.php line 85
?!?!
den php Fehler hab ich nicht mehr,
ich hatte vergessen in der Kategorie Klasse die Basic Action list und show anzulegen.......
bleibt noch das select list problem
Das FormFields.html scheint ja ein Partial zu sein. Wird aus dem Haupttemplate die Variale alleKategorien auch an das Partial übergeben? Debug das mal im Hauptview.
ok, im Hauptview gibt es die Variable alleKategorien.
mit f:debug krieg ich
TYPO3\CMS\Extbase\Persistence\Generic\QueryResultprototypeobject (4 items)
0 => HH\TestAnzeigen\Domain\Model\Kategorieprototypepersistent entity (uid=1, pid=14)
kategorie => 'Sportwagen' (10 chars)
uid => 1 (integer)
_localizedUid => 1 (integer)modified
_languageUid => 0 (integer)modified
pid => 14 (integer)
1 => HH\TestAnzeigen\Domain\Model\Kategorieprototypepersistent entity (uid=2, pid=14)
kategorie => 'Kombi' (5 chars)
uid => 2 (integer)
_localizedUid => 2 (integer)modified
_languageUid => 0 (integer)modified
pid => 14 (integer)
2 => HH\TestAnzeigen\Domain\Model\Kategorieprototypepersistent entity (uid=3, pid=14)
kategorie => 'Bus' (3 chars)
uid => 3 (integer)
_localizedUid => 3 (integer)modified
_languageUid => 0 (integer)modified
pid => 14 (integer)
3 => HH\TestAnzeigen\Domain\Model\Kategorieprototypepersistent entity (uid=4, pid=14)
kategorie => 'Wohnmobil' (9 chars)
uid => 4 (integer)
_localizedUid => 4 (integer)modified
_languageUid => 0 (integer)modified
pid => 14 (integer)
den kompletten Array.
Wie muss ich das dem Partial übergeben?!?
Vielen Dank nochmal!!!!
OK ES KLAPPT!!!!!
ich hab in meiner Hauptview, die (Template/Anzeigen/New.html) also dort wo die Partials eingebunden werden die Variable "alleKategorien" explizit übergeben. Ich wusste nicht, dass die Variablen nicht automatisch in den Partials zur Verfügung stehen.
Und zwar so:
<f:render partial="Anzeigen/FormFields" arguments="{alleKategorien:alleKategorien}" />
oder wenn alle Variablen übergeben werden sollen...
<f:render partial="Anzeigen/FormFields" arguments="{_all}" />
Also nochmals vielen Dank!!!!