PHP Brainstorm und Uservergütung?

440ci

Well-known member
12 Januar 2014
129
0
Moin
Ich betreibe gerade etwas Brainstorm:

Ich bin schon etwas länger daran, ein neues P4-Script zu bauen, in diesem Script gibt es die Möglichkeiten, den User mit folgenden Währungen zu Vergüten:

Multi (Alle unten genannten Währungen (je nach Netzwerk))
Euro
Punkte
Primera
Klammlose
Ebesucher

Jetzt habe ich aber auch noch die Möglichkeit, dem User eine Pauschale Vergütung zu geben (je PM oder Forced-Banner usw. mit einem Pauschalwert), oder eine Prozentuale Vergütung (diese lässt sich separat für PM, Forced-Banner usw. einstellen)

Jetzt bin ich gerade dabei, eine "payment"-Klasse zu schreiben, wo ich eine Methode drin habe, welche die Vergütung für die User abwickelt...und es artet in mehreren ineinander Verschachtelten gigantischen Switches aus....kennt jemand eine bessere Lösung?
 
Jetzt bin ich gerade dabei, eine "payment"-Klasse zu schreiben, [...]...und es artet in mehreren ineinander Verschachtelten gigantischen Switches aus....kennt jemand eine bessere Lösung?
Wenn schon Klassen, wieso nicht gleich richtig benutzen?
Vererbung dürfte wohl das "Feature" von Klassen schlechthin sein ;)
 
Wenn schon Klassen, wieso nicht gleich richtig benutzen?
Vererbung dürfte wohl das "Feature" von Klassen schlechthin sein ;)

Ja, schon, aber ich habe für die Vergütungen folgende Variablen:

PHP:
    // currency
    'currency_user' => 1, (kann 1-5 sein => euro, klammlose, primera usw.)

    // payment
    'pay_user_gap' => 1, (kann 1-2 sein => pauschal oder prozentual)

    // general payment
    'pm_pay_general_euro' => '0.0001',
    'pm_pay_general_primera' => '10',
    'pm_pay_general_points' => '10',
    'pm_pay_general_ebesucher' => '10',
    'pm_pay_general_klamm' => '100',
    'forced_banner_pay_general_euro' => '0.0001',
    'forced_banner_pay_general_primera' => '10',
    'forced_banner_pay_general_points' => '10',
    'forced_banner_pay_general_ebesucher' => '10',
    'forced_banner_pay_general_klamm' => '10',
    'pops_pay_general_euro' => '0.0001',
    'pops_pay_general_primera' => '10',
    'pops_pay_general_points' => '10',
    'pops_pay_general_ebesucher' => '10',
    'pops_pay_general_klamm' => '10',
    'layer_pay_general_euro' => '10',
    'layer_pay_general_primera' => '10',
    'layer_pay_general_points' => '10',
    'layer_pay_general_ebesucher' => '10',
    'layer_pay_general_klamm' => '10',
    'banner_pay_general_euro' => '10',
    'banner_pay_general_primera' => '10',
    'banner_pay_general_points' => '10',
    'banner_pay_general_ebesucher' => '10',
    'banner_pay_general_klamm' => '10',    
    'surfbar_pay_general_euro' => '0.0001',
    'surfbar_pay_general_primera' => '10',
    'surfbar_pay_general_points' => '10',
    'surfbar_pay_general_ebesucher' => '10',
    'surfbar_pay_general_klamm' => '10',

    // percent
    'pm_pay_percent' => 50,
    'forced_banner_pay_percent' => 50,
    'pops_pay_percent' => 50,
    'layer_pay_percent' => 50,
    'banner_pay_percent' => 50,
    'surfbar_pay_percent' => 50

Irgendwie fällt es mir gerade etwas schwer, da an Vererbungen zu denken ;D

// Edit: Wenn ich es mir so recht überlege, werde ich mir eine bessere Lösung suchen, die mit den Switches ist mir zu unflexibel, falls mal eine neue Währung eingebaut werden soll ;)
 
