Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: importowanie plikow
Forum PHP.pl > Forum > PHP > Object-oriented programming
marcio
WItam robie sobie taki wlasny __autoload tzn juz go mam mialem w tablicy wszystkie sciezki na sztywno i wszystko dziala jednak jak chce ladowac sciezko z konfiguracji nie dziala.

Config.php
  1. <?php
  2.  
  3. /*
  4. *******************************************
  5. |Sciezki do MVC libraries/plugins/components *
  6. *******************************************
  7. */
  8.  
  9. $configs['PathControllers'] = 'controllers/';
  10.  
  11. $configs['PathModels'] = 'models/';
  12.  
  13. $configs['PathViews'] = 'views/';
  14.  
  15. $configs['PathLibs'] = 'libraries/';
  16.  
  17. $configs['PathPlugins'] = 'plugins/';
  18.  
  19. $configs['PathModules'] = 'components/';
  20.  
  21. $configs['PathConfig'] = 'config/';
  22.  
  23.  
  24. /*
  25. ********************
  26. |Ustawienia ogolne *
  27. ********************
  28. */
  29.  
  30.  
  31. $configs['controller'] = 'Home'; //Default controller
  32.  
  33. $configs['action'] = 'Index'; //Defualt action
  34.  
  35. $configs['render'] = true; //Render = true bez echo
  36.  
  37. $configs['debug'] = 2;
  38.  
  39. /*
  40. ********************
  41. |Dane do bazy danych *
  42. ********************
  43. */
  44.  
  45. $configs['host'] = '***';
  46. $configs['login'] = '****';
  47. $configs['pwd'] = '****';
  48. $configs['db'] = '***';
  49.  
  50. return $configs;
  51. ?>

I klase import:
  1. <?php
  2. require_once('libraries/Loader.php');
  3. class Imports {
  4.  
  5.  
  6. /*
  7.   private $PathImports = array(
  8.  
  9.   $cfg -> PathControllers,
  10.   $cfg -> PathLibs,
  11.   $cfg -> PathModels,
  12.   $cfg -> PathModules.$cfg -> PathControllers,
  13.   $cfg -> PathModules.$cfg -> PathModels,
  14.   $cfg -> PathModules.$cfg -> PathViews,
  15.   $cfg -> PathPlugins.$cfg -> PathControllers,
  16.   $cfg -> PathPlugins.$cfg -> PathModels,
  17.   $cfg -> PathPlugins.$cfg -> PathViews,
  18.   $cfg -> PathConfig
  19.  
  20.  
  21.   );
  22.  
  23.   */
  24.  
  25.  
  26.  
  27.  
  28. public function __get($class) {
  29.  
  30.  
  31. foreach($this -> PathImports as $key => $imports) {
  32.  
  33. if(file_exists($imports.$class.'.php')) {
  34.  
  35. require_once($imports.$class.'.php');
  36.  
  37. }
  38.  
  39. else if(file_exists($imports.$class.'_Model.php')) {
  40.  
  41. require_once($imports.$class.'_Model.php');
  42.  
  43. }
  44.  
  45. }
  46.  
  47. if(class_exists($class) || class_exists($class.'_Model'))
  48.  
  49. $obj = new $class();
  50.  
  51.  
  52. return $obj;
  53.  
  54. }
  55.  
  56. }
  57.  
  58. ?>

Gdy w polu PathImports dam sciezki czyli controllers,models etc to dziala jednak nie wiem jak zrobic zeby ladowalo je odrazu do tej tablicy i dzialalo mam nadzieje ze wiecie o co mi chodzi.
jang
index.php
  1. $dir_root = str_replace( "\\", "/", realpath( dirname(__FILE__) ) );
  2.  
  3. define('DIR_ROOT', $dir_root.'/');
  4. define('DIR_CON', DIR_ROOT.'controllers/');
  5. define('DIR_MOD', DIR_ROOT.'models/');
  6. define('DIR_VIE' , DIR_ROOT.'views/');


w Twojej klasie
  1. $def = array(DIR_CON, DIR_MOD, DIR_VIE);
  2.  
  3. foreach($def as $key => $value)
  4. {
  5. echo $value . "<br />";
  6. if($value == DIR_CON)
  7. echo "dir_c = " . DIR_CON . "<br />";
  8. }

