Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Automatyczny update aplikacji
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
treewood
Jako twórca pewnej aplikacji internetowej mam pewien problem.
Zastanawiam się nad tym by zrobić automat do update'u.
Oczywiście wszystko jest piękne do czasu gdy w kodzie php (w klasach, metodach itd) nie pojawiają się pewne specyficzne metody, obliczenia.

Czy macie jakiś pomysł w jaki sposób oznaczyć kod tak by update dotyczył całej aplikacji oprócz pewnych "segmentów", które były zrobione specjalnie dla danego klienta (indywidualizacja?).

Proste to niby gdy mamy osobne metody specyficzne dla klienta i trzymame je w innej klasie/pliku/miejscu. Jednak gorzej jest gdy zmiany dotyczą już istniejących metod.

Myślałem by każdą instrukcję np. if else dzielić na jakieś bloki np.
[php:1:b25050b7fe]<?php
if(warunek){
realizacja
} #1#
#after 1
elseif(warunek){
specyficzna realizacja kodu. tego normalnie nie ma
}
#before 2
elseif(warunek){
realizacja
} #2#
else {
realizacja
} #3#
?>[/php:1:b25050b7fe]

Oczywiście to prymitywny przykład i łatwo tą sytuację rozwiązać. Chodzi mi jednak o sens.
W normalnym/standardowym kodzie części instrukcji elseif między #after 1 i #before 2 nie będzie i w czasie update musi być wiadome, że tam a nie gdzie indziej ten warunek musi być wstawiony/nieruszony.

