1

(6 odpowiedzi, napisanych Ogólne)

ale znikal w jakim sensie ? chodzi Ci o to aby wiadomosc pojawila sie na np.10 sekund, a pozniej zniknela bez przeladowania strony, czy tez po przeladowaniu strony ?

2

(6 odpowiedzi, napisanych Model-Widok-Kontroler)

chyba troche jasniej juz to napisales smile
jezeli chodzi o pierwszy przypadek , czyli tabelaA_tabelaB hasMany tabelaA i tabelaB, to chyba najlepszym rozwiazaniem, zgodnym z dotkryna caka jest relacja hasAndBelongsToMany, czyli tworzysz modele mniej wiecej tak :

class tabela_A extends AppModel {
....
var $hasAndBelongsToMany = array('tabela_AB') 
}
-------------------------------------
class tabela_B extends AppModel {
}
-------------------------------------
class tabela_AB extends AppModel {
....
 var $belongsTo = array('tabela_A','tabela_B') 
}
-------------------------------------
class tabela_C extends AppModel {
}
-------------------------------------
class tabela_ABC extends AppModel {
....
var $hasMany = array('tabela_AB','tabela_C') 
}

-------------------------------------
jezeli odwolujac sie z tabeli A chcesz uzyskac wszystkie rekordy z tabeli AB ( a co za tym idzie takze z tabeli B to relacje HABTM umiesc w tabeli A, jezeli z tabeli B...to HABTM w tabeli B).

Natomiast jezeli chodzi o tabele ABC oraz C i ich relacje z tabela AB to chyba cake Ci na to nie pozwoli, poniewaz w tabeli AB (HABTM) mozna miec kolumny skladajace sie z 'id', 'tabela_A_id', 'tabela_B_id'...i nic wiecej.
Chociaz nie do konca smile
prosze przeczytaj ten artykul, moze rzuci inne swiatlo na Twoj problem :
http://debuggable.com/posts/modeling-re … accbdd56cb

powodzonka

3

(3 odpowiedzi, napisanych Uwierzytelnianie i autoryzacja)

jezeli wszystkie subdomeny korzystaja z jednej bazy, takiej samej, (nie koniecznie chodzi mi tutaj o sama baze, bo moze ich byc kilkadziesiat kopii, ale o struktura i dane przechowywane) to przed przekierowaniem sesji na inna subdomene, zapisz numer sesji PHP_SESSION_ID do bazy danych, oraz dane ktore chcesz przekazac na subdomene, a po stronie subdomeny spokojnie odczytasz zmienne i wartosci z bazy danych odczytamym po przeslanym wlasnie PHP_SESSION_ID

4

(6 odpowiedzi, napisanych Model-Widok-Kontroler)

