Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [CI] Utrata obiektu w momencie załączenia pliku., Include/require gubi obiekt, ale tylko jako metoda...
markonix
post 27.07.2012, 19:10:26
Post #1





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


W moim CI mam małą klasę template i się sprawdza ale chce podzielić szablon dodatkowo na moduły ponieważ mimo, że są różne templatki to np. nagłówek jest zawsze ten sam (albo się powtarza w wielu templatkach).

Przykładowy kod templatki:

  1. <?php include('application/views/elements/header.php'); ?>
  2. Jakiś HTML
  3. <?= $content; ?>
  4. <?php include('application/views/elements/footer.php'); ?>


Działa bez zarzutu.

Ale chciałbym to zrobić ładnie i zrobić metodę, która by sprawdzała czy element istnieje jednakże gdy wywołam taką metodę:
  1. $this->template->add_element('header');

w której dla uproszczenia problemu dodam tylko sam include to gubi obiekt tank_auth, który jest w $autoload['libraries'].
Obiekt ten przestaje działać także po wykonaniu funkcji poza includowanym plikiem.
Obiekt ten potrzebuje aby troszkę zmienić wygląd nagłówka w przypadku gdy user jest zalogowany.

Nie umiem pojąć dlaczego surowy include nie sprawia problemów, a już include w metodzie tak...
Nie wiem czy to w ogóle kwestia CI czy PHP.

Ten post edytował markonix 27.07.2012, 19:11:30


--------------------
Go to the top of the page
+Quote Post
thek
post 27.07.2012, 21:17:43
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




A ja bym się zastanawiał czy taki sposób w jaki chcesz to robić jest dobry. Może to już naleciałość z Kohaną związana, ale ja bym rozbijał te "moduły" inaczej. Nie wiem czy wiesz jak to wygląda w Kohanie bowiem. Jednym z popularniejszych sposobów jest utworzenie kontrolera szablonowego, który ma swój widok bazowy. Bazowy to goły html z kilkoma miejscami przewidzianymi do wypełnienia. Wszystkie zależne kontrolery dziedziczą po nim i tylko uzupełniają luki. Ty masz dość podobnie.
Weź więc sobie stwórz szablonowy widok, gdzie zamiast używać include będzie wypisanie zmiennej $header, $content i $footer. Zmienne te możesz mieć domyślnie w bootstrapie ustawione, ale w razie czego możesz wywołać sobie metodę zmieniającą tymczasowo określoną z nich.

Całość widoku to moim zdaniem powinien być jeden obiekt, przy czym właśnie własności tego obiektu i ich wzajemne zagnieżdżenie dały by Ci to czego chcesz. Czemu? Bo obiekt widoku miałby metodę __toString(), która ładnie by Ci z obiektu klasy tworzyła ciąg znakowy.... który mógłby być w nieskończoność zagnieżdżany. Co to daje? Ano pomyśl... Masz obiekt widoku, który renderujesz, czyli sprowadzasz do stringa. Jako że pierwszy jest jakiś bazowy to leci jego html i w pewnym momencie napotyka obiekt podwidoku... który też się do stringa konwertuje i dokleja gdzie trzeba wink.gif Jeśli czegoś braknie to oczywiście leci wyjątek, że podwidok taki i taki nie może być prawidłowo skonwertowany, bo jakaś tam zmienna jest pusta/nie istnieje/nie jest zainicjalizowana. Oczywiście na czym to polega? Klasa View czy jak ją nazwać ma w konstruktorze ścieżkę (lub jej część) do pliku html "z dziurami". My tylko te dziury uzupełniamy, ale śmiało jako dziurę możemy wstawić kolejny obiekt klasy View, który też ma jakieś tam swoje zmienne, jest czystym html lub jest na pałę stringiem. Summa sumarum i tak będzie to jedno wielkie konwertowanie obiektu z użyciem __toString() do ciągu znakowego wink.gif Masz więc wtedy, idąc ścieżką działań, coś w deseń:
  1. $base = new View('jakiś_path_do_bazowego');
  2. $base->header = new View('jakiś_nagłówkowy');
  3. $base->content = new View('strona_główna');
  4. $base->content->sidebar = new View('menu_boczne');
  5. $base->content->main = new View('zawartość_główna');
  6. $base->footer = '<div id="footer">A co? Nie wolno mi tak? Wolno.</div>';
  7. $base->render();

