Tworzenie DAO dla każdego użytkownika jest chyba najlepszym rozwiazaniem ( wg mnie najbardziej elastycznym w kontekscie zmian ). Rozumiem też, że w tej sytuacji trzeba będzie budować odrębne klasy prezentacji danych ( lub szablony )

lub widok generować wspólny, ale każdy przycisk/link/cokolwiek w tym widoku (wywołujący kontroler/metodę/akcję) sprawdzać przed wyświetleniem uwzględniając właśnie uprawnienia użytkownika ... i może to że użytkownik jest jego właścicielem (np ja edytuję swój post więc button edit mi się wyświetli)

?
W tej sytuacji tworzenie odrębnych widoków (bądź jego elementów) wydaje się dobry rozwiązaniem, chociaż wg mnie nie jest to najlepsze rozwiązanie (w przypadku zmian nie jest to już jeden szablon)
<?php
class Fast{
static function check
($user,$controller,$function,$param){ // pobranie informacji o wymaganiach żądania (bądź wartości domyślne)
$actionDemand = getActionDemand($controller,$function,$param);
// pobranie uprawnień użytkownika dla tego żądania,(jeśli brak to dane domyślne )
$userPossibility = getUserPossibility($user,$controller,$function,$param);
// sprawdzenie czy użytkownik może zrealizować ządanie (flagi bitowe)
((int)$actionDemand & (int)$userPossibility == $actionDemand) ? return true : return false ;
}
}
// i gratis helper do linków :)
function Link($link,$name,$title){ return '<a href= " '.base_url().$link.' " title= " '$title' " >'.$name.'</a>';
}
// wykorzystanie w szablonie
if(Fast
::check($this->User,'post','delete',3
)){ echo link('/post/delete/3','Usuń','Usuń tego posta');} ?>
Skomplikowane moze być pobieranie danych w aspekcie jakiegoś lokalnego wydarzenia zależnego od parametru dla wskazanej funkcji w kontrollerze tzn. jestem moderatorem jakiegoś subforum na forum, i w moim subforum do przycisku usuń_posta uprawnienia mają już trzy osoby (user do swojego posta oraz moderator i administrator do każdego posta)...więc procedura spradzenia czy przycisk usuń_linka może odbiegać od innych.
Obecnie walcze z uzyskaniem zgrabnego rozwiązania dla generowania widoków (zależnych od uprawnień) i dynamicznym przydzielaniem uprawnień .
Wnoisek : mamy dla kontrollera DAO zależne od profilu użytkownika...czy z widokiem zrobić tak samo ?
Poradzicie coś ?
////////////////////////////////////////////////////////////////////////////////////////
Pozwolę sobię odświeżyć El Temato
Napisałem klasę wykorzystującą wzorzec Composite View, jest to jedna klasa która przyjmuje tablicę z danymi i nazwę szablonu - po czym podstawia zmienne,wykonuje kod php w szablonie i wyświetla lub przechowuje wynik uruchomienia szablonu.
<?php
// ZAWARTOŚĆ CONTROLLERA
$tplName = 'calendar';
$data = array('poniedziałek','środa','czwartek'); // 3 argument to false tzn.wynik wykanania kodu php w szablonie jest w składowej $calendar_view
$calendar_view = new View($tplName,$data,false);
$banner_view = new View('banner',false,false);
$viewElements = array('calendar' => $calendar_view,'banner'=>$banner_view);
// wyświetlenie
new View('startPage',$viewElements,true);
?>
Co zrobić z uprawnieniami do np. opcji w menu dostępnych tylko dla moderatora. Schemat działania widoku jest prosty - przyjmuje on już przygotowane przez kontroler dane....tzn że w kontrolerze zadecydujemy czy button USUŃ ma się wyświetlić bieżącemu userowi ? Kolejnym rozwiązaniem jest przekazanie danych o uprawnieniach do klasy View....tylko wtedy ta klasa powinna mieć możliwość komunikacji z modelem żeby w oparciu o uprawnienia odpowiednie dane pobierać. Czy ktoś potrafi przedstawić wstępny zarys działania takiej implementacji ?
Można...
- napisać 5 różnych szablonów tego samego widoku i ładować odpowiedni w zależności od uprawnień ?
Nie mam już innego pomysłu .....
-------------------------------------------------------------------------
Może się komuś przyda (dla prostych wywołań typu CI czy VFrame) :
- bieżący uzytkownik (zalogowany czy nie) ma jakiś tam profil (administrator/moderator czy Anonymous)
- do szablonu widoku przekazujemy obiekt użytkownika
- zanim wyświetlimy jakiś link lub przycisk sprawdzamy czy user ma uprawnienia do akcji wywoływanej przez ten link
- sprawdzić instancję użytkownika można podczas wywołania kontrollera w jednej z jego metod lub w konstruktorze
KLASA UŻYTKOWNIKA
<?php
class User{
private $instance = null;
function isAdministrator(){
// sprawdzenie czy user jest administratorem
// return true : false
}
function isModerator($id = null){
// sprawdzenie czy user jest moderatorem czegośtam o wskazanym ID
// return true : false
}
// pozostały kod
}
?>
KONTROLER
<?
class index extends controller{
function index(){
$this->load->class('User');
$this->view->display('index',array('user'=>User
::init()));
}
}
?>
<html>
<body>
<!-- jakaś treść strony -->
<? php
<? if( $user->isAdministrator() ) { echo '<a href="www.system.pl/destroy.php">Link</a>' ; } ?>
</body>
</html>
Czekam na słowa krytyki...