Hi, leider stehe ich gerade vor einem Problem bei dem ich nicht weiter komme. Es geht hierbei darum selbst erstelle Artikelattribute (nicht Freitextfelder!) zu übersetzen. Im Grund läuft mein Plugin problemlos bis auf die Übersetzung. Die Datenbankfelder werden über private function createAttributes() { $this-\>Application()-\>Models()-\>addAttribute( 's\_articles\_attributes', 'my', 'demofeld', 'varchar(255)', true, null ); $this-\>getEntityManager()-\>generateAttributeModels(array( 's\_articles\_attributes' )); }
erstellt. Anschließen wird das Template so erweitert attribute.js //{block name="backend/article/model/attribute/fields" append} { name: 'myDemofeld', type: 'string' }, //{/block}
base.js //{block name="backend/article/view/detail/base" append} Ext.override(Shopware.apps.Article.view.detail.Base, { createRightElements: function() { var me = this, fields = me.callParent(arguments); fields.push({ xtype: 'textfield', name: 'attribute[myDemofeld]', translatable: true, allowBlank: true, fieldLabel: 'Demofeld:' }); return fields; } }); //{/block}
Nun steht das zusätzliche Feld in Artikeleingabe zur Verfügung und wird auch gespeichert! Möchte ich nun das Feld aber Übersetzen, so steht in der s_core_translation folgendes: a:1:{s:20:"attribute[myDemofeld";s:7:"feld-en";}
und das Feld in der Artikeleingabe der Übersetzung ist nach reload leer!? Wo ist hier mein Fehler?? Kann mir das jemand einen Tip geben?
kurzer Nachtrag: Wenn ich in der base.js name: 'attribute[myDemofeld]',
ändere in name: 'myDemofeld',
dann wird die Übersetzung korrekt gespeichert! Dafür ist aber dann das „normale“ Attributefeld leer und wird nicht mehr gespeichert. Irgendwie steh ich gerade doch etwas auf dem Schlauch
Da ich an der Stelle immer noch etwas hänge, anbei das komplette Plugin. Vielleicht kann mir dann jemand einen Tip geben was ich vergessen habe. Bootstrap.php <?php class Shopware_Plugins_Backend_MeinDemofeld_Bootstrap extends Shopware_Components_Plugin_Bootstrap
{
/**
* @return \Shopware\Components\Model\ModelManager
*/
protected function getEntityManager()
{
return Shopware()->Models(); } /\*\* \* Returns the current version of the plugin. \* @return string \*/ public function getVersion() { return '1.0.0'; } /\*\* \* Get (nice) name for plugin manager list \* @return string \*/ public function getLabel() { return 'Demofeld'; } /\*\* \* Returns the meta information about the plugin. \* \* @return array \*/ public function getInfo() { return array( 'version' =\> $this-\>getVersion(), 'label' =\> $this-\>getLabel() ); } /\*\* \* @return bool \*/ public function update() { return true; } /\*\* \* Standard plugin install method to register all required components. \* @throws \Exception \* @return bool success \*/ public function install() { try { $this-\>subscribeEvents(); $this-\>createAttributes(); } catch (Exception $e) { return array( 'success' =\> false, 'message' =\> $e-\>getMessage() ); } return array( 'success' =\> true, 'invalidateCache' =\> array('backend') ); } /\*\* \* On uninstall remove attributes and re-generate customer-attribute models \* @return bool \*/ public function uninstall() { try { $this-\>deleteAttributes(); } catch (\Exception $e) { // noting to do here. } return array( 'success' =\> true, 'invalidateCache' =\> array('backend') ); } /\*\* \* Registers all necessary events and hooks. \*/ private function subscribeEvents() { $this-\>subscribeEvent( 'Enlight\_Controller\_Action\_PostDispatch\_Backend\_Article', 'postDispatchArticle' ); } /\*\* \* create additional attributes in s\_articles\_attributes and re-generate attribute models \*/ private function createAttributes() { $this-\>Application()-\>Models()-\>addAttribute( 's\_articles\_attributes', 'mein', 'demofeld', 'varchar(255)', true, null ); $this-\>getEntityManager()-\>generateAttributeModels(array( 's\_articles\_attributes' )); } /\*\* \* delete additional attributes in s\_articles\_attributes and re-generate attribute models \*/ private function deleteAttributes() { $this-\>Application()-\>Models()-\>removeAttribute( 's\_articles\_attributes', 'mein', 'demofeld' ); $this-\>getEntityManager()-\>generateAttributeModels(array( 's\_articles\_attributes' )); } public function postDispatchArticle(Enlight\_Event\_EventArgs $arguments) { $arguments-\>getSubject()-\>View()-\>addTemplateDir( $this-\>Path() . 'Views/' ); //if the controller action name equals "load" we have to load all application components. if ($arguments-\>getRequest()-\>getActionName() === 'load') { $arguments-\>getSubject()-\>View()-\>extendsTemplate( 'backend/demofeld/article/model/attribute.js' ); $arguments-\>getSubject()-\>View()-\>extendsTemplate( 'backend/demofeld/article/view/detail/base.js' ); } } }
base.js //{block name="backend/article/view/detail/base" append} Ext.override(Shopware.apps.Article.view.detail.Base, { createRightElements: function() { var me = this, fields = me.callParent(arguments); fields.push({ xtype:'textfield', name: 'attribute[meinDemofeld]', fieldLabel:'Demofeld', translatable: true }); return fields; } }); //{/block}
attribute.js //{block name="backend/article/model/attribute/fields" append} { name: 'meinDemofeld', type: 'string' }, //{/block}
Wie gesagt, es funktioniert wie es soll. Nur leider eben nicht für Übersetzungen bzw. Subshops?!
Hi, hier ein komplettes Beispiel, wie man in Shopware ein ExtJS-Formular übersetzbar macht: getItems: function() { var me = this; return [{ xtype: 'form', plugins: [{ ptype: 'translation', pluginId: 'translation', translationType: 'config\_countries' // Ein eindeutiger Name //translationKey: 2, // Ein eindeutiger Key (Es wird die ModelID vom Formular genommen, wenn vorhanden) //translationMerge: false // Option um alle Übersetzungen des selben Typs in einem Datensatz zu speichern }], items: [{ name: 'attribute[myDemofeld]', fieldLabel: 'Name', translatable: true, allowBlank: false, translationName: 'myDemofeld', // Namen des Feldes für die Übersetzung überschreiben translationLabel: 'Name2', }] }]; },
Wahrscheinlich fehlt bei dir nur die Angabe “translationName”. Heiner
Besten Dank!!! Exakt das war es!! Gruß
Hat zu dem Thema noch jemand einen Tip wie man die Ausgabe der Übersetzung im Frontend am Besten realisiert bekommt.?! Mapping von sTranslation(s) erweitern? Wenn ja wie? sArticle::sTranslation::befor/after ? oder einzeln im Plugin direkt per Query und Aufbereitung mit unserialize? Besten Dank schon vorab!
Der Translation Manager sollte automatisch mit dem richtigen key auch deine Werte liefern. Hast du das bereits mal probiert?! Viele Grüße
Danke für deine Antwort. Gibt es im Wiki oder wo anders ein Beispiel wie du dies meinst? Probiert habe ich so manches… $sArticles = $arguments-\>getReturn(); if (isset($sArticles['articleID'])) { $sArticles['myDemofeld'] = $this-\>getMyDemofeldAttributes($sArticles["articleID"]); } return $sArticles;
$select = "SELECT my\_demofeld FROM s\_articles\_attributes WHERE articleID = ? LIMIT 0, 1"; $query = Shopware()-\>Db()-\>fetchAll($select, array($articleID));
oder im Auszug 'sArticle::sGetArticlesByCategory::after', 'addSQL'
$sql = $arguments-\>getReturn(); $sql = str\_replace('at.attr1,', 'at.my\_demofeld, at.attr1,', $sql); return $sql;
Funktioniert ja beides nur nicht multilingual. Finde hier einfach nicht den richtigen Ansatz!