resztę zagadki musisz rozwiązać sam.
marcio
W sumie sposob nawet ciekawy moj config moglby wtedy wygladac tak:

  1.  
  2. /*
  3. *******************************************
  4. |Sciezki do MVC libraries/plugins/components               *
  5. *******************************************
  6. */
  7.  
  8. $configs['PathControllers'] = 'controllers/';
  9.  
  10. $configs['PathModels'] = 'models/';
  11.  
  12. $configs['PathViews'] = 'views/';
  13.  
  14. $configs['PathLibs'] = 'libraries/';
  15.  
  16. $configs['PathPlugins'] = 'plugins/';
  17.  
  18. $configs['PathModules'] = 'components/';
  19.  
  20. $configs['PathConfig'] = 'config/';
  21.  
  22.  
  23. /*
  24. ********************
  25. |Ustawienia ogolne         *
  26. ********************
  27. */
  28.  
  29.  
  30. $configs['controller'] = 'Home'; //Default controller
  31.  
  32. $configs['action'] = 'Index'; //Defualt action
  33.  
  34. $configs['render'] = true; //Render = true bez echo
  35.  
  36. $configs['debug'] = 2;
  37.  
  38. /*
  39. ********************
  40. |Dane do bazy danych    *
  41. ********************
  42. */
  43.  
  44. $configs['host'] = '***';
  45. $configs['login'] = '****';
  46. $configs['pwd'] = '****';
  47. $configs['db'] = '***';
  48.  
  49.  
  50.  
  51.  
  52.  
  53. /*
  54. ********************
  55. |Import plikow               *
  56. ********************
  57. */
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65. $dir_root = str_replace( "\\", "/", realpath( dirname(__FILE__) ) );
  66.  
  67. define('DIR_ROOT', $dir_root.'/');
  68. define('DIR_CTRL', DIR_ROOT.$configs['PathControllers']);
  69. define('DIR_MODELS', DIR_ROOT.$configs['PathModels']);
  70. define('DIR_VIEWS' , DIR_ROOT.$configs['PathViews']);
  71.  
  72. define('DIR_PLUGINS_MODELS' , DIR_ROOT.$configs['PathPlugins'].$configs['PathModels']);
  73.  
  74. define('DIR_PLUGINS_VIEWS' , DIR_ROOT.$configs['PathPlugins'].$configs['PathViews']);
  75.  
  76.  
  77.  
  78.  
  79.  
  80. return $configs;
  81.  
  82.  


Etc... i nawet fajne rozwiazanie dzis pokombinuje i dam znac thx.

jang
Cytat
W sumie sposob nawet ciekawy moj config moglby wtedy wygladac tak:

  1. /*
  2. *******************************************
  3. |Sciezki do MVC libraries/plugins/components               *
  4. *******************************************
  5. */
  6. $configs['PathControllers'] = 'controllers/';
  7. $configs['PathModels'] = 'models/';
  8. $configs['PathViews'] = 'views/';
  9. $configs['PathLibs'] = 'libraries/';
  10. $configs['PathPlugins'] = 'plugins/';
  11. $configs['PathModules'] = 'components/';
  12. $configs['PathConfig'] = 'config/';
no a to do czego ? im dłuższy plik tym lepszy ?
  1. $dir_root = str_replace( "\\", "/", realpath( dirname(__FILE__) ) );
  2.  
  3. define('DIR_ROOT', $dir_root.'/');
  4. define('DIR_CTRL', DIR_ROOT. controllers/);
  5. define('DIR_MODELS', DIR_ROOT. models/);
  6. define('DIR_VIEWS' , DIR_ROOT. views/);
  7. define('DIR_PLUGINS' , DIR_ROOT. plugins/);
  8.  
  9. define('DIR_PLUGINS_MODELS' , DIR_ROOT. DIR_PLUGINS. models/);
  10. // albo poprostu
  11. define('DIR_PLUGINS_MODELS' , DIR_ROOT. plugins/models/);

