Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zarządzanie treścią
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
matid
Zastanawiam się, jak rozwiązać w CMSie zarządzenie treścią. Na chwilę obecną mam mniej więcej coś takiego.

Tabela Content, zawierająca pola
id [ int(11) ]
xml [ text ]

Oprócz tego jest kilka dodatkowych pól umożliwiających tworzenie drzewa itp, ale na razie jest to nie ważne.

I teraz przykładowa treść xml dla folderu wygląda tak:
  1. <?xml version="1.0"?>
  2. <document type="folder">
  3. <title>Folder główny</title>
  4. <description>W tym folderze znajdują się wszystkie podelementy systemu.</description>
  5. </document>

Dla artykułu tak:
  1. <?xml version="1.0"?>
  2. <document type="article">
  3. <author>Mateusz 'matid' Drożdżyński</author>
  4. <timestamp>1113296158</timestamp>
  5. <title>Nowy lider projektu Debian</title>
  6. <description>Swoją kadencję jako lider projektu kończy właśnie Martin Michlmayr, a jego miejsce 17 kwietnia zajmie Branden Robinson wybrany w zakończonym wczoraj głosowaniu. Słów kilka o głosowaniu oraz nowowybranym liderze...</description>
  7. <content>Procedura głosowania w projekcie Debian różni się dość znacznie od tego do czego przyzwyczajeni jesteśmy choćby w wyborach prezydenckich. Głosy można oddawać na każdego kandydata podając dodatkowo wagę głosu. Tym sposobem każdy oprócz faworyzowania swojego kandydata nr 1, ma również wpływ na miejsca zajmowane przez resztę. Nic nie stoi na przeszkodzie by każdemu kandydatowi przyznać głos o największej wadze, ale nie będę się tutaj rozpisywał nad sensownością takiego postępowania ;)
  8.  
  9. Jak już wspomniałem wybory wygrał Branden Robinson, którego sylwetkę chciałbym w skrócie opisać. Branden jest deweloperem Debiana od roku 1998. Dotychczas głównie zajmował się opieką nad pakietami XFree86, a od 2001 roku zasiada w zarządzie Software in the Public Interest, Inc. Od 5 lat pracuje w firmie Progeny. W wyborach na lidera projektu startował nieprzerwanie od 2001 roku, jednak dopiero w tym roku odniósł sukces.
  10. O zamiarach Brandena jako lidera projektu można przeczytać w jego programie wyborczym. Dostępne jest również szczegółowe sprawozdanie z wyborów. Pozostaje tylko życzyć nowemu liderowi sukcesów i doczekania się nowego stabilnego wydania za jego kadencji ;)</content>
  11. </document>


A teraz pytania.

1. Czy to będzie wydajne? IMO średnio. Każde przeglądanie wymaga parsowania pliku XML, nie mówiąc już o wyświetleniu drzewa z tytułami (potrzeba pobrać wszystkie dzieci, wszystkim przeparsować XML i wyświetlić). Z wyszukiwaniem też będzie problem. Tak samo jak z wyświetlaniem np. wszystkich artykułów z danego folderu.
Dobrym rozwiązaniem wydaje się dopisanie do tego dobrego systemu cache i jakiejś wyszukiwarki z crowlerem zapisującym słowa kluczowe. Jeśli ktoś ma jakiś pomysł na dobre wyszukiwanie i cache to proszę się podzielić winksmiley.jpg

2. Jak rozwiązać wyświatlanie. Na chwilę obecną jest to obsługiwane przez zwykły parser XML, który zamienia mi ten dokument na tablicę, która najstępnie jest przekazywana do renderera (np. Smarty, itp.)
Zastanawiałem się także nad XSLT, ale nie bardzo wiem jak w PHP4 się do tego zabrać.
Teraz jest jeszcze kolejny problem, czyli templaty lokalne. Co jeśli chcę wyświetlać w jednym folderze artykuły w inny sposób niż w drugim? Obecnie rozwiązuje to za pomocą sekcji. Tworzę sobie powiedzmy sekcję na folderze głównym, skrypt przy wyświetlaniu elementu sprawdza najbadziej szczegółową (czyli jak mam Root->News->News_1 to najpierw sprawdza News, potem Root) w poszukiwaniu odpowiedniego szablonu. Wydaje się to dość dobrym rozwiązaniem, co o tym sądzicie?

