Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [CakePHP] Prosty Panel Administratora
Forum PHP.pl > Forum > PHP > Frameworki
Bureau
Siemanko.

Postanowiłem że zostanę przy cakephp, bo chyba najbardziej odpowiada mi styl pisania kodu, a może tylko mi się wydaje, bo na youtube jest dosyć dużo tutków do tego frameworka tongue.gif

Nie ważne. Opiszę swój problem. Jeśli komuś chce się to czytać to zachęcam, jeśli nie to nie zachęcam smile.gif

Tak więc... Chcę sobie napisać Panel admina. Panel miałby się opierać na katalogu osobnym "/admin".
Panel kumulowałby wszystkie zastrzeżone akcje typu dodaj, edytuj, usuń - oczywiście po zalogowaniu ;p

Co próbowałem ? A no próbowałem zrozumieć tego gościa:
http://www.youtube.com/watch?v=M40PgwLqS2M
Jednak opisuje on juz gotowy kod, gdzie nie ma nawet nic napisanego w akcji login (a może nie powinno ?) tongue.gif

Próbowałem także zrobić tak jak tutaj:
http://www.gigapromoters.com/blog/2007/12/...nel-in-cakephp/
No niestety nie działało.

To by było tyle z tego co czytałem. Ktoś kiedyś mi wspomniał o routingu. Czytałem, zmieniałem w core.php jakieś dane, ale nic z tego nie wyszło smile.gif

Jedyne co udało mi się zrobić to autoryzacje użytkownika, prostą autoryzacje gdzie kodem:
plik:index.ctp
  1. if ($login_u['role'] === 'admin') {
  2.  
  3. echo " ,jestes adminem mozesz edytowac i usuwac uzytkownikow";
  4.  
  5. }

sprawdzałem czy użytkownik jest adminem czy nie jest. Nie wydaje mi się, aby ten sposób był wygodny, a więc postanowiłem coś zrobić w kierunku osobnego PA.

Wiem też że dążąc do pożądanego przeze mnie efektu osobnego PA w każdym kontrolerze muszę napisać akcje z przedrostkiem admin_, np:
Kod
admin_dodaj

a link będzie wyglądał następująco:
Kod
/admin/artykuly/dodaj/


Tyle jednak, że brakuje mi mechanizmu, zrozumienia mechanizmu routingu, o ile w ogóle o to chodzi.
Napisałem to co w/w video w pliku appController to samo co autor tj:
  1. class AppController extends Controller {
  2.  
  3. public $components = array('Auth', 'Session');
  4.  
  5. public function beforeFilter()
  6. {
  7. $this->Auth->loginAction = array("admin" => false, 'controller' => 'users', 'action' => 'login');
  8. $this->Auth->loginRedirect = array('controller' => 'pages', 'action' => '/admin');
  9. $this->Auth->allow('display');
  10. }
  11.  
  12.  
  13. public function beforeRender() {
  14.  
  15. if(!array_key_exists('requested', $this->params)) {
  16. $user = $this->Session->read($this->Auth->sessionKey);
  17. $this->set(compact('user'));
  18. }
  19.  
  20. }
  21.  
  22.  
  23.  
  24. }

Cytat
Napisałem "user" ponieważ napisany mam kod pod edycje uzytkowników smile.gif i z tym wiązałem swój przykładowy skrypt, a w/w kontroler artykułów to tylko przykład smile.gif


Oczywiście w kontrolerze UsersController uzyłem akcji z przedrostkiem admin_.
  1. public function admin_add() {
  2. if ($this->request->is('post')) {
  3. $this->User->create();
  4. if ($this->User->save($this->request->data)) {
  5. $this->Session->setFlash(__('The user has been saved'));
  6. $this->redirect(array('action' => 'index'));
  7. } else {
  8. $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
  9. }
  10. }
  11. }


Niestety po wpisaniu w adres:
Kod
/admin/users/add/

