Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Pro _ Wirtualne klasy contentu

Napisany przez: Diwi 8.11.2005, 21:28:21

Witam. Od pewnego czasu mam problem jak rozwiązać sprawę wirtualnych klas contentu no i nie moge nadal wymyślić. Czy ktoś ma swoją zaimplementowaną metodę i chciałby się nią podzielić ?

Pozdrawiam

Napisany przez: aleksander 8.11.2005, 21:40:38

eZpublish, polecam przejrze, moj cms bedzie sie na tym wzorowal (jeszcze nie zaimplementowalem tego)

Napisany przez: ebe 8.11.2005, 21:51:57

Seth na swojej stronie zamieścił bardzo fajny diagram - szkielet bazy danych w której takie wirtuakne klasy miałyby siedzieć, proponuję zacząć od tego. Ponadto poszukaj na google czegoś o "idk cms".

Napisany przez: NuLL 26.11.2005, 19:10:57

http://www.meta-language.net/metastorage-tutorial.html

To sie moze przydac - ja swoj sposob znalazlem - narazie tylko na generacje samych klas ale jest i dziala smile.gif

Napisany przez: bela_666 26.11.2005, 19:40:15

A ja znalazłem świetny framework, zresztą zobaczcie sami http://www.djangoproject.com/documentation/overview/.

Skończę semestr i coś podobnego sobie w php napiszę. Bardzo mi się podoba generowanie panelu admina.
Gdyby jeszcze w php były klasy wewnętrze...

Napisany przez: NuLL 26.11.2005, 19:44:56

Ja mam pytanko co do tematu - macie jakas wizje co robic ze starymi obiektami ? Jest to pytanie stricte teoretyczne.

Bo zalozmy - tworzymy sobie klase ktora ma iles tam pol. Usuwamy jedno pole. Dodajemy jakies inne - i co ? Robimy dzikiego update dla starych obiektow czy budujemy sobie system kontroli wersji klas i pozostawiamy stara definicje a nowa zapisujemy w bazie i tworzac nowy obiekt korzystamy juz z nowej definicji ?

Macie jakies inne pomysly ?

Napisany przez: Diwi 26.11.2005, 20:55:49

No dobrze poczytałem troche o wirtualnych klasach contentu ale głównie pomyśł mam jak to wszystko zrealizować lecz nie mam pomysłu jak przechowywać dane w bazie aby łatwo było je posortować, wyciągnąć tylko te potrzebne itp. Jak narazie to przyszło mi do głowy jedynie tworzenie nowej tabeli content_"nazwatypu" a w niej kolumn które były by jednocześnie atrybutami (np. tytul, tresc, obrazek, data-dodania, autor). Jak myślicie czy takie rozwiązanie jest dobre ?

Pozdrawiam

Napisany przez: NuLL 26.11.2005, 23:53:04

Pomysl jak bedzie wtedy wygladac zapytanie pobierajace dane klasy, ktora sklada sie z pola kazdego typu....

Ja mam jedna tabele biggrin.gif

Napisany przez: Diwi 26.11.2005, 23:56:50

A jesteś w stanie przedstawić to rozwiązanie czy jest ono utajnione snitch.gif

Pozdrawiam

Napisany przez: NuLL 27.11.2005, 00:12:46

Szczerze bede troche niemily sad.gif Utajnione do czasu publikacji mojej nowej zabaweczki - jesli do niej nie dojdzie to ujawnie rozwiazanie - na moja decyzje sklada sie to iz pewna firma jest zainteresowana tym czyms i nie chcialbym bym sobie schrzanic dobrej roboty a moze i zycia... - wybaczcie chlopaki

