Code bei Schnittstelle eines Shop-Plugins

Hallo liebe Foren-User,

Ich habe mal wieder ein kleines Problem und hoffe, dass mir jemand hilfreich zur Seite stehen, kann wie es schon das ein oder andere mal so war.

Ich nutze eine Forensoftware und habe mir ein Shop-Plugin dazu gekauft. Leider unterstützt das Plugin keine Versandkosten-Staffelungen. Das heißt es ist von Haus aus nur möglich entweder einen einzigen Versand für die ganze Bestellung einzustellen, oder aber den Versand schon im Produktpreis einzuberechnen. Beide Varianten sind für unsere Zwecke eher ungünstig.

Aber der Entwickler hat eine Schnittstelle (API?) zur verfügung gestellt, um Rabatte definieren zu können. Wir bieten derzeit nur 8 Produkte an, weshalb ich dachte, ich könnte es dort alles einfach mal definieren. Bitte nicht lachen, wenn ihr das hier seht. Ich hab nur sehr wenig Ahnung vom Programmieren und hab das hier in mühevollem hin und herschieben aus verschiedenen Beispielen zusammengestückelt…

[PHP]public function isActive() {

  $count1 = 0; $weight1 = 250; 
  $count2 = 0; $weight2 = 250;
  $count3 = 0; $weight3 = 250; 
  $count4 = 0; $weight4 = 80; 
  $count5 = 0; $weight5 = 50;
  $count6 = 0; $weight6 = 40;  
  $count7 = 0; $weight7 = 40;  
  $count8 = 0; $weight8 = 20; 
  $gesamt = 0;
 
  foreach($this->basket->getBasketItems() AS $basketItem) {
    if($basketItem->productID == 1){
        $count1 += $basketItem->amount;}
    if($basketItem->productID == 2){
        $count2 += $basketItem->amount;}
    if($basketItem->productID == 3){
        $count3 += $basketItem->amount;}
    if($basketItem->productID == 4){
        $count4 += $basketItem->amount;}     
    if($basketItem->productID == 5){
        $count5 += $basketItem->amount;}
    if($basketItem->productID == 6){
        $count6 += $basketItem->amount;}
    if($basketItem->productID == 7){
        $count7 += $basketItem->amount;}
    if($basketItem->productID == 8){
        $count8 += $basketItem->amount;}
    }
   
    $gesamt = $count1*$weight1 + $count2*$weight2 + $count3*$weight3 + $count4*$weight4 + $count5*$weight5 + $count6*$weight6 + $count7*$weight7 + $count8*$weight8;               

        if($gesamt > 2000) {
        return true;
    }
   
    return false;   
}

public function getValue() {
    return 2.0;
}

}[/PHP]

Ihr seht, ich hab für unsere 8 Produkte einfach jeweils ein Gewicht definiert und lasse es am Ende zusammenrechnen. Das funktioniert auch schonmal sehr gut. Mein Problem ist nun, dass ich nur eine einzige Bedingung festlegen konnte, nämlich, dass über 2000g 2€ auf den Preis aufgeschlagen werden.
Ich brauche aber eine größere Staffelung.

Ich hatte die Hoffnung, dass dies klappen würde:

[PHP]public function getValue() {
if($gesamt < 500) return 5.45;
if($gesamt < 1000) return 4.50;
if($gesamt < 2000) return 2.80;
return 0.0;
}[/PHP]

Aber das tuts leider nicht, denn ich bekomme einen PHP-Fehler, der mir sagt, dass $gesamt nicht definiert ist. Also vermute ich, dass die Variable nicht einfach so aus der anderen Funktion übernommen werden kann.
Nun weiß ich aber nicht weiter… Wie bekomme ich es hin, dass ich da verschiedene Fälle nutzen kann?

Ich danke schonmal im Vorraus für die Hilfe.

LG

Moin,
das liegt daran das die Variable $gesamt nur in deiner isActive Funktion tätig ist. Da du sie dort definiert hast. Um diese Variable nun in der kompletten Klasse zur Verfügung zu haben musst du diese ganz oben in der Klasse definieren.
Und zwar so public $gesamt;

Wenn du dies gemacht hast, kannst du in jeder Funktion mit $this->gesamt drauf zugreifen. Nun musst du also anstelle von $gesamt überall $this->gesamt schreiben.

[PHP]public function getValue() {
if($gesamt < 500) return 5.45;
if($gesamt < 1000) return 4.50;
if($gesamt < 2000) return 2.80;
return 0.0;
}[/PHP]

Bei dieser Funktion wirst du auch immer 0.0 zurück bekommen. Also schau dir bitte nochmal if bedingungen an, ich meine speziell mit elseif. Und eine sache noch also so wurde mir das beigebracht, dass mit so vielen returns ist schlechter Code. ein return reicht völlig und zwar der am Ende. Also definier fü die Werte eine variable und gebe diese mit return zurück.

Vielen Dank! Du hast mir sehr geholfen!

Muss nicht unbedingt als public, sondern kann auch als private deklariert werden.
Public braucht man nur, wenn man auch von aussen auf Klassenvariablen zugreifen möchte (bei private deklarierten Variablen brauchst dann halt Getter/Setter).