Zuletzt bearbeitet:
'pm_pay_general_euro' => '0.0001',
'
pm_pay_general_primera' => '10',
'
pm_pay_general_points' => '10',
'
pm_pay_general_ebesucher' => '10',
'
pm_pay_general_klamm' => '100',
'forced_banner_pay_
general_euro' => '0.0001',
'
forced_banner_pay_general_primera' => '10',
'
forced_banner_pay_general_points' => '10',
'
forced_banner_pay_general_ebesucher' => '10',
'
forced_banner_pay_general_klamm' => '10',
'pops_pay_
general_euro' => '0.0001',
'pops_pay_
general_primera' => '10',
'pops_pay_general_points' => '10',
'pops_pay_general_ebesucher' => '10',
'pops_pay_general_klamm' => '10',
'layer_pay_
general_euro' => '10',
'layer_pay_general_primera' => '10',
'layer_pay_general_points' => '10',
'layer_pay_general_ebesucher' => '10',
'layer_pay_general_klamm' => '10',
'banner_pay_
general_euro' => '10',
'banner_pay_
general_primera' => '10',
'banner_pay_general_points' => '10',
'banner_pay_general_ebesucher' => '10',
'banner_pay_general_klamm' => '10',
'surfbar_pay_
general_euro' => '0.0001',
'surfbar_pay_
general_primera' => '10',
'surfbar_pay_general_points' => '10',
'surfbar_pay_general_ebesucher' => '10',
'surfbar_pay_general_klamm' => '10',
Wo is der Fehler? ;) (exemplarisch für 2 von 5 bzw. 2 von 6)
 
:wall:
Du erkennst, dass dieselben Farben dieselbe Nomenklatur der Variablen zeigen?
Das ist absichtlich so gemacht, ds ich PM, FB usw. separat in allen Währungen Vergüten kann
Und wieso sind das dann unzählige Variablen ohne Struktur dahinter? Freilich darfst du dann mit switch und if und allen möglichen merkwürdigen Zeugs arbeiten und musst bei jeder neuen Währung oder neuem "PM, FB, usw." das komplette Script umschreiben :yawn:

Hübsch wärs doch, wenn du gar nix ändern müsstest, sondern bei einer neuen Währung einfach eine zusätzliche Klasse hinzufügst, d.h. eine einzige Datei hinzufügst und sonst keine einzige Zeile Code ändern musst. Oder? ;)
 
Das hat folgenden Sinn ;)

Ich rufe von einem Lose-Netzwerk zb. Paidmails ab, die Netzwerk-Vergütung kann ich mit zb. mit einem Pauschale Wert von zb. 500 Lose dem User geben.
Jetzt rufe ich von dem gleichen Netzwerk FB ab, da wären die 500 Lose pro Forced-Banner zu viel, also brauche ich da schon einen anderen Wert. Das gleiche natürlich auch bei allen anderen Währungen,- und wem das zu viel ist, der kann auch auf eine Prozentuale Vergütung umschalten, aber auch hier wollte ich die Möglichkeit bieten, alles so detailliert wie Möglich zu konfigurieren ;)

Diese Variablen:
PHP:
'pm_pay_general_euro' => '0.0001',
'pm_pay_general_primera' => '10',
'pm_pay_general_points' => '10',
'pm_pay_general_ebesucher' => '10',
'pm_pay_general_klamm' => '100',

Sind ja nur für die Vergütungen der Paidmail, diese hier für die Forced-Banner:

PHP:
'forced_banner_pay_general_euro' => '0.0001',
'forced_banner_pay_general_primera' => '10',
'forced_banner_pay_general_points' => '10',
'forced_banner_pay_general_ebesucher' => '10',
'forced_banner_pay_general_klamm' => '10',

usw. (Je Währung 1 Variable)
 
Anscheinend ist das Klassenkonzept neu :D
Du hast ne Klasse "payment" (meinetwegen).
Diese hat die Attribute:

PHP:
// currency
'currency_user'

// payment
'pay_user_gap'

// general payment
'forced_banner_pay_general'
'layer_pay_general'
'surfbar_pay_general'

// percent
'pm_pay_percent'
'forced_banner_pay_percent'
'pops_pay_percent'
'layer_pay_percent'
'banner_pay_percent'
'surfbar_pay_percent'
Am besten alle protected, damit da auch nix anderes was dran ändert ausser die Klassen die davon erben. Diese Klasse hat die Methode die mit dem zeugs sein zeugs tut.
Diese Klasse ist abstrakt, davon gibts keine Instanz.

Dann schreibst du für jede Währung die du haben willst ne eigene Klasse die von dieser abstrakten Klasse erbt. Darin vergibst du den Attributen die entsprechenden Werte.
Diese Abgeleitete, konkrete Klasse hat auch schon die Methode die da zeugs macht.

Irgendwie müsstest du jetz noch erkennen welche Klassen von der abstrakten Klasse abgeleitet werden, und die irgendwie auf die Währungen mappen (n weiteres attribut mit nem kürzel für die Währung?)

