Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Budowanie CMSa
Forum PHP.pl > Forum > PHP
Asmox
Mimo iż wiem wiele na temat php, nie jestem jakimś ekspertem, więc proszę o wyrozumiałość. Chciałbym napisać swojego CMSa (własnego, bezpiecznego, na wzór innych).
Aby to zrobić, trzeba by napisać.... jakiś framework. Nie wiem wiele o tym, ale z tego co zrozumiałem z Wikipedii ułatwia tworzenie modelu (szablonu) jakiegoś projektu - na przykład strony WWW.
Pomyślałem, że bezpieczniej będzie, jak wszystkie ważne zmienne umieszczę w pliku php z tablicą $_AXF (ma to trochę wspólnego z nazwą tego mojego "frameworka"). Ta tablica jest w oddzielnym pliku.
Tak więc zacząłem pisać klasę pages, która będzie odpowiadać za każdą stronę. Treść stron to po prostu pole w tabeli "strony".

  1. <?php
  2. class page
  3. {
  4. protected $id, $name, // i jakieś jeszcze zmienne
  5.  
  6. static function newpage($name, $dir, $source) {
  7. $_AXF = $GLOBALS['_AXF'];
  8. $now = date("Y-m-d");
  9.  
  10. try{
  11.  if (!@mysql_connect($_AXF['db_c_host'], $_AXF['db_c_login'], $_AXF['db_c_passwd']))
  12.        throw new Exception('Połączenie z bazą danych nie powidło się!');
  13.  if (!@mysql_select_db($_AXF['db_c_base']))
  14.        throw new Exception('Wybranie nazy danych nieudane!');
  15.        
  16.  if ($_AXF['db_set_results'] != "") {
  17.    if (!mysql_query('SET NAMES '.$_AXF['db_set_results']))
  18.        throw new Exception('Nie mogę wykonać zapytania!');
  19.    if (!mysql_query('SET CHARACTER SET '.$_AXF['db_set_results']))
  20.        throw new Exception('Nie mogę wykonać zapytania!');
  21.  }
  22.  if (!mysql_query("INSERT INTO ".$_AXF['db_pages_table']." VALUES(NULL, '$name', '$adress', '$now', 'Przykładowa treść');"))
  23.      throw new Exception('Nie mogę wykonać zapytania!');
  24.  
  25. }
  26.  
  27. catch (Exception $error) {
  28.  echo "Wystąpił błąd podczas działania skryptu o komunikacie: ";
  29.  echo $error->getMessage();
  30.  echo "<br />\n";
  31.  echo "Na linii: ".$error->getLine()."<br />\n";
  32. }
  33. }
  34.  
  35. function __construct() {
  36. $this->id = 0;
  37. $this->name = "example_name.ex";
  38. $this->dir = "directory/";
  39. $this->kategory = "example_kategory";
  40. $this->level = 1;
  41. }
  42. public function assign($id, $name, $dir, $source, $level) {
  43. $this->id = $id;
  44. $this->name = $name;
  45. $this->kategory = $kategory;
  46. $this->level = $level;
  47. }
  48. }
  49. ?>


Mam parę pytań co do swojej klasy.
1. Czy umieszczenie w jednej klasie metod statycznych i tych, co trzeba do ich użycia zmiennej jest w porządku?
2. Czy lepiej, aby ta jedna klasa służyła do wszystkiego wiązanego ze stronami (dodawanie, edycja, wyświetlanie...), czy lepiej, abym stworzył kilka mniejszych ?
erix
Cytat
  1. <?php
  2. $_AXF = $GLOBALS['_AXF'];
  3. ?>

