CakePHP 3 użytkownicy ciąg dalszy

W tej części utworzymy strony edycji i podglądu użytkownika. Widok edycji będzie prawie identyczny z widokiem dodawania, z tą różnicą, że dodamy do niego trochę ograniczeń, ponieważ nie chcemy, aby każdy użytkownik mógł zmienić swoją rolę z "User" na "Admin".

Chcemy również uniemożliwić innym użytkownikom edytowanie innych użytkowników lub dodawanie nowych kont. W pliku src/Controller/UsersController.php dopisz.
public function isAuthorized($user)
{
	// Admin has full access
	if ($user['role'] == 'Admin') {
		return true;
	}
	// User can view and edit own account only
	if (in_array($this->request->action, ['view', 'edit']) && $user['id'] == (int)$this->request->params['pass'][0]) {
		return true;
	}
	return false;
}
Powyższy kod nadpisuje działanie funkcji isAuthorized w klasie nadrzędnej (AppController.php). Teraz dodamy funkcję wylogowania. W tym celu w kontrolerze dodaj następującą metodę.
public function logout()
{
	$this->Flash->success('You are now logged out.');
	return $this->redirect($this->Auth->logout());
}
Następnie dodajmy jeszcze dwie akcje edit i view w kontrolerze.
public function view($id = null) {
	$user = $this->Users->get($id);
	$this->set('user', $user);
	$this->set('_serialize', ['user']);
}
public function edit($id = null) {
	$user = $this->Users->get($id);
	if ($this->request->is(['patch', 'post', 'put'])) {
		if ($this->request->data['password'] == '') {
		   unset($this->request->data['password']);
		}
		$user = $this->Users->patchEntity($user, $this->request->data);
		if ($this->Users->save($user)) {
			$this->Flash->success(__('The user has been saved.'));
			return $this->redirect(['action' => 'index']);
		} else {
			$this->Flash->error(__('The user could not be saved. Please, try again.'));
		}
	}
	unset($user->password);
	$roles = $this->roles;
	$this->set(compact('user', 'roles'));
	$this->set('_serialize', ['user']);
}
Musimy stworzyć dwa widoki src/Templates/Users/view.ctp
<?php $this->assign('title', $user->full_name); ?>
<div class="users view large-9 medium-8 columns content">
    <?php echo $this->Html->link(__('Edit User'), ['action' => 'edit', $user->id], ['class' => 'right']) ?>
    <h3><?php echo h($user->full_name) ?></h3>
    <table class="vertical-table">
        <tr>
            <th><?php echo __('Username') ?></th>
            <td><?php echo h($user->username) ?></td>
        </tr>
        <tr>
            <th><?php echo __('First Name') ?></th>
            <td><?php echo h($user->first_name) ?></td>
        </tr>
        <tr>
            <th><?php echo __('Last Name') ?></th>
            <td><?php echo h($user->last_name) ?></td>
        </tr>
        <tr>
            <th><?php echo __('Email') ?></th>
            <td><?php echo $this->Text->autoLinkEmails($user->email) ?></td>
        </tr>
        <tr>
            <th><?php echo __('Role') ?></th>
            <td><?php echo h($user->role) ?></td>
        </tr>
        <tr>
            <th><?php echo __('Modified') ?></th>
            <td><?php echo h($user->modified) ?></td>
        </tr>
        <tr>
            <th><?php echo __('Created') ?></th>
            <td><?php echo h($user->created) ?></td>
        </tr>
    </table>
</div>
oraz src/Templates/Users/edit.ctp
<?php $this->assign('title', 'Edit User'); ?>
<div class="users form large-9 medium-8 columns content">
    <?php echo $this->Form->create($user) ?>
    <fieldset>
        <legend><?php echo __('Edit User') ?></legend>
    <?php
        echo $this->Form->input('username', ['autofocus' => true]);
        echo $this->Form->input('first_name');
        echo $this->Form->input('last_name');
        echo $this->Form->input('password'); ?>
        <p class="helper">Passwords must be at least 8 characters and contain at least 1 number, 1 uppercase, 1 lowercase and 1 special character</p>
    <?php
        echo $this->Form->input('confirm_password', ['type' => 'password']);
        echo $this->Form->input('email');
        if ($this->request->session()->read('Auth.User.role') == 'Admin') { echo $this->Form->input('role'); }
    ?>
    </fieldset>
    <?php echo $this->Form->button(__('Submit')); ?>
    <?php echo $this->Html->link(__('Cancel'), ['action' => 'view', $user->id], ['class' => 'button']); ?>
    <?php echo $this->Form->end(); ?>
    <?php echo $this->Form->postLink(__('Delete User'), ['action' => 'delete', $user->id], ['confirm' => __('Are you sure you want to delete user: {0}?', $user->full_name)]); ?>
</div>
Zauważ, że w widoku edycji pole do zmiany roli wyświetlamy tylko dla adminów.