Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zarządzanie 'includami'
Forum PHP.pl > Forum > PHP > Object-oriented programming
wlamywacz
Witam smile.gif

Natknąłem się w swojej aplikacji na problem jakim jest zarządzanie inludowanymi plikami .js jak i .css . Aplikacja jest tak zbudowana iż wywoływana jest funkcja view::headerSite() z odpowiednimi parametrami. Jednak pisanie przed każdym wywołaniem nagłówka takiego kodu jest trochę nieporęczne i może wprowadzić zamęt:
  1. <?php
  2. //W konstruktorze
  3. $this->include = array();
  4. //W funkcjach
  5. $this->include[] = '<link rel="Stylesheet" type="text/css" href="templates/index/wlasciwosci.css" />';
  6. $this->include[] = '<script type="text/javascript" src="galeria/js/mootools.v1.11.js"></script>';
  7. $this->include[] = '<script defer type="text/javascript" src="js/preloader.js"></script>';
  8. ?>


Jak wy to rozwiązujecie ?

Pozdrawiam i przepraszam kilka osób za jeden z moich poprzednich tematów. Jednak uwagi tych osób były konstruktywne i po głębszym zastanowieniu przyniosły pożądany efekt.
empathon
Czemu chcesz to pisać za każdym razem? Nie możesz pobrać przez Config (nie całe <link... tylko lokalizację i nazwę pliku)?
Potem wrzucasz automatycznie przy renderowaniu w layout (DOM, odpowiedni preg, wywołanie helpera...).

Swoją drogą
  1. <?php
  2. $this->include = array();
  3. ?>

jest pozbawione sensu, przecież możesz określić parametr tak:
  1. <?php
  2. class ... {
  3. ...
  4. private $include = array();
  5. ...
  6. }
  7. ?>

Co to za funkcje w kodzie? Gdzie? Pokaż cały kod.
wlamywacz
  1. <?php
  2. class site { 
  3.  
  4. private $include = array();
  5.  
  6. public function __construct() {
  7. }
  8.  
  9. public function setParam($name, $param) {
  10.  
  11. $this->$name = $param;
  12. }
  13.  
  14. public function defaultFunction() {
  15.  
  16. $this->page = $this->param2;
  17.  
  18. $this->include[] = '<link rel="Stylesheet" type="text/css" href="templates/index/wlasciwosci.css" />';
  19. $this->include[] = '<script type="text/javascript" src="galeria/js/mootools.v1.11.js"></script>';
  20. $this->include[] = '<script defer type="text/javascript" src="js/pngfix.js"></script>';
  21. $this->include[] = '<script defer type="text/javascript" src="js/rejestracja.js"></script>';
  22. $this->include[] = '<script defer type="text/javascript" src="js/kontakt.js"></script>';
  23. $this->include[] = '<script defer type="text/javascript" src="js/preloader.js"></script>';
  24.  
  25. view::naglowek_index(); //$this->include przed nagłówkiem !
  26.  
  27. $class = new view;
  28.  
  29. if(method_exists($class, $this->page)) {
  30. $page = $this->page;
  31. view::$page();
  32. } else {
  33. view::index();
  34. }
  35.  
  36. view::stopka_index();
  37.  
  38. }
  39.  
  40. }
  41. ?>


  1. <?php
  2. public function naglowek_index() {
  3. $naglowek = new Smarty();
  4. $naglowek->template_dir = FOLDER;
  5. $naglowek->compile_dir = FOLDER . 'compile/';
  6. $naglowek->cache_dir = FOLDER . 'cache/cache_inne/';
  7. $naglowek->caching = 0;
  8. $naglowek->error_reporting = E_ALL; 
  9. if(!isset($this->title)) {
  10. $this->title = 'Standardowy tytuł';
  11. }
  12. $naglowek->assign( 'title' , $this->title);
  13. $naglowek->assign( 'include' , $this->include);
  14. $naglowek->display('index/naglowek.tpl');
  15. }
  16. ?>


W klasie tej jest taki mały router który wywołuje od razu metody w klasie view gdyż są to dane statyczne które nie ulegają zmianie i tym samym nie potrzebują modeli. Nie modę podać samej nazwy gdyż czasem są to pliki typu .js a czasem .css
ShadowD
Możesz podzielić to na dwie części, $this->includeStyle i $this->includeJs. Tym sposobem dopisując jedną linię do class'y ułatwisz sobie pracę, a resztę napisz jak kolega wyżej napisał. Odpowiednie linki w klasie bierz, a tylko adres podawaj...
wlamywacz
Tak zrobię wykonam class parsującą pliki ini z danymi do includowania i natrafiłem na pierwszy problem
  1. [errorblog]
  2. exceptions[] = <link rel="Stylesheet" type="text/css" href="templates/index/wlasciwosci.css" />


Plik ini nie może mieć = w treść jak temu zaradzić ? :/
Crozin
Kod
[errorblog]
exceptions[] = "<link rel='Stylesheet' type='text/css' href='templates/index/wlasciwosci.css' />"
wlamywacz
Ok rozwiązałem to tak:
  1. <?php
  2. class incl {
  3.  
  4. private $ini_array;
  5.  
  6. public function getIncludeArray($param) {
  7.  
  8. $ini_array = parse_ini_file("include.ini", true);
  9.  
  10. for ($i = 0; $i < count($ini_array[$param]['include']); $i++) {
  11. if(substr($ini_array[$param]['include'][$i], -4) == '.css') {
  12. $ini_array[$param]['include'][$i] = '<link rel="Stylesheet" type="text/css" href="'.$ini_array[$param]['include'][$i].'" />';
  13. } else {
  14. $ini_array[$param]['include'][$i] = '<script type="text/javascript" src="'.$ini_array[$param]['include'][$i].'"></script>';
  15. }
  16. } 
  17. return $ini_array[$param]['include'];
  18. }
  19.  
  20. }
  21. ?>


