CMS Seiten (oxcontents Tabelle) um eigenes Feld erweitern

Bei der Erweiterung der Tabelle “oxcontents” habe ich das Problem, dass zwar die von mir angelegten zwei neuen Spalten im Template zwar ausgegeben werden können (der Wert aus der Datenbank wird als “rawValue” im Template ausgegeben), doch ich kann keine Werte speichern.
Soll heißen, ich habe zwei Tinyint Spalten angelegt und möchte diese als Checkbox im Template behandeln. Wenn ich manuell in der Datenbank den Wert der Felder auf “0” setze, wird im Admin die Checkbox korrekterweise als nicht aktiv angezeigt. Aktiviere ich die Checkbox, wird in der Datenbank der Wert geschrieben und nach dem Reload im Admin die Checkbox als “aktiviert” gezeigt. Das zweite Feld blieb weiterhin “0”.
Möchte ich das soeben auf “1”, also “aktiv” gesetzte Feld jedoch wieder deaktivieren, funktioniert das nicht.

Die Felder sind in der Tabelle “oxcontents” exakt gleich angelegt wie das Feld “oxactive”, also tinyint (1) und haben als default “1”. Doch auch wenn ich default auf “0” setze, ändert sich nichts. Egal was ich tue, die Felder lassen sich nicht korrekt speichern.

Views wurden selbstverständlich aktualisiert (sonst würde das Speichern von 0 auf 1, also inaktiv auf aktiv gar nicht funktionieren und auch die Ausgabe des Objects “$edit” enthält die beiden neuen Felder, jedoch nur mit “rawValue”).
Ebenso wurden der tmp Ordner und auch der smarty Ordner geleert.

Woran kann es liegen, dass ich die beiden neuen Felder nicht korrekt speichern kann?

Hallo Alex,


        // checkbox handling
        if ( !isset( $aParams['oxcontents__oxactive']))
            $aParams['oxcontents__oxactive'] = 0;

getRawValue() für die Integer oder habe ich dich falsch verstanden?

Grüße
Rafig

Es geht eigentlich direkt um das Template, also die Datei “application/views/admin/tpl/content_main.tpl”. Darin habe ich lediglich zwei Checkboxen eingefügt, die den Wert aus zwei neuen Feldern der Tabelle “oxcontents” bestimmen sollen.

Trotz exakt gleichem Aufbau wie die “oxactive” checkbox, mit der bestimmt wird, ob eine CMS Seite aktiv oder inaktiv ist, kann ich den Wert “inaktiv” für keines der beiden neuen Felder speichern.

Ähnliche Erweiterungen haben ohne Komplikationen beispielsweise in der “oxarticles” Tabelle und dem zugehörigen Template “article_main.tpl” funktioniert. Auch Checkboxen die in der Datenbank ein tinyint Feld sind und den Wert “0” oder “1” haben können. Funktioniert sauber, fehlerfrei und auch mit “->value” anstatt “->rawValue” beim Auslesen im Template.

Ich frage mich ob man einen NULL als string in die tinyint Tabelle reinschreiben kann, vermutlich nicht.

Grüße
Rafig

Vermutlich möglich, wenn man die Spaltendefinition in der Datenbank als nullable definiert, also dass “null” drinstehen darf.
Irgendwie verstehe ich jedoch nicht, warum der Wert der Checkbox, also gecheckt oder nicht gecheckt, nicht korrekt übertragen und gespeichert wird. Selbst mit Javascript als zusätzliche Option, um den Wert festzulegen, der übertragen wird, ändert sich nichts.

Ich habe folgendes ausprobiert und ebenfalls kein Erfolg:
sowohl dieses ->
onchange=“if(this.checked) {this.setAttribute(‘checked’,true);} else {this.setAttribute(‘checked’,false);}”

als auch dieses ->
onchange=“if(this.checked) {this.value=1; this.setAttribute(‘checked’,true);} else {this.value=0; this.setAttribute(‘checked’,false);}”

Warum wird der Wert für die Checkbox nicht in der Datenbank gespeichert? Fehler im OXID bei der Speicherung der CMS Seiten Daten?

wichtig ist was in controllers/admin/content_main.php ankommt. Also, noch einmal auswerten und dementsprechend reagieren ob im Template oder in PHP Datei spielt dabei überhaupt keine rolle:


var_dump($aParams['dein_checkbox_name'])

Mit der obige beispiel wollte ich dir nur zeigen das du sehr wohl nicht “exakt gleichem Aufbau” hast. Da fehlt doch was wenn der checkbox nicht gecheckt ist, was meinst du?

