Page 1 of 1
Layout - co i jak?
#1
Posted 17 October 2011 - 03:11 AM
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.
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.
#2
Posted 17 October 2011 - 04:44 AM
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.
---------------------------------------------------------------------
"Never memorize what you can look up in books."
Albert Einstein
"Never memorize what you can look up in books."
Albert Einstein
#3
Posted 17 October 2011 - 05:33 AM
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?
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?
#4
Posted 17 October 2011 - 05:54 AM
mozesz tez po prostu w kodzie akcji napisac:
$this->layout = 'column2';
red
#5
Posted 17 October 2011 - 06:10 AM
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.
---------------------------------------------------------------------
"Never memorize what you can look up in books."
Albert Einstein
"Never memorize what you can look up in books."
Albert Einstein
#6
Posted 17 October 2011 - 06:28 AM
sidewinder, on 17 October 2011 - 06:10 AM, said:
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().
#7
Posted 18 October 2011 - 03:22 AM
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
Ostatni parametr w powyższym wywołaniu renderPartial ustawiony na true powoduje, że metoda zawartość zwróci zamiast ją wypisać.
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ć.
I'm not complete idiot... some parts are missing!
#9
Posted 29 December 2011 - 03:09 AM
Jestem początkujący w yii (jak widać po ilości postów :-P ) 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ę :-)
W kolumnie renderujesz formularz, który wysyła się do akcji login wyżej wymienionego kontrolera, a po poprawnym logowaniu przekierowanie na jakąś podstronę :-)

#10
Posted 29 December 2011 - 03:30 AM
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ł.
---------------------------------------------------------------------
"Never memorize what you can look up in books."
Albert Einstein
"Never memorize what you can look up in books."
Albert Einstein
Share this topic:
Page 1 of 1

Help