Tak wyglada sama tabela z atrybutami :

  1. CREATE TABLE object_attribs (
  2. oa_id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. object bigint(20) UNSIGNED NOT NULL DEFAULT '0',
  4. name varchar(64) NOT NULL DEFAULT '',
  5. value text NOT NULL,
  6. PRIMARY KEY (oa_id),
  7. KEY oa_id (oa_id,object,name)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Thats all plus seriazlizacja oraz xml.

Napisany przez: aleksander 27.11.2005, 00:41:39

mi sie nasuwa zeby wszystko trzymac w xmlu, ale jak potem optymalnie wyciagac rozne obiekty to juz nie wiem...

Napisany przez: NuLL 27.11.2005, 01:43:48

Ja zapisuje kazda wlasnosc obiektu jako osobne pole w tabeli z atrybutami.

Napisany przez: chmolu 27.11.2005, 09:43:47

Ja zaimplementowałem w swoim CMFie strukturę bardzo podobną do tej, którą podał http://www.binarychoice.pl/item/28/. Jest to bardzo elastyczne, ale bez cache może być obciążające dla bazy. Żeby wyciągnąć jeden obiekt wraz z atrybutami (w jednym zapytaniu) trzeba połączyć aż 5 tabel:

  1. 'SELECT t.id,
  2. t.child_count,
  3. u.url,
  4. o.obj_id,
  5. o.obj_class_id,
  6. o.obj_class_name,
  7. o.obj_name,
  8. o.obj_date_created,
  9. o.obj_date_modified,
  10. a.attr_name,
  11. a.attr_short_name,
  12. a.attr_type,
  13. av.attr_value
  14. FROM content_tree t
  15. LEFT JOIN url_aliases u ON t.id = u.node
  16. LEFT JOIN content_objects o ON t.obj_id = o.obj_id
  17. LEFT JOIN content_class_attrs a ON a.attr_class_id = o.obj_class_id
  18. LEFT JOIN content_attr_values av ON av.attr_id = a.attr_id
  19. WHERE t.id = :id AND av.attr_obj_id = o.obj_id'


Przez takie skomplikowanie struktury kod php układający to wszystko w logiczne obiekty jest naprawdę zagmatwany (przynajmniej w moim wypadku winksmiley.jpg).

Pomimo złożoności tego rozwiązania sprawdza się ono bardzo dobrze, a tworzenie CMSów jest łatwe i szybkie. Niestety schody zaczynają się, gdy chcemy zaimplementować "obiekty powiązane" znane z ez. Chodzi o to, że jeśli mamy obiekt klasy "artykuł", to zazwyczaj jest z nim związany też obiekt klasy "autor", które musimy wyciągnąć jednocześnie. O ile dla pojedynczego obiektu jest to w miarę proste, to żeby wyciągnąć obiekty powiązane dla listy artykułów trzeba się sporo nakombinować.

Skrypt jest dostępny http://sourceforge.net/projects/daeron/.

Jak tylko uporam się z innymi projektami postaram się zrobić porządny refaktoring kodu, bo obecny to prowizorka. Chcę, by funkcja pobierania obiektów miała podobną funkcjonalność, jak w ez (sortowanie, pobieranie tylko w zależności od wartości atrybutu etc.).

Napisany przez: Vengeance 27.11.2005, 13:05:51

A może by tak wykorzystać natywne bazy danych? Odpada problem z XMLem snitch.gif

Napisany przez: Ociu 29.11.2005, 20:55:02

hm.. ja bym wszystko wpakował do pliku xml i porzucił całkowicie bazę danych winksmiley.jpg .
Plik xml:

  1. <VirtalClass>
  2. <name>Nazwa klasy</name>
  3. <object>nazwa obiektu</object>
  4. <methods>
  5. <param name="__construct" access="public">koood</param>
  6. </methods>
  7. </VirtalClass>

(Alno coś w ten deseń laugh.gif )
Wiadomo. Parser xml:
  1. <?php
  2. class XmlParser {
  3. private $xml;
  4. public function __construct( $file ) {
  5. if(!http://www.php.net/file_exists($file)) throw new TException();
  6. $this->xml = simplexml_load_file($file);
  7. }
  8. public function get( $var ) {
  9. return $this->xml->$var;
  10. }
  11. }
  12. ?>

Jakieś pomysły co do tego rozwiązania ? Drążyć, czy powrócić do bazy danych ?

Napisany przez: Vengeance 29.11.2005, 21:01:49

A chce ci się pisać obsługę wyszukiwania... łączenia wyników... transakcję i wiele innych? :]

Natywne bazy danych doskonale pozwalają na obsługę XMLa, jednak mało gdzie mamy do nich dostęp :/

Napisany przez: aleksander 29.11.2005, 21:05:01

@Ociu mi sie wydaje że Diwiemy chodziło o cos takiego:

  1. <virtualclass name="article">
  2. <section type="varchar" name="Tytuł" />
  3. <section type="file" name="Obrazek" />
  4. <section type="xml" name="Treść />
  5. </virtualclass>

Napisany przez: NuLL 29.11.2005, 21:36:13

Sama definicja klas jest prosta jak barszcz - ja stotuja wlasnie taka z XML-em + jedna wbudowana na stale ( czyt. "Folder" winksmiley.jpg ). Gorszy problem jest z ich uzywaniem tzn - generujesz dzieki tej klasie formularz - nby nic trudnego ale zapis tego potem oraz wyciaganie danych - i zaczynaja sie schody.

Napisany przez: Ace 30.11.2005, 09:24:44

tak dokladnie to samo mam... Z tym ze xml nie generuje mi klas, sam je sobie definiuje, ale pozniej problem jest w operacjach na zapisanych danych. Pojedynczy typ contentu trzymam w osobnej tabeli, a jak chce wylistowac wszystkie elementy z danego folderu to wyciagam dane z glownej tabeli odnosnie galezi (glowne dane takie jak id, czas utworzenia, kto utworzyl etc...) oraz dobieram do kazdego rekordu odpowiednie dane z odpowiedniej tabelki - strasznie nieefektywne ale narazie wystarcza mi to rozwiazanie, gdyz nie tworze bardzo rozgleglych serwisow. Jednak nie mozna sie ograniczac.

zastanawialem sie tez swego czasu, czy np: w postgresql nie mozna wykonywac takich laczen w jednym zapytaniu, zeby zwraal mi dane z glownej tabeli, oraz odpowiednie dane z jednej tabelki (wszystko jednym zapytaniem)

W jaki sposob przechowywac takie dane Contentu? Pozniej robia sie schody przy np: wyszukiwaniu elementow wedlug konkretnych warunkow.

Pozdrawiam.

Napisany przez: aleksander 10.02.2006, 19:05:52

ok odświerzę troche temat ponieważ ten problem w dalszym ciągu mi nie daje spac po nocach:D

Chcę użyc XML do przechowywania contentu. Tabela prosta:

  1. CREATE TABLE content (
  2. id INT
  3. created INT
  4. modified INT
  5. xml TEXT );
przykładowy XML:
  1. <content>
  2. <param type="text" name="title">To jest tytul</param>
  3. <param type="textarea" name="desc">jakis opis</param>
  4. <param type="media-wmv" name="filmik" path="sciezka/plik.wmv" />
  5. </content>

Zalezy mi na XMLu przede wszystkim dlatego że jeste on standardem sieciowym, mogę go sobie dowolnie transformowac dzieki XSLT itp.

I teraz problemy;
- jak wyciągnąc np. tylko tytuł?;] No bo po co do listowania wyciagac caly XML? XPath chyba nie wchodzi w rachubę=]

