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.col...@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@lists.typo3.org
http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german
_______________________________________________
TYPO3-german mailing list
TYPO3-german@lists.typo3.org
http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german

_______________________________________________
TYPO3-german mailing list
TYPO3-german@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)

_______________________________________________
TYPO3-german mailing list
TYPO3-german@lists.typo3.org
http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german

Antwort per Email an