Oxid 6.2.3 Model per Modul hinzufügen

Moin,

ich möchte in meinem Oxid 6.2.3 System ein eigenes Model hinzufügen.

Dieses soll zuerst nur ein einen Title und Active Status enthalten.

Mit meinem Modul füge ich den Listenpunkt “Kontaktperson” unter Benutzer ein. Ich habe einen Controller der den klassischen List View aufruft und dort fängt das Problem an. Die Liste oben möchte auf das Model zugreifen.
Dies habe ich wiefolgt eingebunden:

'extend'       => [
    \OxidEsales\Eshop\Core\Model\BaseModel::class => \MyComp\MyContactPerson\Application\Model\ContactPerson::class,
],

Meine Metadata Version ist die 2.1.

Dies ruft das File auf in dem ich das Model definiert habe:

<?php


namespace MyComp\MyContactPerson\Application\Model;

use oxDb;

class ContactPerson extends \OxidEsales\Eshop\Core\Model\MultiLanguageModel
{
    /**
     * Name of current class
     *
     * @var string
     */
    protected $_sClassName = 'idcontactperson';

    /**
     * Class constructor, initiates parent constructor (parent::oxBase()).
     */
    public function __construct()
    {
        parent::__construct();
        $this->init('idcontactperson');
    }

 function delete($sOXID = null)
    {
        if (!$sOXID) {
            $sOXID = $this->getId();
        }
        if (!$sOXID) {
            return false;
        }

        parent::delete($sOXID);

        return true;
    }
}

Nun bekomme ich beim Aufruf eine Weiterleitung auf die Startseite (Natürlich nur im oberen Listview) mit folgender Fehlermeldung:

[2021-04-03 17:50:17] OXID Logger.ERROR: EXCEPTION_SYSTEMCOMPONENT_CLASSNOTFOUND idcontactperson ["[object] (OxidEsales\\Eshop\\Core\\Exception\\SystemComponentException(code: 0): EXCEPTION_SYSTEMCOMPONENT_CLASSNOTFOUND idcontactperson at /usr/www/users/www/oxid/releases/38/vendor/oxid-esales/oxideshop-ce/source/Core/UtilsObject.php:223)\n[stacktrace]\n#0 /usr/www/users/www/oxid/releases/38/source/oxfunctions.php(104): OxidEsales\\EshopCommunity\\Core\\UtilsObject->oxNew('idcontactperson')\n#1 /usr/www/users/www/oxid/releases/38/vendor/oxid-esales/oxideshop-ce/source/Core/Model/ListModel.php(336): oxNew('idcontactperson')\n#2 /usr/www/users/www/oxid/releases/38/vendor/oxid-esales/oxideshop-ce/source/Application/Controller/Admin/AdminListController.php(780): OxidEsales\\EshopCommunity\\Core\\Model\\ListModel->getBaseObject()\n#3 /usr/www/users/www/oxid/releases/38/vendor/oxid-esales/oxideshop-ce/source/Application/Controller/Admin/AdminListController.php(217): OxidEsales\\EshopCommunity\\Application\\Controller\\Admin\\AdminListController->getItemList()\n#4 /usr/www/users/www/oxid/releases/38/source/modules/mycomp/my_contactperson/Controller/Admin/ContactPersonList.php(39): OxidEsales\\EshopCommunity\\Application\\Controller\\Admin\\AdminListController->render()\n#5 /usr/www/users/www/oxid/releases/38/vendor/oxid-esales/oxideshop-ce/source/Core/ShopControl.php(471): MyComp\\MyContactPerson\\Controller\\Admin\\ContactPersonList->render()\n#6 /usr/www/users/www/oxid/releases/38/vendor/oxid-esales/oxideshop-ce/source/Core/ShopControl.php(359): OxidEsales\\EshopCommunity\\Core\\ShopControl->_render(Object(MyComp\\MyContactPerson\\Controller\\Admin\\ContactPersonList))\n#7 /usr/www/users/www/oxid/releases/38/vendor/oxid-esales/oxideshop-ce/source/Core/ShopControl.php(282): OxidEsales\\EshopCommunity\\Core\\ShopControl->formOutput(Object(MyComp\\MyContactPerson\\Controller\\Admin\\ContactPersonList))\n#8 /usr/www/users/www/oxid/releases/38/vendor/oxid-esales/oxideshop-ce/source/Core/ShopControl.php(142): OxidEsales\\EshopCommunity\\Core\\ShopControl->_process('MyComp\\\\MyCont...', NULL, NULL, NULL)\n#9 /usr/www/users/www/oxid/releases/38/vendor/oxid-esales/oxideshop-ce/source/Core/Oxid.php(27): OxidEsales\\EshopCommunity\\Core\\ShopControl->start()\n#10 /usr/www/users/www/oxid/releases/38/source/index.php(16): OxidEsales\\EshopCommunity\\Core\\Oxid::run()\n#11 /usr/www/users/www/oxid/releases/38/source/admin/index.php(12): require_once('/usr/www/users/...')\n#12 {main}\n"] []

