Hallo!
Ich speichere bestimmte Parameter als json-String in der Datenbank ab (Spalte "params" -> $this->params). Damit das Model auf die einzelnen Parameter Zugriff hat, und ich diese Parameter in bspw. einer ActiveForm wie andere Attribute auch verwenden möchte, bewerkstellige ich den Umgang mit den json-Strings derzeit wie folgt:
Im Model ($_params ist im Model als public declariert):
public function afterFind() {
$this->_params = json_decode($this->params, true);
return true;
}
public function beforeSave() {
if(parent::beforeSave()) {
$this->params = json_encode($this->_params);
}
}
Bis hierher funktioniert alles einwandfrei. Die einzelnen Parameter aus dem json-String sind nun über bswp. $this->_params[foo] ansprechbar.
Nun möchte ich jedoch auf diese einzelnen Parameter die Built-in Validatoren von CValidator anwenden…Möglich ist es, über “rules” im Model einen benutzerdefinierten Validator für das gesamte Array (das Attribut ‘_params’) anzugeben, in welchem ich von Hand alle einzelnen Parameter auf bestimmte Dinge überprüfen kann.
Versuche ich jedoch, einen Build-in Validator auf ein einzelnes Element von “_params” anzuwenden, zum Beispiel ‘required’, dann schlägt dies fehl!
So sehen die Rules dafür aus:
public function rules() {
return array(
array('_params[foo]', 'required'),
array('_params', 'checkParams'),
);
}
public function checkParams($attribute,$params) {
if(!$this->_params[foo])
$this->addError('_params[foo]','foo is required!');
}
Die untere Rule funktioniert problemlos, und ermöglicht mir, die einzelnen Elemente selbst zu prüfen und ggf. entsprechende Fehler zu erzeugen. Lieber wäre es mir jedoch, wenn ich für allgemeine Tests, wie z.B. ‘required’, die Build-in Validatoren nutzen könnte!
Die obere Regel schlägt jedoch fehl:
CException
Beschreibung
Eigenschaft "Model._params[foo] ist nicht definiert.
Quelldatei
yii\framework\db\ar\CActiveRecord.php(110)
Nun zu meiner Frage:
Kann ich die einzelnen Elemente auf irgendeine Art direkt bei den rules angeben, bzw. irgendwie aus einem eigenen Validator hinaus (2. rule, siehe oben) die Build-in Funktionen von CValidator ansprechen?
Oder gibt es gar einen ganz anderen Lösungsansatz für mein json "Problem"?
Vielen Dank für eure Hilfe!