Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zarządzanie treścią czyli jak odróżnić obiekty
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
aleksander
Witam,

Stworzyłem dzisiaj swój wymarzony silnik drzewek. Taki system można podzielić na dwie oddzielne cześci:

- system drzewek czyli jakby foldery (są trzymane w bazie danych)
- obiekty docelowe, czyli jakby pliki.

Silnik drzewek chcę wykozystać na razie do trzech podsystemów:
- katalog artykułów
- katalog produktów (dla sklepów internetowych)
- download

Mógłbym do każdego z tych trzech podystemów zrobić oddzielną tabelę ze swoimi własnymi drzewkami i zrobić z tego oddzielne moduły, ale nie chcę tego, ponieważ to ma być system elastyczny, jak najbardziej przypominający CMSa, a nie system portalowy, gdzie każdy moduł jest zupełnie odosobniony od reszty systemu.

Wykożystując jeden silnik drzewek natrafiam na problem, że występują tu różne obiekty. Artykuły są przechowywane w XMLu i są obrabiane przez jakiś element systemu, a z kolei produkty mają tabele w DB obrabiane przez zupełnie inny element systemu. Aby to bardziej zobrazować (sam widzę, że to troche zagmatwane) podam przykład:

http://www.php.pl/index.php/phppl/artykuly...ch_programistow
Widać, że aby przechować taki element wystarczą w bazie dwa pola: tytuł i treść

http://www.php.pl/index.php/phppl/skrypty/cms/ez_publish
Tutaj z kolei widać, że potrzeba więcej pól: nazwa, wersja, strona www, recenzja, link itd...

Obiekty są różne a mimo to CMS to rozpoznaje i uruchamia odpowiednią akcję.

I tu pojawia się moje pytanie: jak to zrobić w jakiś elegancki CMSowy ( snitch.gif ) sposób smile.gif questionmark.gif

pozdrawiam
bela
Trzymać wszystko w XMLu winksmiley.jpg
Czyli masz np. artykuł w takiej postaci
  1. <?xml version="1.0"?>
  2. <article>
  3. <title>Foo</title>
  4. <content>
  5. <introduction />
  6. <chapter id="1" />
  7. </content>
  8. </article>


I potem przetwarzasz to za pomocą XSLTa, w rezultacie otrzymasz wynik w takiej formie jaka Ci się zażyczy ( z małym udziałem CSSa tongue.gif ) winksmiley.jpg
aleksander
hmm nie za bardzo mi to pasuje, dlatego, że narzuca to sposób przechowywania danych.

Ja chcę np mieć katalog cześci komputerowych, które mają być w bazie danych, w których będą kolumny:
Kod
id, nazwa, typ, opis, cena itd


Z kolei np artykuły chcę przechowywać, tak jak napisaleś wyżej.

Wracamy do punktu wejścia.
NuLL
Dane(w masz obiekcie pole data) jakiegokolwiek obiektu zapisujesz w bazie w postaci plików XML - różnych plików odpowiednich dla danego obiektu - właśnie pracuje na czymś takim w domku cool.gif - sporo roboty: szablony, kontrola wersji i wogóle...
DeyV
Cytat
- system drzewek czyli jakby foldery (są trzymane w bazie danych)
- obiekty docelowe, czyli jakby pliki.

W swoim systemie postanowilem to w pewien sposób połączyć.
To znaczy mam drzewo, ktorze przechowuje nie tylko informacje o folderach, ale również o wszystkich elementach w nich się znajdujących.
Dla drzewa nie ma więc znaczenia, czy w jakimś miejscu pojawi się artykul, news, czy też folder.
Otrzywiście przechowuje jednak taką informację, więc gdy już przyjdzie czas na wyświetlenie konkretnego elementu, to nie ma problemu z rozpoznaniem jego typu, i wyświetleniem odpowiedniej zawartości z odpowiedniego źródła.
W ten sam sposób przygotowuje różne wersje językowe.
To znaczy w drzewku jest jeden wpis, ale do niego odwołują się 4 różne zawartości, pobierane w zależności od potrzeb.

Pozwala to również na znacznie uproszczone linkowanie.
Zawsze bowiem wystaczy podać tylko id liścia w drzewie, a system już sam rozpozna, czym jest podany element.
NuLL
A co sądzicie o pomyśle drzewek do obługi systemu zarządzania użytkownikami - rozmyslam nad czymś takim ostatnio
aleksander
Cytat(DeyV @ 2005-02-10 09:24:14)
W swoim systemie postanowilem to w pewien sposób połączyć.
To znaczy mam drzewo, ktorze przechowuje nie tylko informacje o folderach, ale również o wszystkich elementach w nich się znajdujących.
Dla drzewa nie ma więc znaczenia, czy w jakimś miejscu pojawi się artykul, news, czy też folder.
Otrzywiście przechowuje jednak taką informację, więc gdy już przyjdzie czas na wyświetlenie konkretnego elementu, to nie ma problemu z rozpoznaniem jego typu, i wyświetleniem odpowiedniej zawartości z odpowiedniego źródła.
W ten sam sposób przygotowuje różne wersje językowe.
To znaczy w drzewku jest jeden wpis, ale do niego odwołują się 4 różne zawartości, pobierane w zależności od potrzeb.

