In einem Addon habe ich ein optionales Feld für die Uhrzeit (in MySQL als "time default NULL" delariert).
Wenn nichts eingegeben wird, soll der Wert "NULL" und nicht "00:00:00" gespeichert werden.
Für Validierungszwecke habe ich die rex_form Klasse erweitert. Damit ich "NULL"-Werte speichern konnte, musste ich die "save"-Methode überschreiben (if-Abfrage bei $sql->setValue hinzugefügt):
Code: Alles auswählen
function save()
{
$sql = rex_sql::factory();
$sql->debugsql =& $this->debug;
$sql->setTable($this->tableName);
foreach ($this->getSaveElements() as $fieldsetName => $fieldsetElements)
{
foreach ($fieldsetElements as $element)
{
// read-only-fields nicht speichern
if (strpos($element->getAttribute('class'), 'rex-form-read') !== false)
{
continue;
}
$fieldName = $element->getFieldName();
$fieldValue = $element->getSaveValue();
// Callback, um die Values vor dem Speichern noch beeinflussen zu können
$fieldValue = $this->preSave($fieldsetName, $fieldName, $fieldValue, $sql);
// Den bearbeiteten POST-Wert in die DB speichern (inkl. slashes ?)
if (is_null($fieldValue))
{
$sql->setValue($fieldName, NULL);
}
else
{
$sql->setValue($fieldName, addslashes($fieldValue));
}
}
}
if ($this->isEditMode())
{
$sql->setWhere($this->whereCondition);
$saved = $sql->update();
}
else
{
$saved = $sql->insert();
}
// ----- EXTENSION POINT
if ($saved)
$saved = rex_register_extension_point('REX_FORM_SAVED', $saved, array('form' => $this, 'sql' => $sql));
else
$saved = $sql->getErrno();
return $saved;
}
Code: Alles auswählen
$sql->setValue($fieldName, addslashes($fieldValue));
Anscheinend gilt
Code: Alles auswählen
addslashes(NULL) != NULL
REDAXO: 4.3.2
PHP: 5.2.13
MySQL: 4.1.22
Gruß Heinz