# Werte aus Formularfeld in Datenbank schreiben

**URL:** <https://forum.shopware.com/t/werte-aus-formularfeld-in-datenbank-schreiben/52946>\
**Category:** Programmierung\
**Created:** [16. Mai 2018 um 14:45 UTC](https://forum.shopware.com/t/werte-aus-formularfeld-in-datenbank-schreiben/52946 "2018-05-16T14:45:24Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![Wilson82](https://avatars.discourse-cdn.com/v4/letter/w/e274bd/32.png) [@Wilson82](https://forum.shopware.com/u/Wilson82)\
**Post date:** [16. Mai 2018 um 14:45 UTC](https://forum.shopware.com/t/werte-aus-formularfeld-in-datenbank-schreiben/52946/1 "2018-05-16T14:45:24Z")

</div>

Hallo zusammen,

habe mir mal das swag\_shoesize PlugIn installiert.&nbsp;

Im frontend/account/profile.tpl habe ich folgendes hinzugefügt.&nbsp;

Er holt mir die Daten aus der s\_user\_attributes in das Formularfeld. Soweit so gut.&nbsp;

Nun meine Frage: Beim Speichern soll der neu eingegeben Wert in die s\_user\_attributes Spalte swag\_shoesize geschrieben werden.

Grundsätzlich müsste ich den Account.php Controller -\> die Action saveProfileAction() überschreiben.&nbsp;

Läuft das mit einem SQL Update Befehl oder wie wird hier vorgegangen? Ein Tipp für die Developer Doku wäre auch super. Dann kann ich mich reinlesen. Komme leider nicht weiter.

Für Hilfe wäre ich sehr dankbar!!!

Beste Grüße Wilson

&nbsp;

---

<div class="post-metadata">

**Author:** ![arnebecker](https://avatars.discourse-cdn.com/v4/letter/a/3bc359/32.png) [@arnebecker](https://forum.shopware.com/u/arnebecker)\
**Post date:** [16. Mai 2018 um 16:02 UTC](https://forum.shopware.com/t/werte-aus-formularfeld-in-datenbank-schreiben/52946/2 "2018-05-16T16:02:20Z")

</div>

Ist in dem Plugin kein Beispiel wie das in die DB geschrieben wird? Das Ding soll doch genau das machen, oder steh ich gerade aufm Schlauch?

---

<div class="post-metadata">

**Author:** ![Wilson82](https://avatars.discourse-cdn.com/v4/letter/w/e274bd/32.png) [@Wilson82](https://forum.shopware.com/u/Wilson82)\
**Post date:** [17. Mai 2018 um 13:07 UTC](https://forum.shopware.com/t/werte-aus-formularfeld-in-datenbank-schreiben/52946/3 "2018-05-17T13:07:22Z")

</div>

> [@arnebecker schrieb:](https://forum.shopware.com/profile/26696/arnebecker "arnebecker")
> 
> Ist in dem Plugin kein Beispiel wie das in die DB geschrieben wird? Das Ding soll doch genau das machen, oder steh ich gerade aufm Schlauch?

Ja im Register Controller wird über die saveRegisterAction() der Wert aus dem SwagShoeSize Feld in die s\_user\_attributes geschrieben, also wenn der User sich erstmalig registriert.&nbsp;

Er soll das Feld aber später in seinem Account Bereich auch noch bearbeiten können. Im Account Controller werden aber bei der saveProfileAction() wohl keine Werte an das Attributsystem / tabelle der s\_user\_attributes zurückgeschrieben. Daher muss ich das überschreiben. Nur wie?

Es wäre grundsätzlich interessant, wie ich Daten aus Formularfelden in die Datenbank / Tabelle schreiben kann!!!

---

<div class="post-metadata">

**Author:** ![shyim](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/shyim/32/7681_2.png) [@shyim](https://forum.shopware.com/u/shyim)\
**Post date:** [21. Mai 2018 um 07:41 UTC](https://forum.shopware.com/t/werte-aus-formularfeld-in-datenbank-schreiben/52946/4 "2018-05-21T07:41:13Z")

</div>

Hast du den Input Namen 1:1 so übernommen ? Der name müsste nämlich anders heißen

---

<div class="post-metadata">

**Author:** ![derwunner](https://avatars.discourse-cdn.com/v4/letter/d/e5b9ba/32.png) [@derwunner](https://forum.shopware.com/u/derwunner)\
**Post date:** [22. Mai 2018 um 07:23 UTC](https://forum.shopware.com/t/werte-aus-formularfeld-in-datenbank-schreiben/52946/5 "2018-05-22T07:23:20Z")

</div>

Hallo,

&nbsp;

also wenn ich dich richtig verstehe, dann willst du zusätzlich einen Wert in der DB speichern, also zusätzlich zu dem bisherigen Standard-Verhalten. Genau dafür gibts Events, muss also nichts überschrieben werden. Klinke dich einfach danach ein und speichere deine Werte in der DB.

Denke bitte auch dran, die Formularfelder zu escapen, bzw. den von Shopware generierten escapten Wert zu benutzen, zwecks Angriffsmöglichkeiten via SQL Injections oder ähnliches.

&nbsp;

&nbsp;

MFG

&nbsp;

derwunner

---

<div class="post-metadata">

**Author:** ![Wilson82](https://avatars.discourse-cdn.com/v4/letter/w/e274bd/32.png) [@Wilson82](https://forum.shopware.com/u/Wilson82)\
**Post date:** [23. Mai 2018 um 14:49 UTC](https://forum.shopware.com/t/werte-aus-formularfeld-in-datenbank-schreiben/52946/6 "2018-05-23T14:49:34Z")

</div>

> [@derwunner schrieb:](https://forum.shopware.com/profile/25468/derwunner "derwunner")
> 
> Hallo,
> 
> &nbsp;
> 
> also wenn ich dich richtig verstehe, dann willst du zusätzlich einen Wert in der DB speichern, also zusätzlich zu dem bisherigen Standard-Verhalten. Genau dafür gibts Events, muss also nichts überschrieben werden. Klinke dich einfach danach ein und speichere deine Werte in der DB.
> 
> Denke bitte auch dran, die Formularfelder zu escapen, bzw. den von Shopware generierten escapten Wert zu benutzen, zwecks Angriffsmöglichkeiten via SQL Injections oder ähnliches.
> 
> &nbsp;
> 
> &nbsp;
> 
> MFG
> 
> &nbsp;
> 
> derwunner

&nbsp;

Tausend Dank für die Tipps. Hab mich eingelesen.&nbsp;

Grundsätzlich habe ich mittlerweile herausgefunden, dass Shopware die Sache mit dem Rückschreiben in die Datenbank doch erledigt, und zwar, wenn man im input Feld folgenden Wert setzt:&nbsp;

```
 name="profile[attribute][test]"

```

Die Frage bleibt, wie kann ich in eigenen Formularfeldern (Freitextfeld s\_user\_attributes) den vom User eingegeben Wert holen und dann in die DB Spalte zurückschreiben.&nbsp;

```
public static function getSubscribedEvents()
    {
        return [          
            'Enlight_Controller_Action_PostDispatchSecure_Frontend_Account' => 'onFrontendPostDispatch',           
            'Shopware_Controllers_Frontend_Account::saveProfileAction::after' => 'onAction'
         ];

    }

```

Der PostDispatchSecure kommt für mich nicht in Frage, weil ich das ganze ja explizit nur dann ausführen möchte, wenn der User Änderung speichern klickt und damit wäre ich ja dann beim …:saveProfileAction::after ???

Jetzt kommt leider der blutige Anfänger in mir zum Tragen. Ich würde es mal so versuchen. Hab aber keine Idee, wie ich den $postData befüllen soll…Wäre die Vorgehensweise denn so grundsätzlich so richtig ? Ps meine Alert Box wird auch nicht ausgegben, daher die Frage, ob hier überhaupt was passiert…

```
public function onAction(\Enlight_Hook_HookArgs $args)
    {
        $userId = Shopware()->Session()->sUserId;

        $postData = $args->getSubject()->Request()->getPost();
        $test= $postData["??????????];

        $sqlAccount = 'UPDATE s_user_attributes SET test = ? WHERE userID = ?';
        Shopware()->db()->query($sqlAccount,array($test, $userId));

        echo 'alert("TEST geklappt");';

    }

```

&nbsp;

---

<div class="post-metadata">

**Author:** ![Wilson82](https://avatars.discourse-cdn.com/v4/letter/w/e274bd/32.png) [@Wilson82](https://forum.shopware.com/u/Wilson82)\
**Post date:** [24. Mai 2018 um 14:24 UTC](https://forum.shopware.com/t/werte-aus-formularfeld-in-datenbank-schreiben/52946/7 "2018-05-24T14:24:37Z")

</div>

Hallo nochmal,

also zu meinem Erstaunen funktioniert das ganze soweit.&nbsp;

Aber nur mit Variante&nbsp;‘Enlight\_Controller\_Action\_PostDispatchSecure\_Frontend\_Account’ =\> ‘onFrontendPostDispatch’ -\> was ich nicht ganz glücklich finde, weil dies ja dann immer ausgeführt wird, wenn die Account Seite aufgerufen wird. Wie ich auf die SaveProfileAction komme, keine Ahnung, da tut sich einfach nichts. Aber immerhin.

Den Wert in die Datenbank bekomme ich auch schon reingeschrieben. Allerdings nur, wenn ich&nbsp;$test = “Ich bin ein Wert”; schreibe. Mein Ziel ist es ja, den Wert, den der User im Feld eingegeben hat an die DB zu schicken.

Hier nochmal konkreter, damit ich vielleicht meine Chancen auf einen Tipp erhöhen kann -\>

So sieht mein Feld in der Profile.tpl aus -\>

```
{* swag_shoesize *}
                            {block name="frontend_account_profile_profile_input_swagshoesize"}
                                {s name='ProfilePersonalSwagShoesize'}{/s}
                                
                                    
                                
                            {/block}

```

Der saveProfile Post schickt das raus --\>

![](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/2X/9/92d206a4aac49d18c9cb89e5d7df06c09276f14b.png)

Was leider nicht funktioniert:

```
public function onFrontendPostDispatch1(\Enlight_Controller_ActionEventArgs $args)
    {
        $userId = Shopware()->Session()->sUserId;

        $postData = $args->getSubject()->Request()->getPost();
        $test= $postData["profile[attribute][test1]"];

        $sqlAccount = 'UPDATE s_user_attributes SET test = ? WHERE userID = ?';
        Shopware()->db()->query($sqlAccount,array($test, $userId));
    }

```

Wer kann helfen? Über Tipps wäre ich sehr dankbar.&nbsp;

---

<div class="post-metadata">

**Author:** ![derwunner](https://avatars.discourse-cdn.com/v4/letter/d/e5b9ba/32.png) [@derwunner](https://forum.shopware.com/u/derwunner)\
**Post date:** [25. Mai 2018 um 12:51 UTC](https://forum.shopware.com/t/werte-aus-formularfeld-in-datenbank-schreiben/52946/8 "2018-05-25T12:51:47Z")

</div>

Du kannst im Event abfragen, von welcher Controller Action man gekommen ist. So kann man das auf eine Action herunter brechen =\> dein Code wird also nur dann ausgeführt. Musst dir allerdings alles aus dem Event Parameter holen, denn dort steckt alles drin, was du brauchst bzw. wissen musst:

```
/**
 * @var \Enlight_Controller_Action $controller
 */
$controller = $args->getSubject();
/**
 * @var \Enlight_Controller_Request_Request $request
 */
$request = $controller->Request();

/**
 * @var \Enlight_View_Default $view
 */
$view = $controller->View();

if (strtolower($request->getActionName()) === 'meineaction') {
    // hier dein Code
}

```

Ich würde dir auch empfehlen in Shopware mit dem Container zu arbeiten, also nicht mit dem Shopware() Singleton call, denn der ist veraltet. Zugegeben, in der Dokumentation steht auch nur ganz klein irgendwo dabei, dass sich das meiste noch auf die alte Plugin Struktur bezieht. Man muss hier also schon wissen, was sich auf welche Plugin Struktur bezieht und was gleich geblieben ist. Das findet meiner Meinung nach zu wenig Erwähnung in der Doku.

Eine weitere Sache noch: Grundsätzlich kannst du auf drei verschiedene Art und Weisen auf die Datenbank in Shopware zugreifen:

1. Mit dem Zend\_Db\_Adapter: Nicht mehr zu empfehlen, weil stark veraltet und nur noch vereinzeilt bei alten Core Klassen in Benutzung
2. Mit Doctrine’s DBAL: Schon eher zu empfehlen, ist vorallem der empfohlene Weg im Frontend Bereich
3. Mit Docrtine ORM: Der wohl beste wählbare Weg, meist&nbsp; aber etwas komplizierter als DBAL und man sollte hier schon wissen, was man tut.

Ich empfehle dir auch nicht die Secure Events zu verwenden, denn die werden nur getriggert, wenn sich eine HTTP Anfrage dahinter befindet, hingegen die normalen Events immer. Also einfach

```
Enlight_Controller_Action_PostDispatch_Frontend_Account

```

verwenden, anstatt von

```
Enlight_Controller_Action_PostDispatchSecure_Frontend_Account

```

&nbsp;

&nbsp;

MFG

&nbsp;

derwunner

---

<div class="post-metadata">

**Author:** ![BestShopPossible](https://avatars.discourse-cdn.com/v4/letter/b/6bbea6/32.png) [@BestShopPossible](https://forum.shopware.com/u/BestShopPossible)\
**Post date:** [28. Mai 2018 um 11:38 UTC](https://forum.shopware.com/t/werte-aus-formularfeld-in-datenbank-schreiben/52946/9 "2018-05-28T11:38:38Z")

</div>

Das ganze soll doch ausgeführt werden wenn ein update geschieht. Also hängt man sich auch an die Update Methode. Warum immer so kompliziert?

Das hier sollte die Stelle sein die du suchst:

> <https://github.com/shopware/shopware/blob/5.4/engine/Shopware/Bundle/AccountBundle/Service/AddressServiceInterface.php>

&nbsp;

---

<div class="post-metadata">

**Author:** ![Wilson82](https://avatars.discourse-cdn.com/v4/letter/w/e274bd/32.png) [@Wilson82](https://forum.shopware.com/u/Wilson82)\
**Post date:** [28. Mai 2018 um 14:44 UTC](https://forum.shopware.com/t/werte-aus-formularfeld-in-datenbank-schreiben/52946/10 "2018-05-28T14:44:31Z")

</div>

Vielen Dank BestShopPossible und derwunner!!!

Mein erstes Plugin steht und funktioniert. @derwunner: das Thema mit&nbsp;Doctrine’s DBAL etc. schaue ich mir nochmal genauer an. Irgendwie hat es jetzt doch mit der Registrierung des Events auf die einfache Weise geklappt. Die Abfrage mit dem Request ist aber super und kann ich bestimmt ein andern mal verwenden. Danke auch dafür!

Mein tpl -\>

```
{extends file="parent:frontend/account/profile.tpl"}

{block name="frontend_account_profile_profile_input_lastname"}
    {$smarty.block.parent}

    {block name="frontend_account_profile_profile_input_JwAccountAddress"}
        {s name='ProfilePersonalJwAccountAddress'}{/s}
        
            
        
    {/block}

{/block}

```

Meine JwAccountAddress.php File

```
?php
namespace JwAccountAddress;
use Shopware\Components\Plugin;
use Shopware\Components\Plugin\Context\InstallContext;
/**
 * A simple plugin that shows the usage of attributes in the frontend.
 *
 * @package JwAccountAddress
 */
class JwAccountAddress extends Plugin
{
    /**
     * @param InstallContext $context
     * @return bool
     */
    public function install(InstallContext $context)
    {
        $service = $this->container->get('shopware_attribute.crud_service');
        $service->update('s_user_attributes', 'accountaddress', 'string', [
            'label' => 'AccountAddress',
            'displayInBackend' => true
        ]);

        return true;
    }
    /**
     * @return array
     */
    public static function getSubscribedEvents()
    {
        return [
            'Enlight_Controller_Action_PostDispatchSecure_Frontend' => 'onFrontendPostDispatch',
            'Enlight_Controller_Action_Frontend_Account_saveProfile' => 'saveTransactionAction',
         ];

    }

    /**
     * @param \Enlight_Controller_ActionEventArgs $args
     */
    public function onFrontendPostDispatch(\Enlight_Controller_ActionEventArgs $args)
    {
        $view = $args->getSubject()->View();
        $view->addTemplateDir($this->getPath() . '/Resources/views');
    }

    public function saveTransactionAction(\Enlight_Event_EventArgs $args)

    {

        $userId = Shopware()->Session()->sUserId;

        $view = $args->getSubject()->View();
        $userId = $view->getAssign('sUserData');

        $userId = Shopware()->Session()->sUserId;
        $postData = $args->getSubject()->Request()->getPost();
        $acad = $postData['accountaddress'];

        $sqlAccount = 'UPDATE s_user_attributes SET accountaddress = ? WHERE userID = ?';
        Shopware()->db()->query($sqlAccount,array($acad, $userId));

    }

   
}

```

&nbsp;
