Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [XML+PHP] parser XML do tworzenia Formatek
Forum PHP.pl > Forum > XML, AJAX > XML
Cezar708
Witam,

Dostałem zlecenie, które polega na napisanie pewnego rodzaju back-officeowej aplikacji służącej do generowania fomularzy na podstawie XML.
W pliku XML zapisane mają być tagi, które spowodują pojawienie się na formularzu określonych pól i przycisków w określonych miejscach, a zmiana formatki ma być tylko na podstawie plików XML, bez programowania w PHP.

UWAGA! Nie chodzi mi o transformatę XSLT, ponieważ jednym z założeń ma być DODAWANIE PÓL FORMULARZA oraz ich USUWANIE.

Na przykład: Mamy dane dotyczące użytkownika:

imie,
nazwisko,
miasto,
ulica.

Wiadome jest, że aby dodać takie dane do bazy danych należy stworzyć odpowiednią formatkę i plik PHP ją obsługujący.

Po jakimś czasie okazuje się, że należy dodać jeszcze pola:

nr_telefonu,
kod_pocztowy.

W normalnych warunkach wymagałoby to zmiany w bazie danych oraz zmianie kodów PHP (a w tym walidacja formularza oraz kod akcji zapisywania danych do bazy)

Teraz pytanie:

Czy istnieje jakieś rozwiązanie, na którym mógłbym się oprzeć tworząc taką aplikację?
Czy może ktoś z Was już kiedyś coś podobnego robił?
Proszę o jakiekolwiek wskazówki w jaki sposób najefektywniej utworzyć taki parser - kreator kodu PHP.

Pozdrawiam.
splatch
W twoim przypadku, jeśli idzie o modyfikację struktury najlepszym wyborem będzie DOM. Tagi mapujesz do obiektów a z obiektów renderujesz html.
Cezar708
Hmm,

ale mam pytanie. Wykorzystać DOM to rozumiem (dobry pomysł), ale jak to zrobić w bazie danych? Dla każdej modyfikacji tworzę nową tabelę? Czy może robię altery? Co z danymi, które byłyby w kolumnach usuwanych? A może jest jakiś sposób na zapisywanie `listy zmian` danej tabeli?

Jeśli założę, że za każdym razem, gdy robi się modyfikację będę tworzył nową tabelę to w jaki najwygodniejszy sposób mam zapisywać informację, która tabela jest aktualna? A w jaki sposób się potem dostać do `starych` danych?

Wybaczcie ten potok pytań, ale nigdy czegoś podobnego nie robiłem i nie wiem jak się za to zabrać, a nie chcę robić za dużo błędów na samych założeniach.
wkrugiolka
A moze rozbij to na 2 tabele. Tabela wlasciwego wpisu i polaczona z nia tabela pol formularza (id, nazwa, wartosc, czyWymagane itp). Wtedy nie musisz zmieniac struktury bazy danych tylko dodajesz wpis do tabeli pol formularza.

To tylko pomysl - nie wiem czy spelni Twoje oczekiwania ale wydaje mi sie ze to najlatwiejszy sposob aby nie mieszac w strukturze bazy smile.gif


Pozdro, Wojtas
Cezar708
zróbmy to na przykładzie...

na przykład mam plik XML, który zawiera informację o użytkowniku:

  1. <user>
  2.  <table>
  3.    <name>users</name>
  4.  </table>
  5.  <fields>
  6.    <field>
  7.      <name>id_user</name>
  8.      <type>varchar</type>
  9.    </field>
  10.    <field>
  11.      <name>lastname</name>
  12.      <type>varchar</type>
  13.    </field>
  14.    <field>
  15.      <name>firstname</name>
  16.      <type>varchar</type>
  17.    </field>
  18.  </fields>
  19. </user>


która generuje generuje mi tablicę users (id, lastname, firstname)

...i teraz ktoś chce zmienić tę tablicę, ponieważ okazało się, że ważne będzie to aby był jeszcze jakiś nick i info o użytkowniku, ale niepotrzebne będzie na przykład lastname, czyli nowy plik XML wygląda tak:

  1. <user>
  2.  <table>
  3.    <name>users</name>
  4.  </table>
  5.  <fields>
  6.    <field>
  7.      <name>id_user</name>
  8.      <type>integer</type>
  9.    </field>
  10.    <field>
  11.      <name>firstname</name>
  12.      <type>varchar</type>
  13.    </field>
  14.    <field>
  15.      <name>nick</name>
  16.      <type>varchar</type>
  17.    </field>
  18.    <field>
  19.      <name>info</name>
  20.      <type>varchar</type>
  21.    </field>
  22.  </fields>
  23. </user>


to właśnie nie wiem jak takie informacje "rozbić na dwie tabele", albo jak inaczej do tego dojść, aby system zachowywał się stabilnie.
lszota
Rozbijanie na 2 tabele:

Zakładam, że masz w relacyjnej bazie danych tabele o nazwie "user".
W tabeli przechowujesz dane w stałym formacie: np. user_id, nazwisko, imie, e-mail.
Tworzysz sobie nową tabelę (zakładam, że masz prawo wykonać polecenie CREATE TABLE), w której możesz tworzyć i usuwać dowolne kolumny. Jedną z nich (z reguły pierwszą) jest user_id, która odwołuje się do klucza głównego tabeli user.

Prawdopodobnie z tabeli user korzystają inne moduły Twojego programu lub inne programy. Tabela user nie podlega wtedy modyfikacjom struktury i jest bezpieczna w przypadku błędnego skonstruowania polecenia ALTER TABLE przez skrypt PHP.

Oczywiście możesz przechowywać w tej dodatkowej tabeli pola w postaci XML lub tekstu z separatorami, jednak operacje na takiej bazie może wykonywać jedynie aplikacja a nie baza.
Można w tego typu bazie przechować dowolne informacje, np. dla kilku userów zapisać:
INSERT INTO USER_DATA (user_id, dane_opisowe) VALUES(55, '<NUMER_BUTA>43</NUMER_BUTA>');
Niestety, nie da się wtedy przeszukać takiej bazy pisząc:
SELECT user_id FROM USER_DATA WHERE numer_buta=55. Niestety sad.gif to nie przejdzie.

Proponuję, abyś dołożył nową tabelę (ja ją nazwałem USER_DATA) i w niej przechowywał dane o zmiennym formacie. Raczej w grę wchodzi tylko dodawanie kolumn, bez usuwania bo wtedy tracisz dane. Do tego dodatkowe pole tekstowe (typu varchar) na ewentualne dane, które bardzo chcesz przechować a sa na tyle nietypowe, że tworzenie dla nich specjalnej kolumny jest niemozliwe.

Jeszcze inne rozwiązanie.
Załóż tabelę o nazwie powiedzmy "parametry".
create table parametry(user_id int, parametr varchar, wartosc varchar);
Będziesz mógł przechowywać dowolną zmienną listę wartości dla każdego użytkownika i operować na niej poleceniami SQL.
Najfajniej to działa na bazie Oracle ale na MySQL też się sprawdza.
Cezar708
oki świetnie,

tylko że jeszcze nie wiem jak rozwiązać "usuwanie" kolumn... oczywiście nie bez powodu napisałem to w cudzysłowiach...

... czy dobrym rozwiązaniem byłoby już w samym PHP robić takie jakby maskowanie kolumn, które już są "usunięte"?

... a jeśli tak to w jaki sposób to najlepiej zrobić?
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.