Und im Code, in der Logik die das ganze braucht am Ende, schaust du welche Währung gefragt ist, holst die entsprechende Klasse, erstellst ein Objekt jener Klasse und tada ... kein switch, keine schleifen, keine ifs.
Naja, okay, du solltest schauen ob es zu der Währung ne Klasse gibt, das wäre ein if-else (besser noch try-catch, wenn schon, dann richtig :D)



Und wenn das immer noch Spanisch klingt, dann wirste wohl Spanisch lernen müssen. (Sprich schauen wie das mit den Klassen funzt.)

//Achja: es ist mitten in der nacht,ich bin schon im bett... Denk/Tipp/Gramatik/Rechtschreibfehler seien mir verziehen.
 
Es geht ja noch weiter: Selbst die "Dinger", die vergütet werden, können doch erweiterbar gehalten werden. Siehe Farben Rot und Grün in Post #4.
 
hm, da würde ich dann das neue in der abstrakten mit eintragen.

Man kann sich natürlich auch n fancy Plugin-System basteln :D

Womit dann jede Währung sagt was für "Dinger" es vergüten mag... und dann... passiert irgendwo magie, dass was dann die richtigen zur richtigen zeit am richtigen ord mit der richtigen menge anzeigt.
 
Schon fertig ;)

Die Klasse ist so aufgebaut:

/libraries/payment/payment.php

/libraries/payment/drivers/paidmail.php
/libraries/payment/drivers/forced_banner.php
/libraries/payment/drivers/layer.php
[...]
/libraries/payment/drivers/base.php

/libraries/payment/interfaces/driverinterface.php

Das ganze nutzt (oder besser gesagt SOLLTE) Namespace in Verbindung mit einem Autoloader nutzen

Autoloader geht, Implementierungen und Überschreibungen, sowie die Definitionen der "use"-Statements innerhalb der Klassen gehen...das einzige, was nicht geht, ist die Klamotte, das ich es nicht aus dem Backend aufrufen kann

Sobald ich mit Namespace anfange, läuft da alles Amok, die "/libraries/factory.php" wird in "/libraries/environment/factory.php" gesucht usw., obwohl dort überall der namespace eindeutig ist

// Edit:
Gebe ich den Namespace absichtlich falsch ein, gibt xdebug mir diesen Fehler aus:

Fatal error: Class 'payment' not found in

Gebe ich ihn richtig an, das:

Fatal error: Class 'Payment\Factory' not found
 
Zuletzt bearbeitet:
Spannend wäre jetzt ja zu sehen, wie Dein Autoloader so aufgebaut ist und wie er initialisiert wird.
 
Spannend wäre jetzt ja zu sehen, wie Dein Autoloader so aufgebaut ist und wie er initialisiert wird.

Das ist der ganze Autoloader,- Ich glaube, ich habe den Fehler aber schon entdeckt...

nach dem Einbinden wird "loader::regiser ();" aufgerufen, dann läuft das gute Stück

PHP:
class loader
{
    public static function register ()
    {
        // inizialise autoloader
		spl_autoload_register (array (__CLASS__, 'load'));
	}

	public static function load ($class)
    {
        // remove backslashes
		$file = ltrim ($class, '\\');
        
        // explode parts as array
		$file_array = explode ('\\', $file);
        
        // remove root-dir
		array_shift ($file_array);

        // implode array 
		$file = implode (DS, $file_array);
        
		$path = strtolower (dirname (__FILE__) . DS . $file . '.php');

		if (file_exists($path))
        {
            include $path;
        }
		else
        {
            throw new Exception (Factory::setError (sprintf (SYSTEM_HINT_CLASS_NOT_FOUND, $path), true));
        }
	}
}
 
Also...die Klamotte mit der Multi-Währung ist so weit fertig ;)

Falls jemand eine bessere Idee zur Lösung hat, bitte sagen ;)