include.ini
  1. [site]
  2. include[] = templates/index/wlasciwosci.css
  3. include[] = galeria/js/mootools.v1.11.js
  4. include[] = js/pngfix.js
  5. include[] = js/rejestracja.js
  6. include[] = js/kontakt.js
  7. include[] = js/preloader.js
  8.  
  9. [error_blog]
  10. include[] = templates/index/wlasciwosci.css

Wywołanie:
  1. <?php
  2. $this->include = incl::getIncludeArray('site');
  3. ?>
cbagov
Hm, powiem ci, ze jesli chcesz pomoc temu SOBIE w przyszlosci, to nie dawaj mu takiego spapranego kodu...

$ini_array[$param]['include'][$i]
- co to niby znaczy ? jak dobrze nazwiesz zmienne to komentarz mocno ograniczysz a zrozumienie i analize poprawisz.

dziwaczne odwolania przez petle.. daj spokoj
- nazwij zmienne konfiguracyjne z INI, potem dodatkowo dzieki temu przez zwykle $_CFG->get( grupa, klucz); mozesz w dowolnym miejscu w kodzie odwolywac sie do nich, a te twoje inklude_inklude_ini_inklude... pfff

Przyklad:

$_CFG->get( 'system', 'sql_on');
$_CFG->get( 'user', 'address');

itd.

Nie inkluduj tez tak dziwacznie plikow JS bo to kompletnie nie ma sensu, natomiast jest sens jak pliki JS albo CSS polaczysz dynamicznie w 1 i sciagniesz JEDEN a nie 5 zyskasz szybsze ladowanie strony.

W css np @import + 1 plik glowny a w JS mozna roznie, np. generujac z nich 1 plik na serwerze i zapisujac do cache.

I na koniec - zrob sobie prosty system szablonowania bo z tym php w html to daleko nie zajedziesz.
wlamywacz
Cytat
Nie inkluduj tez tak dziwacznie plikow JS bo to kompletnie nie ma sensu, natomiast jest sens jak pliki JS albo CSS polaczysz dynamicznie w 1 i sciagniesz JEDEN a nie 5 zyskasz szybsze ladowanie strony.


Zrozum że to nie są małe pliki i to Twoje rozwiązanie uważam za bezsensowne. Kolejne pytanie po co mam w to ingerować szablony ? :| Trzymajmy się MCV jednak bez przesady.
Sedziwoj
Cytat(wlamywacz @ 9.06.2008, 16:41:29 ) *
Trzymajmy się MCV jednak bez przesady.


Chyba MVC (lub czasem mylony z MVP, a dla PHP to już prawie synonimy).
A ja nie widzę abyś się trzymał tego wzorca, te <link> i <script> w konfiguracji jasno to pokazują.
Nie wiem czemu takie informacje chcesz mieć w config, a nie wstawisz sobie include w szablonie głównym (bo chyba taki masz?).
cbagov
Moze nie sa to male pliki z tego samego powodu, co jakosc pokazanego kodu, czyli nieporzadek.
Bezsensownych rozwiazan niestety nie stosuje.
A szablony SWOJE bo to banalne do napisania.

Wszystko razem powoduje, ze masz problem, ale skoro ja pisze bez sensu, to nie moj problem, pozdr.
wlamywacz
Cytat
Chyba MVC (lub czasem mylony z MVP, a dla PHP to już prawie synonimy).
A ja nie widzę abyś się trzymał tego wzorca, te <link> i <script> w konfiguracji jasno to pokazują.
Nie wiem czemu takie informacje chcesz mieć w config, a nie wstawisz sobie include w szablonie głównym (bo chyba taki masz?).


Bo jest taka opcja że jeden nagłówek jest wykorzystywany w wielu miejscach i nie chce aby w każdym jego wywołaniu includowało mi po 40 plików css i js które będą mieć ogromną wagę a tylko te które są potrzebne. A więc co doradzicie, rozumiem że config to nieodpowiednie miejsce dla jednak nie wiem jak to inaczej wykonać ? Po co szablony do tego ?
Cysiaczek
Pliki js i css powinny być przypisane do konkretnych widoków lub akcji (zależy jak masz szkielet zaprojektowany).
Działa to na prostej zasadzie:
Cytat
layout:
js: [plik, plik2]
css: [plik1, plik2]

templatka:
js: [plik, plik2]
css: [plik1, plik2]

inna_templatka:
js: [plik, plik2]
css: [plik1, plik2]


Zauważ, że wczytując inna_templatka w layout masz inne pliki niż templatka i layout
Proste.

Co do ilości plików - lepiej upoakować wszystko w jeden plik - dynamicznie podczas tworzenia cache. Zajmuje więcej miejsca, ale w dzisiejszych czasach to nawet nie jest zauważalne - byle było dobrze zarzadzane.
Pozdrawiam.
wlamywacz
No to miałem takie coś przed wywołaniem każdej akcji wyświetlenia nagłówka:
  1. <?php
  2. //W konstruktorze
  3. $this->include = array();
  4. //W funkcjach
  5. $this->include[] = '<link rel="Stylesheet" type="text/css" href="templates/index/wlasciwosci.css" />';
  6. $this->include[] = '<script type="text/javascript" src="galeria/js/mootools.v1.11.js"></script>';
  7. $this->include[] = '<script defer type="text/javascript" src="js/preloader.js"></script>';
  8. ?>

i pierw mówili że źle to więc jak mam to zrobić ?
itsme
poczytac jakies kursy o OOP i wrocic do nas z pytaniami :-) a nie robic chat z forum ...

zamykam
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.