Korzystasz z obiektówki i $GLOBALS...?
Asmox
Znaczy bo nie wiem: co jest źle? Bo to jest tak:
W pliku zmienne.php mam tablicę $_AXF. W niej mam dosłownie wszystko: dane o bazie, nazwę tabeli ze stronami i tak dalej. Ten plik ze zmiennymi includuję do pliku z klasą pages. No i jak zwykle, żeby zmienna z poza funkcji była widoczna, to muszę użyć $GLOBALS.
Tak chyba jest w porządku. A jak nie, to jak proponujesz to zrobić ?
erix
Zmiennych globlanych się unika jak ognia, bo często wprowadzają bałagan.

Zrób klasę statyczną, która będzie trzymała rdzeń.
Asmox
Aha, czyli po prostu taką klasę ze zmiennymi statycznymi publicznymi, do których można się odwoływać bezpośrednio ?
A i czy to nie jest źle, jak mam w jednej klasie wszystkie metody dotyczące w tym przykładzie stron ?
Mephistofeles
Zainteresuj się wzorcem rejestru, korzysta z niego m.in. symfony. Wzorzec ciekawy, wręcz stworzony do konfiguracji smile.gif. Co do samego CMSa - radziłbym oddzielić PHP od HTML, inaczej niezły bałagan się zrobi. Zrób coś w rodzaju widoku (z MVC), czyli klasy z dynamicznie generowanymi polami, które ustawiasz w PHP, i ładowania w niej prostego szablonu, czyli zwykły kod HTML + PHP (ale tylko generujący HTML), korzystający ze zmiennych tej klasy. I wtedy w klasie np. Pages ustawiasz sobie tylko $this->view->error = 'Wystąpił błąd' a w widoku if (isset($this->error)) (...) itp.
Asmox
OK, tylko za bardzo nie mogę się doczytać o tych wzorcach rejestru, bo na stronach są tylko suche "słownikowe" wyjaśnienia, tak że nic nie rozumiem. Jak proponujesz rozwiązać ten problem ze zmiennymi konfiguracyjnymi ? Proszę podaj jakiś przykład.
Mam też znowu kilka pytań:
1. W jakich plikach umieścić "ramy HTMLa" ? W szablonach (np. newsów, downloadzie itd.), czy gdzieś indziej ?
2. Jak dynamicznie generować pola klasy i po co właściwie?
3. Ciągle zastanawia mnie składnia odwołania: $this->view->error. Czy view to jakieś pole klasy, czy metoda... I jak można się w ten sposób odwoływać do zmiennej error ?
4. Wybrałem wyjątki, ponieważ przy wystąpieniu blokują wykonywanie kolejnych procesów, co na przykład przy bazach danych jest bardzo potrzebne. Czyżbyś sugerował mi powrót do konstrukcji die('Nie mogę utworzyć połączenia z bazą danych!') ?
erix
4: absolutnie - po to stworzono wyjątki, aby z nich korzystać.
1,2,3: polecam lekturę o wzorcu MVC, rozwieją się wszystkie Twoje wątpliwości.
Mephistofeles
Ja sugeruję die()? W żadnym wypadku. Przecież nawet wiadomość wyjątku możesz pobrać do zmiennej, to i tak był tylko przykład.
Chodziło mi o to, że robisz sobie klasę View. Zapisujesz jej instancję do pola view twojej klasy Page. Potem w Page robisz $this->view->error (tworzy się tu automatycznie pole w klasie View, to dość dziwna cecha PHP winksmiley.jpg) = 'jakis blad'. Natomiast w klasie View masz metodę render, która pobiera szablon, więc w szablonie korzystasz z pól klasy View, dlatego masz $this->error.
Co do wzorca rejestru:
masz 2 metody statyczne: set i get. Set zapisuje do statycznej tablicy, get pobiera. Do tego możesz dorzucić ładowanie np. z INI albo XMLa...
Asmox
Cytat(erix @ 16.03.2009, 20:50:34 ) *
1,2,3: polecam lekturę o wzorcu MVC, rozwieją się wszystkie Twoje wątpliwości.

Tiaaa.... pewnie już czas kupić nową książkę do PHP. Podstawy ostatnio są dla mnie niewystarczające laugh.gif
Crozin
Chcesz się brać za pisanie CMSa nie mając podstawowej wiedzy...?

