Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: XML + PHP
Forum PHP.pl > Forum > XML, AJAX > XML
anas
Witam wszystkich.

Jako, że zbliżają się święta i wszyscy ludzie otwierają swoje serduszka na pomoc innym potrzebującym licze że dzięki temu tematowi uzyskam od was pomocną dłoń w...:

chodzi mi o budowanie i analizowanie plików konfiguracyjnych w XML'u dla pisanych aplikacji w php. Chciałbym się dowiedzieć(jeśli to wogóle możliwe) jak to u was wygląda i z jakich narzędzi korzystacie. Czy do analizowania plików php stosujecie konkretne rozwiązania, czy może piszecie własne. Fajnie jak ktoś mógłby pokazać to na przykładach.

Skąd takie pytania - potrzebuję stworzyć dość złożony plik konfiguracyjny dla pewnej aplikacji opartej o wzorzec MVC.

Dzięki za każdą pomoc, pozdrawiam.

anas
bela
  1. <?php
  2. /**
  3.  * Klasa ConfigParser
  4.  * Klasa przetwarzająca XMLowy plik konfiguracyjny
  5.  * @author Piotr 'bela_666' Belina
  6.  * @version 0.1
  7.  */
  8. class ConfigParser {
  9.  
  10. /**
  11. */
  12. private $config;
  13.  
  14. /**
  15. * Instancja
  16. * @access private
  17. */
  18. static private $instance = null;
  19.  
  20. /**
  21. * Singleton
  22. * @return object
  23. */
  24. static public function getInstance() {
  25. if(self::$instance == null) {
  26. self::$instance = new ConfigParser;
  27. }
  28. return self::$instance;
  29. }
  30.  
  31. /**
  32. * Konstruktor
  33. */
  34. private function __construct() {}
  35.  
  36. /**
  37. * Ładuje plik konfiguracyjny
  38. * @return object SimpleXML
  39. */
  40. public function loadConfig() {
  41. if(filemtime(&#092;"config.xml\") == filemtime(\"config.php\")) {
  42. $file = file_get_contents(&#092;"config.php\");
  43. $this->config = unserialize($file);
  44. return $this->config;
  45. } else {
  46. $this->config = simplexml_load_file(&#092;"config.xml\");
  47. file_put_contents(&#092;"config.php\", serialize($this->config));
  48. return $this->config;
  49. }
  50. }
  51.  
  52. public function getViews() {
  53. $view = array();
  54. foreach($this->config->actions->view as $name) {
  55. $view[] = $name['name'];
  56. return $view;
  57. }
  58. }
  59.  
  60. public function getActions($category) {
  61. if($this->config->actions->view['name'] == $category) {
  62. foreach($this->config->actions->view->action->name as $actionName) {
  63. $actions[] = $actionName;
  64. return $actions;
  65. }
  66. }
  67. }
  68.  
  69. public function getAuthorizationDriverName() {
  70. foreach ($this->config->main as $main) {
  71. return $main->auth;
  72. }
  73. }
  74. }
  75. ?>


moj parser tongue.gif
hawk
Czyli generalnie: DOM, SAX, SimpleXML. PHP5. Po to są wbudowane, żeby nie pisać samemu.

@bela_666: Parserek bardzo ładny. Prosto, obiektowo, xmlowo.

Tylko czemu w getViews masz return w pętli? Powinien być po foreach. I proponowałbym dla takiej funkcji jak getViews mały cache - zmienna $view jako static w funkcji i foreach odpalamy tylko za pierwszym razem.
anas
Hej ponownie.

@bella_666 - wyglada to calkiem zgrabnie wielkie dzieki za podpowiedz.
Ps. Moglbys kawalek pliku konfiguracyjnego dla przykladu pokazac?
Pss. Jedyne co mnie boli to PHP5 - bo aplikacja bedzie chodzila na serwerku na ktorym aktualnie nie mam PHP5 a nie moge tego robic lokalnie z wielu powodow.

@hawk - rzeczywiscie wiem o tym - ale bardziej interesowala mnie opinia czego wlasnie konkretnie uzyc - co jest wydajniejsze i jak to zorganizowac. (jak konstruowac takie pliki i jak je najlpiej analizowac). Tak czy siak dzieki za pomoc.

pozdrowka

anas
bela
spoko, leci xml smile.gif
  1. <?xml version="1.0" encoding="iso-8859-2" ?>
  2. <odin>
  3.      <main>
  4.            <auth>DBAuth</auth>
  5.      </main>
  6.      
  7.      <actions>
  8.            <view name="news">
  9.                  <action>
  10.                        <name>show</name>
  11.                  </action>
  12.                  <action>
  13.                        <name>dodaj</name>
  14.                        <roles>dodaj_newsa</roles>
  15.                  </action>
  16.                  <action>
  17.                        <name>usun</name>
  18.                        <roles>usun_newsa</roles>
  19.                  </action>
  20.                  <action>
  21.                        <name>zmien</name>
  22.                        <roles>zmien_newsa</roles>
  23.                  </action>                  
  24.            </view>
  25.            <view name="default">
  26.              <action>
  27.                  <name>main</name>
  28.              </action>
  29.         </view>
  30.      </actions>
  31. </odin>


musze jeszcze dorobic wybieranie ról

@hawk wczoraj na ircu sie meczylismy sie czemu nie dziala taki kod ( problem dalej nie rozwiazany dry.gif ) to jest dalsza czesc tej klasy

  1. <?php
  2. public function getDefaultAction() {
  3. foreach($this->config->actions->view['default']->action as $action) {
  4. return $action->name;
  5. }
  6. }?>

blad to
Fatal error: Objects used as arrays in post/pre increment/decrement must return values by reference in c:\gry\miniserver\uniserver3_1\diskw\www\odin\ConfigParser.php on line 76

to ta linia gdzie jest foreach

a z tym returnem to musialem przeoczyc, dzieki smile.gif

edited

problem rozwiązany ale wyszedl potworek ;]

  1. <?php
  2. public function getDefaultAction() {
  3. static $defaultActionName = null;
  4. if(empty($defaultActionName)) {
  5. foreach($this->config->actions->view as $view) {
  6. if($view['name'] == 'default') {
  7. foreach ($view->action as $action) {
  8. $defaultActionName = $action->name;
  9. }
  10. }
  11. }
  12. }
  13. return $defaultActionName;
  14. } ?>


btw zmienilem kod wg zalecen hawka

  1. <?php
  2. /**
  3.  * Klasa ConfigParser
  4.  * Klasa przetwarzająca XMLowy plik konfiguracyjny
  5.  * @author Piotr 'bela_666' Belina
  6.  * @version 0.1
  7.  */
  8. class ConfigParser {
  9.  
  10. /**
  11. */
  12. private $config;
  13.  
  14. /**
  15. * Instancja
  16. * @access private
  17. */
  18. static private $instance = null;
  19.  
  20. /**
  21. * Singleton
  22. * @return object
  23. */
  24. static public function getInstance() {
  25. if(self::$instance == null) {
  26. self::$instance = new ConfigParser;
  27. }
  28. return self::$instance;
  29. }
  30.  
  31. /**
  32. * Konstruktor
  33. */
  34. private function __construct() {}
  35.  
  36. /**
  37. * Ładuje plik konfiguracyjny
  38. * @return object SimpleXML
  39. */
  40. public function loadConfig() {
  41. if(filemtime(&#092;"config.xml\") == filemtime(\"config.php\")) {
  42. $file = file_get_contents(&#092;"config.php\");
  43. $this->config = unserialize($file);
  44. return $this->config;
  45. } else {
  46. $this->config = simplexml_load_file(&#092;"config.xml\");
  47. file_put_contents(&#092;"config.php\", serialize($this->config));
  48. return $this->config;
  49. }
  50. }
  51.  
  52. public function getViews() {
  53. static $view = array();
  54. if(empty($view)) {
  55. foreach($this->config->actions->view as $name) {
  56.  $view[] = $name['name'];
  57. }
  58. }
  59. return $view;
  60. }
  61.  
  62. public function getActions($category) {
  63. if($this->config->actions->view['name'] == $category) {
  64. static $actions = array();
  65. if(empty($actions)) {
  66. foreach($this->config->actions->view->action->name as $actionName) {
  67. $actions[] = $actionName;
  68. }
  69. }
  70. return $actions;
  71. } else {
  72. return false;
  73. }
  74. }
  75.  
  76. public function getAuthorizationDriverName() {
  77. static $authDriver;
  78. if(empty($authDriver)) {
  79. foreach ($this->config->main as $main) {
  80. $authDriver = $main->auth;
  81. }
  82. }
  83.  
  84. return $authDriver;
  85. }
  86.  
  87. public function getDefaultAction() {
  88. static $defaultActionName = null;
  89. if(empty($defaultActionName)) {
  90. foreach($this->config->actions->view as $view) {
  91. if($view['name'] == 'default') {
  92. foreach ($view->action as $action) {
  93. $defaultActionName = $action->name;
  94. }
  95. }
  96. }
  97. }
  98. return $defaultActionName;
  99. }
  100. }
  101. ?>
aleksander
parser fajny ale warto zauwarzyć, że dziurawy. Gdy ktoś wie, że istnieje plik config.php i go otworzy ma do dyspozycji całą konfigurację systemu. Pół biedy gdy zapisane są w nim nazwy modułów - gożej gdy loginy i hasła do bazy...
bela
zawsze jest .htaccess smile.gif pozatym można dodać <?php do pliku i troche przerobic parser

Olo to nie jest coś do zerżenięcie lub wzorowania się winksmiley.jpg
aleksander
bela_666: ale skrypt musi byc tak napisany by lakiś lamik nie musiał jeszcze sie bawić w .htaccesy tongue.gif

UPDATE: dodałem ostatnią 6 smile.gif
bela
olek: ale to cześć frameworka smile.gif btw powinneles jedno 6 dry.gif
NuLL
@bela_666: Ladne to - mozna wykorzystac questionmark.gif
bela
null jasne ze mozna, licencja GPL jak cos tongue.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.