رسائل الخطأ المخصصة على مذهب التصديقات
سؤال
أنا بحاجة إلى تعديل الافتراضي رسائل الخطأ من عقيدة التصديقات.كيف يمكنني أن أفعل هذا ؟
شكرا
المحلول
CrazyJoe هو في الطريقة :لم يكن ممكنا من دون بعض العمل الشاق :-(
ولكن إذا كنت تبحث الصعب بما فيه الكفاية ، قد تجد طريقة ;-)
مع عقيدة 1.1 نموذج الطبقات تمديد Doctrine_Record
.
تلك الفئة ويعرف هذا الأسلوب :
/**
* 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;
}
}
هذا هو الأسلوب الذي يولد من الرسائل ؛ كما يمكنك أن ترى, التلقائي بالكامل ، وليس شكلي في كل :-(
لا يزال بفضل OOP, نحن يمكن أن تفرط هذا الأسلوب في نموذج الطبقات...
ولكن إلى أن يكون قليلا أكثر نظافة ، وأود أن :
- إنشاء فئة جديدة -- يقول
My_Doctrine_Record
, أن يمتدDoctrine_Record
- تلك الفئة تعريف هذه الطريقة تسمح التخصيص من رسائل الخطأ
- و لدينا نموذج الطبقات تمديد هذا
My_Doctrine_Record
فئة.
هذا سوف تجنب الازدواجية في هذا الأسلوب داخل كل نموذج الطبقات.و قد تكون مفيدة في يوم آخر...
لدينا My_Doctrine_Record::getErrorStackAsString
طريقة يمكن أن تعتمد على طريقة لدينا نموذج الطبقات ، للمساعدة في توليد رسائل خاصة التخصيص لكل نموذج الطبقة.
وهنا على سبيل المثال العمل ;بعيدة عن الكمال ، ولكن قد يرشدك إلى ما كنت ترغب في الحصول على ;-)
أولا وقبل كل شيء ، initialisations :
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');
أعتقد أنك بالفعل شيء من هذا القبيل في التطبيق الخاص بك...
القادم الجديد My_Doctrine_Record
الدرجة :
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;
}
}
ستلاحظ أن getErrorStackAsString
طريقة مستوحاة من ما يتم القيام به من جانب واحد التي تقدمها المذهب-هذا يبدو طبيعيا ، أقول ^^
الشيء الآخر أن يكون لاحظت :
- ويعرف ويدعو _
getValidationFailed
طريقة - أن واحدة ينبغي إنشاء رسائل خطأ ;أو العودة
null
إذا كنا نريد استخدام الافتراضي behabiour - ونحن يمكن أن الزائد
_getValidationFailed
طريقة في نموذج الطبقات ، إلى تخصيص الاشياء ;-)
و الآن نموذج عملي الدرجة :
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,
));
}
}
بل يمتد My_Doctrine_Record
, و يعرف _getValidationFailed
الأسلوب الذي يتعامل مع التصديقات الأخطاء على name
ميدان من طراز بي.
الآن, دعونا نفترض أنني أفعل هذا التحميل سجل :
$test = Doctrine::getTable('Test')->find(1);
var_dump($test->toArray());
دعونا نحاول تعديل إعداد "سيئة" القيم :
$test->name = (string)time();
$test->value = 'glop';
try {
$test->save();
} catch (Doctrine_Validator_Exception $e) {
echo '<pre>';
echo $e->getMessage();
echo '</pre>';
die;
}
سواء name
و value
الحقول غير موافق...لذلك سوف تذهب من خلال موقعنا التصديقات وأساليب إنشاء رسالة الخطأ هذه :
BAD DATA in class Test :
* You entered wrong data from 'name' field.
Errors are for 'email'
* 1 validator failed on value (htmlcolor)
يمكنك أن ترى رسالة "name
"وقد تم تخصيص ، أحد "value
"يأتي من الافتراضي عقيدة شيء.
لذا نستنتج :ليس من السهل, ولكن لا قادرة ;-)
والآن الأمر متروك لك استخدام هذا كدليل الدقيق في حل مشكلتك :-)
وسوف تحتاج إلى المزيد من الترميز ، أعتقد...ولكن أنت لست بعيدا عن الصفقة الحقيقية !
وقد متعة !
نصائح أخرى
ولها غير ممكن في النسخة الحالية!