Backend - Artikeleinstellungen - Werte eigener Felder speichern

Hallo Zusammen,

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:

Ausschnitt aus der Metadata-Datei:


'blocks' => array(
        
        array(
            'template'  => 'article_extend.tpl',
            'block'     => 'admin_article_extend_form',
            'file'      => 'blocks/admin/admin_article_extend_form.tpl',
            'position'  => '1'
        ),
        //Next block
    ),

Template-Block:

[{$smarty.block.parent}]
<tr>
	<td class="edittext">
		Meine Checkbox
	</td>	
	<td class="edittext">
		<input class="edittext" type="hidden" name="editval[oxarticles__myVal]" value='0'>
		<input class="edittext" type="checkbox" name="editval[oxarticles__myVal]" value='1' [{if $edit->oxarticles__myVal->value == 1}]checked[{/if}] [{ $readonly }] [{if $oxparentid }]readonly disabled[{/if}]>
	</td>
</tr>
 

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.

[EDIT]
[B]Post mit der Lösung des Problems.[/B]

Hast du die Datenbank-Views neu generiert?

Das hatte ich tatsächlich vergessen (Wald und Bäume und so ;)), hat aber leider nichts an dem Problem geändert.

Versuche es mal damit, folgendes in save() einzufügen:

if (!isset($aParams['oxarticles__myVal'])) {
            $aParams['oxarticles__myVal'] = 0;
        }

In welcher Klasse denn? In der save()-Methode von oxarticle gibt es im Scope soweit ich sehen kann an keiner stelle eine Variable $aParams.

article_extend

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);
    }
}

Du musst schon schauen, dass alles vollständig ist. Woher soll die Info denn für $aParams kommen?:

$aParams = oxRegistry::getConfig()->getRequestParameter("editval");

TMP leeren und Cache des Browsers löschen.

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:

Array
(
[article__oxid] => 05848170643ab0deb9914566391c0c63
[oxarticles__oxweight] => 0
[oxarticles__oxlength] => 0
[oxarticles__oxwidth] => 0
[oxarticles__oxheight] => 0
[oxarticles__oxunitquantity] => 0
[oxarticles__oxunitname] =>
[oxarticles__oxexturl] => http://
[oxarticles__oxurldesc] =>
[oxarticles__oxbprice] => 0
[oxarticles__oxtprice] => 0
[oxarticles__oxfile] =>
[oxarticles__oxtemplate] =>
[oxarticles__oxquestionemail] =>
[oxarticles__oxissearch] => 1
[oxarticles__oxisconfigurable] => 0
[oxarticles__oxnonmaterial] => 0
[oxarticles__oxfreeshipping] => 0
[oxarticles__oxskipdiscounts] => 0
[oxarticles__oxshowcustomagreement] => 1
[oxarticles__myVal] => 1
[oxarticles__oxupdateprice] => 0
[oxarticles__oxupdatepricea] => 0
[oxarticles__oxupdatepriceb] => 0
[oxarticles__oxupdatepricec] => 0
[oxarticles__oxupdatepricetime] => 0000-00-00 00:00:00
[oxarticles__oxblfixedprice] => 0
)

Wenn ich also das Häckchen bei meiner Checkbox setze, wird der Wert auf jeden Fall schon mal übergeben.

[Edit2]
Hatte das Return im Code vergessen. Meintest du das?

Sorry, jeden Beitrag nochmal auf Edits zu durchforsten, ist zeitraubend und absolut unübersichtlich. Mach doch mal komplette Infos rein.

Okay, also noch mal jetztiger Stand mit den neuen Infos:

Erweiterte Klasse article_extend:

class da_article_extend extends da_article_extend_parent {
    public function addDefaultValues($aParams) {
        if (!isset($aParams['oxarticles__myVal'])) {
            $aParams['oxarticles__myVal'] = 0;
        }
        echo print_r($aParams);
        return parent::addDefaultValues($aParams);
    }
}

Template Block für admin_article_extend_form.tpl:

[{$smarty.block.parent}]
<tr>
	<td class="edittext">
		Meine Checkbox
	</td>	
	<td class="edittext">
		<input class="edittext" type="hidden" name="editval[oxarticles__myVal]" value='0'>
		<input class="edittext" type="checkbox" name="editval[oxarticles__myVal]" value='1' [{if $edit->oxarticles__myVal->value == 1}]checked[{/if}] [{ $readonly }] [{if $oxparentid }]readonly disabled[{/if}]>
	</td>
</tr>

Ausgabe von print_r($aParams) wenn man die erweiterten Artikeleinstellungen speichert (meine Checkbox ist angeklickt):

Array
(
[article__oxid] => 05848170643ab0deb9914566391c0c63
[oxarticles__oxweight] => 0
[oxarticles__oxlength] => 0
[oxarticles__oxwidth] => 0
[oxarticles__oxheight] => 0
[oxarticles__oxunitquantity] => 0
[oxarticles__oxunitname] =>
[oxarticles__oxexturl] => http://
[oxarticles__oxurldesc] =>
[oxarticles__oxbprice] => 0
[oxarticles__oxtprice] => 0
[oxarticles__oxfile] =>
[oxarticles__oxtemplate] =>
[oxarticles__oxquestionemail] =>
[oxarticles__oxissearch] => 1
[oxarticles__oxisconfigurable] => 0
[oxarticles__oxnonmaterial] => 0
[oxarticles__oxfreeshipping] => 0
[oxarticles__oxskipdiscounts] => 0
[oxarticles__oxshowcustomagreement] => 1
[oxarticles__myVal] => 1
[oxarticles__oxupdateprice] => 0
[oxarticles__oxupdatepricea] => 0
[oxarticles__oxupdatepriceb] => 0
[oxarticles__oxupdatepricec] => 0
[oxarticles__oxupdatepricetime] => 0000-00-00 00:00:00
[oxarticles__oxblfixedprice] => 0
)

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!

Funktioniert nicht:


[{$smarty.block.parent}]
<tr>
	<td class="edittext">
		Meine Checkbox
	</td>	
	<td class="edittext">
		<input class="edittext" type="hidden" name="editval[oxarticles__myVal]" value='0'>
		<input class="edittext" type="checkbox" name="editval[oxarticles__myVal]" value='1' [{if $edit->oxarticles__myVal->value == 1}]checked[{/if}] [{ $readonly }] [{if $oxparentid }]readonly disabled[{/if}]>
	</td>
</tr>

Funktioniert:


[{$smarty.block.parent}]
<tr>
	<td class="edittext">
		Meine Checkbox
	</td>	
	<td class="edittext">
		<input class="edittext" type="hidden" name="editval[oxarticles__myval]" value='0'>
		<input class="edittext" type="checkbox" name="editval[oxarticles__myval]" value='1' [{if $edit->oxarticles__myval->value == 1}]checked[{/if}] [{ $readonly }] [{if $oxparentid }]readonly disabled[{/if}]>
	</td>
</tr>