[GELÖST] Neues Artikel-Attribut-Feld übersetzbar machen?

Hallo liebe shopware - Gemeinde,

man kann ja mit:

 Shopware()-\>Models()-\>addAttribute( 's\_articles\_attributes', 'attr', 'New', 'longtext', true, null ); $metaDataCache = Shopware()-\>Models()-\>getConfiguration()-\>getMetadataCacheImpl(); $metaDataCache-\>deleteAll(); Shopware()-\>Models()-\>generateAttributeModels( array('s\_articles\_attributes') ); 

problemlos ein neues Attributfeld dem Artikel hinzufügen.

Wie kann man es ermöglichen, dass dieses Feld dann auch übersetzbar ist (so wie die Beschreibung, etc.)?

Müsste ich das Feld der Tabelle s_articles_translations hinfügen? Eine Attribut-Tabelle gibt es bei dieser Tabelle ja leider nicht.

Oder muss ich das neue Attributfeld serialized im Feld objectdata der Tabelle s_core_translations speichern? Wenn ja, gibt es dazu irgendeine Anleitung?

Beste Grüße

Sebastian

Hi, im Grunde trifft wenn ich mich nicht irre folgendes zu: [quote]Oder muss ich das neue Attributfeld serialized im Feld objectdata der Tabelle s_core_translations speichern?[/quote] Da ich aber davon ausgehe, damit die Daten über die Artikeleingabe im Backend kommen, wird dies automatisch dort eingetragen wenn die Erweiterung der Artikeleingabe korrekt gemacht wird. Die Frage ist hier auch wie die Best Practice Vorgehensweise ist um diese im Frontend auszugeben. Einfache sArticle.php -> sGetTranslations überschreiben oder erweitern? Wenn ja, wie? Oder eigene kleine Übersetzungsfunktion schreiben?

[quote=„Creatixx“]Hi, im Grunde trifft wenn ich mich nicht irre folgendes zu: [quote]Oder muss ich das neue Attributfeld serialized im Feld objectdata der Tabelle s_core_translations speichern?[/quote] Da ich aber davon ausgehe, damit die Daten über die Artikeleingabe im Backend kommen, wird dies automatisch dort eingetragen wenn die Erweiterung der Artikeleingabe korrekt gemacht wird. Die Frage ist hier auch wie die Best Practice Vorgehensweise ist um diese im Frontend auszugeben. Einfache sArticle.php -> sGetTranslations überschreiben oder erweitern? Wenn ja, wie? Oder eigene kleine Übersetzungsfunktion schreiben?[/quote] Hallo, danke erstmal für deine Antwort. Auf jeden Fall fehlt bei dem neuen Attributfeld die Weltkugel - muss ich da noch irgendeine Verknüpfung setzen, damit diese wie bei den Artikel-Freitextfeldern verfügbar ist? Die Methode addAttribute hat ja nur folgende Parameter: - $table: Attribut-Tabelle, die erweitert werden soll. Hier: s_user_attributes - $prefix: Eindeutiges Entwickler-Präfix, um Kollisionen mit Plugins von Drittherstellern zu vermeiden - $name: Feldname - $type: SQL-Datentyp - $nullable: Kann das Feld den Wert NULL annehmen? - $default: Standardwert Da gibt es ja keinen Parameter, durch den man „übersetzbar“ festlegen könnte. Das Beispielplugin http://community.shopware.com/Schuhgr%C … _1052.html hilft einem in dem Bereich auch nicht weiter. Mich würde der Weg bzw. der Best Practice - Weg auch interessieren. Oder hat noch niemand ein Zusatz-Attributfeld übersetzbar gebraucht? Beste Grüße Sebastian

Hi, hier mal ein Auszug aus der ExtJS Erweiterung /\*\* \* Creates the right container of the base field set. \* \* @return Array Contains the three form fields \*/ createTransRight:function () { var me = this; return [{ xtype:'textfield', name: 'attribute[prefTranslationtest]', fieldLabel:'Translationtest', allowBlank: true, translatable: true, translationName: 'prefTranslationtest', valueField:'text' } ]; }

1 „Gefällt mir“

Du suchst https://github.com/shopware/shopware/bl … ft.js#L116 Viele Grüße

[quote=„Creatixx“]Hi, hier mal ein Auszug aus der ExtJS Erweiterung /\*\* \* Creates the right container of the base field set. \* \* @return Array Contains the three form fields \*/ createTransRight:function () { var me = this; return [{ xtype:'textfield', name: 'attribute[prefTranslationtest]', fieldLabel:'Translationtest', allowBlank: true, translatable: true, translationName: 'prefTranslationtest', valueField:'text' } ]; } [/quote] Hallo, ich danke dir, translatable: true und translationName: ‚prefTranslationtest‘ fehlten. Manchmal sieht man den Wald vor lauter Bäumen nicht. Hast du schon eine Lösung zum Abruf der Übersetzung im Frontend gefunden (aus deinem Thread: programmierung-f56/probleme-mit-ubersetzung-selbst-erstellter-artikelattribute-t23143.html)? Beste Grüße Sebastian

