Wilson82Wilson82 MitgliedKommentare: 29 Danke erhalten: 5 Mitglied seit: Oktober 2016

Hallo zusammen,

habe mir mal das swag_shoesize PlugIn installiert. 

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

 <div class="register--shoesize">
          <input autocomplete="section-personal shoesize"
              name="register[personal][attribute][swagShoesize]"
              type="email"
              placeholder="Shoesize"
              id="shoesize"
              value="{$sUserData.additional.user.swag_shoesize|escape}"
              class="register--field"
          />
</div>

Er holt mir die Daten aus der s_user_attributes in das Formularfeld. Soweit so gut. 

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. 

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

 

Antworten

  • arnebeckerarnebecker MitgliedKommentare: 337 Danke erhalten: 69 Mitglied seit: Juni 2017

    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?

  • Wilson82Wilson82 MitgliedKommentare: 29 Danke erhalten: 5 Mitglied seit: Oktober 2016

    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. 

    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!!!

  • ShyimShyim MitgliedKommentare: 282 Danke erhalten: 130 bearbeitet 21. Mai Mitglied seit: Mai 2015

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

  • derwunnerderwunner MitgliedKommentare: 269 Danke erhalten: 53 bearbeitet 22. Mai Mitglied seit: Januar 2017

    Hallo,

     

    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.

     

     

    MFG

     

    derwunner

  • Wilson82Wilson82 MitgliedKommentare: 29 Danke erhalten: 5 Mitglied seit: Oktober 2016

    Hallo,

     

    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.

     

     

    MFG

     

    derwunner

     

    Tausend Dank für die Tipps. Hab mich eingelesen. 

    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: 

    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. 

    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 '<script type="text/javascript">alert("TEST geklappt");</script>';
    
        }

     

  • Wilson82Wilson82 MitgliedKommentare: 29 Danke erhalten: 5 Mitglied seit: Oktober 2016

    Hallo nochmal,

    also zu meinem Erstaunen funktioniert das ganze soweit. 

    Aber nur mit Variante '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 $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}
                                    <div class="profile--swagshoesize">
                                        <input autocomplete="section-personal shoesize"
                                               name="profile[attribute][test1]"
                                               type="text"
                                               aria-required="true"
                                               placeholder="TEST"
                                               value="{$sUserData.additional.user.test|escape}"                                           
                                        />
                                    </div>
                                {/block}

    Der saveProfile Post schickt das raus -->

    image

    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. 

  • derwunnerderwunner MitgliedKommentare: 269 Danke erhalten: 53 Mitglied seit: Januar 2017

    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  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

     

     

    MFG

     

    derwunner

Anmelden oder Registrieren, um zu kommentieren.