PHP:
    public function getUserPay ($admin_pay) {
        switch ($this->config->pay_user_gap) {
            // pauschal
            case 1:
                switch ($this->type) {
                    case 'paidmail':
                        switch ($this->config->currency_user) {
                            // multi-currency
                            case 0:
                                // @ multi use admin-currency
                                switch ($this->admin_pay_currency) {
                                    // euro
                                    case 1: $user_pay = $this->config->pm_pay_general_euro; break;
                                    // primera
                                    case 2: $user_pay = $this->config->pm_pay_general_primera; break;
                                    // points
                                    case 3: $user_pay = $this->config->pm_pay_general_points; break;
                                    // ebesucher
                                    case 4: $user_pay = $this->config->pm_pay_general_ebesucher; break;
                                    // klamm
                                    case 5: $user_pay = $this->config->pm_pay_general_klamm; break;
                                }
                                break;
                            // euro
                            case 1: $user_pay = $this->config->pm_pay_general_euro; break;
                            // primera
                            case 2: $user_pay = $this->config->pm_pay_general_primera; break;
                            // points
                            case 3: $user_pay = $this->config->pm_pay_general_points; break;
                            // ebesucher
                            case 4: $user_pay = $this->config->pm_pay_general_ebesucher; break;
                            // klamm
                            case 5: $user_pay = $this->config->pm_pay_general_klamm; break;
                        }
                        break;
                    case 'forced_banner':
                        switch ($this->config->currency_user) {
                            case 0:
                                switch ($this->admin_pay_currency) {
                                    case 1: $user_pay = $this->config->forced_banner_pay_general_euro; break;
                                    case 2: $user_pay = $this->config->forced_banner_pay_general_primera; break;
                                    case 3: $user_pay = $this->config->forced_banner_pay_general_points; break;
                                    case 4: $user_pay = $this->config->forced_banner_pay_general_ebesucher; break;
                                    case 5: $user_pay = $this->config->forced_banner_pay_general_klamm; break;
                                }
                                break;
                            case 1: $user_pay = $this->config->forced_banner_pay_general_euro; break;
                            case 2: $user_pay = $this->config->forced_banner_pay_general_primera; break;
                            case 3: $user_pay = $this->config->forced_banner_pay_general_points; break;
                            case 4: $user_pay = $this->config->forced_banner_pay_general_ebesucher; break;
                            case 5: $user_pay = $this->config->forced_banner_pay_general_klamm; break;
                        }
                        break;
                    case 'pops':
                        switch ($this->config->currency_user) {
                            case 0:
                                switch ($this->admin_pay_currency) {
                                    case 1: $user_pay = $this->config->pops_pay_general_euro; break;
                                    case 2: $user_pay = $this->config->pops_pay_general_primera; break;
                                    case 3: $user_pay = $this->config->pops_pay_general_points; break;
                                    case 4: $user_pay = $this->config->pops_pay_general_ebesucher; break;
                                    case 5: $user_pay = $this->config->pops_pay_general_klamm; break;
                                }
                                break;
                            case 1: $user_pay = $this->config->pops_pay_general_euro; break;
                            case 2: $user_pay = $this->config->pops_pay_general_primera; break;
                            case 3: $user_pay = $this->config->pops_pay_general_points; break;
                            case 4: $user_pay = $this->config->pops_pay_general_ebesucher; break;
                            case 5: $user_pay = $this->config->pops_pay_general_klamm; break;
                        }
                        break;
                    case 'layer':
                        switch ($this->config->currency_user) {
                            case 0:
                                switch ($this->admin_pay_currency) {
                                    case 1: $user_pay = $this->config->layer_pay_general_euro; break;
                                    case 2: $user_pay = $this->config->layer_pay_general_primera; break;
                                    case 3: $user_pay = $this->config->layer_pay_general_points; break;
                                    case 4: $user_pay = $this->config->layer_pay_general_ebesucher; break;
                                    case 5: $user_pay = $this->config->layer_pay_general_klamm; break;
                                }
                                break;
                            case 1: $user_pay = $this->config->layer_pay_general_euro; break;
                            case 2: $user_pay = $this->config->layer_pay_general_primera; break;
                            case 3: $user_pay = $this->config->layer_pay_general_points; break;
                            case 4: $user_pay = $this->config->layer_pay_general_ebesucher; break;
                            case 5: $user_pay = $this->config->layer_pay_general_klamm; break;
                        }
                        break;
                    case 'banner':
                        switch ($this->config->currency_user) {
                            case 0:
                                switch ($this->admin_pay_currency) {
                                    case 1: $user_pay = $this->config->banner_pay_general_euro; break;
                                    case 2: $user_pay = $this->config->banner_pay_general_primera; break;
                                    case 3: $user_pay = $this->config->banner_pay_general_points; break;
                                    case 4: $user_pay = $this->config->banner_pay_general_ebesucher; break;
                                    case 5: $user_pay = $this->config->banner_pay_general_klamm; break;
                                }
                                break;
                            case 1: $user_pay = $this->config->banner_pay_general_euro; break;
                            case 2: $user_pay = $this->config->banner_pay_general_primera; break;
                            case 3: $user_pay = $this->config->banner_pay_general_points; break;
                            case 4: $user_pay = $this->config->banner_pay_general_ebesucher; break;
                            case 5: $user_pay = $this->config->banner_pay_general_klamm; break;
                        }
                        break;
                    case 'surfbar':
                        switch ($this->config->currency_user) {
                            case 0:
                                switch ($this->admin_pay_currency) {
                                    case 1: $user_pay = $this->config->surfbar_pay_general_euro; break;
                                    case 2: $user_pay = $this->config->surfbar_pay_general_primera; break;
                                    case 3: $user_pay = $this->config->surfbar_pay_general_points; break;
                                    case 4: $user_pay = $this->config->surfbar_pay_general_ebesucher; break;
                                    case 5: $user_pay = $this->config->surfbar_pay_general_klamm; break;
                                }
                                break;
                            case 1: $user_pay = $this->config->surfbar_pay_general_euro; break;
                            case 2: $user_pay = $this->config->surfbar_pay_general_primera; break;
                            case 3: $user_pay = $this->config->surfbar_pay_general_points; break;
                            case 4: $user_pay = $this->config->surfbar_pay_general_ebesucher; break;
                            case 5: $user_pay = $this->config->surfbar_pay_general_klamm; break;
                        }
                        break;
                    case 'affiliate':
                        switch ($this->config->currency_user) {
                            case 0:
                                switch ($this->admin_pay_currency) {
                                    case 1: $user_pay = $this->config->forced_banner_pay_general_euro; break;
                                    case 2: $user_pay = $this->config->forced_banner_pay_general_primera; break;
                                    case 3: $user_pay = $this->config->forced_banner_pay_general_points; break;
                                    case 4: $user_pay = $this->config->forced_banner_pay_general_ebesucher; break;
                                    case 5: $user_pay = $this->config->forced_banner_pay_general_klamm; break;
                                }
                                break;
                            case 1: $user_pay = $this->config->pm_pay_general_euro; break;
                            case 2: $user_pay = $this->config->pm_pay_general_primera; break;
                            case 3: $user_pay = $this->config->pm_pay_general_points; break;
                            case 4: $user_pay = $this->config->pm_pay_general_ebesucher; break;
                            case 5: $user_pay = $this->config->pm_pay_general_klamm; break;
                        }
                        break;
                }
                break;
            // percent
            case 2:
                $sum_exchange = self::exchange ($admin_pay);
                switch ($this->type) {
                    case 'paidmail': $user_pay = ($sum_exchange * ($this->config->pm_pay_percent / 100)); break;
                    case 'forced_banner': $user_pay = ($sum_exchange * ($this->config->forced_banner_pay_percent / 100)); break;
                    case 'pops': $user_pay = ($sum_exchange * ($this->config->pops_pay_percent / 100)); break;
                    case 'layer': $user_pay = ($sum_exchange * ($this->config->layer_pay_percent / 100)); break;
                    case 'banner': $user_pay = ($sum_exchange * ($this->config->banner_pay_percent / 100)); break;
                    case 'surfbar': $user_pay = ($sum_exchange * ($this->config->surfbar_pay_percent / 100)); break;
                    case 'affiliate': $user_pay = ($sum_exchange * ($this->config->affiliate_pay_percent / 100)); break;
                }
                break;
        }
        return self::setPayFormat ($user_pay, $this->config->currency_user);
    }
 
