PDA

View Full Version : ایجاد کلاس برای یک Validation خاص



mahdi_1986
دوشنبه 02 تیر 1393, 21:39 عصر
سلام دوستان
من برای یک فیلد نیاز به یک validation خاص دارم مطابق با لینک زیر http://www.yiiframework.com/wiki/168/create-your-own-validation-rule/
ساختم


class AccountNumber extends CValidator
{


private $MIN_COUNT = 3;
private $MAX_COUNT = 10;


/**
* Validates a single attribute.
* This method should be overridden by child classes.
* @param CModel $object the data object being validated
* @param string $attribute the name of the attribute to be validated.
*/
public function validateAttribute($object, $attribute)
{
$this->addError($object,$attribute, 'Account Number is Invalid');
}





}

و در Rule هم به صورت زیر اضافه کردم:


public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('account_number', 'ext.AccountNumber'),
array('account_number', 'required'),


);
}


ولی هیچ چیزی بر رو فرم در موقع خطا نشون نمیده (اصلن خطا فراخوانی نمی‌شود!) کسی میدونه چرا؟؟؟
Model هم از ActiveRecord وارثت برده است
کسی میدونه مشکل از چیه؟؟

MMSHFE
سه شنبه 03 تیر 1393, 07:54 صبح
ولیدیتور خودتون رو تو چه مسیری ذخیره کردین؟

rezaonline.net
سه شنبه 03 تیر 1393, 10:15 صبح
واسه یه مقایسه ساده یه کلاس ننویس چه کاریه
به جای
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('account_number', 'ext.AccountNumber'),
array('account_number', 'required'),


);
}

بنویس

public function rules()
{

return array(

array('account_number', 'required'),
array('account_number', 'checkNumber'),

);
}


function checkNumber($att,$val)
{
$max = 10;
$min = 3;

$acc = $this->account_number;

if($acc>$max or $acc<3)
$this->addError('account_number',"مقداري بين $max و $min انتخاب کنيد");
}

mahdi_1986
سه شنبه 03 تیر 1393, 14:43 عصر
ولیدیتور خودتون رو تو چه مسیری ذخیره کردین؟
تو فولدر extensions

mahdi_1986
سه شنبه 03 تیر 1393, 14:45 عصر
برای اینکه تو 10 تا کلاس باید مقدار رو validate کنم. ولی نمیدونم چرا همین validation هم کار نمی‌کنه
من کد رو به این صورت نوشتم


public function checkNumber($att,$param)
{
$this->addError($att,"مقداري بين انتخاب کنيد");
}


ولی اصلا fire نمی‌شود.
نمیدونم مشکل کجاست!‌:((

MMSHFE
سه شنبه 03 تیر 1393, 18:30 عصر
اینو تست کنید:

public function checkNumber($att, $param)
{
if($att < 0) {
$this->addError($att, 'مقداري مثبت انتخاب کنيد');
return false;
}
return true;
}

mahdi_1986
چهارشنبه 04 تیر 1393, 08:08 صبح
اینو تست کنید:

public function checkNumber($att, $param)
{
if($att < 0) {
$this->addError($att, 'مقداري مثبت انتخاب کنيد');
return false;
}
return true;
}
نه کار نکرد متاسفانه

mahdi_1986
چهارشنبه 04 تیر 1393, 08:31 صبح
مشکلم حل شد، یه سوتی بد فکر کنم داده بودم و این بود که متد
$model->validate()
رو تو Action صدا نمیزدم، بعد از این کار درست شد.
مرسی از دوستان

MMSHFE
چهارشنبه 04 تیر 1393, 11:19 صبح
عیب نداره پیش میاد. دقت کنید که ActiveRecordها قبل از save نیاز به صدا زدن validate ندارن و خودش صدا زده میشه ولی CModel و کلاسهای مشتق شده از اون اینطوری نیستن و باید خودتون هروقت لازم داشتین، صداش بزنید.