Ja bym Ci proponował tego CMSa napisać przy wykorzystaniu jakiegoś FW, polecam Symfony, ale ZF, Kohana i inne też się oczywiście nadadzą
Asmox
Nie, nie źle mnie zrozumiałeś Crozin. Mam książkę o PODSTAWACH PHP pt. "Praktyczny kurs PHP5" autorstwa Marcina Lisa. Niestety są to tylko podstawy, a ja chciałbym dalej rozwijać swoją wiedzę o PHP (znaczy się, że opanowałem podstawy).
Co do wykorzystania Frameworków... Nie wiem, czy to źle, ale ja zawsze wolę wszystko zrobić samemu tj. w tym wypadku napisać własnego Frameworka, nawet jeśli będzie on nie tak dobry jak pozostałe.
Riklaunim
Cytat(Asmox @ 17.03.2009, 18:23:03 ) *
Co do wykorzystania Frameworków... Nie wiem, czy to źle, ale ja zawsze wolę wszystko zrobić samemu tj. w tym wypadku napisać własnego Frameworka, nawet jeśli będzie on nie tak dobry jak pozostałe.

Własnego frameworka nie napiszesz - nie coś co mogło by być nazywane frameworkiem obok CakePHP, CodeIgniter, czy Symfony. To nie jest coś co nawet doświadczony programista pisze "od tak". Zamiast męczyć się z bezproduktywnym klepaniem kodu "prawie jak framework" naprawdę polecam skorzystanie z jakiegoś. Masz gotowy szkielet pod tworzenie aplikacji www o konkretnym działaniu smile.gif
Crozin
Cytat
Co do wykorzystania Frameworków... Nie wiem, czy to źle, ale ja zawsze wolę wszystko zrobić samemu tj. w tym wypadku napisać własnego Frameworka, nawet jeśli będzie on nie tak dobry jak pozostałe.
Też kiedyś "tak miałem". Ale uwierz i ucz się na cudzych, a nie własnych błędach: nie warto. winksmiley.jpg

A już tym bardziej nie warto, gdy celem jest zrobienie CMSa, a nie FW.
Asmox
Cytat(Riklaunim @ 17.03.2009, 16:34:03 ) *
Własnego frameworka nie napiszesz - nie coś co mogło by być nazywane frameworkiem obok CakePHP, CodeIgniter, czy Symfony. To nie jest coś co nawet doświadczony programista pisze "od tak". Zamiast męczyć się z bezproduktywnym klepaniem kodu "prawie jak framework" naprawdę polecam skorzystanie z jakiegoś. Masz gotowy szkielet pod tworzenie aplikacji www o konkretnym działaniu smile.gif

No bo sam nie wiem jak wykorzystać klasy - wszyscy piszą żeby sobie coś poczytać, albo coś innego, a ja za bardzo nie kumam. Więc wpadłem na pomysł na zbudowanie własnego FW, który zawsze by mi pomagał przy tworzeniu jakiejkolwiek strony i mógłbym go edytować jak mi się podoba. Pewnie Zend i inne FW też umożliwiają łatwe tworzenie własnych klas, ale chciałbym najpierw zrobić swojego. Żeby ogólnie się zaznajomić z klasami w PHP, z kilku powodów:
- programowanie obiektowe to zapewne kierunek, w którym idą wszyscy programiści
- znudziło mi się pisanie nieskończonej liczby funkcji i ich codzienne poprawianie
- bo są fajne rolleyes.gif
Chyba najpierw muszę dostać niezłego kopniaka od PHP, żeby zacząć używać normalnych Frameworków.
Cytat(Crozin)
A już tym bardziej nie warto, gdy celem jest zrobienie CMSa, a nie FW.