Pozwala to również na znacznie uproszczone linkowanie.
Zawsze bowiem wystaczy podać tylko id liścia w drzewie, a system już sam rozpozna, czym jest podany element.

Ok więc wydumałem coś takiego:
- pierwsza tabela przechowywuje całe drzewo gałęzi (gdzie każda gałąź ma swoje ID)
- druga tabela przechowywuje powiązania pomiędzy gałęziami i liściami, tzn który liść jest w jakiej gałęzi. jej struktura jest następująca:
Kod
ID - unikalny identyfikator
TREEID - klucz obcy tabeli z gałęziami - pokazuje w którym miejscu jest liść
ACTION - która akcja ma obsłużyć żądanie
PARAMS - parametry dla akcji (potrzebne po to, bo np. akcja artykuły musi rozpoznać, który artykuł wyświetlić
Cechą tego rozwiązania jest to, że nie wystarczy stworzyć nowy liść. Należy go także umieścić w odpowiedniej (dla nas) gałęzi.
Trochę kulawe jeszcze to rozwiazanie (szczególnie z tą kolumną PARAMS), więc czekam na sugestie smile.gif .
bela
alek, można by do tego dorzucic i18n smile.gif
aleksander
ke? a po co?
bela
Hmm, załóżmy, że nagle zajdzie potrzeba przetłumaczenia artykułu na inne języki. Klikasz sobie w interfejsie administracyjnym utwórz tłumaczenie i po kłopocie. A jak dasz na chama wszystko w jednym langu, to co? To tak samo jak z fabrykami winksmiley.jpg
aleksander
chyba to będzie bardziej pasowało waszym wymaganiom:
Cytat(struktura tabel)
tabela 1 - drzewo folderow
-id
-code
-title

tabela2 - obiekty
-id
-code (klucz obcy)
-objecttype (klucz obcy)

tabela 3 - definicje rodzajów obiektów
-id (objecttype)
-name
-action - akcja, która ma zająć się przetwarzaniem obiektu

tabela 4 - dostępne języki
-langid
-title - en-EN, pl-PL itd itp

tabela 5 - wersje językowe
-id obiektu
-langid
API dla wszystkich akcji zarejestrowanych w systemie ( w tabeli 3 ).
Każdy typ obiektu musi mieć swoją klasę.
Klasa musi mieć następujące metody:
  1. <?php
  2. interface action
  3. {
  4. getElement( int $id, string $lang );
  5. getElements( int $start, int $limit, string $lang );
  6. addElement(); //metoda sama pobiera z tablicy $_POST potrzebne dane
  7. updateElement( [int $id] [, string $lang] );
  8. deleteElement( int $id [, $lang] );
  9. findElement( array $pattern ); <= ex. array( 'title' => 'jakis tytuł' ); array( 'content' => 'kawalek tresci' );
  10. }
  11. ?>
Przykładowe wywołanie jakiegoś obiektu:
  1. <?php
  2. //Przykładowe wywołanie obiektu wygląda następująco
  3.  
  4. 1. index.php?action=viewcostam&id=5 // klient wysyła żądanie
  5. 2. kontroler wywołuje akcje viewcostam
  6. 3. 'SELECT * FROM obiekty, obiekty-definicje, wersje-jezykowe WHERE obiekty.id = '$_GET['id']; // akcja viewcostam pobiera informacje o obiekcie.
  7. 4.
  8. $action = obiekty-definicje.action // akcja definuje nazwe kolejnej akcji, id obieektu i jezyk
  9. $id = $_GET['id'];
  10. $lang = 'somelang';
  11.  
  12. 5. $objAction = new {$action}(); //wywoływanie właściwej akcji
  13. $objAction->getElement( $id, $lang );
  14.  
  15. ?>
Jeżeli chcemy dodać powiedzmy artykuł, musimy najpierw stworzyć nowy obiekt artykułu, a następnie dodać do niego treść w jakimś języku.

Hmm mam nadzieję, że wyjaśniłem dostatecznie prosto...

pozdrawiam
NuLL
A macie jakiś pomysl jak takie wredoctwo przeszukiwać ?

Bo LIKe to ja sobie potrafie wepchnąć do wszukiwarki - ale macie może np. jakiś pomysl ja np. przeszukiwać okreslone pola w documencie ? Ja wpadłem na głupi pomysl(wiem, że jest głupi bo powolny:(). Można podczas przeszukiwania drzewka pobierasz szablon danej klasy treściowej i robić to co trzeba, ale co robić mając w bazie np. 40 szablonow oraz 1000 podstron questionmark.gif Zabić bazę ?
ebe
Załóżmy że już uporaliśmy się z ww. problemem tj. organizacją kontentu w drzewo. Jak rozwiązać rozwijania drzewa przy użyciu np. Smarty bądź dowolnego innego systemu szablonów tak aby nie implementować logiki w szablon oraz bez wykorzystania JS. Także nie chcemy generować html w logice biznesowej. Załóżmy że chcemy uzyskac coś takiego na stronie po wejściu w automatyczne (oczywiście wpierw klikając artykułu, pralki i automatyczne)
Kod
Artykuły
  Pralki
    Automatyczne
      Model 1
      Model 2
      Model 3
      Model 4
    Pół automatyczne
   Lodówki
   Zmywarki
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.