Ngu ngơ học làm web (x52) - CakePHP2 - Tạo các trang tĩnh

Tiếp theo của: Ngu ngơ học làm web (x51) - CakePHP2 – Khóa tài khoản
-----

Phần 52. CakePHP2 – Tạo các trang tĩnh


Xem (clip số 50 – chickenrainshop):

- Tạo các trang tĩnh, PagesController (50)

- Khai báo controller không sử dụng model (2":06)

- Xử lý tab active (10":31)

Tạo các trang tĩnh:

Để tạo các trang tĩnh, viết các action cho các trang tĩnh trong PagesController. PagesController được tạo sẵn khi tạo một dự án bằng CakePHP.

[PagesController.php]

Vô hiệu action display() vì không cần dùng tới.

Viết thêm các action: contact(), about(), policy().

public function contact() {
                        $this->set('title_for_layout', 'Liên hệ');
                        if ($this->request->is('post')) {
                                    $this->Page->set($this->request->data);
                                    if ($this->Page->validates()) {
                                                App::uses('CakeEmail', 'Network/Email');
                                                $email = new CakeEmail();
                                                $email->config('smtp')
                                                            ->emailFormat('both')
                                                            ->subject('Đã có một liên hệ mới trên trang Web')
                                                            ->send('Người gửi:'.$this->request->data['Page']['fullname'].'<br/>Email:'.$this->request->data['Page']['email']);
                                                $this->Flash->success('Cám ơn bạn đã gửi email, chúng tôi sẽ trả lời sớm nhất có thể!', ['params' => ['class' => 'alert alert-success']]);          
                                                $this->request->data['Page'] = null;
                                    } else {
                                                $this->set('errors', $this->Page->validationErrors);
                                    }
                        }
            }

            public function about() {
                        $this->set('title_for_layout', 'Trang about');
            }

            public function policy() {
                        $this->set('title_for_layout', 'Điều khoản');
            }
}

[View\Pages\about.ctp]

Trang about!

[View\Pages\policy.ctp]

Trang policy!

[View\Pages\contact.ctp]

<div class="panel panel-info">
            <h4 class="panel-heading"><i class="glyphicon glyphicon-user"></i>Liên hệ</h4>
            <p>Điền các thông tin dưới đây để liên hệ với chúng tôi</p>
            <hr>
            <?php echo $this->Flash->render(); ?>
            <?php echo $this->element('errors'); ?>
                        <?php echo $this->Form->create('Page', ['class' => 'form-horizontal', 'inputDefaults' => ['label' => false, 'error' => false, 'required' => true]]); ?>
                        <div class="control-group">
                                    <label for="inputFullname" class="control-label">Họ và Tên</label>
                                    <div class="controls">
                                                <?php echo $this->Form->input('fullname', ['placeholder' => 'Họ và Tên']); ?>
                                    </div>
                        </div>
                        <div class="control-group">
                                    <label for="inputEmail" class="control-label">Email</label>
                                    <div class="controls">
                                                <?php echo $this->Form->input('email', ['placeholder' => 'Nhập địa chỉ email']); ?>
                                    </div>
                        </div>
                        <div class="control-group">
                                    <label for="inputContent" class="control-label">Nội dung</label>
                                    <div class="controls">
                                                <?php echo $this->Form->input('content', ['placeholder' => 'Nội dung liên hệ', 'type' => 'textarea']); ?>
                                    </div>
                        </div>
                        <hr>
                        <div class="form-actions">
                                    <?php echo $this->Form->button('Gửi', ['type' => "submit", 'class' => "col-lg-2 btn btn-primary"]); ?>
                        </div>
                        <?php echo $this->Form->end(); ?>
</div>

[Model\Page.php]

<?php
App::uses('AppModel', 'Model');

class Page extends AppModel {
            public $useTable = false;
            public $validate = array(
                        'fullname' => array(
                                    'notblank' => array(
                                    'rule' => array('notBlank'),
                                    'message' => 'Họ và tên không được để trống',
                                    )
                        ),
                        'email' => array(
                                    'rule' => array('email'),
                                    'message' => 'Email không được để trống',
                        ),
                        'content' => array(
                                    'notblank' => array(
                                                'rule' => array('notblank'),
                                                'message' => 'Nội dung không được để trống',
                                    ),
                                    'minLength' => array(
                                                'rule' => array('minLength', 10),
                                                'message' => 'Nội dung quá ngắn'
                                    )
                        ),
            );
}

?>

Thực hiện route cho các trang: about, contact, policy.

[routes.php]

Router::connect('/dieu-khoan', ['controller' => 'pages', 'action' => 'policy']);
Router::connect('/ve-trang-web', ['controller' => 'pages', 'action' => 'about']);
Router::connect('/lien-he', ['controller' => 'pages', 'action' => 'contact']);

Đặt các link cho các trang: about, contact, policy.

[View\Layouts\default.ctp]

<ul class="nav navbar-nav">
                                    <li class="active"><?php echo $this->Html->link('Sách mới', '/sach-moi') ?></li>
                                    <li><?php echo $this->Html->link('Sách bán chạy', '/sach-ban-chay'); ?></li>
                                    <li><?php echo $this->Html->link('Liên hệ', '/lien-he'); ?></li>
                                    <li><?php echo $this->Html->link('Về chúng tôi', '/ve-trang-web'); ?></li>
                                    <li><?php echo $this->Html->link('Điều khoản', '/dieu-khoan'); ?></li>
</ul>

Xử lý cho menu khi một mục được active:

[View\Layouts\default.ctp]

<div class="navbar-collapse collapse" id="mainmenu">
                                    <ul class="nav navbar-nav">
                                    <?php if ($this->request->params['action'] == 'latest_books'): ?>
                                                                        <li class="active">
                                                            <?php else: ?>
                                                                        <li>
                                    <?php endif ?>
                                    <?php echo $this->Html->link('Sách mới', '/sach-moi') ?>
                                </li>
                                <?php if ($this->request->params['action'] == 'bestSelling'): ?>
                                                                        <li class="active">
                                                            <?php else: ?>
                                                                        <li>
                                    <?php endif ?>
                                    <?php echo $this->Html->link('Sách bán chạy', '/sach-ban-chay'); ?>
                                    </li>
                                    <?php if ($this->request->params['action'] == 'contact'): ?>
                                                                        <li class="active">
                                                            <?php else: ?>
                                                                        <li>
                                    <?php endif ?>
                                    <?php echo $this->Html->link('Liên hệ', '/lien-he'); ?>
                                </li>
                                <?php if ($this->request->params['action'] == 'about'): ?>
                                                                        <li class="active">
                                                            <?php else: ?>
                                                                        <li>
                                    <?php endif ?>
                                    <?php echo $this->Html->link('Về chúng tôi', '/ve-trang-web'); ?>
                        </li>
                        <?php if ($this->request->params['action'] == 'policy'): ?>
                                                                        <li class="active">
                                                            <?php else: ?>
                                                                        <li>
                                    <?php endif ?>
                                    <?php echo $this->Html->link('Điều khoản', '/dieu-khoan'); ?>
                        </li>
                                    </ul>
                                    <ul class="nav navbar-nav pull-right">
                                                <?php
                                                            echo $this->Form->create('Book', [
                                                                        'url' => ['action' => 'get_keyword'],
                                                                        'class' => 'navbar-form search'
                                                                        ]);
                                                            echo $this->Form->input('keyword',[
                                                                        'label' => '',
                                                                        'style' => 'width: 200px',
                                                                        'placeholder' => 'Tìm kiếm...'
                                                                        ]);
                                                            echo $this->Form->end();
                                                ?>
                                    </ul>

                        </div>
-----------
Cập nhật 13/8/2017
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web
Ngu ngơ học làm web (x53) - CakePHP2 - ACL, AROS, ACOS

Ngu ngơ học làm web (x51) - CakePHP2 - Khóa tài khoản

Tiếp theo của: Ngu ngơ học làm web (x50) - CakePHP2 – postLink trong form, updateAll
-----

Phần x51. CakePHP2 – Khóa tài khoản


Xem (clip số 49 – chickenrainshop):

- Khóa tài khoản người dùng (49)(3":27)

- Định dạng ngày và thời gian (7":22)

Thực hiện chức năng khóa tài khoản.

Trong [UsersController.php] sửa action index() thành admin_index().

Trong [View\Users\] sửa view index.ctp thành admin_index.ctp.

Thêm trường active (tinyint(1)) vào bảng users, giá trị 1 là hoạt động, giá trị 0 là bị khóa.

[View\Users\admin_index.ctp]

<div class="users index">
            <h2><?php echo __('Users'); ?></h2>
            <table cellpadding="0" cellspacing="0">
            <thead>
            <tr>
                                    <th><?php echo $this->Paginator->sort('active', 'Trạng thái tài khoản'); ?></th>
                                    <th><?php echo $this->Paginator->sort('group_id', 'Group'); ?></th>
                                    <th><?php echo $this->Paginator->sort('username'); ?></th>
                                    <th><?php echo $this->Paginator->sort('email'); ?></th>
                                    <th><?php echo $this->Paginator->sort('fullname', 'Họ tên'); ?></th>
                                    <th><?php echo $this->Paginator->sort('created', 'Ngày tạo'); ?></th>
                                    <th><?php echo $this->Paginator->sort('modified', 'Ngày chỉnh sửa'); ?></th>
                                    <th class="actions"><?php echo __('Actions'); ?></th>
            </tr>
            </thead>
            <tbody>
            <?php foreach ($users as $user): ?>
            <tr>
                        <td>
                                    <?php if ($user['User']['active'] == 1): ?>
                                                Đang hoạt động
                                    <?php else: ?>
                                                Bị khóa
                                    <?php endif ?>
                        <td>
                                    <?php echo $this->Html->link($user['Group']['name'], array('controller' => 'groups', 'action' => 'view', $user['Group']['id'])); ?>
                        </td>
                        <td><?php echo h($user['User']['username']); ?>&nbsp;</td>
                        <td><?php echo h($user['User']['email']); ?>&nbsp;</td>
                        <td><?php echo h($user['User']['fullname']); ?>&nbsp;</td>
                        <td><?php echo h($user['User']['created']); ?>&nbsp;</td>
                        <td><?php echo h($user['User']['modified']); ?>&nbsp;</td>
                        <td class="actions">
                                    <?php  if ($user['User']['active'] == 1): ?>
                                                <?php echo $this->Form->postLink(__('Khóa tài khoản'), array('action' => 'active', $user['User']['id']), array('confirm' => __('Bạn có chắc chắn muốn khóa tài khoản này không?'))); ?>
                                    <?php else: ?>
                                                <?php echo $this->Form->postLink(__('Mở khóa tài khoản'), array('action' => 'active', $user['User']['id']), array('confirm' => __('Bạn có chắc chắn muốn mở tài khoản này không?'))); ?>
                                    <?php endif ?>
                                    <?php echo $this->Html->link(__('Edit'), array('action' => 'edit', $user['User']['id'])); ?>
                                    <?php echo $this->Form->postLink(__('Delete'), array('action' => 'delete', $user['User']['id']), array('confirm' => __('Are you sure you want to delete # %s?', $user['User']['id']))); ?>
                        </td>
            </tr>
<?php endforeach; ?>
            </tbody>
            </table>
            …

[UsersController.php]

            public function admin_active ($id = null) {
                        $this->User->id = $id;
                        if (!$this->User->exists()) {
                                    throw new NotFoundException(__('Invalid user'));
                        }
                        $user = $this->User->findById($id);
                        $active = $user['User']['active'];
                        if ($active == 1) {
                                    if ($this->User->saveField('active', 0)) {
                                                $this->Flash->success(__('Tài khoản đã bị khóa!'));
                                    } else {
                                                $this->Flash->error(__('Khóa tài khoản không thành công!'));
                                    }
                        } else {
                                    if ($this->User->saveField('active', 1)) {
                                                $this->Flash->success(__('Tài khoản đã được mở!'));
                                    } else {
                                                $this->Flash->error(__('Mở tài khoản không thành công!'));
                                    }
                        }
                        $this->redirect($this->referer());
            }

Các tài khoản đã bị khóa sẽ không được phép đăng nhập vào Website, để làm điều này, vào 
AppController.php, thêm đoạn mã sau:

public $components = [
                        'Flash','Session','Tool',
                        'Auth' =>[
                                    'loginAction' => '/login',
                                    'authError' => 'Bạn cần phải đăng nhập để tiếp tục!',
                                    'flash' => [
                                                            'element' => 'error',
                                                            'key' => 'auth',
                                                            'params' => ['class' => 'alert alert-danger']
                                                ],
                                    'loginRedirect' => '/',
                                    'authenticate' => array(
                                                'Form' => array(
                                                            'scope' => array('User.active' => 1)
                                                )
                                    )
                        ]
            ];

Khi user đã bị khóa, nếu họ cố gắng để đăng nhập, cần thông báo để họ biết:

[UsersController.php action login()]

public function login() {
                        if ($this->request->is('post')) {
                                    if ($this->Auth->login()) {
                                                $this->redirect($this->Auth->redirect());
                                    } else {
                                                $userInfo = $this->User->findByUsername($this->request->data['User']['username']);
                                                if (!empty($userInfo) && $userInfo['User']['active'] == 0) {
                                                            $this->Flash->error('Tài khoản đã bị khóa, vui lòng liên hệ với admin!', ['key' => 'auth', 'params' => ['class' => 'alert alert-danger']]);
                                                } else {
                                                            $this->Flash->error('Sai tên đăng nhập hoặc mật khẩu', ['key' => 'auth', 'params' => ['class' => 'alert alert-danger']]);
                                                }                      
                                    }
                        }
                        $this->set('title_for_layout', 'Đăng nhập');
            }

Để định dạng hiển thị thời gian của một input theo kiểu ngày/tháng/năm và 24 giờ, viết mã như sau:

Ví dụ:


echo $this->Form->input(‘timeStart’, [‘label’=>’Ngày bắt đầu’, ‘dateFormat’=>’DMY’, ‘timeFormat’ => 24]);
-----------
Cập nhật 7/8/2017
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web

Ngu ngơ học làm web (x50) - CakePHP2 - postLink trong form, updateAll

Tiếp theo của: Ngu ngơ học làm web (x49) - CakePHP2 – Lưu trên nhiều bảng
-----

Phần x50. CakePHP2 – postLink trong form, updateAll


Xem (clip số 48 – chickenrainshop):

- update nhiều mẩu tin cùng lúc (48)

- checkbox (2":17)

- select box (3":06)

- form chứa các checkbox và select box không nằm cạnh nhau (5":04)

- Xử lý tình trạng vừa có postLink vừa có submit (6":31) 

Trong OrdersController, sửa action index() thành admin_index()

[OrdersController.php]

public function admin_index() {
                        $this->Order->recursive = 0;
                        $this->set('orders', $this->Paginator->paginate());
            }

Trong View\Orders, sửa view index.ctp thành admin_index.ctp.

[admin_index.ctp]

<div class="orders index">
            <h2><?php echo __('Orders'); ?></h2>
            <table cellpadding="0" cellspacing="0">
            <thead>
            <tr>
                                    <th>Select</th>
                                    <th><?php echo $this->Paginator->sort('id', 'Mã đơn hàng'); ?></th>
                                    <th><?php echo $this->Paginator->sort('user_id', 'User'); ?></th>
                                    <th><?php echo $this->Paginator->sort('customer_info', 'Email'); ?></th>
                                    <th><?php echo $this->Paginator->sort('payment_info', 'Giá trị đơn hàng'); ?></th>
                                    <th><?php echo $this->Paginator->sort('status', 'Tình trạng'); ?></th>
                                    <th><?php echo $this->Paginator->sort('created', 'Ngày tạo'); ?></th>
                                    <th><?php echo $this->Paginator->sort('modified', 'Ngày xử lý'); ?></th>
                                    <th class="actions"><?php echo __('Actions'); ?></th>
            </tr>
            </thead>
            <tbody>
            <?php echo $this->Form->create('Order', ['url'=>['action' => 'process']]); ?>
            <?php foreach ($orders as $order): ?>
            <tr>
                        <td>
                                    <?php echo $this->Form->checkbox('Order.id.'.$order['Order']['id']); ?>
                        </td>
                        <td><?php echo h($order['Order']['id']); ?>&nbsp;</td>
                        <td>
                                    <?php echo $this->Html->link($order['User']['fullname'], array('controller' => 'users', 'action' => 'view', $order['User']['id'])); ?>
                        </td>
                        <td><?php echo json_decode($order['Order']['customer_info'])->email; ?>&nbsp;</td>
                        <td><?php echo $this->Number->currency(json_decode($order['Order']['payment_info'])->total, ' VND', ['places' => 0, 'wholePosition' => 'after']); ?>&nbsp;</td>
                        <td>
                                    <?php if ($order['Order']['status'] == 0): ?>
                                                Chưa xử lý
                                    <?php elseif ($order['Order']['status'] == 1): ?>
                                                Đã xử lý
                                    <?php else: ?>
                                                Hủy
                                    <?php endif ?>
                        </td>
                        <td><?php echo $this->Time->format('d-m-Y', $order['Order']['created'], null, 'Asia/Ho_Chi_Minh'); ?>&nbsp;</td>
                        <td><?php echo $this->Time->format('d-m-Y', $order['Order']['modified'], null, 'Asia/Ho_Chi_Minh'); ?>&nbsp;</td>
                        <td class="actions">
                                    <?php echo $this->Html->link(__('View'), array('action' => 'view', $order['Order']['id'])); ?>
                                    <?php echo $this->Html->link(__('Edit'), array('action' => 'edit', $order['Order']['id'])); ?>
                                    <?php //echo $this->Form->postLink(__('Delete'), array('action' => 'delete', $order['Order']['id']), array('confirm' => __('Are you sure you want to delete # %s?', $order['Order']['id']))); ?>
                        </td>
            </tr>
<?php endforeach; ?>
            </tbody>
            </table>
            <p>
            <?php
            echo $this->Paginator->counter(array(
                        'format' => __('Page {:page} of {:pages}, showing {:current} records out of {:count} total, starting on record {:start}, ending on {:end}')
            ));
            ?>       </p>
            <div class="paging">
            <?php
                        echo $this->Paginator->prev('< ' . __('previous'), array(), null, array('class' => 'prev disabled'));
                        echo $this->Paginator->numbers(array('separator' => ''));
                        echo $this->Paginator->next(__('next') . ' >', array(), null, array('class' => 'next disabled'));
            ?>
            </div>
            <?php echo $this->Form->select('action', ['1' => 'Chấp nhận đơn hàng', '2' => 'Tạm ngưng đơn hàng', '3' => 'Hủy đơn hàng'], ['empty' => false]); ?>
            <?php echo $this->Form->end('Submit'); ?>
</div>
<div class="actions">
            <h3><?php echo __('Actions'); ?></h3>
            <ul>
                        <li><?php echo $this->Html->link(__('New Order'), array('action' => 'add')); ?></li>
                        <li><?php echo $this->Html->link(__('List Users'), array('controller' => 'users', 'action' => 'index')); ?> </li>
                        <li><?php echo $this->Html->link(__('New User'), array('controller' => 'users', 'action' => 'add')); ?> </li>
            </ul>
</div>

[OrdersController.php action admin_ process()]

            public function admin_process() {
                        foreach ($this->request->data['Order']['id'] as $id => $value) {
                                    if ($value == 1) {
                                                $ids[] = $id;
                                    }
                        }
                        if (!empty($ids)) {
                                    switch ($this->request->data['Order']['action']) {
                                                case 1:
                                                if ($this->Order->updateAll(['Order.status' => 1], ['Order.id' => $ids])) {
                                                            $this->Flash->success(__('Đã xử lý đơn hàng thành công!'));
                                                } else {
                                                            $this->Flash->error(__('Có lỗi xảy ra, vui lòng thử lại!'));
                                                }
                                                break;
                                                case 2:
                                                if ($this->Order->updateAll(['Order.status' => 0], ['Order.id' => $ids])) {
                                                            $this->Flash->success(__('Đã tạm ngưng đơn hàng thành công!'));
                                                } else {
                                                            $this->Flash->error(__('Có lỗi xảy ra, vui lòng thử lại!'));
                                                }
                                                break;
                                                case 3:
                                                if ($this->Order->updateAll(['Order.status' => 2], ['Order.id' => $ids])) {
                                                            $this->Flash->success(__('Đã hủy đơn hàng thành công!'));
                                                } else {
                                                            $this->Flash->error(__('Có lỗi xảy ra, vui lòng thử lại!'));
                                                }
                                                break;
                                                default:
                                                            $this->Flash->error(__('Không có xử lý này, vui lòng thử lại!'));
                                                break;
                                    }          
                        } else {
                                    $this->Flash->error(__('Bạn chưa chọn đơn hàng để xử lý!'));
                        }
                        $this->redirect(['action' => 'index']);

            }
-----------
Cập nhật 2/8/2017
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web