User Attribute setzen

Hallo liebe Leute,

ich steh gerade etwas auf der Leitung. Hab meine User erfolgreich um einige Attribute erweitert.

Ich würde dem Kunden nun in seinem Account gerne die Möglichkeit geben diese zu ändern. Es funktioniert soweit alles, ausser dass ich die Best Practice zum setzen der Attribute nicht herausfinde.

Konkrete Frage: Werden beim Anlegen der Attribute auch setter Methoden generiert oder wie setz ich die Attribute am Besten?

Vielen Dank!

Martin

was meinst du mit setzten ? 

Wenn der kunde etwas eingegben hat und auf Speichern gedrückt hat damit das in die DB gespeichert wird oder wie ?

@Sheppard schrieb:

was meinst du mit setzten ? 

Wenn der kunde etwas eingegben hat und auf Speichern gedrückt hat damit das in die DB gespeichert wird oder wie ?

Ja genau, das meine ich. Shopware stellt ja nach dem Erzeugen von Attributen automatisch die dazugehörigen Getter Methoden.

Meine Frage ist ob auch eine Setter automatisch generiert wird oder ob ich mir die selbst basteln muss.

Die attribute models werden automatisch mit gettern und settern generiert.

Viele Grüße

also während meinen Durchforstungen der Shopware gedärme, habe das desöfteren auch setter methoden gesehen. Jedoch ist es nur logisch das ein trigger das Setzen auslöst, würde ich jetzt sagen. Für das Backend geschieht das ja Automatisch aber für das Frontend musst du glaube ich eine Form erstellen mit einer URL zu einer FUnktion (d)eines Controllers der die Speicher methode beeinhaltet. Wenn du dir ja die anderen Account einstellungen ansiehst haben die auch alle eine Form mit einer Funktion eines Controllers. 

Siehe hier für das Ändern/speichern der Lieferadresse

 

@Aquatuning GmbH schrieb:

Die attribute models werden automatisch mit gettern und settern generiert.

Viele Grüße

Das hab ich mir schon gedacht, ich bin allerdings zu blöd herauszufinden wie ich den Setter aufrufe. 

Der Getter funktioniert bei mir mit

$customerModel->getAttribute()->getKBCustomerBudget();

Dadurch dachte ich mir der Setter funktioniert in etwa so:

$customerModel->setAttribute()->setKBCustomerBudget($var_budget);

Tut er aber nicht :frowning:

Liebe Aquatuning GmbH, könntest du so nett sein und mir mit einem Beispielaufruf behilflich sein?

 

 

 

Schau dir mal das model im cache Ordner an.

Viele Grüße
https://www.digitvision.de

1 Like

@Aquatuning GmbH schrieb:

Schau dir mal das model im cache Ordner an.

Viele Grüße

Ok, der Aufruf funktioniert soweit mit

$customerModel->getAttribute()->setKBCustomerBudget($var_budget);

Wenn ich es direkt danach mit

$customerModel->getAttribute()->getKBCustomerBudget();

abrufe bekomme ich auch wieder den gesetzen Wert zurück.

In die Datenbank schreibt das aber noch nix.  Was fehlt mir da noch? Ich steh irgendwie auf der Leitung und komm nicht weiter…

So, ich hab meine stehende Leitung verlassen, Problem gelöst.

Hab einfach flush() vergessen…

So,

5 Jahre nach dem erstellen des Threads bin ich nun auch an dem Thema angelagt, was hier behandelt wurde.

Was hier leider unter gegangen ist, oder ich irgendwie übersehen habe, ist folgendes:

Damit man mit dem set auf ein Attribute zu Rande kommt, muss man mit dem getter (also: getAttribute) vorher zumindest das entsprechende attribute holen. Sonst führt das zum Fehler beim setter.

Also vom Ablauf eigentlich:
$cutomerModel = $this->getEntityManager()->getRepository('Shopware\Models\Customer\Customer')->findOneBy(
                        array('id' => $userid));

mit $cutomerModel->getAttribute()->getMyAttribute(); (Alternativ kann man auch alle customer Attribute holen, dann hat man direkt zugriff auf alle)
(alternativ: $customerModel->getAttribute();)

JETZT kann man erst ein SET machen !
zu beachten, dass man trotzdem mit getAttribute() arbeitet !
$setVal = $customerModel->getAttribute()->setMyAttribute($myValue);

(ein erneutes lesen, wie oben beschrieben, hat den Wert jetzt zwar verfügbar, aber man muss ihn noch schreiben in die DB, also:
$this->getentitymanager()->persist($setVal);
$this->getentitymanager()->flush();

Kurzer Nachtrag:
$this->getEntityManager() funktioniert natürlich nur, wenn man die entsprechende Methode aktiv hat
        public function getEntityManager()
        {
            return Shopware()->Models();
        }

Hat mich so einiges an Zeit der Recherche gekostet. Vielleicht hilft es dem ein oder anderen, der auch das Problem hat !

1 Like