Z góry dzięki za pomoc.
mike
IMO XML jest dobry do przenoszenia danych, przesyłania miedzy aplikacjami i tego typu rzeczy. Natomiast trzymanie w nim danych jak w bazie to zupełna pomyłka.
Na Twoim miejscu trzymałbym treści w bazie lub same adresy o plików, w których są treścia dodatkowo w bazie reszte informacji.
IMO XML do tego co robisz kompletnie sie nie nadaje.
matid
Cytat(mike_mech @ 2005-04-22 22:36:42)
IMO XML jest dobry do przenoszenia danych, przesyłania miedzy aplikacjami i tego typu rzeczy. Natomiast trzymanie w nim danych jak w bazie to zupełna pomyłka.
Na Twoim miejscu trzymałbym treści w bazie lub same adresy o plików, w których są treścia dodatkowo w bazie reszte informacji.
IMO XML do tego co robisz kompletnie sie nie nadaje.

Moim zdaniem jest to dobre wyjście chociażby z tego względu, że przy wprowadzaniu danych nie jesteśmy ograniczeni strukturą bazy danych. AFAIK w wielu systemach jest to implementowane w ten sposób.
sobstel
moim zdaniem także nie takie jest przeznaczenie XMLu. np. spróbuj mi teraz wyszukac wszystkei artykulu danej osoby, albo zrobic jakakolwiek wyszukiwarke. bedziesz przeszukiwal wszystkei pliki xml? optymalizacyjna klapa.
mike
XML do konfiguracji systemu, owszem.
Ale do trzymania treści, ble.
Zgadzam się z poprzednikiem, a co z wyszukiwaniem, i pożądkowaniem danych.
Ich układem i przejrzystością.

A jeżeli mówisz że ogranicza cie struktura tabeli to robisz dwie: treści i arty. A nie wszystko w jednym pliku.

No i już nie wspomną o tym że takie pliki będe parsowane za każdym odświerzeniem strony, a to zajmuje duuuuużo czasu.

Powtażam pomysł chybiony.
matid
Cytat(sopel @ 2005-04-22 23:59:01)
moim zdaniem także nie takie jest przeznaczenie XMLu. np. spróbuj mi teraz wyszukac wszystkei artykulu danej osoby, albo zrobic jakakolwiek wyszukiwarke. bedziesz przeszukiwal wszystkei pliki xml? optymalizacyjna klapa.

  1. SELECT id, xml
  2. FROM content WHERE xml LIKE "%<author>Mateusz 'matid' Drożdżyński</author>%";

A w ten sposób? Dalej podtrzymuje, że moim zdaniem jest to dobre rozwiązanie.

W tym temacie też polecają trzymanie danych w XMLu.
sobstel
Cytat(matid @ 2005-04-23 08:13:03)
  1. SELECT id, xml
  2. FROM content WHERE xml LIKE "%<author>Mateusz 'matid' Drożdżyński</author>%";

A w ten sposób? Dalej podtrzymuje, że moim zdaniem jest to dobre rozwiązanie.

trudno nazwać to wydajnym rozwiązaniem, zwłaszcza gdy przyjdzie ci wyciągać dane wg. bardziej złożonych kryteriów (co sam zresztą zauważyłeś w swoim poście). tak czy owak nikt tu raczej na siłę nie będzie Cię przekonywał. chciałeś opini i my tu swoją wyraziliśmy. dla mnie to się mija z celem.
matid
Cytat(sopel @ 2005-04-23 09:30:01)
Cytat(matid @ 2005-04-23 08:13:03)
  1. SELECT id, xml
  2.  
  3. FROM content WHERE xml LIKE "%<author>Mateusz 'matid' Drożdżyński</author>%";

