CakePHP benutzerdefinierte Überprüfung mit einer Variablen in der Fehlermeldung

Guten Tag.

Ich habe ein Modell mit einem Feld namens "Prozentsatz". Bei allen ähnlichen Modellen darf der Prozentsatz nicht mehr als 100% betragen. Dies wird während der Validierung überprüft.

In der Validierungsfehlermeldung muss angegeben werden, wie viel Prozent "Raum" der Benutzer noch hat. Wenn beispielsweise alle MyModels bereits 80% aufweisen und der Benutzer versucht, ein neues MyModel mit einem Prozentsatz von 40% zu erstellen, wird die Fehlermeldung "Ihr Prozentsatz ist zu hoch. Sie haben nur noch 20%" angezeigt.

Das Problem ist, dass ich nicht weiß, wie eine Variable in eine Validierungsfehlermeldung eingefügt wird.

In MyModel.php:

public $validate = array(
    'percentage' => array(
        'rule' => array('confirmValidPercentage', 'percentage'),
        'message' => 'foo',
        'required' => true,
    ),
);

public function confirmValidPercentage($data) {
    $percentage = floatval($data['percentage']);

    $total = 0.00;
    $weights = $this->find('all', array('recursive'=>-1));
    foreach ($weights as $weight) {
        $total += floatval($weight[$this->name]['percentage']);
    }

    if ($total + $percentage > 100) {
        // handle the error variable here
        return false;
    }
    else {
        return true;
    }
}

Ich habe versucht :

$this->validate['percentage']['message'] = 'You have '.(100-$total).'% remaining';

Das hier eingestellte Nachrichtenelement überschreibt jedoch nicht die ursprüngliche Nachricht - die Fehlermeldung bleibt 'foo'. Ich habe versucht, das Nachrichtenelement vollständig aus dem $ validation-Array zu entfernen, aber es wird standardmäßig der übergeordnete Name verwendet, d. H. "Prozent". Ich habe es versucht:

unset($this->validate['percentage']['message']);

vor dem Setzen der Bestätigungsnachricht, aber das Ergebnis ist das gleiche.

Weiß jemand, wie man eine Variable in einer Überprüfungsfehlermeldung zurückgibt? Danke vielmals.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage