Layout - co i jak?

Witam.

Zaczynam właśnie naukę tego frameworka, staram się zrozumieć jego logikę i utknąłem na właśnie layout’ach.

Tworzę nowy model, kontroler z akcją oraz plik widoku i tu moje pytanie w jaki sposób mogę określić aby mój nowo zrobiony widok korzystał ze zdefiniowanego w protected/views/layout2.php (wyglądu 2 kolumn).

Wg tutoriala:

"Metoda actionContact generuje internaucie widok o nazwie contact. Wewnętrznie dzieje się to poprzez załączenie pliku widoku /wwwroot/blog/protected/views/site/contact.php i osadzeniu wyniku w pliku układu /wwwroot/blog/protected/views/layouts/main.php" - i gdzie tu jest wskazany pośredniczący layout1.php wg którego strona jest wyświetlana.

To jest akurat trochę zamieszane i zdaje się, że nie uwzględnione w tutorialu. Otóż, zauważ, że wszystkie kontrolery wygenerowane przez gii dziedziczą po klasie Controller zamiast Ccontroller. Jest tak dlatego, że Controller to klasa umieszczona w katalogu components Twojej aplikacji i tam są ustawiane domyślne zmienne i wartości wykorzystywane później w widokach, między innymi layouts. Osobiście zawsze wywalam te layouty, jakoś mi się nie podoba takie rozwiązanie. Zostawiam za to menu oraz breadcrumbs.

Czyli gdy w swoim kontrolerze zdefiniuje "public $layout=" na layout column2.php to po nim poleci.

Zauważyłem też że w układzie 2 kolumn lewa wyświetla zawartość $content z kontrolera a prawa po Widget’ach. Co w przypadku np.: 3 kolumn - lewą kolumnę mam i prawą a jak upchnąć zawartość innego kontrolera do środkowej?

mozesz tez po prostu w kodzie akcji napisac:


$this->layout = 'column2';

To co wyświetla się w różnych kolumnach jest zdefiniowane w konkretnym layoucie i widoku. Tam nic nie jest "automatycznie". Z założenia architektury MVC w danym momencie może działać tylko jeden kontroler, wiec nie za bardzo rozumiem jak chcesz wyświetlić w jednej z kolumn akcję z innego kontrolera. Jeżeli masz elementy które mogą się powtarzać między różnymi stronami to masz do dyspozycji CClipWidget, jeżeli masz jakieś bardziej rozbudowane elementy to zrób sobie własny widget i wyświetl sobie tam gdzie potrzebujesz.

Cenna uwaga, zapytałem bo przy zwykłym programowaniu php kiedy strona ma kilka kolumn to można powsadzać do nich zawartość innych plików poprzez zwykłe include().

Możesz też podejść do sprawy następująco:

  1. definiuj w swoim głównym kontrolerze (domyślnie Controller) zmienne $left, $right,$content;

  2. wypisz je (echo) w swoim pliku głównym layoutu w miejscach w których chcesz

  3. w akcji kontrolera to co zwrócisz w return trafi do $content

  4. możesz do zmiennych $left oraz $right przypisać zawartość następująco w każdej z akcji




$left = $this->renderParital('widok',array(/*zmienne*/,true);



Ostatni parametr w powyższym wywołaniu renderPartial ustawiony na true powoduje, że metoda zawartość zwróci zamiast ją wypisać.

Thx, sprawdzę a jakże :rolleyes:

Jestem początkujący w yii (jak widać po ilości postów :stuck_out_tongue: ) ale wydaje mi się ze najlepiej stworzyć nowa klasę kontrolera np. LoginControler z akcja login.

W kolumnie renderujesz formularz, który wysyła się do akcji login wyżej wymienionego kontrolera, a po poprawnym logowaniu przekierowanie na jakąś podstronę :slight_smile:

Co masz na myśli pisząc widoczny ? Jeżeli chcesz, żeby się wyświetlał na każdej podstronie to wpakuj formularz do pliku layout’u bezpośrednio albo lepiej nawet zrób sobie z niego widget. W formularzu ustaw parametr $action na kontroler/akcje która zajmuje się logowaniem i po sprawie. Widget logowania powinien zapisywać returnUrl tak, żeby po zalogowaniu bądź wylogowaniu przekierować użytkownika do kontrolera / akcji na której wypełnił formularz logowania lub się wylogował.