Neues Feld in Backend: Inhalt wird nicht gespeichert

Hallo zusammen,

ich bin neu hier und auch neu in der Modulentwicklung für Oxid.
Ich möchte mich so nach und nach einarbeiten und fange daher klein an.

Mein erste Modul sollte dem Backend ein neues Feld “Lagerort” im Artikelstamm “Lager” hinzufügen.
Das Feld wird auch angezeigt und verschwindet beim deaktivieren wieder. Der dort eingegebene Wert wird aber nicht gespeichert.

Das Datenbankfeld lege ich über das “onActivate” Event an. Das funktioniert auch. Was mir auffällt: Die anderen DB Felder sind alle komplett groß geschrieben, meines nicht. Liegt hier vll. das Problem, dass ich es falsch anlegen lasse?

Ich denke für euch Profis ist das kein Problem herauszufinden woran das liegt und ich verbuche es für mich einfach unter Startschwierigkeiten.

Herzliche Grüße
Chris
Hier meine Dateien samt Inhalt:

Datei modules/clArtikelStammdaten/metadata.php

$sMetadataVersion = ‘1.1’;
$aModule = array(
‘id’ => ‘clArtikelStammdaten’,
‘title’ => ‘Modul zur Erweiterung der Artikelstammdaten’,
‘thumbnail’ => ‘mythumbnail.png’,
‘version’ => ‘1.0’,
‘author’ => ‘MyName’,
‘url’ => ‘http://www.myserver.de’,
‘email’ => ‘[email protected]’,
‘extend’ => array(),
‘files’ => array(‘clArtikelStammdatenEvents’ => ‘clArtikelStammdatenEvents/core/clArtikelStammdatenEvents.php’,),
‘blocks’ => array(
array(
‘template’ => ‘article_stock.tpl’,
‘block’ => ‘admin_article_stock_form’,
‘file’ => ‘/views/blocks/article_stock.tpl’,
),
),
‘events’ => array(‘onActivate’ => ‘clArtikelStammdatenEvents::onActivate’,),
‘settings’ => array(),

);

Datei: modules/clArtikelStammdatenEvents/core/clArtikelStammdatenEvents.php

Der Inhalt führt hier leider zu einem 403 Error.

Datei modules/clArtikelStammdatenEvents/views/blocks/article_stock.tpl

[{$smarty.block.parent}]

[{oxmultilang ident="ARTICLE_CSTLOCATION" }]

< /td>
< td class=“edittext”>
< input type=“text” class=“editinput” size=“32” maxlength="[{$edit->oxarticles__cstlocation->fldmax_length}]" name=“editval[oxarticles__cstlocation]” value="[{$edit->oxarticles__cstlocation->value}]" [{ $readonly }]>
[{ oxinputhelp ident=“HELP_ARTICLE_MAIN_CSTLOCATION” }]
< /tr>

Dazu hab ich noch zwei language files angelegt. Diese sind vermutlich nicht von Relevanz.

Ich nehme an, dass das Feld nicht in der Datenbank angelegt wurde. Prüfe das mal mit einem mysql-cient.

Die Groß/Kleinschreibung der Felder in der DB ist egal bei oxid.

Der weitere Code sieht ok aus.

Wichtig ist auch nach dem (erfolgreichen) Hinzufügen eines neuen Feldes, die Views neu zu generieren, sonst kommt es zu einer Exception im Backend.

Hi und danke für deine Rückmeldung.
Ich habe das geprüft, das Feld ist angelegt.

Die views habe ich ebenfalls über das Backend aktualisiert. Ich sehe aber auch via phpmyadmin, dass das Feld in der Tabelle nicht gefüllt ist, entsprechend kann nach meinem Verständnis auch in der View nichts ankommen.

Muss ich irgendwo ein explizites “commit” eintragen?
Auszug aus phpmyadmin:

Das Feld selbst kommt in der View schon an, nur es ist eben leer.
Logs geprüft? Tmp geleert?
Versuch es mal manuell zu befüllen, wenn der Inhalt dann angezeigt wird, dann scheitert es beim Speichern schon.

Manuell einfügen sorgt für korrekte Anzeige.

UPDATEoxarticlesSETcstlocation= 'Testspeicher' WHEREoxarticles.OXID= '02ba10f4e4ea4d1d4ce8d3804e5d9d2e';