A w ten sposób? Dalej podtrzymuje, że moim zdaniem jest to dobre rozwiązanie.

trudno nazwać to wydajnym rozwiązaniem, zwłaszcza gdy przyjdzie ci wyciągać dane wg. bardziej złożonych kryteriów (co sam zresztą zauważyłeś w swoim poście). tak czy owak nikt tu raczej na siłę nie będzie Cię przekonywał. chciałeś opini i my tu swoją wyraziliśmy. dla mnie to się mija z celem.

No to jakie inne rozwiązanie proponujesz? Nie chcę być ograniczony strukturą bazy danych, bo jak ktoś będzie chciał dodać sobie jakieś dodatkowe pole np. do artykułu to nie powinien mieć z tym żadnych problemów. Oprócz tego najlepiej, jakby wszystko mogło leżeć w jednej tabeli.
hawk
Odróżnij treść artykułu od atrybutów artykułu. Autor to nie jest treść, tylko atrybut. Trzymanie atrybutów w XML tylko utrudnia wyszukiwanie. Trzymanie treści w bazie danych zapycha bazę.
mike
Cytat(hawk @ 2005-04-23 09:32:45)
Odróżnij treść artykułu od atrybutów artykułu. Autor to nie jest treść, tylko atrybut. Trzymanie atrybutów w XML tylko utrudnia wyszukiwanie. Trzymanie treści w bazie danych zapycha bazę.

Wniosek ( IMO ):
- atrybuty w bazie: łatwośc wyszukiwania, "lekka" baza;
- treści w plikach ( adresy do nich w bazie ).

A i jeszcze powiedz dlaczego chcesz wszystko trzymać w jednej tabeli?
Ja wtedyodróżnisz np. news'a od artykułu? Dodatkowy atrybut.

No i czas dostępu do danych jest bardzo ważny. A parsując pliki XML czasu tego nie znajdziesz.

To by było na tyle w tym temacie z mojej strony.
aleksander
mike_mech - CMS nie rozróżnia artykułu od newsa. Dla niego wszystko jest treścią, tylko mogą być różne sposoby jej prezentacji (np rózne szablony smarty czy xslt).

W porządnych CMSach masz też system keszowania więc czas uzyskiwania dostępu do danych się zmniejsza :]
matid
Cytat(hawk @ 2005-04-23 10:32:45)
Odróżnij treść artykułu od atrybutów artykułu. Autor to nie jest treść, tylko atrybut. Trzymanie atrybutów w XML tylko utrudnia wyszukiwanie. Trzymanie treści w bazie danych zapycha bazę.

Teraz planuję zrobić coś takiego.
Mam dokument XML (oczywiście z deklaracją DTD zgodną z moim systemem i jego DTD będzie w mojej bazie danych).
Importuję go do systemu. Parser zbiera sobie informacje o pliku, czyli rodzaj dokumentu (DTD), autora(-ów), datę utworzenia, modyfikacji, itp. Zapisuje to w bazie danych w odpowiedniej tabeli wraz z informacją na temat położenia pliku XML. Użytkownik, jeśli będzie chciał wyświetlić powiedzmy wszystkie pliki danego autora, szuka to w bazie. Baza zwraca nazwy plików XML.
Jeśli istnieje cache w postaci XHTML to jest ładowany, jeśli nie to za pomocą XSLT plik XML jest transformowany do XHTMLa i cachowany.
Użytkownik ma ładne wyświetlanie, ja mam dane w postaci XML, szukanie jest szybkie. Cache optymalny. Co myślicie o takim rozwiązaniu?
I teraz tylko rodzi się pytanie - jak rozwiązać przeszukiwanie treści artykułów...
hawk
A skąd parser weźmie autora itd? Z sufitu?
matid
Cytat(hawk @ 2005-05-05 20:44:26)
A skąd parser weźmie autora itd? Z sufitu?

Nie z sufitu, tylko dokument XML będzie miał np. taką postać:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <?xml-stylesheet type="text/xml" href="article.xsl"?>
  3. <!DOCTYPE article SYSTEM "article.dtd">
  4. <article>
  5.    <title>Mój artykuł</title>
  6.    <date>22.04.2005 18:30</date>
  7.    <author>Mateusz 'matid' Drożdżyński</author>
  8.    <content>
  9.        <intro>Lorem dolor sit amet, consectetuer adipiscing elit. Donec non purus vel metus pretium consequat. Aliquam arcu. Cras elementum sagittis nulla. Integer ac erat. Phasellus elementum, mauris quis adipiscing sollicitudin, arcu ligula tempor libero, ut convallis purus wisi sed wisi. Integer sed massa. Cras eu sapien non tortor pellentesque facilisis. Suspendisse potenti. Nunc nulla quam, accumsan eu, consequat eu, adipiscing vel, lorem. Integer molestie erat ut erat. Curabitur consequat. Aliquam ullamcorper pulvinar lectus. Donec ac lorem ut purus dictum venenatis.</intro>
  10.  
  11.        <chapter>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec non purus vel metus pretium consequat. Aliquam arcu. Cras elementum sagittis nulla. Integer ac erat. Phasellus elementum, mauris quis adipiscing sollicitudin, arcu ligula tempor libero, ut convallis purus wisi sed wisi. Integer sed massa. Cras eu sapien non tortor pellentesque facilisis. Suspendisse potenti. Nunc nulla quam, accumsan eu, consequat eu, adipiscing vel, lorem. Integer molestie erat ut erat. Curabitur consequat. Aliquam ullamcorper pulvinar lectus. Donec ac lorem ut purus dictum venenatis. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec non purus vel metus pretium consequat. Aliquam arcu. Cras elementum sagittis nulla. Integer ac erat. Phasellus elementum, mauris quis adipiscing sollicitudin, arcu ligula tempor libero, ut convallis purus wisi sed wisi. Integer sed massa. Cras eu sapien non tortor pellentesque facilisis. Suspendisse potenti. Nunc nulla quam, accumsan eu, consequat eu, adipiscing vel, lorem. Integer molestie erat ut erat. Curabitur consequat. Aliquam ullamcorper pulvinar lectus. Donec ac lorem ut purus dictum venenatis.</chapter>
  12.    </content>
  13. </article>
hawk
A jeżeli autor artykułu nie chce pisać wg tego DTD? To nie jest z niczym zgodne. Żaden edytor tego nie wspiera. Nikt tego nie zna. Język jest potwornie ubogi. Nie ma sposobu na wyróżnienie tekstu. Nie ma listingów. Wypunktowania. Tabelek. Obrazków. Odnośników. Niczego nie ma. Możesz albo zostawić taki format, pozbawiając się większości funkcjonalności, albo rozszerzyć go, pakując się w straszne bagno.

Tworzenie własnego formatu artykułów jest gigantyczną pracą, więc nie warto opierać na tym systemu. Jeżeli już, wyciągaj te informacje z DocBooka. A jeżeli już mówimy o CMS, to co będzie, jak ktoś będzie chciał umieścić coś innego niż taki artykuł?
chmolu
Jeżeli dokument będzie przekształcany za pomocą XSLT, to warto poszukać edytora WYSIWYG, który polega na tym, że dokument jest transformowany w czasie pisania. Wystarczy wtedy stworzyć szablon XSLT i mamy obsługę dowolnego formatu w edytorze. Nie wiem, czy dobrze pamiętam, ale zdaje mi się, że TUTAJ powinien być taki edytor.
matid
Cytat(hawk @ 2005-05-08 09:17:10)
A jeżeli autor artykułu nie chce pisać wg tego DTD? To nie jest z niczym zgodne. Żaden edytor tego nie wspiera. Nikt tego nie zna. Język jest potwornie ubogi. Nie ma sposobu na wyróżnienie tekstu. Nie ma listingów. Wypunktowania. Tabelek. Obrazków. Odnośników. Niczego nie ma. Możesz albo zostawić taki format, pozbawiając się większości funkcjonalności, albo rozszerzyć go, pakując się w straszne bagno.

