Potrzebuję podzielić widok, na kilka klas. Dokładniej chcę mieć główny widok i klasy które rozszerzą jego możliwości.
Nie byłoby problemu, bo mógłbym nawet dziedziczyć tylko, że potrzebuję użyć np. 3-4 rozszerzeń naraz.
Przykłady rozszerzeń:
- Klasa obsługująca szablony (parsowanie etc.)
- Klasa parsująca bb-code
- Klasa tworząca formularze
Sam wymyśliłem coś takiego:
Klasa widok, ma metodę:
public function _load($name) { if ($this->$name) { return $this->$name; }else{ $temp = __CLASS__ .'_'. $name; include_once('modules/'.$temp.'.php'); return $this->$name = new $temp; }else{ return false; } } }
Problem polega na tym, że używanie tak wczytanego modułu jest niewygodne, bo muszę robić to np. tak:
$view->template->metoda();
Od razu tutaj zaznaczę, że mam magiczną metodę __get() dlatego odwołuję się poprzez $view->template.
Co w tym niewygodnego? Muszę wszystko zwracać returnami, bo inaczej nic w widoku nie zapiszę.
Dokładniej:
$view = view::create(); // Zwraca obiekt, wzorzec singleton $view->_load('template'); // działania na template np. $view->template->_loadFile('tpl/index.tpl'); // Powiedzmy podmieniamy co mamy podmienić w szablonie foreach ($podmiana as $key => $value) { $view->template->add($key, $value); } // zapis wyniku działania modułu template $view->save($view->template); // i to mi się nie podoba, dałem sobie
To co mi się nie podoba, działa akurat na zasadzie wywołania __toString, który uruchamia parser template.
Z template jest najmniejszy problem, gorzej z robieniem formów... Gdzie np. każdego inputa muszę zapisać do zmiennej i potem $view->save($zmiennaZinputem)
Jak za słabo objaśniłem to czekam na pytania.