a tak poza tym nie wiem poco tworzysz takiego potworka, tych
  1. if($value == DIR_CTRL) to czytaj z katalogu controllers/
  2. if($value == DIR_MODELS to czytaj z katalogu models/

będziesz miał tyle ile katalogów a jak dołożysz nowy katalog musisz pamiętać o dodaniu kolejnego define i kolejnego if'a.

  1. class Loader
  2. {
  3. public function __construct($pełna_nazwa_klasy)
  4. {
  5. include ("Loader/classMap.php")
  6.  
  7. // jeśli w tablicy $classMap istnieje ścieżka do $pełna_nazwa_klasy
  8. // to zwróć tą ścieżkę
  9. // jeśli ścieżki nie ma to loadClass($pełna_nazwa_klasy);
  10. }
  11.  
  12. private function loadClass($pełna_nazwa_klasy)
  13. {
  14. // tutaj metoda z ZF do wczytywania klas
  15. //dopisz ścieżkę do tablicy $classMap
  16. //a następnie zwróć ścieżkę
  17. }
  18. }

a Twoja klasa Imports będzie miała tylko __get albo bez tej klasy zwykły __autoload który będzie korzystał z klasy Loader


  1. if(class_exists($class) || class_exists($class.'_Model'))
  2.  
  3. $obj = new $class();
  4.  
  5.  
  6. return $obj;


  1. if( ! class_exists($class) )
  2. {
  3. // skorzystaj z klasy Loader
  4. require_once("scieżka_do_pliku_klasy_z_class_Loader");
  5. return $obj = new $class();
  6. }
  7. elseif( class_exists($class) )
  8. {
  9. if(!is_object($class)) $obj = new $class();
  10. return $obj;
  11. }
marcio
Cytat
no a to do czego ? im dłuższy plik tym lepszy ?


Nie ze lepszy ale w tablicy wole miec sciezki a w stalych miec pelne sciezki do wszystkiego wtedy wystarczy zmienic tablice i sciezki sa ok i nie trzeba mieszac w stalych to raz a dwa to juz w reszcie aplikacji korzystam z takiego czegos:

  1.  
  2. $cfg = Loader::load('Cfg');
  3.  
  4. $def_cntrl = $cfg -> controller;
  5.  


Etc.. i jest mi tak wygodniej dawac tez sciezki tylko do importu plikow wole miec stale a na reszty config zmienne w tablicy ktore moge potem wykorzystac jako obiekt.



Rozwiazalem to tak:

config.php

  1.  
  2. <?php
  3.  
  4. /*
  5. ***********************************************
  6. |Sciezki do MVC libraries/plugins/components                       *
  7. ***********************************************
  8. */
  9.  
  10. $configs['PathControllers'] = 'controllers/';
  11.  
  12. $configs['PathModels'] = 'models/';
  13.  
  14. $configs['PathViews'] = 'views/';
  15.  
  16. $configs['PathLibs'] = 'libraries/';
  17.  
  18. $configs['PathPlugins'] = 'plugins/';
  19.  
  20. $configs['PathModules'] = 'components/';
  21.  
  22. $configs['PathConfig'] = 'config/';
  23.  
  24. //Inne ustawienia niepotrzebne do tego posta
  25.  
  26. /*
  27. ********************
  28. |Import plikow               *
  29. ********************
  30. */
  31.  
  32.  
  33. $dir_root = str_replace( "\\", "/", realpath( dirname(__FILE__) ) );
  34.  
  35. define('DIR_ROOT', $dir_root.'/');
  36. define('DIR_CTRL', DIR_ROOT.$configs['PathControllers']);
  37. define('DIR_MODELS', DIR_ROOT.$configs['PathModels']);
  38. define('DIR_VIEWS' , DIR_ROOT.$configs['PathViews']);
  39. define('DIR_PLUGINS_MODELS' , DIR_ROOT.$configs['PathPlugins'].$configs['PathModels']);
  40. define('DIR_PLUGINS_VIEWS' , DIR_ROOT.$configs['PathPlugins'].$configs['PathViews']);
  41. define('DIR_COMPONENTS_CTRL' , DIR_ROOT.$configs['PathModules'].$configs['PathControllers']);
  42. define('DIR_COMPONENTS_MODELS' , DIR_ROOT.$configs['PathModules'].$configs['PathModels']);
  43. define('DIR_COMPONENTS_VIEWS' , DIR_ROOT.$configs['PathModules'].$configs['PathViews']);
  44. define('DIR_LIBRARY' , DIR_ROOT.$configs['PathLibs']);
  45. define('DIR_CONFIG' , DIR_ROOT.$configs['PathConfig'])
  46.  
  47. $configs['path'] = array(
  48.  
  49. DIR_CTRL,
  50. DIR_MODELS,
  51. DIR_VIEWS,
  52. DIR_PLUGINS_MODELS,
  53. DIR_PLUGINS_VIEWS,
  54. DIR_COMPONENTS_CTRL,
  55. DIR_COMPONENTS_MODELS,
  56. DIR_COMPONENTS_VIEWS,
  57. DIR_LIBRARY,
  58. DIR_CONFIG
  59.  
  60. );
  61.  
  62.  
  63.  
  64.  
  65. return $configs;
  66. ?>
  67.  
  68.  


Import.php

  1.  
  2. <?php
  3.  
  4. require_once('libraries/Loader.php');
  5.  
  6. class Imports {
  7.  
  8.  
  9. private $cfg;
  10.  
  11.  
  12. public function __get($class) {
  13.  
  14.  
  15. $this -> cfg = Loader::load('Cfg');
  16.  
  17. foreach($this -> cfg -> path as $key => $imports) {
  18.  
  19. if(file_exists($imports.$class.'.php')) {
  20.  
  21. require_once($imports.$class.'.php');
  22.  
  23. }
  24.  
  25. else if(file_exists($imports.$class.'_Model.php')) {
  26.  
  27. require_once($imports.$class.'_Model.php');
  28.  
  29. }
  30.  
  31. }
  32.  
  33. if(class_exists($class) || class_exists($class.'_Model'))
  34.  
  35. $obj = new $class();
  36.  
  37.  
  38. return $obj;
  39.  
  40. }
  41.  
  42. }
  43.  
  44. ?>
  45.  
  46.  


jang
Mam takie pytanie, jak zwą się Twoje klasy ?

class Nazwa i class Nazwa_Model ?

Jeśli tak to co się stanie jeśli będziesz miał klasę class Abc i class Abc_Model bo jak na mój gust Abc_Model nigdy nie wczytasz.
marcio
A czemu ma nie wczytac jak dziala.




Dojdzie do katalogu DIR_COMPONENTS_MODELS albo DIR_PLUGINS_MODELS i wczyta zaleznie od tego czy plugin jest lub nie smile.gif

jang
Cytat(marcio @ 14.09.2009, 23:30:05 ) *
A czemu ma nie wczytac jak dziala.




Dojdzie do katalogu DIR_COMPONENTS_MODELS albo DIR_PLUGINS_MODELS i wczyta zaleznie od tego czy plugin jest lub nie smile.gif

Ano wczyta, tylko ile to wszystko będzie trwało ?
// edit
Działać działa ale pod warunkiem, że tworzysz obiekty tak
  1. $imp = new Imports();
  2.  
  3. $imp->Abc;
  4.  
  5. $imp->Abc_Model;

tak więc w pętli foreach warunek elseif jest absolutnie zbędny. to samo z "|| class_exists($class.'_Model') "

// koniec edit


1. wystarczy je nazwać class NazwaModel i już pozbywasz się elseif
2. w if po require_once można dać break; (aby nie mielić za każdym razem całego $configs['path'] )

zresztą utwórz sobie z 50 obiektów tym sposobem który pokazałeś a póżniej zrób to samo jak w pkt. 1 i 2 powyżej no i oczywiście zmierz sobie czasy.
marcio
Racja samo break sie przyda i przydalo sie faktycznie, jednak co do if'a to nazwy klas i plikow bardziej mi pasuja i dlatego tak jest.




Ogolnie juz wszystko hula zrobie prosty system news'ow i zobacze napewno jeszcze wiele sie zmieni.




P.S i thx jang

jang
Cytat(marcio @ 15.09.2009, 15:33:00 ) *
Racja samo break sie przyda i przydalo sie faktycznie, jednak co do if'a to nazwy klas i plikow bardziej mi pasuja i dlatego tak jest.


marcio zrozum, ja nie mam nic przeciwko nazwom Twoich klas ale tworząc obiekt tak $imp->Abc_Model; elseif w pętli foreach sprawdza czy istnieje plik Abc_Model_Model.php którego zapewne nie masz i miał nie będziesz ?
To samo class_exists sprawdza czy istnieje klasa Abc_Model_Model której raczej też nie znajdzie.
marcio
Calkowita racja cay czas myslalem ze mowisz o czyms innym wielkie dzieki ale do tej pory nie zwracalem uwagi na tego glupiego ifa wczesniej import inaczej wygladal i dlatego if pozostal wszystko dzialalo wiec nie zwrocilem uwagi na niego txh smile.gif
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.