Co ? Właśnie zamierzałem zrobić własnego CMSa na własnym Frameworku.
Mephistofeles
Jeśli chcesz szybko skończyć swój projekt to polecam symfony - sam jestem nim bardzo mile zaskoczony, i bardzo prawdopodobne, że się na niego przerzucę w najbliższym czasie. Teraz również piszę własnego miniframeworka, ale z każdą kolejną klasą mi się coraz bardziej odechciewa winksmiley.jpg.
Riklaunim
Za dużo hasełek się naczytałeś... OOP, obiektowość, zawartość obiektu w obiekcie. Tworzenie prostego CMSa na 20 klasach abstrakcyjnych, singletonie i obiektowym ORMie samo z siebie brzmi dziwnie winksmiley.jpg Swego czasu bawiłem się we własne rozwiązania, po tym spróbowałem frameworka CI i różnica była znacząca, bo zamiast przejmować się jakimi durnotami typu zawartość obiektów w obiekcie mogłem od razu tworzyć funkcjonalne moduły serwisu. Teraz siedzę na Django i nie obchodzi mnie ile tam jest klas, gdzie i jaka jest dziedziczona i czy przypadkiem nie jest za mało obiektowości tongue.gif Ułatwia pracę znacząco i to się liczy. Zdolność napisania gotowego serwisu jest zaletą, znajomość klas we frameworków to tylko u profesora na uniwerku.
kbsucha
Ale z drugiej strony doszliscie do takich wnioskow dopiero po napisaniu, lub rozpoczeciu swojego FW. Zauwazylem ze od momentu kiedy zaczelismy tworzyc swoj wlasny framework, wiele istotnych zagadnien i rozwiazan stalo sie o wiele bardziej zrozumiale. Latwiej mi teraz przegladac zrodla Symfony czy Zenda, uczyc sie z ich rozwiazan, czy je nasladowac.
Moim zdaniem pisanie swojego FW jest jednym z etapow ktore, dobrze jest przejsc, aby samemu dojsc do odpowiednich wnioskow. Kazdy kiedys zaczynal od globali, odkrywal PDO, czy ORM'y i ostatecznie sam wybierze sobie rozwiazania odpowiednie dla siebie.

pozdr
Asmox
Chciałbym bardzo zrobić coś samemu, bo swoją ostatnią stronę napisałem kilka lat temu i w dodatku bardzo kiepską. Dlatego na razie nie chcę korzystać z żadnych pomocy, typu Zend, Smarty i jakieś tam inne, tylko napisać coś samodzielnie. Jak skończę swoją stronkę, to zacznę się przyglądać pomocniczym mechanizmom.

Jak patrzyłem po podpisach, to chyba każdy z modów/przyjaciół/adminów i osób, które się liczą na tym forum mają swoją stronę. Taką prawdziwą, którą można pokazać kumplom. Też chciałbym taką zrobić, ale żebym mógł powiedzieć, że to tylko moje dzieło (jeżeli robisz coś bez pomocy to zawsze jest się później bardziej uradowanym, niż jak się tylko rozbuduje jakiś projekt)
Riklaunim
Cytat(Asmox @ 18.03.2009, 08:57:31 ) *
Jak patrzyłem po podpisach, to chyba każdy z modów/przyjaciół/adminów i osób, które się liczą na tym forum mają swoją stronę.

Ja mam napisaną za pomocą Django winksmiley.jpg
Crozin
Tylko widzisz... Ty chyba nie do końca rozumiesz czym jest FW. winksmiley.jpg FW to nie jakiś tam CMS, że pokażesz stronę znajomym, a oni Ci powiedzą eee... wyklikać kilka opcji w ACP, wrzucić szablon to i ja potrafię

FW to tylko narzędzie pomocnicze. Nikt Ci się nie przeczepi a... stronę w Symfony to i ja sobie potrafię w 15 min strzelić. I strona będzie wtedy jak najbardziej "w pełni Twoja".