Tworzenie własnego formatu artykułów jest gigantyczną pracą, więc nie warto opierać na tym systemu. Jeżeli już, wyciągaj te informacje z DocBooka. A jeżeli już mówimy o CMS, to co będzie, jak ktoś będzie chciał umieścić coś innego niż taki artykuł?

Planowałem rozszerzyć ten DTD o różne inne możliwości w stylu obrazków, podkreśleń, itd.
BTW - chciałem też dać możliwość uploadowania własnego DTD i XSLT.

A co do DocBook to muszę się zastanowić.

Aha, tak pozatym to nie jest tak, że system będzie przyjmował tylko i wyłącznie pliki XML. Na chwilę obecną mam w planach napisanie edytora, kŧóry na podstawie DTD będzie edytował formularz.
Czyli ktoś wybiera, że chce stworzyć artykuł, to na podstawie DTD artykułu dostanie do tego ładny formularz.
hawk
Jeżeli użytkownik może uploadować swoje własne DTD, to ja chcę zrobić takie, w którym autor artykułu przechowywany jest w tagu <czas>, a data utworzenia w tagu <autor>. Moje DTD, wolno mi. Zrób mi do tego parser.

A jeżeli na podstawie DTD będziesz robił formularz, to musisz napisać paser DTD. Co też nie jest proste. I co niby ten parser zrobi z DTD? Jak mu zapodam DTD do HTMLa, to ciekawe, co on mi wyprodukuje...
bigZbig
@matid -> moim skromnym zdaniem zwyczajnie utrudniasz sobie robote. Na temat sensu uzywania xml w php wypowiedzialem sie juz w temacie [porada]tpl Vs. php. Sam tez juz odwiedzales ten temat ale moze nie jestes na biezaco ;-)


