Function 'getNoticeProductList' does not exist or is not accessible

Moin,

ich möchte in einem Modul die Produkte aus dem Merkzettel ausgeben. Dazu habe ich mir den entsprechenden Code-Schnipsel aus der noticelist.tpl geklaut. In meinem Modul-TPL funktioniert das aber nicht und schreibt mir diese Fehlermeldung ins Log:

Function 'getNoticeProductList' does not exist or is not accessible

Was muss ich machen, damit ich auf diese Funktion zugreifen kann?

Ohne jeglichen Kontext kann man diese Frage kaum konkret beantworten.
Kurz und allgemein gesagt hast du zwei Möglichkeiten:
entweder: das Modul-Template nur da benutzen, wo der Controller diese Funktion hergibt, also Benutzerkonto -> Merkzettel
oder: diese Funktion aus dem Controller kopieren und dorthin mitnehmen, wo du das Template verwenden willst.

Danke, hab ich gemacht, funktioniert :slight_smile:

Anschlussfrage dazu: Es wird ja einen Grund geben, warum diese Funktion von Oxid nicht auf allen Seiten zur Verfügung gestellt wird, sondern nur da, wo sie gebraucht wird. Wenn sie jetzt von meinem Modul im Header geladen wird, ist sie ja auf allen Seiten da. Hat so etwas Nachteile, die ich bedenken muss, z.b. bei der Performance?

grundsätzlich bedeuten alle dynamischen Inhalte zusätzliche Serverlast und längere Ladezeit, weil etwas aus der Datenbank geladen, in HTML umgewandelt und an den Browser geschickt werden muss. Ist bei wenig Traffic und einer Änderung nicht merkbar, aber es summiert sich alles.

Ganz einfach damit man nicht einen riesigen Controller hat mit einer Million Methoden. Hat erstmal nichts mit Performance zu tun.

Noch 'ne Folgefrage hätte ich:

In mein Lernmodul hatte ich bisher mehrere Funktionen eingebaut, die alle die oxviewconfig erweitern. In einem ersten Schritt habe ich die jetzt für den Merkzettel benötigte Methode getNoticeProductList() aus der account_noticelist.php geklaut und ebenfalls in oxviewconfig eingebaut. Das funktioniert soweit.

Die Vorlage dieser Methode wird aber über $oView aufgerufen, nicht über $oViewConf. Deshalb habe ich nun meine metadata.php um diese Zeile erweitert:

"oxview" => "ifabrik/multitool/core/multitool_oxview",

… und die Methode in diese PHP-Datei transferiert. Die wird aber nicht ausgeführt, so dass meine Methode von dort nicht aufrufbar ist. Wahrscheinlich habe ich da noch einen Verständnisfehler. Kann mir jemand einen Tipp geben, was ich falsch mache?

das ist wiederum ein wenig komplizierter.
mit $oView wird im Tempalte immer der Controller referenziert, also z.B. die Datei account_noticelist.php und nicht oxView.php
oxView ist dagegen sowas wie eine Schablone für einzelne Controller, du kannst oxView nicht sinnvoll mit dem Modul erweitern, weil der Controller immer original oxView nimmt und nicht deine erweiterte oxView.
Da aber alle Controller die (mehr oder weniger) selbe oxViewConfig teilen, kann man diese sehr gut mit den Modulen erweitern.

Oder anders gesagt: oxviewconfig steht am Ende einer Vererbungskette, deswegen kann diese Kette hier mit einer eigenen Erweiterung fortgesetzt werden, oxview steht dagegen in der Mitte der Kette deshalb gibt es diese Möglichkeit dort nicht. Hier eine Liste der Klassen die nicht erweitert werden können: https://oxidforge.org/en/list-of-not-overloadable-classes.html

Aah, das erklärt’s. Danke!

Ist meine Methode dann in oxviewconfig gut aufgehoben? Gibt es da eine “best practice” oder kann man seine Methoden ungestraft reinpacken wo man gerade will?

Wo die Methode am besten hinpasst muss man selber entscheiden. Oxviewconfig ist schon OK in dem Fall würde ich sagen. Man könnte die Methode auch in oxuser unterbringen, dass ist verfügbar im Template über oxcmp_user. Das geht aber schon wieder nicht einfach mit copy/paste.

OK, verstanden. Danke an alle!

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.