bringt folgendes Ergebnis im Backend:

Welche Logs muss ich prüfen? Im log Verzeichnis finde ich nur eine “EXCEPTION_LOG.txt”. Dort ist der letzte Eintrag allerdings vom 10.06.2017 (Installationszeitpunkt).

tmp-Verzeichnis habe ich geleert.

es gäbe noch den webserver error log, öffne mal im Backend Service -> Systeminfo und such dort nach “error_log”, rechts daneben wird der Pfad der Log Datei stehen.
Bei einigen Hostern sind logs im Hosting Interface verfügbar und einige anderen haben es standardmäßig ausgeschaltet.

wir denn das feld beim absenden des formulars überhaupt übergebn (stichpunkt entwickler konsole)?

Könnte, wie schon des Öfteren, an der Formatierung liegen:
http://downloads.foxido.de/oxarticles__cstlocation.txt

Ich sende euch nachher einen Screenshot aus den Entwicklertools des Browsers. Meiner Ansicht nach ist das Feld zumindest im richtigen form-Element.

Die Formatierung ist im richtigen Code so wie von dir beschrieben. Ich musste das nur zum posten hier anpassen, da das Forum sonst nichts anzeigt.

Ich kämpfe allgemein mit dem Hochladen von Dateien und Code hier aber daran werd ich mich noch gewöhnen. Ich werde die Dateien gleich mal als txt Dateien so wie du extern hochladen, dann kannst du gerne nochmal nach Formatfehlern suchen.

Manchmal sieht man ja exakt solche Kleinigkeiten erst auf den zweiten Blick.

Du hattest Recht, das war das Problem. Mit diesem Hinweis habe ich nochmal im Code nachgesehen und es hat ein </td> Element gefehlt.

Und zwar das des Eingabefeldes selbst.
Ich habe das ergänzt und nun funktioniert alles wie es soll. Herzlichen Dank für die Hinweise.

In den Entwicklertools hat man das nicht gesehen, vermutlich hat der Browser das automatisch gesetzt.

Ich habe heute eine weitere Idee gehabt: Schön wäre es, dieses Feld auch in die Packliste aufzunehmen.
Ich habe dazu bereits Beiträge gefunden, allerdings wurde immer auf ein Modul eines Users verwiesen, das mir auf den ersten Blick überladen dafür scheint.

Das Feld wird ja nicht in die Tabelle oxorderarticles übernommen. Das erscheint mir auch prinzipiell nicht notwendig um doppelte Datenhaltung zu vermeiden.

Eine Referenz auf die oxarticles finde ich aber auch nicht.

Nach meiner Recherche müsste ich aber über die Funktion _getOrderArticle auf die Artikelstammdaten zugreifen können.
Derzeit fehlt mir aber ein bisschen der Ansatz dafür.

Vermutlich muss dazu in der order_package.tpl eine weitere Abfrage mit rein.
Ich habe $articles vom Typ oxorderticles. Dort müsste ich ja die Funktion zur Verfügung haben. Die Funktion _getOrderArticle gibt mir laut Doku ja ein Element vom Typ oxarticle zurück.
Wie komme ich von da aus weiter und wie kann ich den Inhalt im Template ausgeben?

Danke auch hier für eure Hilfe.

Welche Info willst denn abrufen?

Mein eigenes Feld oxarticles__cstlocation->value

Innerhalb von [{foreach from=$order->getOrderArticles(true) item=article}]

[{assign var=“oProduct” value=“oxArticle”|@oxNew}]
[{if $oProduct->load($article->oxorderarticles__oxartid->value)}]
[{ $oProduct->oxarticles__cstlocation->value }]

Danke, genau das, was ich gesucht habe. Das hat funktioniert.
Ich musste im Prinzip nur noch das “if” beenden, sonst bleibt die Seite weiß.

sowas hat in meinen augen aber nichts im template verloren :frowning:

Die Frage war, wie er order_package.tpl anpassen muss. Wenn Du Zeit hast, dann baue Graschi doch was Hübsches: Sicher kann man über ein Modul order_package ersetzen, _getArticles(); erweitern und [{ $article->oxarticles__cstlocation->value }] direkt abrufen :sunglasses:

Ach deswegen “in meinen Augen” :rofl: Viele Wege führen nach Rom :grinning:.