Jesli juz koniecznie zalezy Ci na zastosowaniu technologi xslt to zapoznaj sie z ponizszym przykladem:

  1. <?xml version="1.0" encoding="ISO-8859-2"?>
  2. <channel>
  3.   <item type="klamstwo">
  4.      <title>Microsoft końy rozwój Windows</title>
  5.      <url>http://www.nothere.com/foo/bar</url>
  6.   </item>
  7.  
  8.   <item type="klamstwo">
  9.      <title>George W. Bush znajduje Irak na mapie</title>
  10.      <url>http://www.jakisserwis.irq/news/4544.html</url>
  11.   </item>
  12.  
  13.   <item type="klamstwo">
  14.      <title>Grzegorz M. sprzedaje lodówki eskimosom</title>
  15.      <url>http://www.eskimostuff.nrd/ble/wombat.php</url>
  16.   </item>
  17. </channel>


  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://my.netscape.com/rdf/simple/0.9/">
  3.  
  4. <xsl:output method="html" indent="no" encoding="utf-8"/>
  5.  
  6. <xsl:template match="/">
  7. <html>
  8. <head>
  9. <title>XSLT</title>
  10. </head>
  11. <body>
  12.  
  13.   <xsl:for-each select="/channel/item">
  14.      Pojedynczy News: <xsl:value-of select="title"/><br />
  15.   </xsl:for-each>
  16.  
  17. </body>
  18. </html>
  19. </xsl:template>
  20. </xsl:stylesheet>


  1. <?php
  2.  
  3. if (PHP_VERSION >= 5) {
  4.  // Emulate the old xslt library functions
  5.  function xslt_create() {
  6.  return new XsltProcessor();
  7.  }
  8.  
  9.  function xslt_process($xsltproc,
  10.  $xml_arg,
  11.  $xsl_arg,
  12.  $xslcontainer = null,
  13.  $args = null,
  14.  $params = null) {
  15.  // Start with preparing the arguments
  16.  $xml_arg = str_replace('arg:', '', $xml_arg);
  17.  $xsl_arg = str_replace('arg:', '', $xsl_arg);
  18.  
  19.  // Create instances of the DomDocument class
  20.  $xml = new DomDocument;
  21.  $xsl = new DomDocument;
  22.  
  23.  // Load the xml document and the xsl template
  24.  $xml->loadXML($args[$xml_arg]);
  25.  $xsl->loadXML($args[$xsl_arg]);
  26.  
  27.  // Load the xsl template
  28.  $xsltproc->importStyleSheet($xsl);
  29.  
  30.  // Set parameters when defined
  31.  if ($params) {
  32.  foreach ($params as $param => $value) {
  33.  $xsltproc->setParameter(&#092;"\", $param, $value);
  34.  }
  35.  }
  36.  
  37.  // Start the transformation
  38.  $processed = $xsltproc->transformToXML($xml);
  39.  
  40.  // Put the result in a file when specified
  41.  if ($xslcontainer) {
  42.  return @file_put_contents($xslcontainer, $processed);
  43.  } else {
  44.  return $processed;
  45.  }
  46.  
  47.  }
  48.  
  49.  function xslt_free($xsltproc) {
  50.  unset($xsltproc);
  51.  }
  52. }
  53.  
  54. $file_xml = 'chanel.xml';
  55. $file_xsl = 'chanel.xsl';
  56.  
  57. $arguments = array(
  58.  '/_xml' => file_get_contents($file_xml),
  59.  '/_xsl' => file_get_contents($file_xsl)
  60. );
  61.  
  62. $xsltproc = xslt_create();
  63. $html = (PHP_VERSION >= 5) ? xslt_process($xsltproc,'arg:/_xml','arg:/_xsl',null,$arguments) : xslt_process($xsltproc, './'.$file_xml, './'.$file_xsl);
  64.  
  65. xslt_free($xsltproc);
  66. print $html;
  67.  
  68. ?>


Jeszcze jedna uwaga. Zamiast DTD uzyj xsd - jest precyzyjniejszy.
matid
Dzięki za rady. Zastanowię się jeszcze czy użyć XMLa w moich projektach. Zresztą spróbuję napisać coś więcej i sprawdzić wydajność.

A co do kodu - przecież tutaj mam własny kod dobrze działąjący i nie widzę większej różnicy co do twojej wersji.
Seth
Tez ostatnio sie nad tym zastanawialem i doszedlem do takiego wniosku:
http://www.binarychoice.pl/item/28/ winksmiley.jpg

Dolaczylem tam schemat struktury bazy danych, ktory chyba najlepiej zobrazuje przechowywanie danych.
Ace
Seth: fajnie to zobrazowales, w sumie w chwili obecnej moja struktura cms'a wyglada statycznie, bo w sumie musze definiowac nowe typy obiektow poprzez kopiowanie plikow i tworzenie samemu kodu...

ale daze do tego zeby mozna bylo sobie wyklikac wlasny obiekt z roznymi mozliwosciami np: title, description, photo1, photo2, file, co tylko mozna sobie zarzyczyc... smile.gif
ShaXbee
Ja widzę rozwiązanie podobne do tego co zaproponował @hawk, czyli w bazie trzymamy id, autora, tytuł, słowa kluczowe, natomiast w pliku .xml miałbyś samą treść newsa. Aby zwiększyć szybkość działania możesz zastosować prosty Trick - XMLa parsujesz, następnie serializujesz jako tablice i zapisujesz do pliku - bardzo szybkie, często szybsze od bazy danych. Odświeżenie zawartośći zserializowanego pliku dokonujesz jesli sie zmieni rozmiar / data pliku. Dodatkowo mozna zastosowac jeszcze jeden trick - kopie zserializowanych plików, które są pobierane najczęściej umieszczasz na ramdysku (tempfs czy siakoś tak) - ale to raczej w Windzie, Unix'y robią to automatycznie.
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-2024 Invision Power Services, Inc.