Ngu ngơ học làm web (x33) - CakePHP2 - Đổi mật khẩu, ràng buộc ở controller

Tiếp theo của: Ngu ngơ học làm web (x32) - CakePHP2 – getUser, chỉ thực hiện khi đã đăng nhập
-----

Phần x33. CakePHP2 – Đổi mật khẩu, ràng buộc ở controller


Xem (clip số 35a – chickenrainshop):

- Đổi mật khẩu cho người dùng

- Ràng buộc mật khẩu tại controller (7":02)

- Kiểm tra thỏa ràng buộc - validates (8":53)

- strcmp (12":20)

Đổi mật khẩu cho người dùng:

Vào tập tin default.ctp để tạo link cho mục ‘Đổi mật khẩu’ trên giao diện.

[default.ctp]

<li><a href="">Cập nhật thông tin</a></li>
            <li><?php echo $this->Html->link('Đổi mật khẩu', '/doi-mat-khau'); ?></li>
            <li><a href="">Lịch sử mua hàng</a></li>
            <li><?php echo $this->Html->link('Đăng xuất', '/logout'); ?></li>

Vào UsersController.php để viết hàm change_password:

[UsersController.php]

            public $components = array('Paginator');

/**
 * đổi mật khẩu
 */
            public function changePassword() {
                        $this->set('title_for_layout', 'Đổi mật khẩu');
            }

Vào routes.php để thực hiện route cho chức năng ‘doi-mat-khau’:

[routes.php]

Router::connect('/login', ['controller' => 'users', 'action' => 'login']);
Router::connect('/doi-mat-khau', ['controller' => 'users', 'action' => 'changePassword']);

Tạo view cho action changePassword:

[View\Users\change_password.ctp]

<div class="panel panel-info">
            <h4 class="panel-heading"><span class="glyphicon glyphicon-user"> Đổi mật khẩu</span></h4>
            <?php if (!empty($userInfo)): ?>
                        <?php echo $this->Flash->render('auth'); ?>
                        <?php echo $this->Form->create('User', ['class' => 'form-horizontal', 'novalidate' => true, 'inputDefaults' => ['label' => false]]); ?>
                                    <div class="control-group">
                                                <label class="control-label" for="inputUsername">Mật khẩu mới</label>
                                                <div class="controls">
                                                            <?php echo $this->Form->input('password', ['placeholder' => 'Nhập mật khẩu mới']); ?>
                                                </div>
                                    </div>
                                    <div class="control-group">
                                                <label class="control-label" for="inputPassword">Xác nhận mật khẩu</label>
                                                <div class="controls">
                                                            <?php echo $this->Form->input('confirmPassword', ['placeholder' => 'Xác nhận mật khẩu', 'type' => 'password']); ?>
                                                </div>
                                    </div>
                                    <div class="control-group">
                                                <div class="controls">
                                                            <?php echo $this->Form->button('Lưu', ['type' => 'submit', 'class' => 'col-lg-2 btn btn-primary']); ?>
                                                </div>
                                    </div>
                        <?php echo $this->Form->end(); ?>
            <?php else: ?>
                        Bạn chưa đăng nhập, bấm vào <?php echo $this->Html->link('đây', '/login'); ?> để đăng nhập.
            <?php endif ?>
</div>

Ràng buộc dữ liệu cho trường password và confirmPassword:

[Model\User.php]

'password' => array(
                                    'notBlank' => array(
                                                'rule' => array('notBlank'),
                                                'message' => 'Mật khẩu không được để trống',
                                                //'allowEmpty' => false,
                                                //'required' => false,
                                                //'last' => false, // Stop validation after this rule
                                                //'on' => 'create', // Limit validation to 'create' or 'update' operations
                                    ),
                                    'minlength' => array(
                                                'rule' => array('minlength', 5),
                                                'message' => 'Mật khẩu ít nhất là 5 kí tự',
                                    )
                        ),
                        'confirmPassword' => array(
                                    'notBlank' => array(
                                                'rule' => array('notBlank'),
                                                'message' => 'Mật khẩu không được để trống',
                                    )
                        ),
                        'email' => array(

Hiển thị thông báo lỗi lên view:

[change_password.ctp]

<?php echo $this->Flash->render('auth'); ?>
                        <?php echo $this->element('errors'); ?>
                        <?php echo $this->Form->create('User', ['class' => 'form-horizontal', 'novalidate'

Không hiển thị thông báo lỗi ngay dưới input:

[change_password.ctp]

<?php echo $this->Form->input('password', ['placeholder' => 'Nhập mật khẩu mới', 'error' => false]); ?>
<?php echo $this->Form->input('confirmPassword', ['placeholder' => 'Xác nhận mật khẩu', 'type' => 'password', 'error' => false]); ?>

Viết tiếp xử lý trong action changePassword:

if ($this->User->validates()) {
            //trrcmp trả về 0 nếu giống nhau
            if (strcmp($this->request->data['User']['password'], $this->request->data['User']['confirmPassword']) == 0) {
                                                } else {
                                                            $this->Flash->error('Xác nhận mật khẩu không đúng.',
                                                                        ['params' => [
                                                                                    'class' => 'alert alert-danger' 
                                                                                    ]
                                                                        ]);
                                                }
                                    } else {

                                                $this->set('errors', $this->User->validationErrors);
-----------
Cập nhật 29/6/2017
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web