ich baue gerade ein Modul für Oxid 4.9.5 und möchte gerne Artikeleinstellungen (im Tab erweitert) hinzufügen. Dazu habe ich den vorhandenen Template-Block verwendet:
Der Block wird auch wie gewünscht erweitert und meine Checkbox taucht auf.
Laut dieses Blogposts müsste Oxid den Wert nun automatisch in die Datenbank eintragen. Das Tabellenfeld habe ich natürlich vorher angelegt. Der Wert wird allerdings nicht abgespeichert. Auch wenn ich den Wert händisch in der DB auf 1 ändere, spiegelt sich das nicht im Zustand der Checkbox wieder.
Die üblichen Verdächtigen habe ich schon durch: Cache leeren, Module neu laden (mithilfe von dem Oxid Cookbook-Modul alles deaktiviert). Im Exception Log steht auch nichts.
Habe ich doch noch was vergessen bzw. muss man sich doch selbst um das Speichern der Werte kümmern? Wenn ja, welche Klasse muss ich dafür anfassen?
Google war leider auch nicht sehr ertragreich.
So ich habe die Klasse article_extend überladen und in die metadata.php eingetragen, wird im Modulbereich auch angezeigt. Inhalt ist wie folgt:
<?php
class da_article_extend extends da_article_extend_parent {
public function save() {
if (!isset($aParams['oxarticles__myVal'])) {
$aParams['oxarticles__myVal'] = 0;
}
parent::save();
}
}
Das Problem besteht leider nach wie vor. Hmmm.
[Edit]
Ich les mir gerade den Code der Funktion durch. In der jetztigen Form macht die Erweiterung natürlich wenig Sinn. Ich nehme mal an, dass ich den Code duplizieren und meine Änderungen vornehmen muss. Das kann natürlich Konflikte mit anderen Modulen erzeugen (oder Änderungen bei Patches unwirksam machen). Aber seis drum, zum eingrenzen probier ich das mal eben aus.
[Edit2]
So, ich habe das nun über addDefaultValues() realisiert. Der Aufruf kommt direkt unter dem Code, der deinem sehr ähnlich sieht. Leider hat es immer noch nichts geholfen. Aber trotzdem danke für den Vorschlag. So sieht der Code aus:
<?php
class da_article_extend extends da_article_extend_parent {
public function addDefaultValues($aParams) {
if (!isset($aParams['oxarticles__myVal'])) {
$aParams['oxarticles__myVal'] = 0;
}
return parent::addDefaultValues($aParams);
}
}
Sorry, war ein langer Tag. Ich bin etwas verwirrt - genau diese Codezeile wurde doch schon vorher aufgerufen, oder? (Zeile 151 in article_extend.php)
$aParams = oxRegistry::getConfig()->getRequestParameter("editval");
// checkbox handling
if (!isset($aParams['oxarticles__oxissearch'])) {
$aParams['oxarticles__oxissearch'] = 0;
}
if (!isset($aParams['oxarticles__oxblfixedprice'])) {
$aParams['oxarticles__oxblfixedprice'] = 0;
}
// new way of handling bundled articles
//#1517C - remove possibility to add Bundled Product
//$this->setBundleId($aParams, $soxId);
// default values
$aParams = $this->addDefaultValues($aParams);
Stehe ich jetzt total auf dem Schlauch? Wenn die letzte Zeile aus dem Codeschnipsel aufgerufen wird, müsste doch meine Funktion ausgeführt werden, wo ich dann am Ende über parent::addDefaultValues($aParams); die ursprüngliche Funktion ausführe, oder nicht?
[Edit]
Hier die Ausgabe von print_r($aParams) in der ersten Zeile meiner Funktion:
Ich habe auch den SQL-Debugmodus von OXID aktiviert - hier die aufs wichtigste gekürzte Query, die ausgeführt wurde:
update oxarticles
set oxid = '05848170643ab0deb9914566391c0c63',
[B]myval = '0',[/B]
[...]
where oxarticles.oxid = '05848170643ab0deb9914566391c0c63'
Irgendwo zwischendurch wird mein Wert also wieder auf 0 gesetzt. Die Frage ist jetzt, wo und warum.
Ich hab noch mal etwas weiter getestet. Scheinbar wird in der Abfrage immer der Wert genommen, der vorher schon in der Datenbank stand. Ich habe händisch einen Wert dort eingetragen, der durch die Checkbox niemals kommen kann (10). Der Wert taucht dann auch wieder in der Abfrage auf, unabhängig davon, ob die Checkbox gesetzt ist oder nicht.
Ok, ich habe die Lösung gefunden und ich habe nicht genug Hände, um facialzupalmieren:
Das Datenbankfeld heißt myVal. Zwar ist die Datenbank grundsätzlich Case-insensitive, aber zwecks Lesbar- und Einheitlichkeit habe ich genau diese Schreibweise beibehalten. DAS war der Fehler!