[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
REX_FORM Klasse - NULL-Werte Speichern - REDAXO Forum
Hallo,

Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.

Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
elektra
Beiträge: 20
Registriert: 24. Feb 2007, 16:33
Wohnort: Müllheim (Baden)
Kontaktdaten: Website

REX_FORM Klasse - NULL-Werte Speichern

18. Apr 2011, 16:02

Ist es möglich, mit der rex_form Klasse den Wert NULL in der Datenbank zu speichern?

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;
  }
Scheinbar machen die addslashes in

Code: Alles auswählen

                $sql->setValue($fieldName, addslashes($fieldValue));
die Probleme, da in der rex_sql Klasse in der Methode "buildSetQuery()" auf NULL geprüft wird.
Anscheinend gilt

Code: Alles auswählen

addslashes(NULL) != NULL
Gibt es noch eine andere Möglichkeit als eine Klassen-Erweiterung, um NULL-Werte zu speichern?

REDAXO: 4.3.2
PHP: 5.2.13
MySQL: 4.1.22

Gruß Heinz

Benutzeravatar
Koala
Beiträge: 1612
Registriert: 3. Okt 2005, 13:20

Re: REX_FORM Klasse - NULL-Werte Speichern

3. Nov 2012, 13:30

NULL-Werte können gespeichert werden.
Die Codeänderung dazu ist hier zu finden: https://github.com/redaxo/redaxo4/pull/64/files
Anwendungsbeispiel:

Code: Alles auswählen

$field = &$form->addTextField('gtb');
$field->setLabel("GTB");
$field->setDefaultSaveValue(NULL);
<?php print $Footer; ?>

Sven

Ich würde ja die Welt verändern,
doch der Quellcode ist mir zu absurd!


REX 5 :: Tricks und Tipps
REX 5 :: Modulesammlung

Wiki zu Redaxo 3 und 4 (!nur noch im Webarchiv!)

Zurück zu „Sonstiges“