2011-06-28 20 views
10

Tôi muốn một số đề xuất từ ​​một người có kinh nghiệm về php.Hiển thị cùng một trang khác nhau cho người dùng có vai trò khác nhau

Tôi đang làm cho một trang web trong php mà sẽ có 4 loại người dùng: 1. khách vãng lai (không đăng ký), 2. đăng ký, 3. đăng ký với privilages đặc biệt, 4. quản trị viên

Vì vậy, các cùng một trang sẽ được hiển thị khác nhau cho cả bốn trang.

Hiện tại tôi đang làm điều đó bằng cách sử dụng các điều kiện if. Trong mỗi trang, tôi đang kiểm tra số role của người dùng và sau đó sử dụng nhiều câu hỏi if để hiển thị trang cho phù hợp.

Nó làm cho mã rất lớn và không gọn gàng và tôi phải kiểm tra các điều kiện lặp đi lặp lại trong tất cả các trang.

  1. Có cách nào tốt hơn để thực hiện việc này không?

  2. Điều này được thực hiện như thế nào trong các trang web chuyên nghiệp lớn?

  3. Câu hỏi mở rộng: Cách tối ưu nhất để thực hiện tương tự bằng cách sử dụng khung MVC như kohana 3.1 là gì? Nó có liên quan gì với acl không?

+0

Câu trả lời mở rộng: Có, ACL là Danh sách điều khiển truy cập. Về cơ bản nó nói "đây là một trang chi tiết tài khoản người dùng, vì vậy nó có thể được truy cập bằng cách làm theo các vai trò: 'người dùng đã đăng ký', 'quản trị', 'siêu người dùng', 'thần'". – cypher

Trả lời

5

Nó thực sự phụ thuộc vào những gì bạn cần.

Ví dụ nếu trang đó có phần quan trọng làm thay đổi hoàn toàn, những gì tôi sẽ đề nghị là để tạo ra các mẫu khác nhau và bao gồm chúng tùy thuộc vào "quyền" của họ

$permission = $_SESSION['type_user']; 
include '/path/to/file/with/permission/'.$permission.'/tpl.html'; 

và có một cái gì đó trong trang tương tự như

<?php 
//inside include.php you have the line similar to 
//$permission = isset($_SESSION['type_user']) && $_SESSION['type_user']!=''?$_SESSION['type_user']:'common'; 
require_once '/mast/config/include.php'; 
include '/path/to/file/with/permission/common/header.html'; 
include '/path/to/file/with/permission/'.$permission.'/tpl_1.html'; 
include '/path/to/file/with/permission/common/tpl_2.html'; 
include '/path/to/file/with/permission/'.$permission.'/tpl_3.html'; 
include '/path/to/file/with/permission/common/footer.html'; 
?> 

nếu kịch bản có đầy đủ các bộ phận nhỏ như "hiển thị văn bản này", hoặc "hiển thị nút này", bạn có thể tạo một hàm sẽ kiểm tra quyền truy cập cho bạn

<?php 
function can_user($action, $what){ 
    switch($action){ 
     case 'write': 
      return $your_current_if_on_what; 
      break; 
     case 'read': 
     default: 
      return $your_current_if_on_what; 
      break; 
    } 
} 
?> 

and the template will look like: 

[my html] 
<?=can_user('read','button')?'My Button':''?> 
[my html] 

Theo nguyên tắc, nếu một đoạn mã được sử dụng nhiều hơn 2 lần, nó cần được đặt vào một hàm/tệp riêng, vì vậy nếu bạn có nhiều "IFS", bạn cần tạo hàm

+1

Cảm ơn. Mặc dù đã cho tôi một thời gian để hiểu, tôi đã nhận nó. Bất kỳ ý tưởng làm thế nào điều này được thực hiện bởi các trang web chuyên nghiệp lớn? –

+0

Phụ thuộc vào ý nghĩa của bạn với các trang web chuyên nghiệp lớn. Tôi chạy và phát triển cho các trang web lớn, và mỗi lần là một giải pháp khác nhau tùy thuộc vào những gì các tham số được. Ví dụ bạn phải ghi nhớ rằng mỗi khi PHP phải truy cập vào hệ thống tập tin, nó có một vấn đề hiệu suất lớn, nhưng một số máy gia tốc/tối ưu hóa thường có thể giúp (tôi sử dụng eAccelerator). – Fabrizio

+0

2 trang web lớn cuối cùng của tôi, tôi đã sử dụng kết hợp cả hai nơi mà mẫu mà tôi muốn đưa vào được chuyển tới "can_user" và tên của bản thân trả về hoặc tên mẫu khác khi người dùng không có quyền để xem phần đó. một cái gì đó như 'bao gồm can_user ('đọc', 'nút', 'button_html');' và hàm can_user sẽ là 'return $ this_user_can?$ template, 'permission_deny_in_page'; ' – Fabrizio