如何在CMS中创建会员时自动生成密码并填写密码字段?

How to generate a password automatically and fill in password fields when creating a member in the CMS?

我创建了一个名为 'Clients' 的模型管理员。在 "Security" 选项卡下,我创建了一个名为 'clients' 的新组。此模型管理员仅管理客户而不管理其他成员。

当使用模型管理员在 CMS 中创建新成员时,我想为他们自动生成一个密码(而不是他们必须创建自己的密码),然后通过电子邮件将其发送给他们。

我想要发生的事情:

工作人员单击 "Add member" 后,密码和密码确认文本框会自动填充生成的密码。 - 这是我认为最理想的方式。 - 一旦工作人员点击保存,它将发送客户端和电子邮件,其中包含用户名和新生成的密码。

问题是你是怎么做到的?

ClientAdmin.php

<?php

class ClientAdmin extends ModelAdmin {

    private static $menu_icon = 'themes/cadence/images/icons/person.png';

    public $showImportForm = false;

    private static $managed_models = array(
        'Member'
    );

    private static $url_segment = 'clients';

    private static $menu_title = 'Clients';

    public function getList() {
        $list = parent::getList();
        $clientGroup = Group::get()->filter('code', 'clients')->first();
        $list = $list->filter('Groups.ID', $clientGroup->ID);

        return $list;
    }
}


MemberClientExtension.php

<?php

class MemberClientExtension extends DataExtension implements PermissionProvider
{
    private static $db = array(

    );

    public function providePermissions() {
        return array(
            'CLIENTS' => 'Can access the site as a client',
        );
    }

    public function updateCMSFields(FieldList $fields) {

    }

    public function generatePasswordForClient(){

        $plainPassword = $this->owner->create_new_password();
        $encryptedPassword = $this->owner->encryptWithUserSettings($plainPassword);

        // Need to set password in database here?

        return $plainPassword;
    }

    public function sendClientWelcomeEmail() {
        $email = new Email('email@gmail.com', 'email@gmail.com', 'New member sign up');
        $email->setTemplate('NewClientSignUp');
        $email->populateTemplate(array(
            'Email' => $this->owner->Email,
            'Password' => $this->generatePasswordForClient()
        ));
        return $email->send();
    }

    public function onBeforeWrite()
    {
        parent::onBeforeWrite();
    }

    public function onAfterWrite()
    {
        parent::onAfterWrite();

        // Seems to send 2x emails.. Only want to send one
        $this->sendClientWelcomeEmail();


    }
}

您可以在您的会员扩展中使用 populateDefaults() 函数。

public function populateDefaults() {
    $this->owner->changePassword($this->generatePasswordForClient());
}

但我要说的是:这是个坏主意。您不想通过像电子邮件这样不安全的方式发送纯文本密码。让用户选择自己的密码是迄今为止更好的方法。

您应该在 SetPassword 字段中设置临时纯文本密码,并在调用 onBeforeWrite 和 onAfterWrite 挂钩时管理上下文。

class MemberClientExtension extends DataExtension
{
    protected $sendWelcomeEmail = false;
    ...
    // onBeforeWrite on extension is called after password is encrypted and set
    public function validate(ValidationResult $validationResult) {
       if (!$this->owner->isInDB()) {
           $this->sendWelcomeEmail = true;
       }
    }

    public function onAfterWrite() {
        if ($this->sendWelcomeEmail) {
            // reset for password change
            $this->sendWelcomeEmail = false;
            $password = $this->generatePasswordForClient();
            $this->owner->changePassword($password);
            $this->sendClientWelcomeEmail(array(
                'Email' => $this->owner->Email,
                'Password' => $password;
            ));
        }
    }
}