A gdyby tak np napisac program jakims języku "zwykłym" typu c++ c#, java który by sobie rezydował w pamięci i czekał na prosby od php? CMS mógłby SOAPem wysyłac zapytanie do niego w stylu
  1. <query>
  2. <id>568</id>
  3. <keys>
  4. <key name="title" />
  5. <key name="desc" />
  6. </keys>
  7. </query>
  1. <search>
  2. <param author="aleksander" />
  3. <param text="%php%" />
  4. </search>
a dostawałby ładny sformatowany XML. XPath itp przechodziłoby na stronę programu - modelu.

Napisany przez: NuLL 11.02.2006, 00:59:30

TIP - Pobrac tego tak sie nie da. Chyba ze wyrazenia regularne biggrin.gif

Napisany przez: Vengeance 11.02.2006, 01:07:58

"Chcę użyc XML do przechowywania contentu. Tabela prosta:"

Wykorzystaj natywną bazę danych

Napisany przez: splatch 11.02.2006, 01:28:41

  1. <content>
  2. <param type="text" name="title">To jest tytul</param>
  3. <param type="textarea" name="desc">jakis opis</param>
  4. <param type="media-wmv" name="filmik" path="sciezka/plik.wmv" />
  5. </content>

XPath? Nic prostszego smile.gif
  1. <?php
  2. $xml = simplexml_load_string('tutaj string z bazy');
  3. $result = $xml->xpath('/content/param[@name="title"]');
  4. ?>

Napisany przez: ActivePlayer 11.02.2006, 09:14:10

eeeee.... patrzcie tu http://dev.mysql.com/tech-resources/articles/mysql-5.1-xml.html

Napisany przez: sztosz 13.02.2006, 12:46:34

@ActivePlayer: Yay. To mnie zabiło. Więcej takich ciekawostek na PHPpro biggrin.gif Innymi słowy, ślicznie dziekuję.

Napisany przez: aleksander 13.02.2006, 15:47:37

to by idealnie rozwiązało moją sprawę, tylko że mysql 5.1 ;( u mnie hosting nie ma nawet 4.1 ;]

Napisany przez: ActivePlayer 13.02.2006, 15:50:07

no wlasnie, i tutaj znowu sprawa wraca do korzeni. Ja nawet na localhoscie nie mam mysql 4.1 bo na nim pracuje nad aplikacjami ktore potem beda na 4.0. tak samo z php. niby wiem ze 5 lepsze, ale po co mi to jak i tak nie mam tego gdzie uzyc sad.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)