Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [XML+PHP] parser XML do tworzenia Formatek, i ich obsługa bez `ręcznej` zmiany kodów PHP
Cezar708
post
Post #1





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

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


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.
Go to the top of the page
+Quote Post
splatch
post
Post #2





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


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.
Go to the top of the page
+Quote Post
Cezar708
post
Post #3





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

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


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.
Go to the top of the page
+Quote Post
wkrugiolka
post
Post #4





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 2.12.2007

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


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)


Pozdro, Wojtas
Go to the top of the page
+Quote Post
Cezar708
post
Post #5





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

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


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.
Go to the top of the page
+Quote Post
lszota
post
Post #6





Grupa: Zarejestrowani
Postów: 13
Pomógł: 1
Dołączył: 15.11.2004
Skąd: Kraków

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


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 (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post
Cezar708
post
Post #7





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

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


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ć?
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 25.12.2025 - 09:27