Yii2 - 如何将'isNewRecord'传递给自定义表单?

时间:2015-09-29 21:03:59

标签: php activerecord yii model yii2

我有一个自定义表单CreateAdminForm,后端的管理员可以创建一个新的管理员用户。我创建了自己的表单模型,因此我可以处理密码。他们只需填写用户名,nicename,电子邮件,密码,选择状态(活动,禁止,删除),然后选择一个角色(Root,Super,Admin)。他们正常输入密码,自定义表单对其进行加密。 - 我有检查,所以Root可以创建任何东西,Super只能创建常规管理员,而普通管理员根本无法创建任何其他管理员。

我实际上已经在我的上一个项目上工作了,但我绕过了isNewRecord,因为我在各自的视图文件(create.php和update.php)中创建了表单,而不是使用相同的{{1}。 1}}文件。这不是什么大不了的事,但我想按照Yii的方式做事,并在可能的情况下再次处理_form.php文件处理表格。

由于我现在使用自己的模型_form.php而不是CreateAdminForm模型(这是Admin的衍生品),因此它无法访问User

如何isNewRecord_form.php与我的自定义isNewRecord模型一起使用?

截断CreateAdminForm:

CreateAdminForm

_form.php:

class CreateAdminForm extends Model
{
    public $nicename;
    public $username;
    public $email;
    public $password;
    public $role;
    public $status;

    public function createAdmin()
    {
        if ($this->validate()) {
            $admin = new Admin();
            $admin->nicename = $this->nicename;
            $admin->username = $this->username;
            $admin->email = $this->email;
            $admin->role = $this->role;
            $admin->status = $this->status;
            $admin->setPassword($this->password);
            $admin->generateAuthKey();
            if ($admin->save()) {
                return $admin;
            }
        }

        return null;
    }
}

2 个答案:

答案 0 :(得分:0)

CreateAdminForm课程按照您希望的方式工作的一种方法是让它保存Admin课程的副本作为属性并使其工作。这样,您就可以创建一个访问Admin isNewRecord属性的方法。下面的简单例子

class CreateAdminForm extends Model
{
    // This needs to be filled in with an instance of Admin. Maybe through your constructor or through dependency injection
    protected $admin;

    public function createAdmin()
    {
        if ($this->validate()) {
            $this->admin->nicename = $this->nicename;
            $this->admin->username = $this->username;
            $this->admin->email = $this->email;
            .
            .
            .
            return $this->admin->save()
        }

        return false;
    }

    public function isNewRecord()
    {
        return $this->admin->isNewRecord;
    }
}

至于另一种更简单的方法(因为这似乎已回答了您的问题),您可以CreateAdminForm继承Admin以获取对ActiveRecord和{{{{{{ 1}}例如BaseActiveRecord方法(而不必担心管理2个对象)

getIsNewRecord()

答案 1 :(得分:0)

isNewRecord

没有使用Model

$isNewRecordActiveRecord的属性,从BaseActiveRecord延伸。因此,当您对表单使用Model时,无法调用此属性。

  class MyForm extends Model
  {

  }

没有使用isNewRecord,因为Model / Form无法将数据插入数据库。因此,没有数据更新的可能性。