Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Rozszerzenie klasy, Czyli co i jak...
Fifi209
post
Post #1





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Witam!

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ę:
  1. public function _load($name) {
  2. if ($this->$name) {
  3. return $this->$name;
  4. }else{
  5. $temp = __CLASS__ .'_'. $name;
  6. if (file_exists('modules/'.$temp.'.php')) {
  7. include_once('modules/'.$temp.'.php');
  8. return $this->$name = new $temp;
  9. }else{
  10. return false;
  11. }
  12. }
  13. }


Problem polega na tym, że używanie tak wczytanego modułu jest niewygodne, bo muszę robić to np. tak:
  1. $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:

  1.  
  2. $view = view::create(); // Zwraca obiekt, wzorzec singleton
  3. $view->_load('template');
  4.  
  5. // działania na template np.
  6. $view->template->_loadFile('tpl/index.tpl');
  7.  
  8. // Powiedzmy podmieniamy co mamy podmienić w szablonie
  9. $podmiana = array('title' => 'test', 'content' => 'testy');
  10.  
  11. foreach ($podmiana as $key => $value) {
  12. $view->template->add($key, $value);
  13. }
  14.  
  15. // zapis wyniku działania modułu template
  16. $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. (IMG:style_emoticons/default/haha.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Fifi209
post
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Chyba lepiej pokaże moje rozwiązanie na kolanie pisane:

Klasa view (główna) do niej "ładuję" moduły
  1. <?php
  2.  
  3. class view {
  4.  
  5. protected $content;
  6. private $modules;
  7.  
  8. private function __construct() {}
  9.  
  10. public function __toString() {
  11. if ($this->content) {
  12. return $this->content;
  13. }else{
  14. return 'It\'s empty!';
  15. }
  16. }
  17.  
  18. public function __get($name) {
  19. if ($this->modules[$name]) {
  20. return $this->modules[$name];
  21. }else{
  22. return false;
  23. }
  24. }
  25.  
  26. static public function create() {
  27. static $handle;
  28. if (!isset($handle)) {
  29. $handle = new view();
  30. }
  31. return $handle;
  32. }
  33.  
  34. public function _load($name) {
  35. if ($this->$name) {
  36. return $this->$name;
  37. }else{
  38. $temp = __CLASS__ .'_'. $name;
  39. if (file_exists('modules/'.$temp.'.php')) {
  40. include_once('modules/'.$temp.'.php');
  41. return $this->$name = new $temp;
  42. }else{
  43. return false;
  44. }
  45. }
  46. }
  47.  
  48. public function save($text) {
  49. return $this->content .= $text;
  50. }
  51.  
  52. public function view() {
  53. if ($this->content) {
  54. return $this->content;
  55. }else{
  56. return false;
  57. }
  58. }
  59.  
  60. }
  61.  
  62. ?>


Przykładowy moduł:
  1. <?php
  2.  
  3. class view_template {
  4.  
  5. private $vars;
  6. private $values;
  7. private $content;
  8.  
  9. public function __toString() {
  10. return $this->parse();
  11. }
  12.  
  13. public function add($var, $value) {
  14. $this->vars[] = $var;
  15. $this->values[] = $value;
  16. return true;
  17. }
  18.  
  19. public function _load($text) {
  20. $this->content = $text;
  21. }
  22.  
  23. public function parse() {
  24. if ((is_array($this->vars)) && (is_array($this->values))) {
  25. return str_replace($this->vars, $this->values, $this->content);
  26. }else{
  27. return 'Error';
  28. }
  29. }
  30.  
  31. }
  32.  
  33. ?>


Mam nadzieję, że to mniej więcej rozjaśni mój problem. ;d
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 01:52