Czy macie jakieś lepsze pomysły/doświadczenie?
spenalzo
Hmm... a nie najprostsze rozwiązanie?
Tworzysz sobie dwa pliki: w jednym ogolne klasy, funkcje itd, a w drugim takie specyficzne - przy update tylko podmieniasz pierwszy plik.
treewood
no to jest banalne rozwiazanie [; i o tym juz pisalem ... jednak czasem trzeba pogrzebac w kodzie, ktorego nie chce zmieniac bo coz ... mam jakas metode w klasie i ona cos realizuje (np. wyszukuje) i gdzies odwoluje sie do tej metody i teraz ... robi sie syf w przypadku gdy musialbym tworzyc nowa podobna metode (specyficzna dla klienta) poniewaz w wielu innych plikach odwoluje sie do tej metody i w ten sposob zmuszony bylbym do zmiany nie jednego pliku ale np. 5-10

tak samo tyczy sie to obliczen, dodawania do tabel itp.
dlatego by zrobic mniejszy chaos dokonuje zmian juz w istniejacych metodach i przy return po prostu jest inny wynik.
intol
A gdyby tak zmieniać konkretne linijki w pliku? Np. 55 a wniej tylko echo"Skrypt": by było...
Jeszcze przydała by się mozliwość wstawiania nowych linijek między istniejące, sktypt poza tym musiał by mieć swoją wersję gdzieś zapisaną...
treewood
czyli 1 linijka = 1 czynnosc ?
wyjscie takze ale co w przypadku gdy sa roznice w liniach?
najwazniejsze przeciez jest to by skrypt nie wstawial tylko nowych linii ale by wstawial je w odpowiednie miejsca.

tak jak pisalem myslalem o specyficznych oznaczeniach kazdej funkcji/czynnosci/dzialania
tak by w latwy sposob latwo bylo sie znalezc w kodzie ale to tez troche utrudnia sprawe bo przeciez zmuszeni jestesmy do oznaczania wszystkiego co skrypt ma robic a komu by sie to chcialo?

chodzi tu o cos uniwersalnego co by mialo nawet szersze zastosowanie ...
a jesli nawet nie szersze to bynajmniej by sprawdzalo sie dobrze w konkretnym przypadku
Nalfein][WR
Najbardziej uniwersalne byłoby chyba parsowanie plików php. php ma wbudowany w siebie parser:

http://www.php.net/manual/pl/ref.tokenizer.php
http://www.php.net/manual/pl/tokens.php

Trzeba by "tylko" zaprogramować język w jakim dałoby się określić co należy zmienić (takie skrypty aktualizacyjne) np. jako dialekt XML-a. To by miało szerokie zastosowanie i można by tego użyć do np. implementacji systemu wersji w php coś jak CVS. Ale jest to trochę pisania i projektowania.
Cudi
Podobny wątek był na forum webcity.php.pl, może wnioski i rozwiązania z tamtąd sie przydadzą:
:arrow: http://webcity.php.pl/forum/index.php?act=...t=ST&f=15&t=952
GrayHat
klasy inwidualne oznacz komentazami jakimis i przy aktualizacji pomijaj text miedzy tymi komentazami...
treewood
grayHat << to juz bylo pisane. pestka jest to gdy robisz specjalne osobne moduly (klasy/metody) dla indywidualnego klienta i to wszystko po prostu wciskam do innego pliku to najlatwiej ... ale co gdy zmiana musi miec miejsce w kodzie oryginalnym tylko dlatego, ze do tego wlasnie kodu odwoluje sie z wielu innych miejsc np. obliczenie ceny brutto biorac pod uwage marze lub narzut, cene zakupu, stawke vat i upust (rabat).
regula jest niby taka sama ale jak widac klienci sa rozni i jeden juz wyskoczyl z pomyslem iz chce by to bylo wszystko inaczej obliczane ... to przyklad. takich zmian jest masa ...
problem tez gdy zmuszony jestem do stworzenia osobnej tabeli w SQL'u i zastosowania jej w juz istniejacych zapytaniach ... mozna by to rozwiazac albo tworzac wszystkie zapytania SQL od poczatku uwzgledniajac dodatkowa tabele albo zrobic w podzapytaniu inne zapytanie ... bynajmniej tu i tu wymagana jest juz ingerencja w oryginalny kod
radziel
Najprostrze rozwiązania bywają najlepsze ...
Czy nie wystrarczy "Patcha" pisać normalnie jako plik txt, a jego zawartość niech będzie identyczna w strukturze jak pliki instalacji Modów do PHPbb?

np

Cytat
----[OPEN FILE: {PLIK}]-------
----[FIND: {JAKAS LINIJKA}]------
----[AFTER ADD]-------
{JAKIS KOD}
----[/AFTER ADD]------


Wydaje mi się że tego typu "aktualizacja" jest najprostrza...
intol
A jest jakiś program który automatycznie wgrywa mody?
radziel
Cytat
A jest jakiś program który automatycznie wgrywa mody?


Wystarczy napisać "parser" do tego typu "kodu" który podałem wcześniej winksmiley.jpg
intol
A może ktoś zna link do takiego paraser'a? Jeżeli byłby oficjalny (czy coś takiego 8) ), mógłbyś przy okazji podpatrzeć "jak oni to robią"... :wink:
bumelang
Być może nie jest to odpowiedź na pytanie autora wątku, ale dyskusja schodzi dość jednoznacznie na przepisywanie w php bardzo starych i sprawdzonych narzędzi, które są w każdym unixopodobnym systemie i nazywają się diff i patch winksmiley.jpg (tudzież ich windowsowych i innych javowych odmian).

W szczególności nie rozumiem, Nalfein][WR, do czego miałoby prowadzić przepisanie korzystających z tych dwóch - będących standardem - rozwiązań w php.
eXtreme
heh... mój brat (Zyx z webcity[.php].pl) w swoim enginie stron www (http://fillarws.sourceforge.net) zrobił taki bajer z patchami że wystarczy zrobić plik patrzujący który wygląda mniej więcej tak:
[php:1:3cb0141db9]c|This is a sample patch file!
g|37
-| private $session_id;
-| var $session_user;
-| var $session_ip;
+| var $session_id;
+| private $session_user;
+| private $session_ip;
| var $session_browser;
-| var $session_page;
+| private $session_page;
g|51
+| // Main constructor
+| // calls init_session();
g|70
-| $sql -> sql_query('UPDATE users, sessions SET user_lastvisit = sessions.session_time WHERE sessions.session_time < '.(time() - fws::$config -> SESSION_TIME));
-| $sql -> sql_query('DELETE FROM sessions WHERE session_time < '.(time() - fws::$config -> SESSION_TIME));
c|***************
c|* Let's add something to the session init
c|***************
f| $this -> session_type = $session_type;
+| $this -> session_bizi = 19;
g|196
+| // elele
+| // elele
e|[/php:1:3cb0141db9]
c - komentarz patcha
- - usunięcie linijki
+ - dodanie linijki
- (spacja) pozostawienie linijki tak, jak jest
g - idź do linii XXX
f - znajdź linię
e - zakończ patch

Dzięki takiej konstrukcji możeliwe jest też łatwe odinstalowanie patcha, ponieważ interpreter zamienia sobie funkcjami + i - i plik powraca do pierwotnej formy.
radziel
@eXtreme: mawet sobie ściągnełem ten "framework" niestety nie mogę znaleźć parsera odpowiedzialnego za przetworzenie tego pliku...
PS. Czy mogę wykorzystać w swoim projekcie klase do obsługi szablonów... // nie moge znaleźć gg Zyx'a :/
eXtreme
engine/filesystem.php
metoda: patch_file();

ps. tu od zyxa messag: "FWS to nie jest framework smile.gif. Projekt jest open-source (GNU GPL), więc jak zaznaczysz, że to moja klasa, to nie ma sprawy. GG mojego w necie raczej nie znajdziesz".
a1internet
Cytat
Czy macie jakiś pomysł w jaki sposób oznaczyć kod tak by update dotyczył całej aplikacji oprócz pewnych "segmentów", które były zrobione specjalnie dla danego klienta (indywidualizacja?).


Myślę, że tą kwestię najlepiej rozwiązać na poziomie architektury samej aplikacji. W końcu to wręcz podręcznikowa sytuacja, w której warto zastosować programowanie obiektowe. Chcesz wyświetlić indeks newsów w serwisie. Piszesz klasę PageNewsIndex wykorzystującą szablon Page/NewsIndex.html i korzystającą z klasy News.php (obsługującej odczyt danych z tabeli "news" w bazie danych albo innego źródła).

Jeśli chcesz dopisać nowe funkcje specjalnie dla konkretnego klienta, to tworzysz klasę PageNewsIndexKonkretnyKlient bazującą na PageNewsIndex, rozszerzającą już napisane lub dodającą nowe metody.

Wystarczy teraz umieścić obie klasy w innych katalogach i możesz uaktualniać PageNewsIndex do woli, a u klienta wyświetlanie newsów będzie wciąż działało tak jak sobie zażyczył.

Często nie trzeba nawet tworzyć nowej klasy, wystarczy zastosować inny szablon.

Na tej właśnie zasadzie (w duużym skrócie) opiera się nasz system A1 Framework.
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.