Ich verwende einige abstrakte Modellklassen von Zend.Zend Framework's Model Abstract und Nullwerte
Ich habe diese Lösung vor einigen Monaten in der Zend Quick Start Dokumentation gefunden Aber in den letzten Monaten hatte ich einige Probleme mit Nullwerten.
Ich habe ein Zend_Form_Element_Select Element, das seinen Wert aus der Datenbank bekommen hat. Die Werte sind IDs aus einem Fremdschlüssel. Daher wird nur eine gültige Fremdschlüssel-ID oder Null akzeptiert. Aber das Zend_Form_Element_Select-Element ist optional, daher ist es möglich, dass ich eine leere Zeichenfolge als Ergebnis bekomme (-> addMultiOption (null, 'Wähle deine Option')). Aber das wird mir einen Fehler geben, weil eine leere Zeichenfolge keine gültige Fremdschlüssel-ID ist, weder eine Null, die ebenfalls erlaubt wäre.
Mein erster Versuch war, meinen Controller, der das Formular behandelt, einzuchecken, wenn der select-Elemente-Wert eine Eingabezeichenfolge-Zeichenfolge ist, und ändern Sie es in null. Das ist hässlich und das Problem war, dass mein Setter Null zu 0 änderte, weil ich es mit (int) $ value validiere.
public function setId($value)
{
$this->_id = (int) $value;
return $this;
}
So war ein weiterer Ansatz, dass ich in meinem Setter zu überprüfen, wenn der Wert null ist und dann mit ich bestätige es nicht (int). Das würde ungefähr so aussehen.
public function setId($value)
{
if($value !== null)
$this->_id = (int) $value;
return $this;
}
Dies würde fr diesem Fall arbeiten, aber ich nicht sinnvoll, weil manchmal möchte ich so einen vorhandenen Wert auf Null zurückgesetzt. Daher kann ich Werte mit null im Setter nicht ignorieren. Also ein anderer Ansatz wäre:
public function setId($value)
{
if($value !== null)
$this->_id = (int) $value;
else
$this->_id = null;
return $this;
}
Aber jetzt wird es wirklich hässlich. Ich bin gespannt, wie Sie dieses Problem lösen könnten. Weil ich denke, dass es eine einfache Lösung geben muss, ohne nur (int) im Setter zu entfernen. Denn soweit ich das gesehen habe, scheint dies ein üblicher Weg zu sein, den Setter zu benutzen.
Mit freundlichen Grüßen, Nico
Es ist keine Antwort auf Ihre __set oder __get Problem, aber Sie könnten in der Steuerung mit if (trim ($ yourselect) == '') $ yourselect = null; ? – Ashley