Vererbung - UserController


#1

Hallo Community,

ich möchte mit einem Modul das Registrierungs-Formular der Nutzer erweitern.

Dazu habe ich den RegisterController um eine Funktion erweitert, die über das Template “form/fieldset/user_account.tpl” aufgerufen wird. Das ganze funktioniert soweit ganz gut.

Nun habe ich aber festgestellt, dass wenn der Nutzer sich während des Bestellvorgangs an der Kasse registrieren möchte (und nicht, über den Aufruf “Anmelden -> Registrieren”), zwar das o.g. Template aufgerufen wird, jedoch Smarty eine Fehlermeldung wirft:

Function 'pdkGetOrganisations' does not exist or is not accessible! (OxidEsales\Eshop\Application\Controller\UserController)

Daraufhin habe ich mir den Code mal etwas genauer angeschaut, und festgestellt, dass der Controller RegisterController von der Klasse UserController erbt.

Also habe ich mein Modul nun so umgebaut, dass ich nicht den RegisterController um meine Funktion erweitere, sondern den Controller UserController. Somit wäre meine Funktion schließlich auch in der RegisterController verfügbar, da diese ja von der UserController erbt. dachte ich…

Nach dieser Anpassung habe ich jetzt allerdings das umgekehrte Problem:

Meine Funktion kann jetzt problemlos von dem o.g. Template aufgerufen werden, wenn der Nutzer sich während des Bestellvorgangs registrieren möchte. Geht er allerdings direkt auf Registrieren (z.B. über “Anmelden -> Registrieren” auf der Website), erhalte ich die folgende Fehlermeldung:

Function 'pdkGetOrganisations' does not exist or is not accessible! (OxidEsales\Eshop\Application\Controller\RegisterController)

Ich fühle mich gerade etwas dumm. Habe ich das Prinzip der Vererbung nicht verstanden? Muss ich jetzt beide Klasse (UserController und RegisterController) um ein und die selbe Funktion erweitern damit alles läuft?

Ich würde mich freuen, wenn Ihr einen Ratschlag für mich habt :grinning:


#2

ja. Stell dir vor, du hast 5 Kühlschränke im Keller. Nun hast du eine Torte gekauft und legst sie in einen der Kühlschränke. Und später suchst du die Torte in einem anderen Kühlschrank, aber sie ist nicht da drin. Genau so läuft es auch hier.


#3

Hallo Vanilla,

Danke für diese schöne Verdeutlichung :rofl: Dann werde ich es so realisieren.

Was mich halt wundert, dass die Klasse RegisterController doch von der Klasse UserController erbt. Ich dachte, wenn ich die Klasse UserController mit meinem Modul um eine Public Funktion erweitere, wird diese auch an die RegisterController vererbt.

Meine neue Funktion soll später nur in dem einem Template user_account.tpl zur Verfügung stehen. Ist es dafür wirklich nötig zwei verschiedene Controller mit der selben Funktion zu auszustatten?


#4

Hallo Ihr Lieben,

ich hoffe Ihr hattet ein paar schöne Festtage.

Leider funktioniert es so nicht :frowning:

Ich habe meine Funktion nun sowohl in der Klasse RegisterController als auch in der UserController angelegt.

Dies hat nun zur Folge, dass der von mir erweiterte Inhalt des Blocks user_account_username aus dem Template user_account.tpl, nun irgendwie doppelt geladen wird.

Kurzes Beispiel…

Im Verzeichnis modules/pdk/mymodule/views/blocks/ liegt ein File pdk_user_account_username.tpl

Dieses hat den folgenden Inhalt (vereinfacht dargestellt):

"Meine Ergänzung"
[{$smarty.block.parent}]

Es soll den Block user_account_username im Template user_account.tpl erweitern.

In der metadata.php habe ich dies wie folgt konfiguriert:

'blocks'       => array(
    array(
        'template' => 'form/fieldset/user_account.tpl',
        'block'    => 'user_account_username',
        'file'     => 'views/blocks/pdk_user_account_username.tpl'
    ),

Das Ergebnis ist, dass im Formular für die Registrierung zunächst "Meine Ergänzung" "Meine Ergänzung" (2x) steht, und dann das eigentliche Formular beginnt.

Warum wird denn jetzt"meine Ergänzung" doppelt geladen? Der restliche Blockinhalt steht doch auch nur ein mal da…


#5

schau mal in die Tabelle oxtplblocks ob dort der Eintrag nicht zufällig doppelt vorhanden ist.


#6

Für mein Modul (Spalte OXMODULE) gibt es dort tatsächlich zwei Einträge mit dem OXFILEviews/blocks/dps_user_account_username.tpl”.

Was bedeutet das und wie konnte das passieren?

Kann ich das Modul deaktivieren und die Einträge dann einfach löschen?


#7

Wieso das passiert, weiß ich nicht. Du kannst einfach einen der beiden Einträge löschen.


#8

Ok, super. das hat geholfen.

Vielen Dank!