Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Generowanie tabeli i przechowywanie jej szablonu w bazie
Forum PHP.pl > Forum > Przedszkole
modern-web
Witam!
Chciałbym poznać Wasze propozycje - jak można utworzyć tabelę i przechować jej szablon w bazie danych, tak by było to wydajne i nie wymagało dostępu do kodu HTML.
Co dokładniej mam na myśli?

Chciałbym utworzyć poniższą tabelę za pomocą interfejsu znajdującego się na stronie tak by po zapisaniu zmian jej `szkielet` trafił do bazy danych, a pola z zawartością '<input>' zawierały `inputy` albo po prostu - były puste (to jest najmniej istotne).


Problem jest łatwy do rozwiązania - zdaję sobie z tego sprawę, ale problemem są 2 rzeczy:
-> tworzenie tabeli bez dostępu do kodu HTML (najlepiej graficznie)
-> przechowywanie szkieletu tabeli w bazie danych - tak by było to w miarę optymalne

Najłatwiej to pewnie wklepać kod HTML tabeli do bazy, ale zalatuje to brakiem profesjonalizmu smile.gif
Czekam na Wasze propozycje!

Pozdrawiam i z góry dzięki smile.gif
PanGuzol
Jeśli nie przewidujesz komórek scalonych to wystarczy, że będziesz przechowywał wysokość oraz szerokość tabeli oraz w trzeciej kolumnie wartości oddzielone np. średnikiem lub innym znakiem który niebędzie występował jako wartość tych inputów.
KrzysiekKCN
W sumie, ciekawy projekt. Sam bym taki wykonał wink.gif Zawsze się przyda tongue.gif

Troszkę pomyślałem i może by zliczać kolumny, i wiersze, wtedy by można utworzyć tablicę dwuwymiarową. Każdy rekord posiadał by swój element tablicy który mógł by zawierać takie dane jak treść, czy css'a.
Pytanie jak to do bazy dodać. Myślałem żeby stworzyć dla każdej tabeli osobną tabele w bazie danych o określonej strukturze, to by można dość łatwo wygenerować.
Drugą opcją jaką bym wykorzystał to zakładając tabele 4x3 i mając np bazę: id | kolumny | wiersze | style | treść
mógł bym ustalić w interfejsie wiersz[1,1] wiersz[1,2] wiersz[1,3] style dzieląc je np % czy jakimkolwiek znakiem którego bym nie używał
i analogicznie każdy kolejny wiersz bym tak wypisał. Później można by to rozdzielić i wszystko powinno grać. Do treści można by stworzyć osobną tablicę dwuwymiarową, która by pobierała dane tak samo.

Pewnie da się to zrobić 3x szybciej, czekam na twoje propozycje, uwagi
modern-web
No właśnie... Jeśli chodzi o samą tabelę - będzie miała różne wymiary; może opiszę krok po kroku jak by to miało wyglądać z mojego punktu widzenia..
1. admin loguje się na swoje konto i określa wymiary tabeli oraz opisuje wszystkie kolumny i wiersze (na rysunku odpowiednio A,B,C,D... oraz 1,2,3...); <input> mogą pozostać puste.
2. użytkownik loguje się i widzi tę tabelę, taką jaką zapisał administrator - z tym, że bez możliwości edycji opisu kolumn i wierszy - jedyne co może zrobić to uzupełnić inputy (dodane przy wyświetlaniu tabeli za pomocą skryptu).

Kompletnie nie wiem jak się za to zabrać... samo stworzenie tabeli to przecież nic trudnego - wystarczy, że admin wpisze 4x4 i tyle się tego wyświetli - a potem po prostu odpowiednio to wszystko opisze inputami...
Ale jak to zachować w bazie? Jak ten szkielet przechować, wraz z opisami? ;/ Tutaj jest problem... nie chcę tworzyć 200000 tabel (bo załóżmy, że każdy użytkownik otrzyma 1 tabelę, która będzie miała inaczej opisane kolumny i wiersze...).
Hm... można by to przechować w pliku rozdzielając kolumny znakiem'|' a wiersze '_' - wtedy miałoby to jakiś porządek smile.gif
KrzysiekKCN
może podziel to na kilka kroków?
logujesz się adminem, wpiszujesz rozmiar i nazwę tabeli i dostajesz wygenerowaną strukturę 4x4 a program zapisuje np. $_SESSION['kolumna'] = 4; $_SESSION['wiersz'] = 4; $_SESSION['nazwa'];

przechodzisz do kolejnego kroku gdzie ustalasz wygląd, i tu byś mógł mieć określone np styl_1 dla wiersza1 i styl_2 dla reszty to np. w jquery użyć czegoś w stylu draganddrop i poprzeciągać w określone miejsca style.
program sprawdził by rekord po rekordzie zapisane style i dodał to do $_SESSION['style'][kolumna][wiersz] = styl_x;

