رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
custom validate function
#1
Bug 
عرض سلام
توی برنامه من کاربران می تونن بی نهایت مشتری به پنل خودشون اضافه کنند.نام های این مشتریان برای هر یوزر باید انحصاری باشه به این معنی که
در کل جدول مشتریان می تونیم نام تکراری داشته باشیم ولی این تکرار برای یک یوزر خاص مجاز نیست.
برای validate کردن هم اومدم یه تابع نوشتم
['name', 'validatemyname']
    public function validatemyname($attribute, $params)
    {
        $identity = Yii::$app->user->identity;
        $login_id = $identity->id;
        $customer = (new yiidbQuery())
            ->select(['id','name'])
            ->from('customer')
            ->where(['user_id'=>$login_id])
            ->all();
            $customer_temp=ArrayHelper::map($customer,'id','name');
            if (in_array($this->$attribute, $customer_temp)) {
                $this->addError($attribute, 'BEFORE USED');
            }
    }

قطعا هنگام درج مشتری این تابع درست کار می کنه ولی هنگام آپدیت، همیشه نام مشتری رو تکراری تشخیص میده و اجازه آپدیت بدون تغییر نام رو نمیده
اول بفرمایید راه ساده تر یا تابعی برای این فراید وجود دارد یا خیر ، در صورتی هم که میشه از این روش استفاده کرد هنگام آپدیت چطور مشکل رو حل کنم؟
با تشکر
پاسخ
تشکر شده توسط:
#2
این رو امتحان کنین:
class Customer extends ActiveRecord
{
    private $_oldAttributes;
    
    public function afterFind()
    {
        $this->_oldAttributes = $this->attributes;
        return parent::afterFind();
    }
    
    public function validatemyname($attribute, $params)
    {
        if ($this->{$attribute} != '' && $this->{$attribute} != $this->_oldAttributes[$attribute] && self::find([$attribute => $this->{$attribute}, 'user_id' => Yii::$app->user->identity->id])->exists()) {
            $this->addError($attribute, 'BEFORE USED');
        }
    }
}

تست نکردم (با موبایل وصلم) ولی باید کار کنه. نکته اینجاست که مقادیر قبلی فیلدها رو توی afterFind داخل فیلد _oldAttributes ذخیره میکنید و بعد چک میکنین مقدار جدید فیلد، خالی یا برابر با مقدار قبلی نباشه و بعد هم رکوردی با این اسم برای ID کاربر لاگین‌شده پیدا نشه توی جدول جاری.
پاسخ
تشکر شده توسط: senator_x




کاربران در حال بازدید این موضوع: 1 مهمان