Frage

Ich muss Standard-Fehlermeldungen der Lehre Validierungen ändern. Wie kann ich das tun?

Dank

War es hilfreich?

Lösung

CrazyJoe richtig ist, in einer Art und Weise: es nicht möglich ist, ohne eine harte Arbeit : - (

Aber, wenn man hart genug suchen, könnte man einen Weg finden, ; -)


Mit Lehre 1.1 erweitern Sie Modellklassen Doctrine_Record.
Diese Klasse definiert diese Methode:

/**
 * Get the record error stack as a human readable string.
 * Useful for outputting errors to user via web browser
 *
 * @return string $message
 */
public function getErrorStackAsString()
{
    $errorStack = $this->getErrorStack();

    if (count($errorStack)) {
        $message = sprintf("Validation failed in class %s\n\n", get_class($this));

        $message .= "  " . count($errorStack) . " field" . (count($errorStack) > 1 ?  's' : null) . " had validation error" . (count($errorStack) > 1 ?  's' : null) . ":\n\n";
        foreach ($errorStack as $field => $errors) {
            $message .= "    * " . count($errors) . " validator" . (count($errors) > 1 ?  's' : null) . " failed on $field (" . implode(", ", $errors) . ")\n";
        }
        return $message;
    } else {
        return false;
    }
}

Dies ist die Methode, die die Nachrichten erzeugt; wie Sie sehen können, es ist vollautomatisch und nicht konfigurierbar überhaupt : - (


Dennoch dank OOP, können wir diese Methode in unserer Modellklasse überlasten ...

Aber ein bisschen sauberer zu sein, würde ich:

  • Erstellen Sie eine neue Klasse - sagen My_Doctrine_Record, das sich Doctrine_Record
  • Diese Klasse würde neu zu definieren, dass die Methode, die Anpassung von Fehlermeldungen ermöglichen
  • Und unsere Modellklassen würden diese My_Doctrine_Record Klasse erweitern.

Dies wird Vervielfältigung dieser Methode in jedem unserer Modellklassen vermeiden; und könnte sich als nützlich an einem anderen Tag ...


Unsere My_Doctrine_Record::getErrorStackAsString Methode kann natürlich, sich auf ein Verfahren zur Herstellung unserer Modellklassen, zu helfen, die Nachrichten, mit spezieller Anpassung für jede Modellklasse zu erzeugen.

Hier ist ein funktionierendes Beispiel; bei weitem nicht perfekt, aber es könnte Sie führen zu dem, was Sie erhalten möchten ; -)


Zunächst einmal die Initialisierungen:

require_once '/usr/share/php/Doctrine/lib/Doctrine.php';
spl_autoload_register(array('Doctrine', 'autoload'));

$manager = Doctrine_Manager::getInstance();
$manager->setAttribute(Doctrine::ATTR_VALIDATE, Doctrine::VALIDATE_ALL);

$conn = Doctrine_Manager::connection('mysql://test:123456@localhost/test1');

Ich vermute, Sie schon so etwas wie die in Ihrer Anwendung haben ...


Als nächste unsere neue My_Doctrine_Record Klasse:

class My_Doctrine_Record extends Doctrine_Record
{
    public function getErrorStackAsString()
    {
        $errorStack = $this->getErrorStack();
        if (count($errorStack)) {
            $message = sprintf("BAD DATA in class %s :\n", get_class($this));
            foreach ($errorStack as $field => $errors) {
                $messageForField = $this->_getValidationFailed($field, $errors);
                if ($messageForField === null) {
                    // No custom message for this case => we use the default one.
                    $message .= "    * " . count($errors) . " validator" . (count($errors) > 1 ?  's' : null) . " failed on $field (" . implode(", ", $errors) . ")\n";
                } else {
                    $message .= "    * " . $messageForField;
                }
            }
            return $message;
        } else {
            return false;
        }
    }

    protected function _getValidationFailed($field, $errors) {
        return null;
    }

}

Sie werden bemerken, dass die getErrorStackAsString Methode inspiriert ist, was mit dem von Lehre zur Verfügung gestellt wird - dies scheint normal, würde ich sagen ^^

Eine andere Sache, bemerkt zu werden:

  • Sie definiert und ruft die _getValidationFailed Methode
  • , dass man Fehlermeldungen zu erzeugen; oder Rückkehr null, wenn wir die Standard behabiour
  • verwenden möchten
  • und wir können diese _getValidationFailed Methode in unserer Modellklasse, überlasten Sachen anpassen ; -)


Und nun, meine Modellklasse:

class Test extends My_Doctrine_Record
{
    protected function _getValidationFailed($field, $errors) {
        switch ($field) {
            case 'name': 
                    return "You entered wrong data from 'name' field.\n      Errors are for '" 
                        . implode("', '", $errors) . "'\n";
                break;
            // other fields ?
            default:
                return null;
        }
    }

    public function setTableDefinition()
    {
        $this->setTableName('test');
        $this->hasColumn('id', 'integer', 4, array(
             'type' => 'integer',
             'length' => 4,
             'unsigned' => 0,
             'primary' => true,
             'autoincrement' => true,
             ));
        $this->hasColumn('name', 'string', 32, array(
             'type' => 'string',
             'length' => 32,
             'fixed' => false,
             'notnull' => true,
             'email'   => true,
             ));
        $this->hasColumn('value', 'string', 128, array(
             'type' => 'string',
             'length' => 128,
             'fixed' => false,
             'notnull' => true,
             'htmlcolor' => true,
             ));
        $this->hasColumn('date_field', 'integer', 4, array(
             'type' => 'timestamp',
             'notnull' => true,
             ));
    }
}

Es erstreckt sich My_Doctrine_Record und definiert eine _getValidationFailed Methode, die mit Validierungen Fehlern auf dem name Bereich meines Modells beschäftigt.


Nun nehmen wir an, dass ich tun, einen Datensatz zu laden:

$test = Doctrine::getTable('Test')->find(1);
var_dump($test->toArray());

Lassen Sie uns versuchen, es zu ändern, „schlechte“ Werte einrichten:

$test->name = (string)time();
$test->value = 'glop';
try {
    $test->save();
} catch (Doctrine_Validator_Exception $e) {
    echo '<pre>';
    echo $e->getMessage();
    echo '</pre>';
    die;
}

Beide name und value Felder sind nicht OK ... So werden wir unsere Validierungen Methoden durchlaufen, und erzeugen diese Fehlermeldung:

BAD DATA in class Test :
    * You entered wrong data from 'name' field.
      Errors are for 'email'
    * 1 validator failed on value (htmlcolor)

Sie können die Nachricht für „name“ sehen angepasst wurde, und das ein für „value“ kommen aus der Standardlehre Sache.


Also, zu dem Schluss: nicht einfach, aber machbar ; -)

Und jetzt ist es an Ihnen, das als Leitfaden für die exakte Lösung für Ihr Problem zu verwenden : -)
Es wird noch einige Codierung brauchen, denke ich ... Aber du bist nicht weit weg von dem real deal!

Viel Spaß!

Andere Tipps

Es ist nicht möglich, in der aktuellen Version !!!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top