[TYPO3-german] Problem mit sys_category Auswahl in Frontend Plugin

_doc _doc at freenet.de
Sun Mar 24 21:54:45 CET 2019


Hallo Matthew,

eine Idee noch: hast du in Bezug auf die Kategorien @lazy als Annotation 
im Modell verwendet. (meist aus Performance-Gründe eingeführt)

Das könnte dir in die Hacken laufen, weil beim Create-Prozess das 
Extbase fehlenden Klassen nicht unbedingt nachlädt.

Dieter

Am 24.03.2019 um 17:41 schrieb Matthew Colton:
> Hallo Dieter,
>
> danke für deine Antwort. Konkret geht es um eine Vereinsliste. Der
> Stadtteil ist eine Kategorie. Benutzer können neue Vereine melden und
> Änderungen beantragen. Dabei muss beim Neuerstellen ein Stadtteil
> ausgesucht werden, bei Änderungsanträgen ist das optional. Beim Anzeigen
> der Vereine gibt es noch weitere Kategorien nach denen gefiltert werden
> kann. Das funktioniert auch prima.
>
> Ich habe schon öfter mit Kategorien gearbeitet. Das funktioniert im
> Backend ohne Probleme beim Anschauen, Anlegen und Aktualisieren. Im
> Frontent ist die Darstellung und Filtrierung auch kein Problem.
> Allerdings wurden nie neue Datensätze mit Kategoriezuweisungen im
> Frontend erstellt. Das ist das einzige was nicht klappt. Ich habe, da
> die Zeit pressiert, einen Workaround verwendet. Sobald ich wieder ein
> wenig Luft habe werde ich das Problem angehen und die Lösung dann hier
> posten.
>
> Nochmals vielen Dank für deine Hilfe.
>
> Cheers
>
> Matthew
>
>
> Am 23.03.19 um 20:19 schrieb _doc:
>> Hallo Matthew,
>>
>> Aus der Ferne kann ich dir auch nicht sagen, was genau verkehrt läuft.
>> Ich habe aber die Befürchtung, dass du im Klassiker "Suchen eines
>> Fehlers an falscher Stelle." festhängst.
>>
>> Ich fasse noch einmal zusammen, was ich verstanden habe, was du bauen
>> möchtest:
>> Du möchtest einen Filter bauen, wo eine Seiten-Besucher eine bestimmte
>> Kategorie auswählen kann. Wenn der Besucher diese ausgewählt hat,
>> feuert der Browser per Ajax oder nach dem Drücken eines Buttons ein
>> neues Request ab, um dann nur die Daten anzuzeigen, die der gewählten
>> Kategorie entsprechen.
>> Den Code der filterAction() hast du hier nicht zitiert (?)
>>
>> Ich nehme mal an, dass du 'xdebug' zum Debuggen verwenden kannst. Das
>> voraussetzend würde ich das Tracen der Requests mit folgendem Zusatz
>> empfehlen.
>>
>> Zusätzlich zur filterAction würde ich im Controller testweise eine
>> initializeFilterAction-Funktion einbauen. Dieses Intialize wird vor
>> der Validierung der Requestdaten durch TYPO3 aufgerufen und stellt
>> einen hilfreichen Einstieg dar.
>> In initializeFilterAction würde ich die Anweisung $arguments =
>> $this->request->getArguments(); einbauen und mit xdebug anschauen,
>> welche Daten per $arguments im Request ankommen. das weitere vorgehen
>> hängt dann davon ab, was man vorfindet.
>>
>> Wenn das nicht weiterführt. dann gibt es noch die Möglichkeit der
>> Reflektion:
>> Hilfreich könnte auch sein, dass du aufmalst, welchen Datenfluss du
>> erwarteten würdest. Beim Aufmalen merke ich häufig, an welchen Stellen
>> ich fehlerhaft denk oder an welchen Stellen ich testen könnte.  (P.S.
>> Wenn mir das Malen schwer fällt, weiß ich, dass ich mein Problem nicht
>> richtig verstanden habe.)
>>
>> Sorry, dass ich dir nicht im detail  weiterhelfen konnte.
>>
>> Mit besten Grüßen
>>
>>    Dieter
>>
>> Am 23.03.2019 um 12:29 schrieb Matthew Colton:
>>> Hi Dieter,
>>> leider funktioniert das so nicht. Ich habe den Aufruf
>>> makeCategorizable() in Overrides verschoben. Die
>>> ext_typoscript_setup.txt kann man sich auch weiterhin nicht sparen,
>>> sonst funktioniert das Mappen in einem Frontend Plugin nicht. Was ich
>>> weglassen konnte war der Kram in der setup.typoscript.
>>>
>>> Aber das Ergebnis bleibt identisch, $meinmodel->getCategories liefert
>>> ein leeres ObjectStorage zurück.
>>>
>>> Ich kenne leider keine Extension wo in einem Frontend Plugin eine
>>> Kategorie ausgesucht wird, sonst würde ich da mal schauen. Falls jemand
>>> eine kennt freue ich mich auf eine Rückmeldung.
>>>
>>> Cheers
>>> Matthew
>>>
>>> Web: www.web-xs.de <http://www.web-xs.de>
>>> E-Mail: mat.colton at web-xs.de
>>> Tel: 06621 7941-30
>>> Mobil: 0160 7990125
>>> Ust.-Nr: DE315925085
>>> Am 22.03.19 um 22:32 schrieb _doc:
>>>> Wahrscheinlich fehlt ein Eintrag deiner Tabelle in
>>>> |$GLOBALS['TYPO3_CONF_VARS']['SYS']['defaultCategorizedTables'].|Ich
>>>> hätte mich an die zweite Variante in der Dokumentation gehalten.
>>>> https://docs.typo3.org/typo3cms/CoreApiReference/latest/ApiOverview/Categories/Index.html
>>>>
>>>> // Add an extra categories selection field to the pages table
>>>> \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::makeCategorizable(
>>>>      'examples',
>>>>      'pages',
>>>>      // Do not use the default field name ("categories") for pages,
>>>> tt_content, sys_file_metadata, which is already used
>>>>      'tx_examples_cats',
>>>>      array(
>>>>         // Set a custom label
>>>>         'label'  =>
>>>> 'LLL:EXT:examples/Resources/Private/Language/locallang.xlf:additional_categories',
>>>>
>>>>         // This field should not be an exclude-field
>>>>         'exclude'  =>  FALSE,
>>>>         // Override generic configuration, e.g. sort by title rather
>>>> than by sorting
>>>>         'fieldConfiguration'  =>  array(
>>>>            'foreign_table_where'  =>  ' AND
>>>> sys_category.sys_language_uid IN (-1, 0) ORDER BY sys_category.title
>>>> ASC',
>>>>         ),
>>>>         // string (keyword), see TCA reference for details
>>>>         'l10n_mode'  =>  'exclude',
>>>>         // list of keywords, see TCA reference for details
>>>>         'l10n_display'  =>  'hideDiff',
>>>>      )
>>>> ); Dein Typoscript-Model-Geraffel könntest du dann sparen, weil deine
>>>> Tabelle über die MM_Tabelle richtig den Categorien zugeordnet wird.
>>>> Was anderes wäre es natürlich, wenn du in der sys_categories unbedingt
>>>> ein neues Feld brauchst. Das sollte dann aber begründet sein. Das mit
>>>> der Validierung habe ich, einen einfachen Anwendungsfall unterstellt,
>>>> auch nicht verstanden. Ich hätte gemäß der Dokumentation TYPO3
>>>> unterstellt, dass TYPO3 den Eintrag automatisch validiert, wenn die
>>>> TCA-Einträge korrekt sind. Dieter
>>>>
>>>> Am 22.03.2019 um 20:25 schrieb Matthew Colton:
>>>>> Hallo allerseits,
>>>>>
>>>>> ich sitze an einer Erweiterung bei dem die Typo3 Kategorien
>>>>> (sys_category) verwendet werden. Im Backend funktioniert alles prima.
>>>>> Allerding möchte ich auch, dass eine Kategorie in einem Frontend
>>>>> Plugin
>>>>> vom Besucher auswählbar ist. Konkret geht es um eine Vereinsliste.
>>>>>
>>>>> Model und Repository für die Klasse „Category“ habe ich angelegt,
>>>>> diese
>>>>> sind leer und extended einfach nur
>>>>> \TYPO3\CMS\Extbase\Domain\Model\Category und
>>>>> \TYPO3\CMS\Extbase\Domain\Repository\CategoryRepository. Die
>>>>> categoryRepository injecte ich im Controller.
>>>>>
>>>>> Weitere Dateien:
>>>>>
>>>>> [ext_tables.php]
>>>>>
>>>>> \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::makeCategorizable(
>>>>>      'Clubs',
>>>>>      'tx_clubs_domain_model_club'
>>>>> );
>>>>>
>>>>>
>>>>> ##########################################
>>>>>
>>>>>
>>>>> [setup.typoscript, Auszug]
>>>>>
>>>>> plugin.tx_clubs_club {
>>>>>
>>>>>       persistence {
>>>>>
>>>>>        storagePid = {$plugin.tx_clubs_club.persistence.storagePid}
>>>>>
>>>>>        classes {
>>>>>
>>>>>          WXS\Clubs\Model\Category {
>>>>>
>>>>>            mapping {
>>>>>
>>>>>              recordType = 0
>>>>>
>>>>>              tableName = sys_category
>>>>>
>>>>>            }
>>>>>
>>>>>          }
>>>>>
>>>>>        }
>>>>>
>>>>>      }
>>>>>
>>>>> }
>>>>>
>>>>>
>>>>> ##########################################
>>>>>
>>>>>
>>>>> [ext_typoscript_setup.txt]
>>>>>
>>>>> config.tx_extbase {
>>>>>
>>>>>      persistence {
>>>>>
>>>>>        classes {
>>>>>
>>>>>          WXS\Clubs\Domain\Model\Category {
>>>>>
>>>>>            mapping {
>>>>>
>>>>>              tableName = sys_category
>>>>>
>>>>>            }
>>>>>
>>>>>          }
>>>>>
>>>>>        }
>>>>>
>>>>>      }
>>>>>
>>>>>      objects {
>>>>>
>>>>>        TYPO3\CMS\Extbase\Domain\Model\Category.className =
>>>>> WXS\Clubs\Domain\Model\Category
>>>>>
>>>>>      }
>>>>>
>>>>> }
>>>>>
>>>>>
>>>>> ##########################################
>>>>>
>>>>>
>>>>> [Vereins-Model (Club), Auszug]
>>>>>
>>>>> /**
>>>>>
>>>>> * @var
>>>>> \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\WXS\Clubs\Domain\Model\Category>
>>>>>
>>>>>
>>>>>
>>>>> */
>>>>>
>>>>> protected $categories;
>>>>>
>>>>>
>>>>> function __construct()
>>>>> {
>>>>>        $this->categories = new ObjectStorage();
>>>>> }
>>>>>
>>>>>
>>>>> /**
>>>>>
>>>>> * @param \WXS\Clubs\Domain\Model\Category $category
>>>>>
>>>>> * @return void
>>>>>
>>>>> */
>>>>>
>>>>> public function addCategory(\WXS\Clubs\Domain\Model\Category
>>>>> $category) {
>>>>>
>>>>>        $this->categories->attach($category);
>>>>>
>>>>> }
>>>>>
>>>>>
>>>>> /**
>>>>>
>>>>> * @param \WXS\Clubs\Domain\Model\Category $categoryToRemove The
>>>>> Category
>>>>> to be removed
>>>>>
>>>>> * @return void
>>>>>
>>>>> */
>>>>>
>>>>> public function removeCategory(\WXS\Clubs\Domain\Model\Category
>>>>> $categoryToRemove) {
>>>>>
>>>>>        $this->categories->detach($categoryToRemove);
>>>>>
>>>>> }
>>>>>
>>>>>
>>>>> /**
>>>>>
>>>>> * @return
>>>>> \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\WXS\Clubs\Domain\Model\Category>
>>>>>
>>>>>
>>>>> $categories
>>>>>
>>>>> */
>>>>>
>>>>> public function getCategories() {
>>>>>
>>>>>        return $this->categories;
>>>>>
>>>>> }
>>>>>
>>>>>
>>>>> /**
>>>>>
>>>>> * @param
>>>>> \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\WXS\Clubs\Domain\Model\Category>
>>>>>
>>>>>
>>>>> $categories
>>>>>
>>>>> * @return void
>>>>>
>>>>> */
>>>>>
>>>>> public function
>>>>> setCategories(\TYPO3\CMS\Extbase\Persistence\ObjectStorage
>>>>> $categories){
>>>>>
>>>>>        $this->categories = $categories;
>>>>>
>>>>> }
>>>>>
>>>>>
>>>>> ##########################################
>>>>>
>>>>>
>>>>> Ich lese die verfügbaren Kategorien aus und weise sie den Options
>>>>> einer
>>>>> f:form.select zu:
>>>>>
>>>>>
>>>>> <f:form.select class="form-control" options="{categoryOptions}"
>>>>> property="categories" id="district" optionValueField="uid"
>>>>> optionLabelField="title" prependOptionValue=""
>>>>> prependOptionLabel="Bitte
>>>>> wählen">
>>>>>
>>>>> </f:form.select>
>>>>>
>>>>>
>>>>> Soweit so gut, die Liste erscheint auch korrekt und man kann die
>>>>> gewünschte Kategorie auswählen. Wohlgemerkt, es soll nur eine
>>>>> Kategorie
>>>>> ausgesucht werden, deshalb das Select Element ohne „multiple“.
>>>>>
>>>>>
>>>>> Im Validator versuche ich nun via
>>>>> $value->getCategories()->rewind()->current() auf das Feld
>>>>> zuzugreifen um
>>>>> es zu validieren. Das funktioniert allerdings nicht, der Wert ist
>>>>> einfach NULL. Also habe ich ein var_dump() auf getCategories()
>>>>> losgelassen und erhalte folgende Meldung:
>>>>>
>>>>>
>>>>> ##########################################
>>>>>
>>>>> object(TYPO3\CMS\Extbase\Persistence\ObjectStorage)#1175 (6) {
>>>>>
>>>>> ["warning":"TYPO3\CMS\Extbase\Persistence\ObjectStorage":private]=>
>>>>>
>>>>> string(228) "You should never see this warning. If you do, you
>>>>> probably
>>>>> used PHP array functions like current() on the
>>>>> TYPO3\CMS\Extbase\Persistence\ObjectStorage. To retrieve the first
>>>>> result, you can use the rewind() and current() methods."
>>>>>
>>>>> ["storage":protected]=>
>>>>>
>>>>> array(0) {
>>>>>
>>>>> }
>>>>>
>>>>> ["isModified":protected]=>
>>>>>
>>>>> bool(false)
>>>>>
>>>>> ["addedObjectsPositions":protected]=>
>>>>>
>>>>> array(0) {
>>>>>
>>>>> }
>>>>>
>>>>> ["removedObjectsPositions":protected]=>
>>>>>
>>>>> array(0) {
>>>>>
>>>>> }
>>>>>
>>>>> ["positionCounter":protected]=>
>>>>>
>>>>> int(0)
>>>>>
>>>>> }
>>>>>
>>>>>
>>>>> ##########################################
>>>>>
>>>>> Wenn ich in eine initialize Methode einen vardump mache sehe ich, dass
>>>>> „categories“ ein String mit der korrekten UID der Kategorie ist.
>>>>>
>>>>> Jetzt bin ich überfragt. Was muss ich machen, damit ich auf die Werte
>>>>> des Feldes zugreifen kann. Fehlt da ein Type Converter?
>>>>>
>>>>> Ich bin für jede Hilfe dankbar! :)
>>>>>
>>>>>
>>>>> Cheers,
>>>>>
>>>>> Matthew
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> TYPO3-german mailing list
>>>>> TYPO3-german at lists.typo3.org
>>>>> http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german
>>>> _______________________________________________
>>>> TYPO3-german mailing list
>>>> TYPO3-german at lists.typo3.org
>>>> http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german
>
> _______________________________________________
> TYPO3-german mailing list
> TYPO3-german at lists.typo3.org
> http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german

-- 
---

Dr. Dieter Porth
Grünenstraße 23
D-28199 Bremen
Germany

+(049) 421 / 51 48 35 48
+(049) 160 / 99 18 06 88 (abends/ after 18:00)



More information about the TYPO3-german mailing list