как скрыть часть формы HTML в зависимости от роли пользователя

0

Я разрабатываю веб-сайт с использованием Kohana 3.3, и я хочу выборочно отображать элементы HTML UI в зависимости от роли пользователя. e: - Если пользователь является администратором, тогда отобразите гиперссылку "edit", и когда администратор нажмет кнопку редактирования, измените текстовое поле с "readonly" на "normal".

Если пользователь является зарегистрированным обычным пользователем, чем кнопка "задать вопрос".

Если пользователь посетитель, у него нет никаких привилегий.

Прямо сейчас я использую один файл вида и изменяю visbility после проверки состояния php-переменных. Почему-то я чувствую, что я не делаю это правильно, каков предложенный метод для обработки таких сценариев (любые плагины?)?

  • 0
    Это зависит от того, как вы сохраняете информацию пользователя. например, для посетителя ничего не сохраняйте в куки. Для пользователя сгенерируйте случайное число, затем хешируйте его и помещайте в базу данных для сравнения, чтобы никто не мог угадать хеш. Для администратора тот же метод, просто используйте $_COOKIE['hash_id'] и выполните несколько SQL-запросов, и все будет в порядке.
  • 0
    Используете ли вы модуль Auth по умолчанию (включая роли)?
Показать ещё 1 комментарий
Теги:
kohana

1 ответ

1

Итак, вы хотите выделить три разных случая

  • посетитель
  • админ
  • пользователь

Место для этого - ваш контроллер. В этом случае у вас есть доступ к Auth::instance()->get_user().

$user = Auth::instance()->get_user();
if ($user === null) {
    //visitor
} else {
    if ($user->has('roles', ORM::factory('Role', array('name' => 'admin')))) {
        //admin
    } else {
        //user
    }
}

Теперь, когда вы знаете, как обращаться с делами, вам почему-то нужно сообщить свое мнение. Для этого вы можете создать новую переменную, в которой вы загружаете одно из трех видов - по одному для каждого случая.

$specificViewName = "";
$user = Auth::instance()->get_user();
if ($user === null) {
    $specificViewName = "visitor";
} else {
    if ($user->has('roles', ORM::factory('Role', array('name' => 'admin')))) {
        $specificViewName = "admin";
    } else {
        $specificViewName = "user";
    }
}
$specificView = View::factory("index/".$specificViewName);

Если вы находитесь в Controller_Template, теперь вы можете использовать $this->template->set("specificView", $specificView); ,

В этом случае у вас будет такой шаблон индекса

<html><!--etc.-->
<h1>Welcome to my website</h1>
<!--stuff all sites share like navigation-->
<?php print $specificView; ?>
<!--more-->
</html>

И индекс/посетитель

<span class="sadtext">Nothing special for you here</span>

Индекс/пользователя

<form>
<button>ask a question!
</form>

Индекс/админ

<a href="edit">hyperlink</a>
  • 0
    Спасибо, я проверю ваше предложение, но, в моем случае, элементы пользовательского интерфейса практически одинаковы (за исключением изменения свойства readonly, если администратор нажимает кнопку «Изменить» и видимость кнопок), имея 3 различных представления, я чувствую, что я реплицирую эти файлы ,
  • 1
    Ну, вы можете установить флаг и реагировать на это внутри представления - однако, это не было бы чисто MVC IMO ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню