Функция пользовательской проверки Yii2 не вызывается

Мне нужно сделать мое пользовательское правило проверки, чтобы предупредить пользователя о том, что требуется поле электронной почты или phone_number, но пользовательская функция проверки не вызывается

мой код до сих пор: Модель

namespace backend\models;
use Yii;


class Advertisement extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'advertisement';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['position', 'location', 'status'], 'required'],
            [['description'], 'string'],
            [[ 'phone_number', 'company'], 'integer'],
            [['created_at', 'updated_at','date_added'], 'safe'],
            [['position', 'email', 'location', ], 'string', 'max' => 255],
            [['phone_number','email'], 'myRule'],
        ];
    }


    public function myRule($attribute, $params)
    {

        if (empty($this->email)
            && empty($this->phone_number)
        ) {
            $this->addError($attribute, Yii::t('ap', 'either Phone or Email required'));

            return false;
        }

        return true;
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => Yii::t('app', 'ID'),
            'position' => Yii::t('app', 'Position'),
            'description' => Yii::t('app', 'Description'),
            'email' => Yii::t('app', 'Email'),
            'phone_number' => Yii::t('app', 'Phone Number'),
            'created_at' => Yii::t('app', 'Created At'),
            'updated_at' => Yii::t('app', 'Updated At'),
            'company' => Yii::t('app', 'Company'),
            'status' => Yii::t('app', 'Status'),
        ];
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getCompany0()
    {
        return $this->hasOne(User::className(), ['id' => 'company']);
    }


}

действие контроллера

 public function actionCreate()
 {
     $model = new Advertisement();

     if ($model->load(Yii::$app->request->post()) ) {
         $model->company = Yii::$app->user->identity->id;
         $model->created_at = date("Y-m-d H:i:s");
         $model->date_added = date("Y-m-d H:i:s");

          $model->save();
          return $this->redirect(['view', 'id' => $model->id]);
     } else {
            return $this->render('create', [
                'model' => $model,
            ]);
     }
 }

любая помощь ?


person Mhmd Backer Shehadi    schedule 28.02.2016    source источник


Ответы (2)


Для этого вам необходимо отключить skipOnEmpty свойство Validator. Для получения дополнительной информации Читать

 Update your code as 

  [['phone_number','email'], 'myRule' ,'skipOnEmpty' => false],
person Double H    schedule 28.02.2016
comment
Прекрасно работает. Спасибо - person AbhimanuSharma; 31.08.2018

Я думаю, вы использовали $attribute, а не $attribute_name.

public function myRule($attribute_name, $params)
{

    if (empty($this->email)
        && empty($this->phone_number)
    ) {
        $this->addError($attribute, Yii::t('app', 'either Phone or Email required'));

        return false;
    }

    return true;
}

из документа yii2

Открытый метод addError() Добавляет ошибку об указанном атрибуте в объект модели.

Это вспомогательный метод, который выполняет выбор и интернационализацию сообщений. public void addError ($model, $attribute, $message, $params = [])

Попробуйте это действие создать

public function actionCreate()
{
    $model = new Advertisement();

    if ($model->load(Yii::$app->request->post()) ) {
        if ($model->validate()) {


          $model->company = Yii::$app->user->identity->id;
          $model->created_at = date("Y-m-d H:i:s");
          $model->date_added = date("Y-m-d H:i:s");

          $model->save();
          return $this->redirect(['view', 'id' => $model->id]);
        }
        else {
        $errors = $model->errors;
        return $this->render('create', [
            'model' => $model,
        ]);
      }
    }  else {
       return $this->render('create', [
            'model' => $model,
        ]);
    }
}
person scaisEdge    schedule 28.02.2016
comment
Две вещи 1) показать также весь код модели..? показать также код действия (контроллера) - person scaisEdge; 28.02.2016