kolejnym krokiem było by na tej samej zasadzie przeciąganie wcześniej zdefiniowanych obiektów np. inputy radio itp.
program zapisze jak jak style np do $_SESSION['obiekty'][kolumna']['wiersz'] = obiekt_x;

kojelny krok to do danie do bazy
style i obiekty = w pętli do końca tablicy element1^element2;
dodajesz kolumne, wiersz, style, obiekty, nazwe;
usuwasz SESJE
koniec

--- loguje się uzytkownik
wybiera nazwę tabeli,
program generuje mu ją na podstawie wierszy i kolum, oraz uzupełnia ją poprzez style i obiekty rozdzielając ciąg. każdy obiekt w formularzu posiadał by swoją nazwę np. po numerze rekordu
użytkownik uzupełnia swoje dane które zapisywane są do $_SESSION['dane'][kolumna][wiersz].
zatwierdza i przechodzi np do walidacji, tam może sprawdzić wszystkie dane, zatwierdza
w bazie danych tabela np. modyfikacje [id, id_uzytkownika, id_tabeli, dane]
dane = w pętli do końca tablicy element1^element2;
-- wyświetlanie tabeli
generuje strukture wypełnia stylami i danymi

ja tak to widzę, a ty? Kiedyś właściwie robiłem coś takiego ale znacznie prostszego, nie generowałem tabeli tylko wpisywałem dane. Taki jakby plan lekcji dla każdej klasy z osobna.
modern-web
A jak to będzie wyglądało pod względem wydajności? Wiesz... przewiduję min. 30000 użytkowników.
KrzysiekKCN
Tego niestety ci nie powiem, zawsze można napisać coś prostszego i testować, skracać kod, różne funkcje można wykorzystać wiele razy, np generowanie struktury tabeli.
Może pomogło by indeksowanie bazy? Albo zapytania mysqli, kiedyś czytałem że są bardziej wydajne.
modern-web
Korzystam tylko z mysqli i pdo smile.gif Zauważyłem wzrost wydajności, lepszą obsługę błędów i ogólne polepszenie standardów.
Aplikacja będzie zaprogramowana w stylu obiektowym (proceduralny jest żałosny i mało wydajny) - kapsułkowanie bardzo się w tym wypadku przyda.

Kurde, no nie wiem... z takim projektem jeszcze styczności nie miałem, a schrzanić niczego nie chcę dlatego wolę poznać wszelkie możliwe warianty.

A co powiesz na taki schemat:
- admin wpisuje wymiary tabeli - załóżmy 4(kolumny) x 6(wierszy); klika 'generuj';
- wyświetla się tabela, zawierająca pola input w 1 wersie i 1 kolumnie; reszta komórek pusta;
- admin wypełnia zawartość komórek i zapisuje zmiany;
- tabela trafia do bazy w postaci:
Cytat
A|B|C|D_1|..|..|.._2|..|..|.._3|..|..|.._4|..|..|.._5|..|..|..


-użytkownik loguje się i widzi tabelę -> skrypt za pomocą pętli i funkcji explode odpowiednio obrabia ciąg z bazy (struktura tabeli) i rysuje ją;
-w puste pola (..) skrypt dopisuje inputy, które użytkownik może wypełnić;
-po zapisaniu zmian w formularzu, dane trafiają do tabeli z identyfikatorem użytkownika, tak, że każda kolumna trafia do oddzielnej kolumny, a każdy wers do oddzielnego rekordu.

Jakieś sugestie, co można by poprawić/udoskonalić/zmienić lub... zupełnie wywalić biggrin.gif?
PanGuzol
Od strony admina
1. Jak już ustaliłeś wpierw pytasz admina o wymiary.
2. Generujesz tbaele o takich wymiarach z inputem w każdej komórce.
3. Jeśli komórka ma być pusta zostawiasz pustą, ma być tetst wpisujesz tekst, ma być input wpisujesz np. {input}
4. Zapisujesz do bazy. Tabela psotaci id|x|y|content. Content to masz połączone wszystkie wartości inputów za pomocą funkcji imlpode, znak oddzielający sam
sobie wybierz, możesz skorzystać np z jakiegoś niedrukowalnego znaku aby nie kolidowało z tekstem.

Od strony użtkownika
1. Generujesz tabelę
2. Jeśli trafisz na komórkę której wartośc to {input} wstawiasz go z nazwą np x1y2 możesz wykorzystać licznik pętli.
3. Po przesłaniu formularza łączysz wartości inputów za pomocą implode i zapisujesz w tabeli data o strukturze id|userid|tableid|data.
modern-web
Niewielka poprawka mojej koncepcji ale już jesteśmy coraz bliżej, projekt wydaje się być coraz bardziej przejrzysty smile.gif
Zaraz się za to wezmę, zobaczymy co z tego wyjdzie, pewnie wprowadzę kilka poprawek kosmetycznych ale zasada będzie podobna, bo wydaje mi się bardzo logiczna.
W razie problemów/pytań będę się tutaj odzywać smile.gif
KrzysiekKCN
smile.gif No podobnie myślałem, napisałeś to bardziej przejrzyście. Jak by co daj znać jak idzie, ja też spróbuje coś napisać.
modern-web
Pewnie! Liczę na Waszą pomoc w razie czego. Jak skończę udostępnię kod, by na przyszłość ktoś znalazł rozwiązanie problemu 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.