A jak chcesz mieć w pełni Twoją (tym razem bez cudzysłowi) to napisz sobie jeszcze własny język programowania, bo przecież w PHP to dziesiątki gotowych rozwiązań masz. Później własny serwer..., następnie własny OS, maszyne, itd. biggrin.gif
Mephistofeles
Własny komputer w piwnicy też zrobisz? BIOSa do niego nie zapomnij napisać. Czasami lepiej korzystać z gotowych, sprawdzonych rozwiązań.
Framework zastępuje tylko część pracy, związaną głównie z wewnętrznym działaniem modelu MVC, ale nie wykona za ciebie całego systemu. Więc bez obaw korzystaj z czego się da, nikt ci nie zarzuci, że to nie ty to napisałeś winksmiley.jpg.
blooregard
Cytat
A jak chcesz mieć w pełni Twoją (tym razem bez cudzysłowi) to napisz sobie jeszcze własny język programowania, bo przecież w PHP to dziesiątki gotowych rozwiązań masz. Później własny serwer..., następnie własny OS, maszyne, itd

Cytat
Własny komputer w piwnicy też zrobisz? BIOSa do niego nie zapomnij napisać. Czasami lepiej korzystać z gotowych, sprawdzonych rozwiązań.
Framework zastępuje tylko część pracy, związaną głównie z wewnętrznym działaniem modelu MVC, ale nie wykona za ciebie całego systemu. Więc bez obaw korzystaj z czego się da, nikt ci nie zarzuci, że to nie ty to napisałeś


Myślę, że Koledzy trochę za bardzo "przesadzili" co do tworzenia własnych rozwiązań. Zgadzam się z twierdzeniem, że pisanie narzędzi w stylu Symfony czy ZF mija się z celem, ale pojęcie "framework" nie ogranicza się tylko do tego typu systemów. Ja na przykład na potrzeby tworzonych przez siebie aplikacji napisałem sobie (i ciągle rozwijam o nowe moduły) taki a'la framework, oparty na architekturze MVC.
Poza podstawowym zadaniem tego frameworka (czyli podziału aplikacji na logikę, przetwarzanie danych i ich prezentację), stworzyłem w nim szereg klas, które ułatwiają mi tworzenie pewnych standardowych, powtarzających się elementów aplikacji (tabelki z listami np. rekordów w bazie danych, formularze, linki, upload plików, sortowanie wyników w tabelach, prosta wyszukiwarka, zaawansowana wyszukiwarka itp.). Metody w tych klasach mają za zadanie maksymalnie ułatwić mi budowę nowych modułów aplikacji bez konieczności np. tworzenia szablonu Smarty i przetwarzania w nim foreach-em wyników z bazy, aby wyświetlić kompletną tabelę. Po prostu - tworzę sobie obiekt klasy "Table", do niego jedną metodą przesyłam nagłówki kolumn, do drugiej metody przesyłam tablicę asocjacyjną zawierającą wynik zapytania do bazy, trzecia metoda zwraca mi gotową tablicę. Plus klasy do obsługi połączeń z bazą, obsługi $_SESSION czy też tablic $_GET i $_POST.
Jest to jedynie forma uproszczenia sobie pracy, a nie chęć konkurowania z ZF czy Symfony. Po prostu do niektórych prostszych aplikacji stosowanie ZF to próba naprawy Malucha młotem pneumatycznym.
melkorm
Eh. Troche się chyba zagolopowaliście z tymi osądami .... .

Osobiście, kolega niech sobie kupi książke o wzorcach, szczególnie dobrze prawiącą o MVC, bo to chyba najpopularniejsze rozwiązanie i na podstawie książki i informacji w niej zawartych sklecić pare klas, jakiś router , adapter , system szablonów by załapać ogólnie jak to działa , następnie gdy się już to przyswoji ściagnać np. symfony zobaczyć jak tam to działa poprzeglądac pliki postawić na tym coś swojego ... no i później można np złożyć już coś ciekawego na własne potrzeby z ZF =)
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.