Benutzerdefinierte Fehlermeldungen auf Lehre Validierungen
Frage
Ich muss Standard-Fehlermeldungen der Lehre Validierungen ändern. Wie kann ich das tun?
Dank
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 sichDoctrine_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 !!!