2015-09-29 6 views
0

У меня есть пользовательская форма CreateAdminForm, где администратор в бэкэнд может создать нового пользователя Admin. Я создал свою собственную модель формы, чтобы я мог обрабатывать passsword. Они просто заполняют имя пользователя, имя пользователя, адрес электронной почты, пароль, выбирают статус (активный, запрещенный, удаленный) и выбирают роль (Root, Super, Admin). Они вводят пароль как обычно, и пользовательская форма шифрует его. - У меня есть проверки, так что Root может создать что-либо, Super может создавать только обычных админов, а обычные админы вообще не могут создавать никаких других администраторов.Yii2 - Как передать 'isNewRecord' в пользовательскую форму?

Я на самом деле было это работает на моем последнем проекте, но я обошел isNewRecord, потому что я создал формы в своих просмотра файлов (create.php и update.php) вместо того, чтобы их обоих, используя один и тот же файл _form.php. Это не очень важно, но я хотел бы следить за тем, как Yii что-то делает, и получить файл _form.php, обрабатывающий формы, если это возможно.

Так как я сейчас, используя свою собственную модель CreateAdminForm вместо Admin модели (которая представляет собой ответвление User), он не имеет доступа к isNewRecord.

Как я могу получить _form.php для использования isNewRecord с моей собственной моделью CreateAdminForm?

Усеченный CreateAdminForm:

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; 
    } 
} 

_form.php:

<div class="admin-form"> 

    <?php $form = ActiveForm::begin(); ?> 

    <?= $form->field($model, 'username')->textInput(['maxlength' => true]) ?> 

    <?= $form->field($model, 'nicename')->textInput(['maxlength' => true]) ?> 

    <?= $form->field($model, 'email')->textInput(['maxlength' => true]) ?> 

    <?= $form->field($model, 'role')->dropDownList(
     $model->getUserRoleDropdown(), 
     ['prompt'=>' - Admin Role - '] 
    ) ?> 

    <?= $form->field($model, 'status')->dropDownList(
     $model->getUserStatusDropdown(), 
     ['prompt'=>' - Admin Status - '] 
    ) ?> 

    <?= (!$model->isNewRecord) ? Html::a('Change Password!', ['admin/change-admin-password', 'id' => $model->id]) . '<br /><br />' : '' ?> 

    <div class="form-group"> 
     <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> 
    </div> 

    <?php ActiveForm::end(); ?> 

</div> 
+0

Никогда не использовал Yii2, но не мог ли вы просто расширить свою модель администратора вместо создания чего-то, основанного на этом классе модели? – georaldc

+0

Моя форма основана на уже существующих ContactForm и RegistrationForm. Просто изменен, чтобы соответствовать моим потребностям. Возможно, ваше предложение возможно. Я всегда мог захватить действие, чтобы определить, является ли это действием создания или обновления, но это взлом. Поскольку действия по умолчанию для создания/обновления изначально использовались '$ model = Admin', это правдоподобное решение.Я работаю над несколькими другими областями приложения, пока я жду еще нескольких ответов, чтобы войти. Немного, я могу изучить этот маршрут, если у меня нет твердого ответа здесь. Спасибо. –

+0

Ты был прав. С моим текущим 'CreateAdminForm' точно так же, как и я, я просто изменил его на расширение' Model', чтобы расширить 'Admin'. Он работает как шарм, и работает 'isNewRecord'. - Я дам вам немного времени, чтобы написать это как ответ. –

ответ

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 и BaseActiveRecord, такие как метод getIsNewRecord() (и не придется беспокоиться об управлении 2 объекта)

class CreateAdminForm extends Admin 
{ 
    // CreateAdminForm specific code 
} 
0

Там нет использование isNewRecord с Model

$isNewRecord является собственностью ActiveRecord, простирается от BaseActiveRecord. Поэтому это свойство нельзя назвать, когда вы используете Model для своей формы.

class MyForm extends Model 
    { 

    } 

Там нет использование isNewRecord, так как модель/форма не может вставить данные в базу данных. Таким образом, нет возможности обновить данные.

+0

Это не отвечает на вопрос. Я знал, что нет 'isNewRecord' с моделью, поэтому моя проблема. Правильный ответ заключается в расширении 'Admin', который имеет к нему доступ. Я скопировал существующее использование ContactForm и RegistrationForm, которые расширяют модель. Я не знал, что могу легко заменить модель для администратора, и она работает без заминки. –