Hier ist einmal ein Bild welches ich mit dem DevUtils Modul von VanillaThunder gemacht habe:

Ist diese Art ein Model hinzuzufügen überhaupt die “richtige” und wenn ja wäre es toll wenn mir jemand vielleicht einen kleinen Tipp geben könnte was ich falsch machen, vielen Dank! Und Frohe Ostern :wink:

  1. Controller in metadata unter controllers’ =>

  2. protected $_sClassName = ‘contactperson’;

  3. oxnew(‘contactperson’).

  4. Oder alles mit idcontactperson.

du hast da ein paar Sachen durcheinander gebracht.
Den "extend" => [] Teil braucht man nur, wenn man Funktionen von bestehende Klassen in OXID erweitern oder ändern möchte.
Für eigene Klassen brauch man keinen Eintrag in “extend”, aber man muss Namespaces statt kurzen Klassennamen nutzen.

1 Like

Danke für deine Antwort!

heißt es ich müsste statt dem Extend das ganze als Controller registrieren?

Und was heißt “alles”, inkludiert das die Controller, Classpfade etc?

Danke für deine Antwort!

Heißt das, ich müsste das Model garnicht in der Metadata registrieren oder als Controller?

Und wo genau müsste ich den Namespace aufrufen, in oxnew()?

Jaein, wenn Du einen eigenen Seitentyp definieren möchtest dann benötigst immer einen eigenen Controller. Den Controller meldest in der metadata.php aber über die Einstellung controller an controllers — OXID eShop developer documentation 6.2.0 documentation

Dies soll wahrscheinlich heißen, dass an allen 3 Stellen contactperson durch idcontactperson ersetzt. Wichtig ist das die Namensgebung überall einheitlich.

Korrekt. Das Model lädt das OXID eShop Framework Dir automatisch, wenn Du die Verzeichnisstruktur in Deinem Modul einhälst. Deinen Controller meldest über metadata.php an.

Im ersten Moment brauchst oxNew() nicht für Deinen neuen Controller, weil dies übernimmt das OXID eShop Framework automatisch für Dich wenn über das Frontend Deinen definierten Controller über /index.php?cl=contactperson aufrufst.

Weitere Infos zum Namespace Using namespaces — OXID eShop developer documentation 6.2.0 documentation

Empfehlenswert wäre noch, dass zusätzlich zum Controller noch ein eigenes Model definierst mit eigener zugehöriger Datenbanktabelle um darin Deine jeweiligen Kontaktpersonen zu speichern.

In der render() Methode Deines Controllers lädst Dir dann über Dein Model Deine benötigten Daten ein und legst fest auf welche Template Datei Dein Controller verweist. In der Regel empfiehlt sich nach dem MVC Konzept auch eine eigene Template Datei in der metadata.php und im Modul zu hinterlegen für die spätere Ausgabe.

1 Like

Vielen Dank,

es hat funktioniert!

Das Model habe ich auch angelegt und es funktioniert super mit dem Namespace!

1 Like