TranslatableLabelInterface
Hallo!
Man kann ja jetzt in dem DCA bestimmte Übersetzungen auch als enum und Yaml-Dateien angeben:
PHP-Code:
rank' => [
'inputType' => 'select',
'enum' => \Babelfisch\FossilsBundle\Data\TaxonomicRanks::class,
Funktioniert super, nur stehe ich gerade auf dem Schlauch, wie ich das in einem DCA-Callback selber verwenden kann. Ich rufe es jetzt so in einem Label Callback auf:
PHP-Code:
public function addIcon($row, $label): string
{
$strRank = TaxonomicRanks::from($row['rank'])->label();
Der Wert ist jetzt bspw. 'class' und ich möchte 'Klasse' zurückbekommen. Zurück bekomme ich aber 'rank.label.class'. In der Select-Liste werden die verschiedenen Werte dagegen sauber übersetzt.
Kann mir hier jemand weiterhelfen?
Gruß
Liste der Anhänge anzeigen (Anzahl: 1)
Erreichen möchte ich folgendes:
Anhang 28390
Die Übersetzung vom Feld rank soll dabei rechts stehen.
Erreicht habe ich es jetzt erst einmal, indem ich die Format-Angabe im Label mit etwas HTML angepasst habe:
PHP-Code:
'label' => [
'fields' => ['name', 'commonName', 'rank'],
'format' => '%s (%s) <span style="margin-left:auto">[%s]</span>',
'label_callback' => ['tl_foss_taxonomy', 'addIcon'],
Dort funktioniert die Übersetzung, genau wie beim Bearbeiten des Datensatzes. Gerne hätte ich die Übersetzung vom Feld rank aber im Callback zur Verfügung. Mein Ansatz war eben:
PHP-Code:
$strRank = TaxonomicRanks::from($row['rank'])->label();
Das liefert mir aber nur rank.label.phylum oder rank.label.class zurück.
Ich habe mir jetzt auch diese Erklärung mal angeschaut und testweise mal ein Model erstellt und es damit versucht:
PHP-Code:
if (($objTaxonomy = FossTaxonomyModel::findByPk($row['id'])) !== null) {
$strRank = $objTaxonomy->getEnum('rank')->label();
}
Da kommt aber das gleiche heraus. Sowohl $objTaxonomy->getEnum('rank'), als auch TaxonomicRanks::from($row['rank']) liefern mir zwar das richtige ENUM, ich weiß aber nicht, wie ich dann die Übersetzung dafür bekomme. Mit label() bekomme ich nur die TranslatableMessage aber ich brauche dann wohl noch den Translator.
Mein ENUM sieht so aus:
PHP-Code:
enum TaxonomicRanks: string implements TranslatableLabelInterface
{
case _domain = 'domain';
case _kingdom = 'kingdom';
case _phylum = 'phylum';
case _class = 'class';
case _order = 'order';
case _family = 'family';
case _genus = 'genus';
case _species = 'species';
// https://docs.contao.org/5.x/dev/reference/dca/fields/#enumerations
public function label(): TranslatableMessage
{
return new TranslatableMessage(
'rank.label.'.$this->value,
[],
'taxonomy',
);
}
}
Die Übersetzung taxonomy.de.yaml ist hier:
Code:
rank:
label:
domain: Domain
kingdom: Reich
phylum: Stamm
subphylum: Unterstamm
class: Klasse
subclass: Unterklasse
order: Ordnung
suborder: Unterordnung
family: Familie
subfamily: Unterfamilie
genus: Gattung
species: Art
subspecies: Unterart
Da komme ich erst einmal nicht weiter.