Nie otrzymałem nic. To znaczy otrzymałem błąd oczywiście, ale nie pożądany przeze mnie efekt ; (
Wiem, że coś mi się pomieszać już mogło, coś źle robię JA.

Ktoś może naprowadzić mnie na dobrą drogę, bo boje się, że się zgubię i zniechęcę do dalszej wędrówki biggrin.gif\

Z góry chciałbym podziękować za próby pomocy smile.gif
Pozdrawiam.
kleus
najprosciej bedzie tak:

w pliku core.php
  1. Configure::write('Routing.prefixes', array('admin'));


w AppController
  1. public $components = array(
  2. 'Auth'
  3. 'Session',
  4. );
  5. public $helpers = array('Html', 'Form', 'Session');
  6.  
  7. public function beforeFilter(){
  8. $this->Auth->allow('display'); // akcje dostepne bez logowania
  9. }
  10. public function beforeRender(){
  11. // zabezpieczenie panelu admin... nikt kto nie nalezy do grupy admin nie zobaczy panelu
  12. if(isset($this->params['prefix']) && $this->params['prefix'] === 'admin'){
  13. if($this->Auth->User('group') === 'admin'){
  14. $this->layout = 'admin';
  15. }else{
  16. $this->layout = 'admin_login';
  17. }
  18. }
  19. }


w pliku routes.php
  1. Router::Connect('/admin/:controller/:action', array('controller' => 'pages', 'action' => 'display', 'prefix' => 'admin', 'admin' => true));


przykladowa tabela users
  1. CREATE TABLE IF NOT EXISTS `users` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `username` varchar(40) NOT NULL,
  4. `password` varchar(255) NOT NULL,
  5. `group` enum('admin','regular') NOT NULL DEFAULT 'regular',
  6. `status` enum('active','notactive','suspended','deactivated') NOT NULL DEFAULT 'notactive',
  7. PRIMARY KEY (`id`),
  8. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Bureau
Niby działa, ale nie dziala w stosunku do rangi grupy sad.gif

Wszystko działa po zalogowaniu, prefix admina jest też, ale zwykly user moze zmieniac dane...

Coś nie tak w beforeRender ?

Niby działa, ale nie dziala w stosunku do rangi grupy sad.gif

Wszystko działa po zalogowaniu, prefix admina jest też, ale zwykly user moze zmieniac dane...

Coś nie tak w beforeRender ?
kleus
w dokumentacji juz dalej jest wszystko ladnie wytlumaczone
http://book.cakephp.org/2.0/en/tutorials-a...ample/auth.html

Jak bedziesz dalej miec problemy to pisz
Bureau
No niestety przeglądałem to wiele razy i tam jest opisane jak logować i sprawdzać użytkownika, nic więcej. Zintegrowałem to z tym co mi napisałeś i działa jakoś, choć nie zastanawiałem sie nad zrozumieniem tego mechanizmu jeszcze.

Jedyny problem to taki ze nie czyta grupy uzytkownika, a przecież powinno ?
Dziwne. Myślałem że FW ułatwia programowanie, ale w tym przypadku muszę stwierdzić że nie jest to 'ułatwienie' ;/

Logowanie itp łatwo zrobić, ale nie łatwo mi zrobić panel osobny.
Zwykle w PHP jak robiłem jakiegoś koślawego CMSa to Panel miał osobny katalog o nazwie przykładowo "Admin" i zawierał sesje, był jeden użytkownik i dziękuje.

Tutaj najwidoczniej bede musiał panel admina połaczyć ze stroną, bo inaczej tego nie da się zrobić bez utraty chęci.
W każdym kontrolerze musiałbym pisać te same metody tj: admin_login, admin _wyloguj i to byłoby troche zagmatfane, nie sądzisz?

Nie da się zrobić tak, żebym miał fizycznie stworzony katalog ADMIN a w nim jeden kontroler obsługujący wszystkie dane lub coś na ten styl ? Może chociaż jeden folder ADMIN gdzie zawarłbym kolejno osobny kontroller do każdej podstrony.

Znów mnie chwyta niechęć jak chce coś zrobić a nie wiem dokładnie jak i mało osób może mi pomóc, bo nie znalazłem jeszcze tutoriala opisującego jak to zrobić.
Damn it!

edit: pomijajac fakt iz nie czyta grup uzytkownika, to przy edycji tez nie czyta parametrow przesylanych w get - dokladniej nie wie ktory id uzytkownika jest edytowany i jest pusty formularz...
jak to wykonac aby do adresu parametru dodawalo takze admin/ ?
kleus
AppController
  1. public $components = array(
  2. 'Auth' => array(
  3. 'authorize' => array('Controller'),
  4. ),
  5. 'Session'
  6. );
  7. public $helpers = array(
  8. 'Session', 'Form', 'Html', 'Rss', 'Text'
  9. );
  10. public function beforeFilter(){
  11. $this->Auth->allow('*');
  12. if(isset($this->params['prefix']) && $this->params['prefix'] == 'admin' && $this->Auth->user('group') != 'admin'){
  13. $this->Auth->deny('*');
  14. }
  15. }
  16. public function isAuthorized(){
  17. if(isset($this->params['prefix']) && $this->params['prefix'] == 'admin' && $this->Auth->user('group') != 'admin'){
  18. return false;
  19. }
  20. return true;
  21. }


Sprawdziłem u siebie i działa
Bureau
No, działa! smile.gif Jesteś moim mistrzem smile.gif

Tylko czy w tym przypadku:

1. Pisząc w jednym kontrolerze UsersController.php metony z prefixem admin_, muszę w innym pisać to samo?
2. Dlaczego nie czyta mi parametru GET ? Gdy edytuje użytkownika bez ADMIN w adresie to wsio działa, a jak edytuje go pod adresem /admin/users/edit/1 to już nie ściąga getem numeru ID uzytkownika i pola sa puste. Co w tym celu musiałbym dodać do kodu ?
3. Czy naprawdę jest sens według Ciebie do stosowania tego co chce uzyskać ? Nie łatwiej, tym samym efektem robić panel admina jako stronę główną projektu z tym że jeśli ktoś nie ma rangi ADMIN to nie zobaczy linków do edycji oraz będzie bezpośredni link do edycji zastrzeżony ? Pisałem o tym wyżej.
kleus
AD 1. Nie rozumie o co pytasz? Jeżeli pytasz o to czy metody admina musza się zaczynać od admin_ to tak muszisz metody admina definiowac jako admin_costam w kazdym controller.
AD 2. nie widzac kodu nie moge ci powiedziec co jest nie tak...
AD 3. Tego to juz kompletnie nie rozumie...
Bureau
Co do 1 pytania to pytałem własnie o pisanie metod z przedrostkiem admin. Trochę zamuliłem bo gdybym nie robił routingu to i tak te metody add, edit, delete byłyby więc nie robi to różnicy smile.gif
Mniejsza o to.

2 pytanie tez można olać bo już mi czyta, troche poprawiłem kod smile.gif

Co do 3 pytanka to miałem na myśl;i porównanie dwóch sposobów przedstawienia Panelu admina.

Ten co teraz tworzę jest z routingiem itd, a ten który przedstawiaja w tutorialach na yt po prostu blokuje użytkownikowi możliwość wyświetlania elementów typu dodaj, edytuj, usun.
Chodzi mi o to iż jak zaloguje się jako admin to na stronie głównej mam link przy newsie "edytuj" -> klikam na niego i przechodzi mi do strony edycji tego newsa. Zwykły użytkownik nie miałby dostępu do sekcji edytowania i nie miałby pokazanego linku "edytuj" przy newsie.

Chciałem po prostu zapytac Ciebie, którą metode Ty byś wybrał ? Panelu zintegrowanego ze stroną, którą widzi zwykły użytkownik,a Ty gdy zalogujesz się jako admin pokazują się dodatkowe opcje czy może całkowicie osobny panel admina tak jak ja to chciałem zrobić ?
kleus
Zalezy jaki duzy projekt...
masz tylko bloga to panelu admina mozna nie robic tylko przypisac prawa do grup i ukrywac pokazywac opcje w widokach.
masz projekt na powiedzmy 200 controllers: ACL i panel dla admina smile.gif
Bureau
Myślę, że jeszcze dojdę do wprawy w tym frameworku, dopiero zaczynam. Nie napisałem jeszcze projektu konkretnego, a jedynie testowe aplikacje smile.gif
ACL brzmi strasznie, ale tylko teraz smile.gif

Dzięki wielkie za pomoc przyjacielu smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.