Archive for the 'PHP' Category
Prac ciąg dalszy
Po niezbyt pracowitym weekendzie w domu, wróciłem do Rzeszowa i ostro wziąłem sie do roboty. Dzięki temu sporo nadgoniłem. Troche męczyłem sie nad Validacją formularza do dodawania pytań, gdyż gryzło sie z rePopulacją z bazy danych itp. Posiedziałem troche i sie udało :) Musiałem troche wszystko przebudować, ale dzięki temu dowiedziałem sie o czymś takim jak Flash w Symfony. Musze przyznać, że ciekawe rozwiązanie. U siebie w SparkleWorks rozwiązałem to troche inaczej, przez bezpośrednie dodanie parametrów w wywołaniu metody. Być może zmienie u siebie na coś podobnego… To się jescze okaże, któro będzie wygodniejsze :)
2 commentsNowa klasa AppBrigde
Aby sie troche odstresować, zacząłem grzebać przy SparkleWorks. Troche poprawiłem AppController, gdyz był mały bug i zacząłem myśleć na konfiguracją. Zrobiłem tak, że do konfiguracji FW oraz aplikacji odwołujemy sie przez Config::getConfig(var), natomiast do konfiguracji modulu przez $this->getConfig(var) Podział taki powstal, gdyz konfiguracja FW oraz aplikacji zawsze bedzie taka sama, natomiast mozemy zechciec pobrac konfiguracje innego modulu niz aktualnie wykonywany. I tu mialem maly problem. Chcialem uniknąć
-
$c = new ModuleConfig('modul')
-
$c->getConfig(var);
dla pobieranie konfiguracji aktualnego modulu i zastapic przez $this->getSelfConfig(var). Nie mialem gdzie umiescic tej dodatkowej metody. Wpadlem wiec na pomysl klasy AppBridge. Jest to główna klasa Akcji, i inne klasy po niej dziedziczą. Nic nowego to zapewne nie jest, ale stwarza teraz nowe możliwości, co do dalszej rozbudowy :)
2 comments“Update pole = pole+1″ in propel == POSSIBLE
Dzis całkiem przypadkiem znalazłem rozwiazanie tego problemu. W koncu troche bardziej rozbudowali dokumentacje i sie znalazło :) A jak to zrobić? Bardzo prosto i logicznie:
-
$o = SubCategoryPeer::retrieveByPK( $this->getRequestParameter( 'sub_cat_id' ) );
-
$o->setQuestionCount( ( $o->getQuestionCount() + 1 ) );
-
$o->save();
4 comments
Symfony i jego braki…
W koncu mamy layout dla ToNieProblem. Z racji tego odpusciłem sobie narazie prace nad SparkleWorks na rzecz Symfony. Najpier miło mnie zaskoczyło, jak łatwo mozna dodać kontrolke RichEdit do formularzy. Bardzo przyjemna sprawa. Ale to tyle rzeczy pozytywnych. Przejdzmy do tego co znowu mi brakuje. A mianowicie cały ten system slotów i komponentow. Jest To rozbudowane jak cholera. Wiele funkcji jest az nadto, a nie ma tego co mi jest potrzebne. A mianowicie: mam komponent user. Występuje on w 3 różnych stanach. Kiedy użytkownik jest zalogowany, niezalogowany oraz kiedy zalogowany uzytkownik jest expertem. I jak to najłatwiej zrobić? Przyszło mi do głowy, ze w szablonie załaduje komponent z akcją Index. W tejze akcji zrobimy cos takiego:
-
<?php
-
class usersComponents extends sfComponents
-
{
-
public function executeIndex()
-
{
-
if( $this->getUser()->isAuthenticated() )
-
{
-
if( $this->getUser()->getAttribute('credential_registered') == 'expert' )
-
{
-
$this->executeExpert();
-
}
-
else
-
{
-
$this->executeLoggedUser();
-
}
-
}
-
else
-
{
-
$this->executeUnloggedUser();
-
}
-
}
-
private function executeLoggedUser()
-
{
-
-
}
-
private function executeUnloggedUser()
-
{
-
-
}
-
private function executeExpert()
-
{
-
}
-
}
-
?>
To działa. Ale co z widokiem? Nie da sie teraz załadować widoków dla poszczególnych akcji komponentu. Coś takiego jak setTemplate() dla komponentów nie istnieje :(
Tak więc kolejny argument za tym, aby napisać SparkleWorks :D
Wiele akcji w jednej akcji - sukces!
W poprzedniej notce pisałem o moich dylematach co do ładowania akcji w akcji. Teraz, po długich bojach doszedłem do tego co chciałem :D Przyklad:
-
<?php
-
class DefaultAction extends View
-
{
-
public function Index()
-
{
-
$this->newModel( 'Show'); //Załaduje nam akcje Show z aktualnego modulu
-
$this->newModel( 'Show', 'News' ); //Załaduje Show z modułu News
-
$this->newModel( 'Index', 'Test'); //Załaduje Index z modułu Test
-
}
-
public function Show()
-
{
-
$this->test = 'zmienna testowa';
-
}
-
}
-
?>
To był przyklad wykorzystania. To jest dokladnie to o co mi chodziło od początku :) Teraz bez problemu moge napisać moduł News oraz moduł Comments, bez zadnych powiązań między nimi. Zaden z modułów nic nie musi wiedzieć o drugim. Do zrobienia jeszcze zostało mi tylko dodanie parametrów, do nowo wywołanej akcji, ale to już nie problem :)
Dodatkowo, aby sie nie pomylić w szablonach ze zmiennymi, zrobiłem małe udogodnienie. Do zmiennych w szablonie odwołujemy sie w taki sposób: echo $NazwaModułu->zmienna Dzięki temu napewno nie nastapi pomyłka, lub nadpisanie jakiejs zmiennej :)
Ładowanie akcji oraz widoków
Jako że przepisuje cały kod, którego i tak było nie wiele, postanowiłem dodać nową funkcjonalność, jaką jest ładowanie klilku akcji w jednej. Już tłumacze na przykładdzie. Mamy moduł News i w nim akcje Show. Oprócz tego mamy jeszcze moduł Comments z akcją ShowComments. I teraz w News->Show() wywołujemy Comments->ShowComments()
-
Class News{
-
public function Show()
-
{
-
//Zawartość akcji
-
$this->newModel('Comments', 'ShowComments'); //Tutaj wczytujemy moduł Comments z akcją ShowComments
-
}
-
}
To był przyklad wywołania. Tak więc to jest to o co powinno chodzić w MVC wg mnie. Np. W tak potężnym Symfony nie ma tego zaimplementowanego. I tam aby wywołać np. komentarze do newsów trzeba było wszystko napisać w akcji newsów. A to mi sie nie podoba!
W teori wygląda ładnie, gorzej z zastosowaniem. Męcze się już nad tym już troche i jakoś nie wiem do końca jak to rozwiązać. Zresztą zainteresowanych zapraszam do dyskusji na ten temat na forum PHP.PL
Smartowanie VS Pehapowanie :)
Po dłużeszje przerwie (nie cały miesiąc) wróciłem do SparkleWorks. Skorzystałem z okazji, że zrobiło sie troszeczke luźniej po serii zaliczeń na uczelni. Przy okazji pochwale sie ze aktualny bilans końcowy: 4, 5, 5, 5 :D Dzisiaj doszły ostatnie 2 piątki za zaliczenia z Podstaw informatyki oraz z Algorytmów :) Wczoraj 5 z mikroekonomii, a jakiś miesiąc wczesniej 4 z Logiki. No ale koniec przechwałek. Zajrzałem do kodu a tam bałagan, który narobiłem na święta jak byłem chory :/ Doszedłem do wniosku, że tego używać sie nie da i trzeba przepisać, stosując troche nowych pomysłów. Na szczęscie nie ma duzo bo tylko kontroler, Router, Widok, i ConfigClass. To ostatnie to trzeba rozbudować o generator itp. :) Ale w trakcie przerwy nie próżnowałem tylko od czasu do czasu myślałem co nieco. Między innymi tematem były szablony. Osobiście jestem przeciwnikiem Smarty i pochodnych. Nie widze praktycznie zadnej różnicy między < ?php echo $title ?> A {title}. No zapis jest krótszy i troche prostszy i tyle. Ale żeby do tego pisać specjalne klasy to nie dla mnie. Z kolei wszyscy zwolennicy Smarty piszą ze graficy nie znają php, i nie bedą sie bawić. W sumie też racja. O ile wyświetlenie zmiennej to nic, ale juz pętli czy instrukcji warunkowej to troche trudniejsza sprawa. W smarty tez nie jest za kolorowo, tylko troche mniej groznie wygląda ;) I jak tu dogodzić jednym i drugim. Wyjściem które sprawi, że i grafik i programista będzie zadowolony, będzie tymczasowy szablon. Coś bardzo banalnego. Skoro grafik juz poświecił kiedys czas i nauczył sie skladni Smarty, to nie rzucajmy mu klód pod nogi tylko wspomagajmy. Niech sobie dalej używa skladni Smarty jak gdyby nigdy nic. Potem ja, programista :D odpalam skrypt php, który mi to wszystkie Smartowskie znaczki zamieni normalnymi regexpami na kod php, a wynik zapiszemy do nowego pliku. I koniec. Od tej pory używamy tylko wersji phpowej. Wersja a'la Smarty gdzies sobie leży zapisana i delektuje sie spokojem :) W razie jakiejs drobnej poprawki, moge odrazu zmienić w szablonie php, albo niech grafik zrobi to po Smartowemu, a ja znowu sobie to "przekompiluje" do normalnego php :] Takim oto sposobem wilk syty i owca cała :) Nie jest to nowośc, gdyż znane jest to jako mechanizm cache szablonów, ale eliminuje całą mase kodu. W tym wypadku wystarczą dobrze napisane regexpy i jesteśmy w domu :)
7 commentsJuż coś jest :)
Jak pisałem wczesniej tworze wlasnego frameworka. Do tej pory już całkiem sporo jest zrobione, jeśli chodzi o szkielet. Moze nie jest do idealna implementacja MVC, ale jest. Pisząc SparkleWorks bazuje a dokladniej podglądam troche rozwiązania z Symfony, które uważam za świetne, chociaż troche przekombinowane ;) Jak przeglądam kod to czasami dochodze do wniosku, że wiekszość rzeczy jest poprostu sztuką, dla sztuki. Czyli napiszemy to bo to fajnie wyglada, chociaz jest nie bardzo użyteczne ;)
Ale wracając do frameworka. Najgorzej było na początku zacząć. Stworzyć tą pierwszą klase i funkcje, później nastepną. Miałem wiele pomysłów, tylko nie miałem pomysłu jak przelać to na kod. W koncu sie udało i powstał szkielet.
Sparkle It!!!
Długo dojrzewała we mnie myśl stworzenia wlasnego frameworka, aż w końcu sie dokonało :) Po długiej przerwie w zabawie php, trwająca coś ponad rok czasu zacząłem grubej rury :) Najpierw dostałem sie do projektu ToNieProblem.pl z uczelni. Wymagało to nauczenia sie frameworka. Padło na Symfony . Z tego co wyczytałem to mało kto go lubi bo to wielka kobyła i w dodatku bardzo skomplikowana z ogromem konfiguracji. Fakt zgadzam sie :D Ale mi sie podoba. Jednak nie zmiania faktu, że jest kobyłą. Dlatego też do mniejszych rzeczy w ogóle sie nie nadaje. Dlatego też postanowiłem wyjść na przeciw i stworzyć SparkleWork. Kiedyś Sparkle miał być rozbudowanym CMSem, ale teraz bedzie już frameworkiem :)
2 commentsPropel jest blee
Na początku tak mi sie podobał. A im więcej go poznaje i używam, tym bardziej sie zniechęcam do niego :( Niby ułatwia prace, ale nie do końca. Brakuje kilku funkcji, albo coś nie działa. Np. Prosty UPDATE wielu wierszy trzeba zrobić tak:
-
$c = new Criteria();
-
$c->add(AnswerPeer::QUESTION_ID, $this->getRequestParameter('id'));
-
$this->objs = AnswerPeer::doSelect($c);
-
foreach($this->objs AS $this->obj)
-
{
-
$this->obj->setIsDeleted(1);
-
$this->obj->save();
-
}
Przygotowana funkcja doUpdate jakoś nie za bardzo chce działać :|
2 comments“Update pole = pole+1″ in propel == impossible
Najpierw strach... Co to w ogóle jest... Później poznawanie... zachwyt...A teraz rozczarowanie :/ Taki potężny zestaw narzędzi, a nie przygotowali nic do tak prostego zapytania:
UPDATE table SET pole=pole+1 WHERE pole='10'
Zamiast tego trzeba najpierw pobrać ręcznie wartość, a dopiero póżniej ją zUPDATEjtować :|
17 commentsPrac ciąg dalszy
Po krótkiej przerwie (3-4) dni wróciłem do roboty. Sciągnąłem nowe phpide, ale jakoś nie zauważyłem róznicy. Musiałem dokończyć sprzątać co nabroiłem ostatnio jak zmieniłem strukture kategorii. Błędy już poprawione, jeszcze tylko uzupełnić metode kasowania pytań i... No własnie. Nie mam za bardzo pomysłu co dalej. Pewnie zrobie szerszą edycje pytań i odpowiedzi :)
No comments