Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: różna ilość kolumn (widok), mvc
Forum PHP.pl > Forum > PHP
nmts
Najpierw opiszę to co mam aktualnie. Na bazie Kohany.

W domyślnym kontrolerze dziedziczącym po Controller_Template ustalam domyślną
ilość kolumn:
  1. public $columns = '3columns';


W before() ustalam kolejno odpowiedni widok dla danej liczby kolumn, i przekazuje liczbę kolumn
aby załadować plik stylu dla danej opcji.
  1. $this->template->main = View::factory($this->columns);
  2. $this->template->columns = $this->columns;


I teraz mogę ustalać sobie dla każdego kontrolera inna ilość, przykładowo:
  1. class Controller_About extends Controller_Index {
  2.  
  3. public $columns = '2columns';
  4.  
  5. public function action_index()
  6. {
  7. $this->template->main->content = View::factory('about');
  8. }
  9. }


Oprócz tego jak już wymieniłem są default2columns.css, default3columns.css, i default.css dla tego co jest wspólne, w głównym widoku odpalam <?php echo $main ?>,
który odpala widok 2columns.php(który w rzeczywistości jest jedną kolumną) lub 3columns.php(który w rzeczywistości ma dwie kolumny - trzecia, statyczna kolumna jest na tym samym poziomie co zmienna $main), które z kolei wyświetlają co tam jeszcze chcą.

Jednak w takim rozwiązaniu nie mogę ustalić różnej ilości kolumn dla różnych akcji.

Jakie proponujecie bardziej elastyczniejsze rozwiązanie bardziej lub mniej różniące się od powyższego?

Może po prostu coś takiego, efekt chyba taki sam, choć z palca pisane, trochę więcej kodu w poszczególnych akcjach, ale można bardziej szczegółowo definiować:
  1. class Controller_About extends Controller_Index {
  2.  
  3. public $columns;
  4.  
  5. public function action_index()
  6. {
  7. $this->columns = '2columns';
  8. $this->template->columns = $this->columns;
  9. $this->template->main = View::factory($this->columns);
  10. $this->template->main->content = View::factory('about');
  11. }
  12. }


A może jakoś fajniej można to zrobić?

Próbowałem rozszerzyć klasę View, aby można było zrobić coś w stylu:
  1. $this->template->main = View::factory('about')->set('tekst', 'blabla')->set_columns('2columns');


co dało by efekt taki jak we wcześniejszym listingu, ale nie mogłem sobie z tym poradzić - utworzenie nowej metody to nie problem, ale oprócz tego wypadałoby chyba rozszerzyć render() w taki sposób aby w określonym przypadku widok wrzucała do widoku 2columns/3columns, który z kolei zwracać zmiennej main, plus jakaś zmianna, może set_global do określenia odpowiedniego css. snitch.gif
Crozin
Mógłbyś sobie rozszerzyć kontroler o jakąś metodę typu: podaj nazwę widoku, podaj zmienne do niego (to co robi teraz View::factory()) + podaj nazwę szablonu (2columns etc). Kod takej metody ograniczyłby się do:
  1. protected function abc($view, array $data = array(), $style = null) {
  2. $style = $style ?: 'default';
  3. $this->template->templateStyle = $style;
  4. $this->template->main = View::factory($style);
  5. $this->template->content = View::factory($view, $data);
  6. }


btw: co to ma wspólnego z MVC?
Pilsener
Cytat
W before() ustalam kolejno odpowiedni widok dla danej liczby kolumn, i przekazuje liczbę kolumn
aby załadować plik stylu dla danej opcji
- jak dla mnie to skomplikowane i mało logiczne. Dlaczego po prostu nie stworzyć tak zwanego layoutu, który będzie składał się z innych widoków, te widoki także mogą się składać z innych widoków, styli, plików js etc.

A moim zdaniem najlepiej aplikację zbudować w oparciu o drzewo kategorii, gdzie każda gałąź może mieć podpięty swój szablon, plik css, moduł, dodatek, plik js czy też inną zawartość.
nmts
@Crozin:
W tytule umieściłem mvc, bo myślałem, że jest możliwe rozwiązanie typowe dla mvc..
Dodałem jeden argument, ale taka metoda chyba trochę ogranicza obsługę widoku.
  1. protected function load_view($var, $view, $data = array(), $style = null) {
  2. $this->template->templateStyle = $style;
  3. $this->template->main = View::factory($style);
  4. $this->template->main->{$var} = View::factory($view, $data);
  5. }


Rozszerzyłem View:
  1. public function set_columns($columns)
  2. {
  3. $this->columns = $columns;
  4. $this->set_global('columns', $columns);
  5. return $this;
  6. }
  7.  
  8. public function render($file = NULL)
  9. {
  10. if(!$this->columns){
  11. return parent::render();
  12. } else {
  13. $view = parent::render();
  14. return View::factory($this->columns)
  15. ->set('content', $view)
  16. ->render();
  17. }
  18. }


Przykład użycia:

  1. public function action_index()
  2. {
  3. $this->template->main = View::factory('news_read')
  4. ->set_columns('3columns');
  5.  
  6. }
  7.  
  8. public function action_read($news_id)
  9. {
  10. $news = ORM::factory('publication', $news_id)->limit(1)->order_by('id', 'desc')->find();
  11.  
  12. $this->template->main = View::factory('news_read')
  13. ->set('news', $news)
  14. ->set_columns('2columns');
  15.  
  16. // $this-> template->main->content->comments = $comments;
  17. }


To rozwiązanie mi się podoba, chyba działa prawidłowo, wada jest taka, że nie mówi nam to, że przypisze news_read do zmiennej content, co może być nie zrozumiałe.
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.