Eigenes Modul (Community Edition 6.1.5)

Ich habe ein kleines Modul für OXID ( Community Edition 6.3.1) geschrieben. Dieses funktioniert auch soweit gan gut. Jetzt stehe ich aber vor dem Problem das ich dieses Modul für die Version 6.1.5 bereitstellen soll.

Angenommen hatte ich das ich das Modul einfach via ./vendor/oxid-esales/oxideshop-ce/bin/oe-console oe:module:install-configuration <PHAT> einbinden kann. Es fängt aber schon damit an das in diesem Ordner kein “bin/oe-console” befindet.

Wie bekomme ich das Modul trotzdem installiert? Das Modul soll eigentlich nur eine eigene Seite mit Inhalt darstellen, der über die Url …/index.php?cl= abgerufen werden soll…

Ich bin mal wieder am verzweifeln ^^

6.1 hat noch keine Yaml-Konfigurationsdateien, deshalb braucht man “install-configuration” da nicht. Verwendet das Modul Namespaces?

1 Like

Ja, in diversen anderen Modulen sind tatsächlich Namespaces definiert. Wie kann ich mir das zunutze machen? Also das Modul habe ich bereits hochgeladen und kann es auch im Admin-Bereich aktivieren. Allerdings zeigt das Modul " [OXID Community Module Internals]" einen Fehler im Controller an :frowning:

Welchen Fehler? Und in deinem Modul, in der metadata.php, hast du da Version 1 oder 2?

Anbei meine metadata.php

<?php

$sMetadataVersion = '2.0';
$aModule = array(
    'id'            => '<NAME>_buyplattform',
    'title'         => '<b><NAME></b>: Ankaufsplattform',
    'description'   => 'Individuelles Modul',
    'version'       => '1.0.0',
    'thumbnail'   => 'out/pictures/thumb.png',
    'author'        => '<NAME>',
    'email'       => '[email protected]<NAME>.de',
    'url'           => 'https://www.<NAME>.de',
	'extend' => array(
	 ),
    'controllers' => array(
        'buyplattform' => \<NAME>\BuyPlattform\Controller\BuyPlattform::class,
    ),
    'blocks' => array(
    ),
	'templates'   => array(
		'buyplattform.tpl' => '<NAME>/BuyPlattform/views/tpl/buyplattform.tpl'
    ),
    'settings' => array(
    ),
    'events' => array(),
);

Und der dazugehörige Controller

<?php
namespace <NAME>\BuyPlattform\Controller\BuyPlattform;

use OxidEsales\Eshop\Application\Controller\FrontendController;

class BuyPlattform extends FrontendController
{

    protected $_sThisTemplate = 'buyplattform.tpl';

    public function render()
    {
        parent::render();
        return $this->_sThisTemplate;
    }
}

Der Fehler:

Wenn du das Modul nur hochgeladen, und nicht per composer installiert hast, dann kennt composer den Namespace noch nicht. Du kannst den Namespace manuell in der composer.json des Shops (nicht des Moduls) eintragen und dann im Rootverzeichnis des Shops “composer dump-autoload” ausführen. In der composer.json muss ein Abschnitt “autoload” eingfügt werden:

  "autoload": {
    "psr-4": {
      "Hersteller\\Modul\\": "./source/modules/Hersteller/Modul"
    }
  }

Hey! Genau das hatte gefehlt! Zumindest hatte ich es jetzt ein einziges mal als Fehlerfrei. Nach einem erneuten Aktivieren meckert es aber jetzt:

Fehler: Modul nicht aktiviert.
In einem Shop oder Sub-Shop müssen Schüssel und Werte für “controllers” eindeutig sein.

:confused:

Einfach nochmal aktivieren

Über das Backend? Wenn ja, dann erscheint leider immer wieder der oben beschriebene Fehler

Hattest du zufällig die Modul-ID zwischendurch geändert?

Tatsächlich weil ich zwischendurch dachte mit einem neuen Namen könnte es eventuell doch gehen ;/

Versuche mal das Modul zu deaktivieren, dann die Moduldateien des Moduls vom Server löschen. Wenn du jetzt die Seite “Module” im Backend aufrufst, sollte eine Meldung kommen “es wurden ungültige Moduldaten erkannt”, auf “ja löschen” klicken. Dann das Modul wieder hochladen und aktivieren.

So, da das Modul ja bereits nicht mehr aktiv ist, habe ich es nun vom Server gelöscht. Leider bekomme ich aber mit einem neuen Aufruf von “Module” keine Möglichkeit die verbleibenden Reste wirklich zu löschen. Jemand noch eine Idee?

Du kannst alle Module zurücksetzen mit:

DELETE FROM `oxconfig` WHERE `OXVARNAME` LIKE '%module%'

Die Einstellungen der Module bleiben erhalten aber du musst die Module danach manuell wieder aktiv schalten. Zur Sicherheit mach vorher ein Backup der Tabelle oxconfig.

Nun endlich ist das Modul im grünen Bereich. Beim Versuch das Modul über die Url aufzurufen, endet der Versich natürlich gleich in einem Fehler…

[2021-11-05 23:56:48] OXID Logger.ERROR: EXCEPTION_SYSTEMCOMPONENT_CLASSNOTFOUND *****\BuyPlattform\Controller\BuyPlattform ["[object] (OxidEsales\\Eshop\\Core\\Exception\\SystemComponentException(code: 0): EXCEPTION_SYSTEMCOMPONENT_CLASSNOTFOUND *****\\BuyPlattform\\Controller\\BuyPlattform at /home/users/*****/www/shop/vendor/oxid-esales/oxideshop-ce/source/Core/UtilsObject.php:222)\n[stacktrace]\n#0 /home/users/*****/www/shop/source/oxfunctions.php(101): OxidEsales\\EshopCommunity\\Core\\UtilsObject->oxNew('*****\\\\BuyPlat...')\n#1 /home/users/*****/www/shop/vendor/oxid-esales/oxideshop-ce/source/Core/ShopControl.php(372): oxNew('*****\\\\BuyPlat...')\n#2 /home/users/*****/www/shop/vendor/oxid-esales/oxideshop-ce/source/Core/ShopControl.php(272): OxidEsales\\EshopCommunity\\Core\\ShopControl->_initializeViewObject('*****\\\\BuyPlat...', NULL, NULL, NULL)\n#3 /home/users/*****/www/shop/vendor/oxid-esales/oxideshop-ce/source/Core/ShopControl.php(137): OxidEsales\\EshopCommunity\\Core\\ShopControl->_process('*****\\\\BuyPlat...', NULL, NULL, NULL)\n#4 /home/users/*****/www/shop/vendor/oxid-esales/oxideshop-ce/source/Core/Oxid.php(26): OxidEsales\\EshopCommunity\\Core\\ShopControl->start()\n#5 /home/users/****/www/shop/source/index.php(15): OxidEsales\\EshopCommunity\\Core\\Oxid::run()\n#6 /home/users/*****/www/shop/source/oxseo.php(28): require('/home/users/***...')\n#7 {main}\n"] []

Der Inhalt des Controllers:

<?php
namespace ***\BuyPlattform\Controller\BuyPlattform;

use OxidEsales\Eshop\Application\Controller\FrontendController;

class BuyPlattform extends \OxidEsales\Eshop\Application\Controller\FrontendController
{

    protected $_sThisTemplate = 'buyplattform.tpl';

    public function render()
    {
        parent::render();
        return $this->_sThisTemplate;
    }
}

Und die Meta:

$sMetadataVersion = '2.0';
$aModule = array(
    'id'            => 'BuyPlattform',
    'title'         => '<b>*******</b>: Ankaufsplattform',
    'description'   => 'Individuelles Modul',
    'version'       => '1.0.0',
    'thumbnail'   => 'out/pictures/foot-logo.png',
    'author'        => '--------',
    'email'       => '[email protected]*****',
    'url'           => 'https://www.******',
	'extend' => array(
	 ),
    'controllers' => array(
        'buyplattform' => \******\BuyPlattform\Controller\BuyPlattform::class,
    ),
    'blocks' => array(
    ),
	'templates'   => array(
		'buyplattform.tpl' => '*****/BuyPlattform/views/tpl/buyplattform.tpl'
    ),
    'settings' => array(
    ),
    'events' => array(),
);

Composer ist auch drin:

 "autoload": {
    "psr-4": {
      "*****\\BuyPlattform\\": "./source/modules/******/BuyPlattform"
    }
  },

Ich verstehe es nicht. Wo hab ich den Denkfehler?

Es kann ja nicht sein da sich dieses blöde Modul nicht dazu bekomme beim Aufruf von www.wasauchimmer.de/index.php?cl=buyplattform den Inhalt der buyplattform.tpl anzuzeigen :expressionless:

Ich frage nur zur Sicherheit: Composer dump-autoload gemacht?

Ja, bevor ich die Aktivierung im Admin-Panel durchgeführt habe, hatte ich Composer dump-autoload ausgeführt.

Ich schätze das ich das erst danach machen hätte sollen?

Nein, das wäre schon korrekt so.
Absolut sicher bin ich mir nicht, aber ich glaube, dass eigene namespaces nicht mit einem schrägstrich anfangen dürfen.
Vergleiche hiermit

Im Namespace ist einmal Buyplatform zu viel denke ich.