تالار گفتمان nCIS.ir

نسخه‌ی کامل: custom validate function
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
عرض سلام
توی برنامه من کاربران می تونن بی نهایت مشتری به پنل خودشون اضافه کنند.نام های این مشتریان برای هر یوزر باید انحصاری باشه به این معنی که
در کل جدول مشتریان می تونیم نام تکراری داشته باشیم ولی این تکرار برای یک یوزر خاص مجاز نیست.
برای 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');
            }
    }

قطعا هنگام درج مشتری این تابع درست کار می کنه ولی هنگام آپدیت، همیشه نام مشتری رو تکراری تشخیص میده و اجازه آپدیت بدون تغییر نام رو نمیده
اول بفرمایید راه ساده تر یا تابعی برای این فراید وجود دارد یا خیر ، در صورتی هم که میشه از این روش استفاده کرد هنگام آپدیت چطور مشکل رو حل کنم؟
با تشکر
این رو امتحان کنین:
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 کاربر لاگین‌شده پیدا نشه توی جدول جاری.