witam
nie, nie sadze aby to stanowilo duzo problemow, ale podczas wyciagania niektorych wiadomosci np. z tabeli A (jezeli potrzebujesz tylko te rekordy), mozesz unbindowac
(funckja unbindModel - http://book.cakephp.org/view/86/Creatin … n-the-Fly,
albo behaviorem Containable - http://book.cakephp.org/view/474/Containable) pozostale tabele.
Szkoda ze nie napisales jakie sa relacjie pomiedzy A i B, pytam w sensie czy rekord z A ma wiele, czy tylko jeden odpowiednik z B, ale generalnie relacje moga byc takie :

model tabela_A
var $hasMany = array('tabela_B') / lub var $hasOne = array('tabela_B')

model tabela_B
var $hasMany = array('tabela_B') / lub var $hasOne = array('tabela_B')
var $belongsTo = array('tabela_A')

model tabela_C
var $belongsTo = array('tabela_B')

chcac dojsc z tabeli A do C przez zapytanie ustaw recursive => 2

w sumie zadna nowosci czego nie mozna znalesc tutaj : http://book.cakephp.org/view/78/Associa … s-Together
milej lektury smile
pozdrawiam

Kto przebrnal przez system logowania Acl cake, component otAuth oraz moze kilka innych i potrawi z powodzeniem zaimplementowac to we wlasnym zakresie ...szacun. ja nie smile. Dlatego przedstawiam dosc indywidualne rozwiazanie systemu logwania i uwierzytelniania.
Zacznijmy od bazy. Potrzebujemy 2 tabele w bazie danych

groups - przechowuje prawa poszczegolnych grup uzytkownikow. Ponizej struktura..

CREATE TABLE groups (
  id int(3) NOT NULL auto_increment,
  group_name varchar(50) character set latin1 default NULL,
  level int(5) default NULL,
  cake tinyint(1) NOT NULL default '0',
  debug tinyint(1) NOT NULL default '0',
  przekierujPoZalogowaniu varchar(250) character set latin1 NOT NULL default '/',
  modified datetime NOT NULL,
  created datetime NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

- group_name - przechowywujemy tutaj nazwy grup userow, np. Klient, Admin, Super Admin
- level - poziom jakie dana grupa posiada
- cake - pzyjmuje wartosci 0 lub 1...w dalszej czesci bedzie to dokladniej wyjasnione
- debug - jaki debug ma byc wlaczony dla danej grupy po zalogowaniu (przydatne jezeli logujemy sie jako Super Admin i chcemy miec debug = 2)
- przekierujPoZalogowaniu - miejsce gdzie przekierowujemy usera po zalogowaniu np. Admin => '/admin' , Klient => /users/myaccount

users - tabel w ktorej przechowywujemy dane dostepowe do systemu

CREATE TABLE users (
  id int(7) unsigned NOT NULL auto_increment,
  userName varchar(50) NOT NULL,
  passwd varchar(32) NOT NULL,
  name varchar(50) NOT NULL,
  email varchar(100) NOT NULL,
  lastVisit datetime default '0000-00-00 00:00:00',
  group_id int(10) unsigned NOT NULL default '0',
  active tinyint(1) unsigned NOT NULL default '0',
  created datetime NOT NULL default '0000-00-00 00:00:00',
  modified datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (id),
  UNIQUE KEY username (userName),
  UNIQUE KEY email (email,userName),
  KEY group_id (group_id)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

- userName - nazwa robocza usera np. juby
- email - nasz login
- lastVisit - mozemy wykorzystac do statystyk kiedy, kto sie zalogowal
- group_id - bardzo wazna czesc tabeli, tutaj podajemy group_id jaki posiadac bedzie dany user, np. jezeli w tabeli 'groups' pod id = 1 bedziemy przechowywac Super Admina to wpisujac tutaj 1 pokazujemy ze dany user ma byc Super Adminem
- active - mozemy wykorzystac w celu sprawdzenia czy dane konto jest aktywne lub nie (0 - nie, 1- tak)

nastepnie tworzymy modele z nstp relacjami
group.php

class Group extends AppModel
{
    var $name = 'Group';
    var $hasMany = 'User';
}

oraz user.php

class User extends AppModel {

    var $name = 'User';
    var $belongsTo = array(
            'Group' => array('className' => 'Group',
                                'foreignKey' => 'group_id'
            )
    );

Zalozmy ze w tablicy 'groups' bedziemy miec nstp. grupy userow

INSERT INTO `groups` (
`id`, `group_name`,  `cake`, `debug`, `przekierujPoZalogowaniu`, `modified`, `created`) VALUES
(1, 'Super Admin', 1, 2, '/admin/home', '0000-00-00 00:00:00', '0000-00-00 00:00:00'),
(2, 'Admin', 1, 0, '/admin/home', '0000-00-00 00:00:00', '0000-00-00 00:00:00'),
(3, 'Klient', 0, 0, '/', '0000-00-00 00:00:00', '0000-00-00 00:00:00');

jezeli mamy juz utworzone modele oraz tabele czas na app_controller.php. Oto kilka rzeczy, ktore musimy w nim wykonac.

//app_controller.php

// miejsce formularza z logowaniem, bedzie nam potrzebny controller 'users_controller.php'
var $loginForm = "/users/login";

function beforeFilter()
    {
        // w funkcji tej sprawdzamy czy przypadkiem w adresie nie ma Routing.admin....jezeli jest wywolujemy funckje restrictAccess(1)
        if (isset($this->params[Configure::read('Routing.admin')])) {
            $this->restrictAccess(1);
        } 
    }


function beforeRender()
    {
        //jeeli ktos probuje sie dostac do stefy admin, zmien layout o takiej samej nazwie jak Routing.admin (core.php)
        if (isset($this->params[Configure::read('Routing.admin')])) {
            $this->layout = Configure::read('Routing.admin');
        }
        if (($this->layout == 'ajax') || ($this->layout == 'xls')) {
            Configure::write('debug', 0);
        }
    }

function restrictAccess($cake = 0)
    {
        // sprawdzamy czy w sesji jest zmienna 'zalogowany' (zmienna tablicowa,swiadczy ze user jest zalogowany) i czy przekazany parametr
        // znajduje sie w zmiennej tablicowaj 'zalogowany'
        if (($this->Session->check("zalogowany")) && ($this->Session->read("zalogowany.Group.cake")>=$cake)) {            
            return true;
        } else {
            // jezeli nie jestesmy zalogowani to...
            // wyciagnij wszystkie grupy z tabeli 'groups'
            $groupsArray = $this->Group->find('all', array( 'fields' => 'Group.id', 'order' => 'id ASC', 'recursive' => 0));
 
            // tworzymy tabele pomocnicza
            $groups = array();
            foreach( $groupsArray as $thisGroups) {
                $groups[] =  $thisGroups['Group']['id'];
            }
            
            // wytnij kawalek tablicy , opis funkcji pobierzIdGrupy(), sprawdzDostepPoIdGrupy() ponizej....reszte przeanalizujcie sami :)
            $groups = array_slice( $groups, 0, ($this->pobierzIdGrupy()-1));
            $this->sprawdzDostepPoIdGrupy( $groups );
            $this->Session->write("adresProbyWejscia",str_replace('url=','',$_SERVER['QUERY_STRING']));
            $this->Session->setFlash("Proszę się zalogować");
            $this->redirect($this->loginForm);
        }
    }

// ta funkcja sprawdza nam czy dany user ma dostep do danej czesci witryny w zaleznosci od jego group_id, funkcja bedzie wykorzystywana
// wszedzie tam , gdzie chcemy zastrzec sobie dostep tylko dla danych userow z danej grupy...ponizej pokaze jak to zrobic...
function sprawdzDostepPoIdGrupy($groups = null)
    {
        if (!empty($groups)) {
            if (is_array($groups) && in_array($this->Session->read("zalogowany.Group.id"),$groups)) {
                return true;
            } elseif (!is_array($groups) && $this->Session->read("zalogowany.Group.id")==$groups) {    
                return true;        
            } else {
                $this->Session->write("adresProbyWejscia",str_replace('url=','',$_SERVER['QUERY_STRING']));
                $this->Session->setFlash("Nie masz dostępu do tej części witryny");
                $this->redirect($this->loginForm);
            }
        }
    }

// funkcja wyciaga z sesji group_id danego usera
function pobierzIdGrupy()
    {
        if ($this->Session->check("zalogowany")) {
            return $this->Session->read("zalogowany.Group.id");
        } else {
            return false;
        }
    }

to tyle jezeli chodzi o app_controllera, teraz czas na users_controller.php, a konkretnie funkcje 'login'

// users_controller.php
function login()
    {
        // po wypelnieniu formularza logowania
       if (empty($this->data)) 
           { // pokaz formularz logowania
           }
       else
           { // proba zalogowania
           $this->data['User']['passwd'] = md5($this->data['User']['passwd']);
           $this->User->recursive = 1;
           
           // sprawdzamy czy istnieje taki user oraz czy jego konto jest aktywne, czyli active = 1
           $user = $this->User->find("User.email='".$this->data['User']['email']."' AND passwd='".$this->data['User']['passwd']."' AND User.active = 1");
           if (!empty($user))
               {
               // jezeli istnieje taki user zaladuj do jego sesji jego dane
               $this->Session->write("zalogowany",$user); 
      
               // jezeli user probuje dostac sie do zastrzezonej czesci serwisu i nie ma pozwolenia...porzekieruj do strony logowania.
               // w innym przypadku kontynuuj
               if ($this->Session->read("adresProbyWejscia")<>'') 
                   {                
                   $strzezonaAkcja = (bool)(strpos($this->Session->read("adresProbyWejscia"), Configure::read('Routing.admin'), 0) === 0);
                   if ($strzezonaAkcja && $user['Group']['cake']=='0') 
                       {
                       $this->Session->setFlash("Przepraszamy ".$user['User']['userName'].", ale nie możesz dostać się do panelu administracyjnego.");       
                       $this->redirect($user['Group']['adresProbyWejscia']);
                       exit();
                       }
                   else
                       {
                            if($this->Session->read("adresProbyWejscia") == Configure::read('Routing.admin')) {
                                $this->redirect($user['Group']['przekierujPoZalogowaniu ']);
                            } else {
                                $this->redirect($this->Session->read("przekierujPoZalogowaniu "));
                            }
                       }
                   }
               else
                   {
                   $this->redirect($user['Group']['przekierujPoZalogowaniu ']);
                   }
               exit();
               }
           else
               {
               $this->Session->setFlash("Zły email (login) lub hasło.");   
               $this->redirect($this->loginForm);
               }
           }    
    }

i teraz cala magia : jezeli ktos bedzie chcial sie dostac do czesci serwisu zawierajacego 'Routing.admin'. np. funckji 'admin_add' kontrolera 'news', wowczas to logowanie sprawdzi czy dany user jest zalogowany oraz czy ma tam dostep.


Natomiast jezeli bedziemy chcieli ograniczyc dostep do jakiejs funckji np. 'add' kontrolera 'news' robimy to tak

function add() 
{
   // wywolaj funkcje z app_controllera z parametrami w postaci tablicy, gdzie chcemy aby do tej funkcji mieli tylko Super Admini oraz Admin,
   // Klienci nie beda posiadali dostepu
   $this->sprawdzDostepPoIdGrupy(array(1,2))
}

Aha, jeszcze jedna sprawa, formularz logowani (views/users/login.ctp)

<form action="/users/login/" method="post" id="loginForm">
    <?php echo $form->input('User.email');?>
    <?php echo $form->input('User.passwd');?>
    <?php echo $form->submit();?>
</form>

Mam nadzieje ze ten system przyda sie komus. Sadze ze jest dosc prosty w przeanalizowaniu. Napewno skuteczny..przynajmniej tak mi sie wydaje. Powodzenia w uzytkowaniu.

6

(4 odpowiedzi, napisanych Instalacja i konfiguracja)

umieszczanie jednego katalogu 'cake' z ktorego korzysta wiele realizacji (jak sam sie przekonalem na wlasnej skorze smile) nie jest interesujace i dosc powiedzialbym niebezpieczne. Dlaczego ?...wyobrazcie sobie ze korzystamy caly czas z wersji np. Cake 1.2.0.7125 RC1. Na tej bazie produkujemy strony, tworzymy kontrolery, widoki, korzystamy z funkcji find..itd...itd...Nagle updatujemy do wersji najnowszej np. Cake 1.2.1.8004 i co sie moze okazac ? (a sie tak czasami okazuje, nie zawsze jest to kompatybilne w dol)....ze pewne funkcjie dzialaja troszeczke inaczej, co zmienia dzialanie niektorych czesci serwisu. I, powiem przydko, dupa zbita smile
Lepiej pomimo wszystko, za kazdym razem tworzyc w tej samej lokalizacji, cala strukture paczki Caka, aby nie bylo pozniej poprawek dzialania serwisow stworzonych we wczesniejszych wersjach.
...to tylko moja opinia, oparta na praktyce smile..

7

(7 odpowiedzi, napisanych Ogólne)

jeszcze jedna rzecz przyszla mi na mysl aby to zoptymalizowac...skoro potrzebuejsz tego na kazdej podstronie, moze zmienna $licznik wrzucisz sobie  raz do sesji, pozniej za kazdym razem bedziesz sprawdzal sobie czy taka zmienna w sessji istnieje, jezeli tak nie musisz znowy odpytywac bazy danych za kazdym odswierzeniem, zmiana strony..czyli

// app_controller.php
function beforeRender() {
  // sprawdz czy 'licznik' jest juz w bazie
  if(!$this->Session->check('licznik')) {
    $licznik = $this->Content->_getLicznik(...zmienne jakie potrzebujesz..);
    $this->Session->write('licznik', $licznik);
  }
}

od tego momentu masz zmienna licznik w sessji. Aby odwolac sie do tej zmiennej w kontrolerze wystarczy

//dodowlny kontroler
$licznik = $this->Session->read('licznik');

a w widokach poprzez

  //dowolny widok, layout, element..
  echo $session->read('licznik');

tym sposobem oszczedzaj tyle zapytan do bazy danych ile razy odswierzysz strone lub zmienisz widok ;-)

8

(14 odpowiedzi, napisanych Model-Widok-Kontroler)

alez ja od samego poczatku uwazam iz jezeli robi sie wszystko we framewokru jakim jest cake , trzeba korzystac najwiecej jak to mozliwe z jego dobrodziejstw, trzymac sie zasady MVC, dobrze zaplanowac strukture, baze, kontrolery, widoki, modele, elementy..itd..itd.
Oczywiscie uzywajac takich metod (jak np. $this->query() ..z czego trzeba korzystac jak najmniej) mozna byloby w pewnym momencie dojsc do wniosku, paradoksalnie, iz caly serwis upchnac do jednego pliku, jakim jest np. bootstrap.php smile co nie jest cakefriendly smile
Osobiscie nie preferuje takich metod, ale jezeli na pewnym etapie realizacji serwisow, szczegolnie jezeli robi sie to po kims, lub jezeli serwis jest dosc duzy, a nie ma czasu na przebudowe, niestety trzeba uciec wlasnie do takich rozwiazan jak np. $this->query...
no..ale to debata na dlugie rozmowy na temat MVC oraz cakefriendly.
pozdrawiam serdecznie

9

(14 odpowiedzi, napisanych Model-Widok-Kontroler)

sposob z ClassRegistry::init...nie jest za bardzo optymalny moim zdaniem. Wywylujac ta funcje nie dosc ze dolaczasz dodatkowe 73 linijki kodu (tyle zajmuje init http://api.cakephp.org/view_source/clas … y/#line-98) to jeszcze w dodatku zasmiecasz pamiec niepotrzebnym obiektem.
Moim zdaniem najlepszym rozwiazaniem (jezeli nie chcesz dodawac modelu w zmiennej $uses) jest napisanie funkcji prywatnej (z przedrostkiem '_', aby nie mozna bylo jej wywolac z poziomu przegladarki) w modelu aktualnym np w pliku models/NazwaModelu.php stworzyc funkcje taka :

class NazwaModelu extends AppModel {
   
   ....
   ....
   ....
   function _getSlownik() {
     $data = $this->query('.....zapytanie do tabeli 'slowniki'');
     return $data;
  }
}

a w danym miejscu kontrollera wywolujesz ja w znany wszystkim sposob

//controller
$data = $this->NazwaModelu->_getSlowniki();

mam nadzieje ze sposob bedzie dla Twoich potrzeb optymalny

10

(7 odpowiedzi, napisanych Ogólne)

aby odwlolac sie do modelu Content w app_controlerze, na poczatku deklarujesz ze w app_controlerze bedziesz chcial korzystac z modfelu Content, a wiec piszesz

var $uses = array('Content',.....inne modele....)

a pozniej w funkcji beforeRender() tworzysz zapytanie do modelu Content. Najlepiej (trzymajac sie zasady MVC) zapytanie przerzucic do modelu Content
a wiec, robisz np tak

// app_controller.php
function beforeRender() {
  $this->set('licznik', $this->Content->_getLicznik(...zmienne jakie potrzebujesz..));
  // od tego momentu w layoucie bedziesz mial dostepna zmienna 'licznik'...
}
// models/content.php
function _getLicznik(..zmienne..) {

  // cialo funckji - wyciagniecie danych z tabeli contents
  $licznik = $this->find(....)
  return $licznik; 
}

mam nadzieje ze to Ci pomoze
pozdrawiam

11

(3 odpowiedzi, napisanych Ogólne)

rozwiazaniem przechowywania sesji przez php na serwerach home.pl (dobrze za napisales ze to home) jest utworzenie w miejscu gdzie prowadzi domena, katalogu 'tmp' nadajac mu prawa 777. Ta jakze wazna informacje mozna znalesc w dokumentacji
http://home.pl/dokumentacja...ale w ktorym miejscu..tego nie widza nawet najstarci indianie smile

12

(2 odpowiedzi, napisanych Ogólne)

nie wiem czy uzywasz tych plikow .po w caku czy gdzies indziej, ale sprobuj tak:

<?php
$dane = file('a.po');
for($i = 0; $i < count($dane); $i++) 
{ 
 echo $dane[$i].'<br />';
}
?>

13

(3 odpowiedzi, napisanych Ogólne)

jeszcze inny problem z krzakami w bazie danych moze wyniknac w momencie kiedy : np dzialasz na serwerze z zainstalowana wersja PHP4...oraz MySQL 5... W tym przypadku trzeba ustawic 'driver' (w database.php) na 'mysqli' , a nie jak jest domyslnie na 'mysql'

14

(7 odpowiedzi, napisanych Ogólne)

jezeli chcesz miec dostep od zmiennych na kazdej podstronie renederowanej przerzuc funkcje do app_controllera.php , do funkcji beforeRender(). Zmienna bedzie widoczna wszedie: w layocie jak i w widoku.

15

(1 odpowiedzi, napisanych Ogólne)

witam spolecznosc
mam pytanie : natknal sie ktos moze z Was nad problemem kontroli nad katalogiem 'webroot/files'?
z tego co mi wiadomo, nie jest to taki 'zwykly' katalog , lecz o ile dobrze pamietam mozna nad nim kontrolowac (np. przechowywac w podkatalogu pliki dostepne tylko po zalogowaniu). Pytam poniewaz kiedys mi sie o uszy obilo a nie moge tego znalesc w manualu do Cake 1.2 smile
dziekuje za odpowiedz smile

16

(6 odpowiedzi, napisanych Ogólne)

pierwsza rzecz jaka mi przyszla do glowy :
1. stworz sobie plik app_model.php w katalogu 'app'
2. w tym pliku zdefiniuj nowa funckje do validacji emaili (a konkretnie tworzac ja zmieniasz standardowa funckje do validacji emaili )

function email($data) {
  // $data - tablica np. z emailiami, moze to byc $this->data['NazwaModelu']['email'][0]...[1]...[2]
  // sa to pola tworzone dynamicznie z przeslanych danych z widoku
 
  $check = true;
  foreach($data as $key => $thisEmail) {
    // poszczegolne kroki
    // 1. dla kazdego $thisEmail sprawdz czy to jest prawidlowy email, np. wyrazeniem regularnym
    // 2. jezeli nie jest przypisz wartosc false
  }
  return $check;
}
funckja email zwroci Ci wartosc zmiennej $check true albo false.
Dzieki temu bedziesz wiedzial czy przeslane emaile sa prawidlowe

mam nadzieje ze pomoze to ;-)

17

(7 odpowiedzi, napisanych Instalacja i konfiguracja)

pozno , ale moze sie przydac.....
moza na nowym koncie masz taka sytuacje ze php to 4... a mysl 5...?
ostatnio spotklem sie z takim problemem, wyskakiwal ciagle ten sam blad, ten sam ktory opisujesz powyzej. A wszystko bylo napisane w opisie do database.php smile.
Rozwiazaniem okazalo sie zastosowanie w database.php wpisu :
'driver' => 'mysqli', (a nie jak jest domyslenie 'mysql').

18

(8 odpowiedzi, napisanych Ogólne)

szukalem, grzebalem , pytalem ...to jest nie mozliwe smile

19

(10 odpowiedzi, napisanych Ogólne)

Cachowanie dobra sprawa, ale co jezeli ktos chce zmienic dynamiczne, podkreslam : dynamiczne menu smile, a czas wygasniecia jest ustawiony jak wyzej, czyli np na 2 godziniy? chyba nikt nie bedzie tak dlugo czekal na to. Cachowanie sprawdza sie tylko jezeli mamy pewnosc ze dany widok, element , layout nie bedzie zmienial sie zbyt czesto, np raz na miesiac, raz na 6 miesiecy, kwesta sporna co oznacza dla kazdego "czestosc zmian".

Jezeli chodzi o to dynamiczne menu ja bym raz na poczatku beforeFilter() wyciagnal menu z bazy danych, zapisal sobie tablice z menu w sessji, albo w ciasteczkach i na kazdej podstronie , do elementu z menu na przyklad, przekazywal wczesniej przeczytane menu z sesji lub z ciasteczek. Z praktyki wiem ze to najlepszy chyba sosob na takie powtarzajace sie rozwiazania jezeli nie chcemy za bardzo uderzac w Cachowanie.

20

(8 odpowiedzi, napisanych Ogólne)

nie wiem czy dobrze zrozumialem: jezeli potrzebujesz w danym kontrolerze, danej akcji  rozne widoki, a ten sam layout to dlaczego nie skorzystasz z dobodziejstwa Cake smile ( mowa o cake1.2, zreszta 1.1 takze to umozliwial ) . jezeli chcesz dla danej akcji skoczystac z innego widoku w akcji 'zastepujesz' domyslny widok poprzez
$this->render( 'nazwa_widoku', 'nazwa_layoutu');
lub jezeli potrzebujesz innego layoutu:
$this->layout = 'nowa_nazwa_layoutu' ( w ktorym to definiujesz sobie rozne elementy )
mam nadzieje ze o to chodzilo.

21

(8 odpowiedzi, napisanych Ogólne)

w cake/libs/... znajdziesz jeszcze wiele innych ciekawych rzeczy..trzeba pogrzebac smile
natomiast wracajac do pytania na temat statycznych stron - darek_dobron oraz jego rozwiazanie jest najlepsze, mowa o pages_controller. Nawet szczegolnie duzo nie muisz grzebac w routes.php. Wystarczy ze plik ten bedzie wygladal tak :

Router::connect('/', array('controller' => 'pages', 'action' => 'home'));
Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));

w katalogu /app/views/pages/  bedziesz dodawal statyczne strony. ...a w pages_controller.php bedziesz mial standardowa funkcje 'display()' i juz wszystko powinno dzialac. Generalnie w tym momencie wszystkie strony z katalogu /app/views/pages/ , ktore utworzysz i tam rzucisz, beda widoczne po wpisaniu adresu
http://mydomain.pl/pages/statycznaStrona1
http://mydomain.pl/pages/statycznaStrona2
Natomiast jezeli bedziesz chcial w nich umiescic jakias mala , dynamiczna tresc , wowczas w pages_controller.php bedziesz musial stworzyc, stosownie do nazwy pliku strony statycznej, funkcje o tej samej nazwie, np . jezeli chcesz aby na podstronie http://www.mydomain.pl/pages/contact pojawialy sie np. 2 najswiezsze newsy, wowczas w pages_controller.php tworzysz funkcje contact() , w ktorej wyciagasz te 2 najswiezsze wiadomosci i przekazujesz do strony statycznej poprzez $this->set().

witam,
wiem ze troche pozno dolaczam sie do watku, ale dopiero co sie zarejestrowalem, ( znaczy przypomnialem sobie login i haslo do forum smile ).
Jezeli chodzi o sprawe z menu nie uzywalbym requestAction - zbednie obciaza pamiec, "podwojnie" nabija statystyki i generalnie nie powinno sie jej uzywac.
Inne rozwiazanie : nie wiem czemu nie mozesz normalnie wywolac funckji z AppControllera , skoro i tak "dowolnyController" dziedziczy z AppController.
Wiec rozwiazanie wygladalo by mniej wiecej tak :

class AppController extends Controller {

function beforeFilter() {
  // w tym miejscu wyciagasz menu w postaci tabeli ( $menuTab ) z bazy danych, albo definiujesz funkcje, ktrora bedzie zwracala tablice z menu
  //.....
  //....

  // przekazanie zmiennej do layoutu  
$this->set( 'menuTab', $menuTab );
 
}
}
?>

po przekazaniu zmiennej $menuTab ( tablicy z menu ) renderujesz element, z parametrem $menuTab, w ktorym to elemencie odpowiednio obrabiasz tablice z menu np.

$this->element( 'menu', $menuTab );

i teraz tam gdzie chcesz miec menu poprostu renderujesz ten element z parametrem, ktory przechowuje tablice menu.

Wiem ze poznno pisany e-mail, ale od teraz bedzie ich czesciej smile