Grüße
Rafig

Aber ich werde doch deswegen nicht die Core-Funktionen vom Shop ändern?

In meinem Template steht folgendes:

<input class="edittext" type="checkbox" name="editval[oxcontents__show_footer]" value="1" [{if $edit->oxcontents__show_footer->rawValue == 1}]checked[{/if}] [{ $readonly }]>

Lasse ich mir oxcontents__show_footer ausgeben ([{$edit->oxcontents__show_footer->rawValue}]) wird der Wert aus der Datenbank ausgegeben. Steht also (manuell eingetragen) “0” in der Spalte, wird auch “0” ausgegeben. Beim Wert “1” wird korrekt “1” ausgegeben. Daher wird die Checkbox auch wie gewünscht beim Laden der CMS Seite im Admin aktiv oder inaktiv angezeigt.
Was fehlt ist [{$edit->oxcontents__show_footer->value}] und die Möglichkeit, dass bei einer Änderung der Checkbox von “checked” auf “unchecked” der Wert “0” in der Datenbank gespeichert wird.

Nein, musst du natürlich nicht. Direkt im Template prüfen:


[{$edit->oxcontents__show_footer->value|var_dump}]

und ändere das auf:


[{if $edit->oxcontents__show_footer->value == 1}]

Grüße
Rafig

Bei Einfügen von

[{$edit->oxcontents__show_footer->value|var_dump}]

Gibt er mir jetzt [I]string(1) “1”[/I] aus. Prüfung innerhalb der Ausgabe ob checked oder nicht mit

[{if $edit->oxcontents__show_footer->value == 1}]

klappt inzwischen. Es wird also checked ausgegeben, wenn in der DB “1” steht und nichts, also unchecked, wenn in der DB “0” steht.

Speichern einer Änderung, also eine aktive Checkbox deaktivieren und dann speichern, verändert in der Datenbank jedoch nichts. Es bleibt bei “1”, der Wert “0” wird niemals in die DB geschrieben.

Wie gesagt, im Template “article_main.tpl” habe ich ebenfalls schon neue Checkboxen eingefügt, in der zugehörigen Tabelle die jeweiligen Felder angelegt und alles funktioniert. Lediglich beim CMS Seiten Template streikt OXID.

Also, du schickst deine Formulare mit klick auf das “Speichern” ab und der checkbox ist nicht checked und bekommst trotzdem einen “1” zurück? Da stimmt was nicht.

Grüße
Rafig

Exakt, genau das ist mein Problem.
Aus der DB kommt der korrekte Wert, in die DB den korrekten Wert schreiben, geht nicht.

Alex, das hat mit der Datenbank überhaupt nicht zu tun. Probiere mal damit ob das jetzt klappt. Einfach oberhalb einfügen:


<input type="hidden" name="editval[oxcontents__show_footer]" value="0">

Grüße
Rafig

Der Ansatz hat geholfen, danke!
Zwar reichlich kompliziert und weiterhin nicht verständlich, aber so, wie nachfolgend gezeigt, funktioniert die Speicherung - insbesondere auch dann, wenn man einen CMS Inhalt bearbeitet und die aktivierte Checkbox nicht verändert:

<input class="edittext" type="checkbox" onchange="if(this.checked) document.getElementById('show_footer').value=1; else document.getElementById('show_footer').value=0;" [{if $edit->oxcontents__show_footer->value == 1}]checked[{/if}] [{ $readonly }]>
<input type="hidden" name="editval[oxcontents__shb_show_footer]" id="show_header" [{if $edit->oxcontents__show_footer->value == 1}]value="1"[{else}]value="0"[{/if}]>

Wenn du Ihn jetzt oberhalb einfügst brauchst du den ganzen JavaScript nicht mehr. Also einfach so:


<input type="hidden" name="editval[oxcontents__show_footer]" value="0">
<input type="checkbox" name="editval[oxcontents__show_footer]" value="1"[{if $edit->oxcontents__show_footer->value == 1}] checked[{/if}] [{$readonly}]>

Grüße
Rafig

Perfekt, vielen Dank!

Es bleibt zwar die Unwissenheit darüber, warum die Checkbox allein nicht funktioniert, doch mit der jetzigen Lösung auf jeden Fall sehr gut.

Hallo zusammen,

kann es sein, dass eine solche Lösung nicht mit Spalten vom Typ date funktioniert? Ich bekomme bei meiner zusätzlich angelegten date-Spalte immer NULL ausgespuckt. Bei einer anderen Spalte vom Typ varchar(255) funktioniert es hingegen wunderbar.