:wall:

Du musst doch bei dem ganzen Copy&Paste schon gemerkt haben, dass da was ned passt?

Außerdem dachte ich, du wolltest das flexible machen?
Jetzt is ja doch alles fix in den Quellcode gemeißelt.
 
:wall:

Du musst doch bei dem ganzen Copy&Paste schon gemerkt haben, dass da was ned passt?

Außerdem dachte ich, du wolltest das flexible machen?
Jetzt is ja doch alles fix in den Quellcode gemeißelt.

Die Funktion als ganzes läuft erst mal und werden nach und nach in die Währungs-Klassen untergebracht.
Wo ich 4 Tage am bauen und testen bin, damit alles reibungslos läuft, wird von dir flüchtig überflogen und gesagt, es passt etwas nicht? Ich hoffe, du kannst es begründen.

// Edit:
Das ganze wird natürlich hinterher über 1 Klasse abgewickelt,- zb.
PHP:
$class = loadDriver ($this->area, $this->admin_pay_currency, $this->admin_pay, $this->user_pay_curreny, $this->user_pay);

Wobei $this->area dann paidmail, forced-banner usw. ist
Paidmail, Forced-Banner usw. befinden sich dann in extra Klassen...genau wie "Euro", "Klammlose", "Primera" usw.
 
Zuletzt bearbeitet: