Cl=content variable erklärung

Hi, vermutlich eine dumme Frage… aber
ich versuche mir gerade oxid shop bei zu bringen und bin jetzt schon eine ewigkeit dabei herraus zu finden wie dieser cl parameter in internen template verlinkungen funktionieren soll.

Im footer habe ich
<a href="[{oxgetseourl ident=$oViewConf->getSelfLink()|cat:"cl=contact"}]" title="contact">Hier Formular ausfüllen und anmelden</a>

Was sich wie folgt übersetzt

<a href="https://www.url.com/index.php?cl=contact" title="Kontakt">Kontakt</a>

Das funktioniert super, doch wenn ich das neue template einbinden möchte(was aktuell nur eine Kopie der contact.tpl ist), wird diese anscheinend nicht gefunden und ich werde an index.php?cl=start&redirected=1 weitergeleitet.

<a href="[{oxgetseourl ident=$oViewConf->getSelfLink()|cat:"cl=garantie_form"}]" title="garantie_form">Hier Formular ausfüllen und anmelden</a>

Sollte das nicht so ausreichen?
oder muss ich die Datei noch irgend wo in einem zentralen register anmelden, das dieser weis wo die Datei liegt? Denn ich hab das komplette projekt schon mehrfach mit text search durchsucht auf referenzen zu der eigentlich contact.tpl oder dessen pfad. Und habe hier nichts weiter gefunden.

Meine Frage also, woher weis der Webserver, dass bei der variable cl=contact er die datei contact.tpl aus dem spezifischen template pfad ziehen soll, da der pfad ja nirgends angegeben wird?

aus cl=contact wird application/controller/contact.php und dort wird die Funktion render() ausgeführt, an deren Ende Du sowas wie “return contact.tpl” findest bzw “return $this->_sTemplate;” und $sTemplate ist irgendwo am Anfang der Datei auf contact.tpl festgelegt

Möchtest Du nur ein anderes Template für die Kontaktseite oder eine komplett neue Seite mit einem Formular basteln?

2 Likes

Ich möchte ein komplet neues formular für garantieverlängerung die dann zum Hersteller weitergeleitet wird.

Ich finde hier dann die ContactController.php unter
vendor/oxid-esales/oxideshop-ce/source/Application/Controller

dies scheint auch die richtige Datei zu sein, danke.
Wenn ich das template verändere nimmt er jetzt ein anderes.

Da sich das Ganze ja nun im Vendor befindet, muss ich nun ein neues modul dafür anlegen wenn ich den controller updatesicher bearbeiten will, bzw einen neuen controller erstellen will??

und wo steht jetzt genau die zuordnung von dem parameter cl=contact auf contactController.php?

Ja also, wenn es ein neues Formular sein soll, dann ist die Änderung der Kontaktseite der falsche Weg, denn man ändert dort das bestehende Kontaktformular und erschafft dadurch kein neues Formular.
Ein Modul ist aber in jedem Fall richtig.

Zuordnung für die eigenen Klassen vom Shop ist hier:
ShopControllerMapProvider.php
Zuordnung für die Module erfolgt vermutlich über composer und wird bei der Modulinstallation aktualisiert, habe mich noch nicht wirklich damit beschäftigt.

1 Like

Ich habe jetzt mal die modul erstellungs guides durchgeschaut und von einem leeren module template ein modul erstellt. wieder mit den contactcontroller.php und deren tpl´s lediglich umbenannt und diese auch so in composer.json und metadata.php benannt.

Jetzt habe ich das Modul in den Modulordner kopiert aber der erkennt noch immer nicht den parameter cl=gg_guarantee
macht der Composer noch was anderes als die dateien von weis gott wo her auf meinen web server zu kopieren, weswegen ihr das installieren nennt? (irgend was mit namespaces zu ordnen?)
und was mache ich damit der composer mein test modul überhaupt erst erkennt und auch deployen kann, denn dass findet er ja jetzt natürlich nirgends… außerdem habe ich es natürlich schon hochgeladen, muss ich da den komposer trotzdem benutzen? und wenn ja, wo auf dem webserver muss ich welches command ausführen um mein modul so zu installieren das ich es testen und die Dateien einbinden kann?

[26 Jul 15:57:36.790885 2018] [exception] [type OxidEsales\Eshop\Core\Exception\SystemComponentException] [code 0] [file /data/www/www.url.com/oxid6/vendor/oxid-esales/oxideshop-ce/source/Core/UtilsObject.php] [line 222] [message EXCEPTION_SYSTEMCOMPONENT_CLASSNOTFOUND gg_guarantee]
[26 Jul 15:57:36.790885 2018] [exception] [stacktrace] #0 /data/www/www.url.com/oxid6/source/oxfunctions.php(101): OxidEsales\EshopCommunity\Core\UtilsObject->oxNew(‘gg_guarantee’)
[26 Jul 15:57:36.790885 2018] [exception] [stacktrace] #1 /data/www/www.url.com/oxid6/vendor/oxid-esales/oxideshop-ce/source/Core/ShopControl.php(372): oxNew(‘gg_guarantee’)

https://docs.oxid-esales.com/developer/en/6.0/modules/good_practices/module_setup.html

1 Like

genau danach habe ich gesucht!

leider funktioniert es immer noch nicht!. Ist warscheinlich die Hitze…
ich poste einfach mal meine files, evtl hab ich da ja noch irgend wo den Ihr gleich auf die schnelle seht.

metadata.php
$sMetadataVersion = ‘1.1’;

/**
* Module information
*/
$aModule = array(
	'id'			=> 'gg_customforms',
	'title'			=> ' gg_customforms',
	'description'	=> 'Erstellung von neuen formularen',
	'thumbnail'		=> 'thumb.png',
	'version'		=> '1.0',
	'author'		=> 'SMARCADO GmbH',
	'email'			=> '[email protected]',
	'url'			=> 'url.com',
    'extend'        => array(
    ),
    'files'         => array(
            'gg_guarantee' => 'gg/gg_customforms/controller/gg_guarantee.php',
    ),
    'templates'     => array(
            'gg_guarantee_form.tpl'  => 'gg/gg_customforms/views/form/gg_guarantee_form.tpl',
            'gg_guarantee.tpl'  => 'gg/gg_customforms/views/gg_guarantee.tpl',
    )

composer.json

{
    "name": "oxid-esales/gg_customforms",
    "description": "This is the gg_customforms module for the OXID eShop.",
    "type": "oxideshop-module",
    "keywords": ["oxid", "modules", "eShop"],
    "homepage": "https://www.url.com",
    "license": [
        "GPL-3.0-only",
        "proprietary"
    ],
    "extra": {
        "oxideshop": {
            "blacklist-filter": [
                "documentation/**/*.*",
                "CHANGELOG.md",
                "composer.json",
                "CONTRIBUTING.md",
                "README.md"
            ],
            "target-directory": "gg/gg_customforms"
        }
    },
    "require": {
        "php": ">=5.6"
    },
    "autoload": {
        "psr-4": {
            "OxidEsales\\gg\\": "../../../source/modules/gg/gg_customforms",
			"gg_guarantee\\" : "./source/modules/gg/gg_customforms/controller/gg_guarantee.php"
        }
    }
}

Die composer.json im Modulverzeichnis wird nur verwendet wenn das Modul aus einem Repository installiert wird. In dem Link ist aber beschrieben wie man bei manueller Installation ohne composer den Namespace manuell registriert.

Dazu trägt man den Namespace manuell in die composer.json des Rootfolders des Shops (also da wo source und vendor liegen, nicht im Modulordner) ein und führt dort composer dump-autoload aus.

Bei einer Installation aus einem Repository würde das Modul zuerst in das Verzeichnis vendor/Herstellername/Modulname kopiert werden, deshalb ist der Pfad für den Namespace in der composer.json des Moduls …/…/…/source/modules/, eben von da aus wo die composer.json liegt. Wenn du den Namespace manuell einträgst, verwendest du dazu die composer.json im Rootverzeichnis, daher ist der Pfad dann ./source/modules.

Du musst nur einen Namespace für das gesamte Modul generieren, nicht für die einzelnen Files. Du kannst dir hier ansehen wie der registrierte Namespace für ein Modul und bei den einzelnen Files ausschaut: https://github.com/linslin/oxid6-example-module