A jak mógłby wyglądać widok ukryty pod ścieżką "jakiś_path_do_bazowego" ?
  1. <?php echo $header; ?>
  2. </head>
  3. <?php echo $content; ?>
  4. <?php echo $footer; ?>
  5. </body>
  6. </html>

przy czym część z tych rzeczy możesz zrobić "z automatu" przy głównym pliku aplikacji i w razie czego "podmienić" w razie potrzeby w kontrolerach potomnych. Bo kto Ci zabroni choćby tak napisać widok header, by pliki css, js czy znaczniki meta nie mogły być dodawane dynamicznie z użyciem jakiejś klasy do wstrzykiwania tego tam?

Oczywiście to jest tylko pomysł jak zrobić sobie dość elastyczne rozwiązanie widoków i implementację już zostawiam Tobie, ale myślę, że to elastyczniejsze rozwiązanie niż walenie na pałę include do widoku, bo grzebać się potem z tym by w określonych wypadkach zamiast include domyślnego nagłówka dać coś innego.... masakra się robi. A tak masz jedną klasę dla które piszesz konwersję z obiektu do stringa i łapiesz wyjątki jeśli zmienne php zaszyte w podanym przez ścieżkę pliku nie są podczas konwersji ustawiane.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
markonix
post 28.07.2012, 15:04:29
Post #3





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


CI to mój pierwszy framework, ma tylko standardowe widoki, bez systemu templatek.


Jeżeli widok nie będzie plikiem HTMLem to taki bazowy szablon nie ma sensu, chyba, że bazowy to nie jedyny, co najwyżej domyślny.

Nie za bardzo rozumiem co miałby robić konstruktor VIEW.
Sprawdzać czy plik istnieje, potem include?
Nie wiem, dla mnie to bardziej skomplikowane, tym bardziej muszę myśleć o koderze.

W moim sposobie mam te kilka templatek - nie jest ich dużo.
Jeżeli chce nową templatkę z innym headerem to wystarczy kod:
  1. $this->template->add_element('other_header');

Nie wiem co w tym masakrycznego smile.gif
Oczywiście nie działa mi ten sposób zgodnie z tematem.

Czy mniej więcej Twoją konwencje wykorzystuje ta biblioteka:
http://williamsconcepts.com/ci/codeigniter...late/index.html
?


--------------------
Go to the top of the page
+Quote Post
thek
post 29.07.2012, 15:15:53
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Nie do końca to, ale można też wykorzystać by jakoś uelastycznić całość.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
mieszkos
post 9.08.2012, 00:03:07
Post #5





Grupa: Zarejestrowani
Postów: 78
Pomógł: 11
Dołączył: 1.04.2009

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


eh.. markonix, poczytaj dużoooooo o CI, chociażby samą dokumentacje... na co te include ?....
nie lepiej zrobić:

views - >
includes - >
header.php
footer.php
template.php

i w template php napisać : $this->load->view('includes/header'); $this->load->view($content); $this->load->view('includes/footer');

potem w kontolerze sobie ładujesz coś do content np. $data['content'] = 'kontakt'; $this->load->view('includes/template',$data);

Go to the top of the page
+Quote Post
markonix
post 9.08.2012, 08:15:30
Post #6





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


Cytat(mieszkos @ 9.08.2012, 01:03:07 ) *
eh.. markonix, poczytaj dużoooooo o CI, chociażby samą dokumentacje... na co te include ?....
nie lepiej zrobić:

views - >
includes - >
header.php
footer.php
template.php

i w template php napisać : $this->load->view('includes/header'); $this->load->view($content); $this->load->view('includes/footer');

potem w kontolerze sobie ładujesz coś do content np. $data['content'] = 'kontakt'; $this->load->view('includes/template',$data);

Temat już nieaktualny. Skorzystałem z load mniej więcej coś w deseń co podałeś.
W dokumentacji nie ma nic o wywoływaniu load w samym widoku więc po prostu na to nie wpadłem aby sprawdzić.

  1. public function add_element($name)
  2. {
  3. $this->CI->load->view('elements/' . $name);
  4. }


Ten post edytował markonix 9.08.2012, 08:18:34


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 17.06.2025 - 12:46