Wilson82Wilson82 MitgliedKommentare: 35 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

 

2 Antworten

  • derwunnerderwunner MitgliedKommentare: 304 Danke erhalten: 61 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

    Zitieren
    Akzeptierte Antwort
    Danke von 1Wilson82
  • BestShopPossibleBestShopPossible MitgliedKommentare: 696 Danke erhalten: 116 Mitglied seit: November 2017

    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

     

    Zitieren
    Akzeptierte Antwort
    Danke von 1Wilson82
  • Akzeptierte Antworten

Antworten

  • arnebeckerarnebecker MitgliedKommentare: 347 Danke erhalten: 75 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: 35 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: 435 Danke erhalten: 194 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: 304 Danke erhalten: 61 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: 35 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: 35 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: 304 Danke erhalten: 61 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

    Zitieren
    Akzeptierte Antwort
    Danke von 1Wilson82
  • BestShopPossibleBestShopPossible MitgliedKommentare: 696 Danke erhalten: 116 Mitglied seit: November 2017

    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

     

    Zitieren
    Akzeptierte Antwort
    Danke von 1Wilson82
  • Wilson82Wilson82 MitgliedKommentare: 35 Danke erhalten: 5 bearbeitet 29. Mai Mitglied seit: Oktober 2016

    Vielen Dank BestShopPossible und derwunner!!!!!!!

    Mein erstes Plugin steht und funktioniert. @derwunner: das Thema mit 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}
            <div class="profile--jwaccountaddress">
                <input autocomplete="section-personal accountaddress"
                       name="accountaddress"
                       type="email"
                       aria-required="true"
                       placeholder="E-Mail Rechnungsadresse"
                       value="{$sUserData.additional.user.accountaddress|escape}"
                       class="profile--field is--required{if $errorFlags.accountaddress} has--error{/if}"
                />
            </div>
        {/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));
    
    
        }
    
       
    }

     

Anmelden oder Registrieren, um zu kommentieren.