Ansätze hatte ich einige, aber keine wirklich brauchbare Lösung. Aquatuning schrieb ja in dem anderen Thread [quote] Der Translation Manager sollte automatisch mit dem richtigen key auch deine Werte liefern. Hast du das bereits mal probiert?! [/quote] Allerdings weis ich nicht wie das genau gemeint ist. Wenn man in der sArticles.php -> sGetTranslations einfach das array erweitert funktionieren die Übersetzungen. Allerdings sehe ich hier nicht wie ich mir vernünftig einklinken könnte, oder ob es überhaupt die richte Stelle wäre. switch ($object) { case 'article': $map = array( 'txtshortdescription' =\> 'description', 'txtlangbeschreibung' =\> 'description\_long', 'txtArtikel' =\> 'articleName', 'txtzusatztxt' =\> 'additionaltext', 'txtkeywords' =\> 'keywords', 'txtpackunit' =\> 'packuni', ); break;

Du musst die Daten schon separat auslesen: $manager = new \Shopware\_Components\_Translation(); $translation = $manager-\>read( $language, "dein\_plugin" ); Viele Grüße

1 „Gefällt mir“

Vielen Dank für deine Antwort! Was genau bedeutet: $manager-\>read( $language, "dein\_plugin" ); Warum „dein_plugin“? Wird nicht der Typ also article erwartet? public function read($language, $type, $key = 1, $merge = false) { if ($type == 'variantMain') { $type = 'article'; } $sql = ' SELECT `objectdata` FROM `s_core_translations` WHERE `objecttype` = ? AND `objectkey` = ? AND `objectlanguage` = ? '; $data = Shopware()-\>Db()-\>fetchOne($sql, array( $type, $merge ? 1 : $key, $language )); return $this-\>unFilterData($type, $data, $merge ? $key : null); } Stimmt zumindest die richtig hier? /\*\* \* \*/ public function afterGetArticleById(Enlight\_Hook\_HookArgs $arguments) { $language = Shopware()-\>Shop()-\>getId(); $manager = new \Shopware\_Components\_Translation(); $translation = $manager-\>read( $language, "prefTranslationtest" ); $articleData = $arguments-\>getReturn(); $articleData['pref\_Translationtest'] = $translation; $arguments-\>setReturn($articleData); } EDIT: Ok eine Nacht drüber geschlafen und festgestellt dass der letzte Teil Käse ist! :smiley:

Hallo, also ich habe bisher auch noch keine Lösung gefunden, die es ausliest. Nach studieren der read-Methode und der Datenbank-Tabelle s_core_translations habe ich folgenden Ansatz entwickelt: function afterGetArticleById(Enlight\_Hook\_HookArgs $args){ $article = $args-\>getReturn(); $id = $article["articleID"]; $language = Shopware()-\>Shop()-\>getId(); $manager = new \Shopware\_Components\_Translation(); $translation = $manager-\>read( $language, "article", $id); $pref\_Translationtest = $translation['prefTranslationtest']; $article['pref\_Translationtest'] = $pref\_Translationtest; $args-\>setReturn($article); } Dieser funktioniert leider auch nicht, obwohl ansich alle Daten richtig der read-Methode übergeben sein müssten. Beste Grüße Sebastian

Lass dir mal $id ausgeben! Bei mir wird hier aus z.B. articleID 167 bei der Ausgabe über $article = $args-\>getReturn(); $id = $article["articleID"]; 0167 daraus. Und das kann dann ja nicht mehr passen. Schreibe ich es “hardcoded” rein gehts!? EDIT: hmm, die 0 plötzlich weg?! :frowning:

Also im Ansatz funktioniert das function afterGetArticleById(Enlight\_Hook\_HookArgs $args){ $article = $args-\>getReturn(); $id = $article["articleID"]; $language = Shopware()-\>Shop()-\>getId(); $manager = new \Shopware\_Components\_Translation(); $translation = $manager-\>read( $language, "article", $id); $pref\_Translationtest = $translation['prefTranslationtest']; $article['pref\_Translationtest'] = $pref\_Translationtest; $args-\>setReturn($article); } Allerdings wird so auch die Standardsprache überschrieben, da noch nicht geprüft wird ob es auch eine Übersetzung gibt! Hier fehlt noch die Abfrage.

[quote=“Creatixx”]Also im Ansatz funktioniert das function afterGetArticleById(Enlight\_Hook\_HookArgs $args){ $article = $args-\>getReturn(); $id = (int)$article["articleID"]; $language = Shopware()-\>Shop()-\>getId(); $manager = new \Shopware\_Components\_Translation(); $translation = $manager-\>read( $language, "article", $id); $pref\_Translationtest = $translation['prefTranslationtest']; $article['pref\_Translationtest'] = $pref\_Translationtest; $args-\>setReturn($article); } Allerdings wird so auch die Standardsprache überschrieben, da noch nicht geprüft wird ob es auch eine Übersetzung gibt! Hier fehlt noch die Abfrage.[/quote] Hallo, mit $id = (int)$article[“articleID”]; könntest du zumindestens die führenden Nullen entfernen, falls das nochmal auftreten sollte. Ich habe auch gemerkt, dass die Standardsprache nicht angezeigt wird, da diese in der s_core_translations ja nicht vorhanden ist. Man müsste also noch eine Abfrage machen, dass wenn die Standardsprache ausgewählt ist, er die Daten dann eher über: $sqlQuery = "SELECT pref\_Translationtest FROM s\_articles\_attributes WHERE articleID=".$id." AND pref\_Translationtest != ''"; $article["pref\_Translationtest"] = Shopware()-\>Db()-\>fetchOne($sqlQuery); beziehen sollte. Beste Grüße Sebastian

Ich habe es jetzt mal übers Repository gemacht. Ob das wirklich so „Best Practice“ ist denke ich aber nicht. Ob es auch für Variantenartikel geht muss ich noch test! /\*\* \* \*/ function afterGetArticleById(Enlight\_Hook\_HookArgs $arguments){ $article = $arguments-\>getReturn(); $id = $article["articleID"]; $language = Shopware()-\>Shop()-\>getId(); $manager = new \Shopware\_Components\_Translation(); $translation = $manager-\>read( $language, "article", $id ); if (!empty($translation['cnetTranslationtest'])) { $pref\_Translationtest = $translation['prefTranslationtest']; $article['pref\_translationtest'] = $pref\_Translationtest; } else { $repo = Shopware()-\>Models()-\>getRepository('Shopware\Models\Attribute\Article')-\>findOneBy(array('articleId' =\> $id)); $articleData['pref\_translationtest'] = $repo-\>getPrefTranslationtest(); } $arguments-\>setReturn($article); }

[quote=„Creatixx“]Ich habe es jetzt mal übers Repository gemacht. Ob das wirklich so „Best Practice“ ist denke ich aber nicht. Ob es auch für Variantenartikel geht muss ich noch test! /\*\* \* \*/ function afterGetArticleById(Enlight\_Hook\_HookArgs $arguments){ $article = $arguments-\>getReturn(); $id = $article["articleID"]; $language = Shopware()-\>Shop()-\>getId(); $manager = new \Shopware\_Components\_Translation(); $translation = $manager-\>read( $language, "article", $id ); if (!empty($translation['cnetTranslationtest'])) { $pref\_Translationtest = $translation['prefTranslationtest']; $article['pref\_translationtest'] = $pref\_Translationtest; } else { $repo = Shopware()-\>Models()-\>getRepository('Shopware\Models\Attribute\Article')-\>findOneBy(array('articleId' =\> $id)); $articleData['pref\_translationtest'] = $repo-\>getPrefTranslationtest(); } $arguments-\>setReturn($article); } [/quote] Hallo, ich habe es wie erwähnt so gelöst: function afterGetArticleById(Enlight\_Hook\_HookArgs $args){ $article = $args-\>getReturn(); $id = (int)$article["articleID"]; $language = Shopware()-\>Shop()-\>getId(); $manager = new \Shopware\_Components\_Translation(); $translation = $manager-\>read( $language, "article", $id); if (!empty($translation['prefTranslationtest'])) { $pref\_Translationtest = $translation['prefTranslationtest']; $article['pref\_translationtest'] = $pref\_Translationtest; } else { $sqlQuery = "SELECT pref\_translationtest FROM s\_articles\_attributes WHERE articleID=".$id." AND pref\_translationtest != ''"; $article["pref\_translationtest"] = Shopware()-\>Db()-\>fetchOne($sqlQuery); } $args-\>setReturn($article); } Funktionieren tut es - ob es „Best Practice“ ist, weiss ich auch nicht. Beste Grüße Sebastian

Best practice wird hier erklärt: https://developers.shopware.com/developers-guide/ In Shopware 5 solltest du den service dekorieren, dein Attribut mit auslesen (was eigentlich bereits passieren sollte?!) und die Übersetzung holen. Viele Grüße

[quote=“sschreier”][quote=“Creatixx”]Ich habe es jetzt mal übers Repository gemacht. Ob das wirklich so “Best Practice” ist denke ich aber nicht. Ob es auch für Variantenartikel geht muss ich noch test! /\*\* \* \*/ function afterGetArticleById(Enlight\_Hook\_HookArgs $arguments){ $article = $arguments-\>getReturn(); $id = $article["articleID"]; $language = Shopware()-\>Shop()-\>getId(); $manager = new \Shopware\_Components\_Translation(); $translation = $manager-\>read( $language, "article", $id ); if (!empty($translation['cnetTranslationtest'])) { $pref\_Translationtest = $translation['prefTranslationtest']; $article['pref\_translationtest'] = $pref\_Translationtest; } else { $repo = Shopware()-\>Models()-\>getRepository('Shopware\Models\Attribute\Article')-\>findOneBy(array('articleId' =\> $id)); $articleData['pref\_translationtest'] = $repo-\>getPrefTranslationtest(); } $arguments-\>setReturn($article); } [/quote] Hallo, ich habe es wie erwähnt so gelöst: function afterGetArticleById(Enlight\_Hook\_HookArgs $args){ $article = $args-\>getReturn(); $id = (int)$article["articleID"]; $language = Shopware()-\>Shop()-\>getId(); $manager = new \Shopware\_Components\_Translation(); $translation = $manager-\>read( $language, "article", $id); if (!empty($translation['prefTranslationtest'])) { $pref\_Translationtest = $translation['prefTranslationtest']; $article['pref\_translationtest'] = $pref\_Translationtest; } else { $sqlQuery = "SELECT pref\_translationtest FROM s\_articles\_attributes WHERE articleID=".$id." AND pref\_translationtest != ''"; $article["pref\_translationtest"] = Shopware()-\>Db()-\>fetchOne($sqlQuery); } $args-\>setReturn($article); } Funktionieren tut es - ob es “Best Practice” ist, weiss ich auch nicht. Beste Grüße Sebastian[/quote] Funktioniert so aber nicht mit Variantenartikeln! Hier müsstest du eher noch articleDetailsId abfragen.

[quote=“Creatixx”][quote=“sschreier”][quote=“Creatixx”]Ich habe es jetzt mal übers Repository gemacht. Ob das wirklich so “Best Practice” ist denke ich aber nicht. Ob es auch für Variantenartikel geht muss ich noch test! /\*\* \* \*/ function afterGetArticleById(Enlight\_Hook\_HookArgs $arguments){ $article = $arguments-\>getReturn(); $id = $article["articleID"]; $language = Shopware()-\>Shop()-\>getId(); $manager = new \Shopware\_Components\_Translation(); $translation = $manager-\>read( $language, "article", $id ); if (!empty($translation['cnetTranslationtest'])) { $pref\_Translationtest = $translation['prefTranslationtest']; $article['pref\_translationtest'] = $pref\_Translationtest; } else { $repo = Shopware()-\>Models()-\>getRepository('Shopware\Models\Attribute\Article')-\>findOneBy(array('articleId' =\> $id)); $articleData['pref\_translationtest'] = $repo-\>getPrefTranslationtest(); } $arguments-\>setReturn($article); } [/quote] Hallo, ich habe es wie erwähnt so gelöst: function afterGetArticleById(Enlight\_Hook\_HookArgs $args){ $article = $args-\>getReturn(); $id = (int)$article["articleID"]; $language = Shopware()-\>Shop()-\>getId(); $manager = new \Shopware\_Components\_Translation(); $translation = $manager-\>read( $language, "article", $id); if (!empty($translation['prefTranslationtest'])) { $pref\_Translationtest = $translation['prefTranslationtest']; $article['pref\_translationtest'] = $pref\_Translationtest; } else { $sqlQuery = "SELECT pref\_translationtest FROM s\_articles\_attributes WHERE articleID=".$id." AND pref\_translationtest != ''"; $article["pref\_translationtest"] = Shopware()-\>Db()-\>fetchOne($sqlQuery); } $args-\>setReturn($article); } Funktionieren tut es - ob es “Best Practice” ist, weiss ich auch nicht. Beste Grüße Sebastian[/quote] Funktioniert so aber nicht mit Variantenartikeln! Hier müsstest du eher noch articleDetailsId abfragen.[/quote] Hallo, mit deiner Variante funktioniert es also auch bei Variantenartikeln? Beste Grüße Sebastian

Nein, auch hier müsste man über articleDetailsId gehen. Allerdings hab ich hier meine Zweifel ob das wirklich so gedacht war für Übersetzungen von eigenen Attributen.

Auch müsste sich bei Varianten wenn diese separate Texte/Inhalte haben der Typ (artcile -> variant) sowie die $id ($artcileId -> $articleDetailsId) ändern. Also zumindest rein theoretisch :shock: