ugrás a tartalomhoz

CMS, Framework vagy saját fejlesztés?

ggabor · 2011. Május. 9. (H), 11.09
Már egy ideje aktuális lenne egy saját oldal létrehozása.
Az oldal egy olyan portál lenne, ahol alapvetően egy hatalmas katalógusból lehet rendelni felhasználók által feltöltött dolgokat (apróhirdetés+webshop. mint pl.: e-bay, vatera), de kiemelt fontosságú különböző témába vágó cikkek, hírek, események magazin szerű megjelenítése is, továbbá különböző közösségi funkciók is lennének, mint például az egyes termékek, vagy eladók/vevők értékelése, egyéb párbeszédek, illetve nyílt fórum további kérdésekről nyitott eszmecserékhez.

A feladat elméleti háttere már ki van dolgozva. Ide értve az adatbázis szerkezetet, a különböző funkciók működését, a fő- és almenüpontokat és egyéb működési kérdéseket. Elkészült továbbá a komplett template is, amely szinte minden oldal részletes megjelenítését tartalmazza.

A problémát jelenleg a php kód jelenti. Lassan két hónapja próbálom megtalálni az ideális megoldást, amely megfelelő sebességet és biztonságot jelent akár többezer látogató esetén is.

Próbáltam több framework-öt is (yii, symfony, codeigniter) de ezek számomra nem tűntek túl hatékonynak. A kódjukat nézve arra jutottam, hogy ezek a programozó dolgát tényleg egyszerűsítik, cserébe viszont rengeteg ponton lassítják az oldalt.

Gondoltam arra is, hogy valamely CMS-t érdemes lenne felhasználni. Megnéztem a drupal-t kicsit közelebbről és úgy tűnik ez sem nyújt szinte semmi olyat, amivel a feladatot könnyedén megoldhatnám. Ilyen-olyan modulokat kellene letölteni, majd továbbfejleszteni és rávenni bizonyos funkciókra. Akkor inkább már framework vagy saját fejlesztés.

A fentiek alapján nekiálltam egy saját fejlesztésnek. Ezen a ponton szinte csak az MVC/OOP megoldást preferálja mindenki. Nagyjából értem, hogy ez miért jó, de itt is azt gondolom, hogy sokkal inkább a fejlesztő dolgát könnyíti meg a teljesítémény rovására. Ezért kialakítottam egy olyan egyszerű rendszert amely procedurális alapon, de mégis MVC szerint szervezve nagyjából OOP szerint, de nem php objektumokkal dolgozik. Lényegében egy könyvtár/fájl struktúra. Ez viszont tényleg csak néhány alapvető dolgot, mint például az aktuális nyelv, a választott template és a kért vezérlő irányítását jelenti.

Ti mit gondoltok, mi lenne a legjobb módszer egy igazán összetett oldal gyors kiszolgálására? Készítsek egy rakás osztályt, ami lassítja a működést, de gyorsítja az én munkámat? Válasszak egy framework-öt, amely sosem lesz olyan gyors mint egy saját fejlesztés, de könnyebb vele haladni? Vagy fejlesszek ki egy objektum orientált php rendszert, amely ugyan jól struktúrált, de mégis lassabb mint a procedurális megközelítés? Vagy maradjak a procedurális, fájl/függvény alapú megoldásnál?

Egyébként a saját fejlesztésben most ott akadtam el, hogy a template master fájljában döntsem el, hogy mi jelenjen meg, vagy a vezérlő valahogy (de hogy?) mondja meg a masternek, hogy mit mutasson?
 
1

Pénz = idő

stan · 2011. Május. 9. (H), 12.04
Igazából nem hiszem, hogy az objektumok vagy egy keretrendszer használata jelentősen lassítaná az oldalt. Sőt keretrendszer esetében sok minden optimalizálva van, így akár gyorsabb is lehet mint a te kódód.

Inkább a template betöltésén aggódnék, mert általában ott veszít a legtöbb sebességet egy weboldal betöltése. Érdemes lefuttatni a Google által kifejlesztett (online) PageSpeed programot, meg fogsz lepődni mennyi lehet spórolni csak a megfelelő beállításokkal, akár a betöltési idő 70%-át is (!!!):
http://pagespeed.googlelabs.com/

Szóval a sebesség miatt nem aggódnék a php kód esetében, mert az általában nehezen észrevehető különbséget produkál, ha esetleg pontosan kiméred a betöltés sebességét, akkor lehet valamennyi különbség. Meg nyilván függ a tárhelyed kapacitásától is, de az szintén nem php kérdés.

Viszont ennél sokkal fontosabb kérdés, hogy milyen gyorsan tudsz haladni a programozással, mert nyilván annál hamarabb kezd pénzt termelni a weblapod, és minél több fejlesztést tudsz csinálni, annál funkcionálisabb lesz az oldalad, és annál több visszatérő látogatód lesz, ami megint csak a pénzt termeli.

Az általad felvázolt kőbaltás megoldás nyilván elég gyors, egyszerű, és átlátható. Azonban el fog telni 1-2 év, és rájössz, hogy néhány új funkció leprogramozása napokba vagy akár hetekbe is beletelik, jóllehet ugyan ezt egy megfelelően felépített oop-s rendszerben vagy keretrendszerben egy délelőtt alatt meg tudtad volna csinálni.

Szóval szerintem inkább most tanuld meg a megfelelő technikákat. Ha esetleg nem tetszenek a framework-ök, akkor is legalább tanuld meg az oop-s mvc-s technikákat, de előbb utóbb nem árt egy framework használata. Pl. próbáld ki a zend-et, amelyet a php fejlesztői csinálnak, az az egyik legnépszerűbb, de van aki másra esküszik.

Most pár nap vagy pár hét tanulással később hónapokat vagy akár éveket is nyerhetsz a fejlesztésben! A most tanulásra fordított idő később sokszorosan megtérül.

Összegezve: mindenképpen saját fejlesztésben / frameworkben gondolkodj, de csak akkor, ha hajlandó vagy kitanulni a megfelelő technikákat. Meglévő CMS rendszerrel tapasztalatom szerint nem érdemes ilyen bonyolult rendszerbe kezdeni, mert lehet, hogy alapvető elgondolásokat máshogy szeretnél. Szóval lehet, hogy az egészet át kellene írni ahhoz, hogy neked jó legyen, annak meg már nincs értelme. Én is azért kezdtem el php-t és a kapcsolódó technikákat kitanulni, mert voltak olyan problémák, amelyeket nem tudtam egy meglévő cms rendszerrel megoldani, vagy csak óriási munka árán lehetett volna.
3

Ami kimaradt

ggabor · 2011. Május. 9. (H), 14.01
Azt az előbb kihagytam, hogy én magam rendszertervező és programozó vagyok, de az elmúlt 10 évben kizárólag c++ és .NET (C#) nyelvekkel dolgoztam. Így tehát az objektum orientált fejlesztés és a rendszertervezés sem áll távol tőlem. PHP-val korábban (12 éve?!) már foglalkoztam, annak idején készítettem is egy saját CMS-t, de ez mára már elavult. Meg a tudásom is jócskán elavult már a php-t és egyéb webes technológiákat tekintve.

Ugyanakkor összetett desktop és szerver alkalmazások fejlesztése után kicsit ágyúval-verébre esetnek tartom a php-s objektumrendszert, hiszen végülis egy-egy oldal "legenerálása" a feladat, lehetőleg nagyon rövid idő alatt. Ehhez objektumokat példányosítani nem sok értelmét látom. Az kétségtelenül igaz, hogy a saját dolgomat könnyítem meg ezzel. Sajnos arra vonatkozóan nem találtam hiteles mérési eredményeket, hogy egy komplexebb feladat objektum alapon mennyivel lassabb mint procedurálisan.

Ugyanakkor mint említettem nézegettem framework-öket, és pl. a codeigniter forráskódjában számos helyen találkoztam szerintem felesleges bonyolítással. Egy példa: include előtt mindig ellenőrzi, hogy fizikailag létezik-e a fájl és olvasható-e. Csak ezután include-olja. Egy jól tervezett rendszer esetén ez egy baromság, hiszen ha nincs meg az include akkor amúgy is vége a történetnek. És még számtalan ilyen apró dolog van ami nem tetszik.

De ha már itt tartunk egy dolog a mai napig nem világos az MVC tekintve. Melyik rész az ami meghatározza, hogy az aktuális page milyen elemekből épüljön fel? A controller vagy a view? Ha a view, akkor ez azt jelenti, hogy minden controllernek kell legalább egy, de inkább több view fájl, ami összességében rengeteg. Ki győzi ezt karbantartani? Ha a controller mondja meg a tartalom "blokkokat", akkor ezt milyen módon tudatja a view-val? Egyszerűen include-olja ami kell? Ez komplexebb oldalnál nem megy.

Számos példát láttam arra, hogy a (master) view közepén van egy sima echo $content. De ha a content több elemből kell felépüljön és esetleg több controller alapján, akkor mi van?

Megmondon őszintén kicsit most kifogott rajtam ez a view-controller témakör, mert szinte mindenhol csak egy adott rendszerhez van tutorial, vagy általános formában szinte csak hello world van, ami nagyon kevés.
5

Sebesség

Poetro · 2011. Május. 9. (H), 14.11
Ha már mindenképpen a sebességen lovagolsz, akkor miért nem C++ vagy C# nyelven írod meg az alkalmazásodat? Az sokkal gyorsabb lesz, mintha PHP-ban írtad volna meg, ráadásul már ismered is a nyelv sajátosságait, nem kell a PHP API őrültségeivel megküzdeni. De most komolyan. Ha egy PHP keretrendszert vagy CMS-t használsz, azzal vesztesz tegyük fel 10-30% teljesítményt. De ha ugyanezt mondjuk C++-ban írnád meg akkor többször gyorsabb lenne az alkalmazásod. Igazából csak az érdekel, miért pont PHP? És ha már PHP akkor miért pont a sebességen nyavalygunk?
8

Ez engem is érdekel,

inf · 2011. Május. 9. (H), 14.53
Ez engem is érdekel, asp.net-ről azt hallottam, hogy két pillanat összerakni egy oldalt. :-)
9

miért éppen php?

ggabor · 2011. Május. 9. (H), 14.54
Egyrészt mert az ASP host-ok igen drágák, másrészt meg gondoltam felelevenítem a php-s ismereteimet ennek kapcsán. A sebességen egyébként nem "lovagolok", csupán tisztában vagyok vele, hogy nagyon sokat számít a sebesség. Gondolom te sem szeretsz hosszú másodperceket várni egy-egy kattintás után. És ezzel nem azt mondom, hogy a meglévő keretrendszerek biztos lassúak, csak azt nem akarom, hogy mondjuk megoldom az egészet codeigniter-el vagy symfonyval és a végén, amikor már minden funkció működik kiderül, hogy már kisebb terhelés mellett is nagyon belassul. És ekkor ugye kezdhetném előről az egészet.
10

Ezt a belassulás dolgot nem

inf · 2011. Május. 9. (H), 15.02
Ezt a belassulás dolgot nem tartom túl valószínűnek. A kimenetet ezerféleképpen lehet kesselni ezeknél a rendszereknél, szóval ritka az, amikor egy teljes oldalt a nulláról le kell generálni.
11

Examiner.com

Poetro · 2011. Május. 9. (H), 15.03
Nem tudom, nekünk általában az I/O-val vannak problémáink. Pedig az Examiner.com egy Drupal által hajtott weboldal, és napi több mint 2 millió oldalletöltésünk van.
60

C

janoszen · 2011. Május. 10. (K), 19.26
C-vel tudsz FastCGI alkalmazást írni, az csomó helyen elfut. Had ne mondjak neveket, de évi 14e Ftért olyan tárhelyet kapsz, amin SSH is van. Havi egy meki ára és nem kell számodra kényelmetlen nyelvvel bajlódni.
6

De ha a content több elemből

inf · 2011. Május. 9. (H), 14.50
De ha a content több elemből kell felépüljön és esetleg több controller alapján, akkor mi van?

Általában a controllerek egy kérést kapnak, amit validálnak, ha valid, akkor végrehajtják, aztán vagy válaszolnak valamit, vagy nem. Ha van válasz, akkor annak tartalmát a view kell, hogy összerakja a controllernek ahhoz semmi köze. Az egyes részeket helperek rakják össze. Szóval mindig csak egy controllert hívsz. Ha több controllerben szerepel ugyanaz a rész, akkor azt ki kell emelni controller helperbe. Ha a viewoknak van közös része, akkor azt meg view helperbe kell kiemelni. Az optimalizálásnál a válasz egyes részeit, amit a helperek visszaadnak érdemes ugyanúgy kesselni, mint magát a teljes választ. Kb ennyi, amit tudok a témáról.
12

ennek így mi értelme?

ggabor · 2011. Május. 9. (H), 15.07
Nem mondom, hogy teljesen világos. Amennyire én láttam a kész keretrendszerekben a helperek sima függvények. Így viszont ez azt jelenti, hogy amint egy helper szükségessé válik máris lőttek az oop-nak, vagy legalábbis elég nagy katyvaszt kapunk.

Végülis a fő kérdésem az, hogy egy-egy előállított oldal felépítését miként lehet MVC-OOP alapján hatékonyan megoldani úgy, hogy az adott oldalon többféle tartalmi blokk van? Például a nyitólapon szeretném látni a két legfrisebb cikket (cikk controller), a legnépszerűbb top 10 terméket (katalógus controller), az új felhasználókat (users controller), a legfrisebb véleményeket (fórum controller) stb. A katalógusban meg az aktuális témakörhöz tartozó legfrisebb cikket (katalógus + cikkek controller).

Lényegében egy jól használható, moduláris view rendszert szeretnék, amely többféle template-et támogat. Itt azt is megjegyezném, hogy pl. a template rendszereket (smarty) sem tartom jó ötletnek, hiszen maga php is egy template nyelv. Így mi szükség újabb rétegre?
14

A template rendszereknek

inf · 2011. Május. 9. (H), 15.31
A template rendszereknek tényleg nincs sok értelme. Max akkor van jelentősége, ha olyan ember írja a sablonokat, akinek nem szívesen engednéd, hogy bármi komolyabb dologhoz hozzáférjen az oldalon.

Például a nyitólapon szeretném látni a két legfrisebb cikket (cikk controller), a legnépszerűbb top 10 terméket (katalógus controller), az új felhasználókat (users controller), a legfrisebb véleményeket (fórum controller) stb. A katalógusban meg az aktuális témakörhöz tartozó legfrisebb cikket (katalógus + cikkek controller).


Ahogy én látom ezek a dolgok, amiket leírtál nem kapcsolódnak szorosan az egyes controllerekhez. A controllerek szerintem inkább csak egy külső hozzáférési felületet adnak az alkalmazásnak. Mondjuk a cikk lekérésnél nem küldesz űrlapot, csak egy listát vársz, szóval a controller nem csinál kb semmit, csak a view rész a dolgozik. Szóval mondjuk a két legfrissebb cikk lekérésénél példányosítasz egy cikk view helpert, ami visszaad neked egy html részletet a két legfrissebb cikkről. De ha ugyanúgy a két legfrissebb cikket akarod lekérni, csak mondjuk nem a tartalmi részre, hanem bal oldalra a menü alá, akkor ugyanazt a cikk view helpert hívod meg, csak más kinézetre vonatkozó paraméterekkel. Én legalábbis így képzelem el.

Szóval a controllerek a public rész, ami a külső hozzáférést intézi, a helperek meg a private rész, ami a belső hozzáféréseket intézi. Mondjuk az alapján, amit írtál a legtöbb rendszerben ez nem különül el ennyire élesen.
16

most még inkább zavaros

ggabor · 2011. Május. 9. (H), 15.41
Odáig értem, hogy ezek a "modulok" végülis nem controllerek, csupán "snippet"-ek, melyeket helper függvényekkel állítunk elő. De akkor most végülis mi a túrót csinál a controller? Mi a feladata? Mert a tartalmi rész tényleges előállítása meg a model réteg feladata lenne.

Tehát adott egy url query mondjuk simán a nyitólapra. Ezen a ponton elvileg a controller-hez kerül a vezérlés, amely azonban így nem csinál mást, mint behívja a nyitólap view-t. És ebben a view-ban van ezek szerint meghatározva, hogy a fent felsorolt komponensek jelenjenek meg. Így a view-ból egyszerű függvény (helper) hívásokkal beillesztjük a szükséges blokkokat. A függvények meg a model rétegből lehívják a konkrét tartalmat. Tehát mi a szerepe a controllernek azon kívül, hogy include 'nyitolap_view.php' ?
18

A controller validálja a

inf · 2011. Május. 9. (H), 16.09
A controller validálja a kérést. Megnézi, hogy formailag stimmelnek e az adatok, van e joga a felhasználónak az adott dolgot csinálni, és csak utána hívja meg a megfelelő kódot.

A helpernek egyébként azért nem jó a függvény, mert az rontja az újrafelhasználhatóságot. Sztem sokszor előfordul, hogy helper osztályokból örököltetnek, mondjuk listáknál a rendezéssel kapcsolatos kódokat, vagy ilyesmiket. Annyira mondjuk nem folytam bele a témába. Egy időben én is gondolkodtam saját CMS-en, de most már nem látom sok értelmét. Rengeteg idő egy használható rendszert fejleszteni (főleg egyedül).
20

Hmm, lehet, hogy amiről én

inf · 2011. Május. 9. (H), 21.59
Hmm, lehet, hogy amiről én beszélek az már nem is MVC :D
21

és ezt így hogy?

ggabor · 2011. Május. 10. (K), 07.51
Ha a controllerek osztályokba vannak szervezve, akkor helperként mi szükség további osztályokra. A közös dolgokat nem lenne célszerűbb controller ős-osztályokba szervezni?

Egyébént meg azt gondolom, hogy a helperek használata felborítja az egységességet. Valahogy már az elnevezés is azt sugallja, hogy jó ez az oop-mvc, de mindig szükség van külső "segítségre", mankókra, melyek nélkül nem oldalható meg hatékonyan a feladat. Így viszont megette a fene az elméletet.

Nem tudom, hogy érdemes-e külön topicot indítani, ezért egyelőre itt kérdezem meg, hogy végülis milyen módon építenél fel egy moduláris vezérlést, ahol bármely oldalon bármely funkció egy-egy szelete megjelenhet?

Én odáig eljutottam, hogy az url elemzése révén beazonosítom, hogy melyik "page" kell: főoldal, katalógus, magazin stb. Itt arra gondoltam, hogy akár ezeken belül is lehetnek további aloldalak, melyeket egyszerű path-ként azonosítok, pl.: katalogus/ujhirdetes, magazin/hirek. És ezekhez mind-mind készítek egy-egy "page" php-t, a view alatt és itt határozom meg lényegében az oldal tartalmát.

Talán egyszerűbb, ha a könyvtárszerkezetet vázolom:

- wwwroot
--- app
----- core.php
----- data.php
----- auth.php
----- ........
--- lang
------ hu
--------- home.php
--------- catalog.php
--------- .....
------ en
--------- home.php
--------- catalog.php
--- view
------ mytheme
--------- page
------------ catalog
--------------- add.php
------------ magazine
--------------- news.php
------------ catalog.php
------------ magazine.php
------------ home.php
--------- style
------------ master.css
--------- script
------------ master.js
--------- master.php
--- config.php
--- index.php

És ezt úgy gondoltam, hogy a view/mytheme/master.php-t tölti be az index, miután egy "globális" config tömbben beállítok egy csomó mindent, ami kell. Ezután a master.php tartalmazza azt ami minden oldalra kell + egy include-ot a kért oldalra, pl.: include 'page/magazine/news.php". És mivel az oldal-t a view alá raktam, ezért itt minden okom megvan arra, hogy az oldal tartalmát vizuálisan is rögtön itt összeállítsam. A page oldalak meg az "app" alatt lévő "helperek" függvényeit hívják. Az "app" include-okat meg már az index.php megcsinálja - csak ami kell!

Vélemények?
25

Egy ilyennél pl abba kell

inf · 2011. Május. 10. (K), 11.10
Egy ilyennél pl abba kell belegondolni, hogy az url és a mappaszerkezet egyáltalán nem kell, hogy megegyezzen. Ha mondjuk magyar url-t állítasz be, akkor a catalog/add helyett katalogus/hozzaadas lesz. Szóval általában kelleni szokott egy kód, ami elosztja a kéréseket a megfelelő controllerek felé. Ez lehet mondjuk egy olyan tömb, ahol a kulcs a megfelelő regex minta, az érték meg a controller és az action, de akár lehet az is, hogy több dimenziós tömbben helyezed el ugyanígy az adatokat, az url-t meg splitteled "/" szerint. Ez utóbbi valszeg gyorsabb is, mert nem kell ezer regex-et lefuttatni. Innentől egyáltalán nem függ az url-től, hogy hogyan rendezed a php fájljaidat. Elméletileg ezt a routing kódot ki lehet tenni htaccess-be is.
Ha már mindenképp külön mappát akarsz minden controllernek, akkor a catalog.php-t berakhatnád a catalog mappába index.php néven. A lang-nál elég erős a redundancia, nem tudom, hogy az a rész pontosan mit csinálna, de nem hiszem, hogy így kéne megoldani. :-)
27

érdekes, hogy említetted

ggabor · 2011. Május. 10. (K), 11.27
Érdekes, hogy rögtön említetted az url fordítást. Pedig ezzel nem sok helyen találkoztam eddig. A kódot úgy írtam meg, hogy többnyelvű url-t is kezel egy sima fordító array segítségével. Ez a tömb meg a belsőleg használt angol nyelvű "controller" nevet adja vissza. Az alkönyvtárakat azért csináltam, mert így egyszerűen, további elemzés nélkül kiadható egy:

-- include 'view/theme/page/' . $validurl . '.php';
-- AMI:
-- include 'view/theme/page/magazine.php'
-- VAGY:
-- include 'view/theme/page/magazine/news.php'

És persze van egy validáló tömb, amiben tételesen fel vannak sorolva a "page"-ek, így tehát: array('magazine', 'magazine/news' ...), de itt már csak a belsőleg használt angol nevek!

A gondom az url fordításnál a "controller"-nek átadott paraméterekkel van jelenleg, hiszen ezeket is le kéne fordítani, de ez már rengeteg bejegyzés. pl: magazine/news/cars -> magazine/news/autok, ahol a cars/autok egy sima filter. Ezekből meg nyilván rengeteg lehet.
28

Hát én a különböző nyelvű

inf · 2011. Május. 10. (K), 11.40
Hát én a különböző nyelvű url-eket eltérő domainre vagy subdomainre tenném, és ott intézném el az url átírását az angol nyelvűre, meg hozzácsapnék a queryString-hez egy "&lang=hu"-t mondjuk.
37

szerintem mindegy

ggabor · 2011. Május. 10. (K), 12.45
Szerintem az még nem érdekes, hogy milyen formában kapod meg a nyelvnek megfelelő url-t. Ez persze lehet külön domain, subdomain, de akár simán egy nyelv jel az uri-ban, pl.: www.domain.com/hu/.

A kérdés az, hogy miután tudod a nyelvet a további url elemeket mind le kell-e fordítani, vagy csak a vezérlőig és a továbbiakat hagyjuk meg angolul? pl.: domain.com/hu/magazin/hirek/autok/legfrisebb query-ben a "magazin/hirek" már meghatározza az oldalt, az "autok/legfrisebb" meg további paraméter, a tartalom előállításához (model-nek adjuk majd át).

Nyilván érdemes végig lefordítani, csak ettől most egy kicsit megijedtem, mert ebből rengeteg lesz, hiszen ide tartoznak pl. a különböző rendezések, egyéb táblázat filterek is. Az viszont hülyén néz ki, hogy: domain.com/hu/magazin/hirek/cars/news.

Most hogy így beszélünk róla kezd letisztulni a dolog. Kell a fordítás mindenhez. Már csak azt kell kitalálni, hogy milyen formában. Talán az lesz a legjobb, ha a vezérlő tölti be a hozzá tartozó paraméterek nyelvi fordítását és a további url elemzést maga végzi. Így csak annyit töltünk be, amennyi feltétlenül kell.
79

block action

razielanarki · 2011. Május. 11. (Sze), 13.05
"Nem tudom, hogy érdemes-e külön topicot indítani, ezért egyelőre itt kérdezem meg, hogy végülis milyen módon építenél fel egy moduláris vezérlést, ahol bármely oldalon bármely funkció egy-egy szelete megjelenhet? "

én a saját mvc-mben ezt úgy oldottam meg hogy vannak ún block-actionok a controlleren (igazából ugyanolyanok mint egy rendes action, csak "block_" prefix-szel)
amiket egy pl twig-be exportált
{{ showblock ('ctrl/action/params') }}
hívással lehet megjeleníteni

(pl fejlécben egy user_panel, vagy oldalsáv modulok stb)
2

Pénzes megoldások -> ingyenes

inf · 2011. Május. 9. (H), 13.05
Pénzes megoldások -> ingyenes megoldások keresése -> saját kód írása. Kb ez a normál sorrend, nyilván ha nincs pénzed, akkor az utóbbi kettő marad. A lényeg, hogy üzleti szempontból semmi értelme saját keretrendszert írnod. Persze ha nem az üzlet miatt csinálod, hanem fejlődni akarsz, vagy csak szórakozásból, akkor semmi akadálya.
4

hol találok megfelelőt?

ggabor · 2011. Május. 9. (H), 14.06
Teljesen igazad van! A valóság azonban az, hogy kerestem korábban php fejlesztőt a munkára, de nagyon siralmas volt a felhozatal. Összesen 8 jelentkezővel beszéltem személyesen, de számomra az derült ki, hogy mind ilyen otthoni hobbi programozó és jó esetben megtanult valami kész rendszert úgy-ahogy gányolni. Erre nem vagyok kíváncsi. Persze vannak profi webes cégek is, őket viszont egyelőre valóban nem tudom megfizetni. A kettő között meg sajnos nem találtam igazi programozót, aki tényleg érti a fejlesztés lényegét és nem csak gányolni tud.

Mivel én magam elég nagy rendszereket fejlesztek más környezetben ezért végül úgy voltam vele, hogy mi ez a php nekem, seperc alatt összerakom a rendszert. Aztán szembesültem azzal, hogy ez egészen más világ, másféle fejlesztői gondolkodás szükséges. Így nekiláttam tervezni és tanulni, de ma már szinte mindenhol a kész rendszerek mennek. Ez nem is lenne baj, de valahogy egyik sem az igazi.
7

Én zenddel fogok gányolni nem

inf · 2011. Május. 9. (H), 14.52
Én zenddel fogok gányolni nem sokára. Utánaolvasgattam, és elég jó kép alakult ki bennem róla. Nem mondom, hogy ez a tuti rendszer, mert még nem ismerem, de talán érdemes lenne ránézni, hátha megfelel neked.
13

szerintem túl nagy

ggabor · 2011. Május. 9. (H), 15.10
Megnéztem a zend keretrendszert is. Számomra úgy tűnik, hogy tényleg egy jól kidolgozott, robosztus rendszer. És pont ez az ami elriaszt, hiszen igen sok idő elsajátítani, részleteiben átlátni és közel sem biztos, hogy néhány hét után nem derül ki, hogy alapvetően alkalmatlan arra, amire kellene.
15

Hát jó, csak amíg gondolkodsz

inf · 2011. Május. 9. (H), 15.33
Hát jó, csak amíg gondolkodsz rajta, addig telik az idő, és nem történik semmi :D
17

oké, hogy idő, de mégis

ggabor · 2011. Május. 9. (H), 15.45
Az igaz, hogy így telik az idő, de csupán azért, hogy mielőbb legyen "valami" még nem biztos, hogy érdemes összecsapni a dolgot. Egyéb fejlesztéseim során már régen leszoktam a durr-bele stílusról, amikor alapos tervezés nélkül belecsapunk a lecsóba. Ebből még sosem származott semmi jó. Tehát ha van értelme kicsit átgondolni a dolgokat, akkor mindeképpen érdemes erre időt szánni még az érdemi kódolás előtt.
19

Yepp, én csak azt mondom,

inf · 2011. Május. 9. (H), 16.10
Yepp, én csak azt mondom, hogy a másik véglet sem jó, szóval hogy túl sokat gondolkodsz, és nem történik semmi. Én inkább ez utóbbiba szoktam beleesni.
22

MVC, ki hogyan

Max Logan · 2011. Május. 10. (K), 08.59
Az elmúlt fél évben több fejlesztést csináltam. Minden esetben más-más felépítést, megközelítést alkalmaztam a PHP oldali részek kezelésénél, de minden esetben próbáltam szétválasztani az M-V-C logikát. Volt ahol csak az M-VC szétválasztás valósult meg, de ott és akkor már ez is éppen elég volt.

Kb. 3 éve ismerkedtem meg az MVC-vel. Azóta ezen szemlélet mentén próbáltam építkezni. Az utolsó fejlesztésem kapcsán (amin most dolgozom) gondoltam, hogy megint más megközelítésben állnék neki a kérdésnek (ez fél éven belül talán a 4. féle megoldás lesz :-)).

Ennek okán elkezdtem kicsit keresgélni MVC témában; a meglévő ismereteimet bővítendő. Azt látom, hogy ahány ember, annyiféle értelmezése van az MVC-nek. Van ahol azt írják, hogy az MVC felépítés esetén a VIEW csak és kizárólag a CONTROLLER-től fogad adatokat, melyeket meg kell jeleníteni. Másik cikk azt írja, hogy ennek éppen ellenkezője az igazi, azaz a VIEW csak és kizárólag a MODEL-től fogad adatokat, a CONTROLLER nem közvetítő ezen rétegek között. Egy másik értelmezés esetén a CONTROLLER nem csinál mást csak a tényleges felhasználói aktivitásra reagál, tehát a MODEL objektum mind a VIEW, mind a CONTROLLER esetén át van adva "saját használatra". Így egy sima lekérdezés esetén a CONTROLLER nem is csinál semmit (csak update, stb. műveletek esetén).

Őszintén megmondom, hogy a magam részéről jó iránynak tartom ezt a szétválasztást, de azért egyre inkább vannak fenntartásaim. Az vitathatatlan, hogy miért jó irány az egyes logikai egységek szétválasztása.

A probléma viszont az, hogy éppen a WEB az, ami a legtöbb gondot okozza ezzel kapcsolatban. Mert míg egy desktop alkalmazásnál nem kell azzal foglalkozni, hogy a felhasználó meghamisíthatja a UI-t (max. ha crack-eli a progit), addig itt -- mivel minden szöveges kommunikáción alapszik -- minden esetben újra kell építeni a felhasználói felületet, ami felesleges köröket jelent minden egyes oldaltöltésnél.

Újra kell építeni egy menüt, amiben be kell jelölni, hogy melyik az éppen kiválasztott elem. Ez egy AJAX webalkalmazás esetén a kliens, azaz JS dolga. Míg egy nem AJAX rendszer esetén minden egyes oldaltöltésnél kell egy menüösszerakó rutin, aminek valamelyik pontján egy programrész megmondja például az URL alapján, hogy melyik a kiválasztott menüelem*. De itt már jön is a szívás, hogy validáljuk a menü ID-t, megfelelő-e (típus, érték), stb.

Ennek okán hiába az MVC, ha olyan köröket kell futni, ami teljes mértékben felesleges és az ember gondolkodik, hogy akkor mit hova toljon be. Ez nagyjából a helper téma, amit fentebb is boncolgattok.

Ebből is látszik, hogy a WEB-et olyan módon akarjuk használni, mint egy desktop alkalmazás, de alapjában véve nem erre lettek kitalálva az építőkövek. Annó az MVC is ugye a GUI alkalmazások esetén jelent meg, de ott minden marad a memóriában, nem kell újraépíteni az egyes oldaltöltéseknél az egész UI-t. Ez AJAX esetén nagyjából megvalósul, de ott is kérdés, hogy mit hogyan oldjunk meg. Ha desktop like megoldásban gondolkodunk, akkor ott a PHP (vagy bármilyen backend) ténylegesen csak adatot szolgáltat. Ha pedig ez így van, akkor elértünk oda mint a DOS-os időkben, hogy kézzel kell összerakni a UI-t, igaz JS segítségével.

Egyre inkább kezdek kiábrándulni ebből a honlapkészítős témából, mert már tényleg olyan módon használjuk az egészet, aminek köze sincsen ahhoz, amire annó kitalálták.

Tartom, hogy a HTML, CSS alapvetően dokumentumok leírására való és nem online alkalmazások fejlesztésére. A szöveges alapú protokollok és az egész WEB működése sok sebből vérzik, ha alkalmazásokat akarunk írni.

Így pedig már nem csodálkozom azon, hogy nem tudjuk eldönteni egy WEB-es fejlesztés esetén, hogy MVC-ben mit hogyan. Mert nem ilyen közegbe, nem ilyen technológóiai környezetre lett kitalálva az MVC...

* Éppen tegnap futottam bele ebbe. Ha a menü elemei adatok, akkor azt a model rétegnek kell prezentálnia. Hogy melyik az aktív menüelem, ezt ki lehet olvasni az URL-ből. De ha a modelnek átadjuk az URL-t feldolgozásra, akkor már sérül a logikai szétválasztás. Mert a modellnek -- szerintem -- nem kell tudnia, hogy mi az az URL. Ekkor jött a következő lépés, hogy a menü objektumnak legyen egy setActive() metódusa, melyet a controller rétegben hívok meg az egyes action-öknél.
23

tökéletes megfogalmazás

ggabor · 2011. Május. 10. (K), 09.02
Tökéletesen leírtad az általam megfogalmazni próbált kérdések hátterét. Én mint desktop fejlesztő hasonlóan látom a webet. Lényegében egy katyvasz lett mára az egész webfejlesztés, ahol mindenki a saját igazát bizonygatja, de nincs sehol egy egységes megoldás. Sőt nemcsak, hogy megoldás, de még egységes elméleti útmutató sincs.

Én emiatt végső soron arra jutottam, hogy a php feladata egyszerűen annyi, hogy egy oldalt előállít. Így talán a legegyszerűbb megoldás lesz a legcélravezetőbb, mégpedig az, hogy mindent úgy kellene szervezni, hogy amint egy-egy eleme az oldalnak előállítható állítsuk is elő és menjünk tovább. Ne szarakodjuk minenféle oop-mvc paradigmákkal, csak akkor ha ez az oldal előállítását megkönnyíti.

Sajnos azonban ezzel úgy tűnik net-szerte egyedül vagyok. Mindenhol a desktop alkalmazás gondolatait igyekeznek görcsösen átültetni webre és mint ahogy te is írtad, ez nem igazán célravezető. Mi a francnak példányosítsunk 3-4 osztályt, töltsünk be egy rakás "helpert" meg egyebet mondjuk egy menü előállításához, amit egy sima array-ből is felépíthetnénk pillanatok alatt?

Komolyan elgondolkodtam azon, hogy csupán hobbiból indítok egy open-source projektet web-framework témában a fentiek alapján. Persze ez lenne így százmilliomodik framework, de mivel ilyen működést egyik létezőnél sem találtam, talán lenne értelme.
24

Oldal előállítása

Max Logan · 2011. Május. 10. (K), 10.36
Az oldal előállítása egy érdekes téma. Az egyik rendszernél csinlátam egy objektumot, aminek sok-sok metódusa az oldal egyes részeinek előállítását végezte, nevezhetjük ezeket helpernek. De ez csak addig jó megközelítés, amíg az oldalnak max. a tartalmi területe változik.

Kezelhetnénk az oldal egyes részeit is objektumokként, header, footer, sidebar, stb, de itt megint az lesz a gond, hogy ha nagyon eltérő elemek vannak az egyes aloldalakon, akkor igen nagy káosz lesz.

Most egy olyan megoldást alkalmazok, hogy van egy egyszerű függvény, mely a renderTemplate() nevet viseli, ezt fogja használni a VIEW objektum. Lesznek VIEW objektumok és minden egyes aloldalhoz lesznek fő .tpl-ek majd ezek include-olnak kisebb template-eket, mint pl. header, categoryMenu, stb.

És akkor itt jönnek az olyan kérdések, mint amit az előző kommentben is feszegettem, hogy egy menüelem aktív állapotát mi állítsa be, ha el akarjuk fedni azt, hogy milyen formában érkezik az összehasonlítás alapját képező menüID. Most egy SEF URL router működik a rendszerben, mely a request objektumban állítja be az adatokat. Ha nem SEF URL-t kezelő router van, sima GET paraméterekben jönnek az adatok, a végén akkor is a request objektumon keresztül lehet elérni a paramétereket. De mivel szeretném a modellt függetleníteni attól, hogy van olyan, hogy request objektum, ezért kénytelen vagyok a kontroller beiktatásával beállítani a modellben az aktív státuszt.

Szóval én arra jutottam, hogy hiába az OOP, hiába az MVC és egyéb megoldások, a WEB működése okán szinte képtelenség "tiszta" kódbázist létrehozni (ahol nem kell előbb-utóbb valami áthidaló megoldást kitalálni egy-egy funkció megvalósítása esetén).

Amit te írsz az lényegében visszavezet az alapokhoz, mármint a PHP alapvető működéséhez, hogy vannak a HTML blokkok, meg vannak az egyéb szerver oldali, dinamikus részek, amik végül HTML kódot állítanak elő, csak nem kézi, hanem gépi erővel (ciklusok, feltételek).

Én szerettem volna egy "tiszta" szerver oldali megközelítéssel dolgozni, de egyre inkább azt látom, hogy nem lehet, mert nem elég csak a szerver oldali (business logic) dolgokkal foglalkozni, olyan szintű bemeneti szűrést és olyan szintű felesleges köröket kell lefutni a stateless környezet miatt, ami túlbonyolítja az egészet. AJAX környezet kicsit jobb ilyen tekintetben, de ott meg jönnek más problémás esetek.

A WEB linkelt dokumentumok halmaza, melyekbe beágyazunk ilyen-olyan egyéb médiákat, nem pedig alkalmazásplatform. Lehet ez utóbbinak is használni, de akkor megkapjuk azt a sok szívást, amivel nap, mint nap dolgunk van.

Nem emlékszem pontosan, de talán a dinamikus szerver oldali nyelveknek az alapja az volt, hogy ne kelljen kézzel legyártani sok-sok HTML oldalt, amiben sok a redundancia, ha változik valami, akkor ne kelljen ezer helyen módosítani. Nem pedig az, hogy online alkalmazásokat írjunk, ahol igen komoly a kétirányú kommunikáció. Elősorban publikálásra, nem kétirányú interakcióra termett a WEB annó. De legalábbis nem olyan mértékű interakcióra, mint azt ma csináljuk.

A WEB jóság, mert egy igen kellemes környezet (interaktivitás, változatos megjelenés), de a technológiai alapok egyre inkább szorongatják a fejlesztőket. Ezt mondom már mióta és ahogyan látom, nem vagyok egyedül ezzel a meglátással...

Update: annó valamelyik topicban írta valaki (MVC volt a téma), hogy érdemes a modellt úgy kialakítani, hogy nem támaszkodunk arra, hogy WEB-en fog működni a rendszer. Tehát nincsenek WEB-es jellegű függőségek, pl. a modell nem használ $_GET-et és hasonlókat.

Most visszapillantottam a kódra, amit tegnap írtam, valamint arra, amit fentebb írtam, hogy a request objektumot nem akartam megismertetni a modell objektummal, mert hogy ők ne tudjanak egymásról, az előbb leírt logikai elválasztás okán.

De ez a logika már ott bukik, hogy a modellnek vissza kell adni egy-egy kategória link-jét, amihez ismerni kell az URL struktúrát. Hiába a router objektum, amit kedvünk szerint cserélhetünk, így vagy SEF vagy sima GET paraméter alapú URL-ünk van, ha a modell állítja elő az URL-eket pl. a kategóriákhoz, akkor nem lehet végső soron szépen megvalósítani a szétválaszást, mert a modellbe bele kell vinni az URL logikát.

Ezt vagy úgy lehetne feloldani, hogy képezünk egy olyan réteget a modellen belül, ami egy közbülső réteg, de ez meg már olyan szintű bonyolítás, ami felesleges egy kisebb oldalnál. Vagy áttoljuk a kontorllerbe, így meg kezdődik a hackelés.

Én úgy érzem, hogy nem igazán lehet ezzel a közeggel "tiszta" kódbázist létrehozni, ahol ténylegesen elkülönül minden. Vagy ha igen, akkor olyan szintű rétegezés és objektumhalmaz jön létre, ami teljes mértékben indokolatlan, tekintve a folyamatos oldaltöltést és az így újra és újra felépülő programlogikát.

Tehát kijelenthetjük, hogy a WEB stateless mivolta az, ami a legtöbb problémát okozza ha alkalmazásokat akarunk írni WEB-es alapokon.

Nem véletlenül írtam azt a közelmúltban az egyik topicban, hogy ha ilyen módon akarjuk a WEB-et használni a jövőben (de már a jelenben is), akkor kellenek az új technológiai alapok, nem pedig a mostani foltozgatása, ami még több szopáshoz vezet...
59

Rendszeresen elolvasom a

tiku I tikaszvince · 2011. Május. 10. (K), 19.07
Rendszeresen elolvasom a sirámaidat itt a weblaboron, hogy mekkora kókányolt vacak ez az egész web. De vesszek meg ha megértem.

Tessenek már elfogadni, hogy a web != desktop! Teljesen más környezet. Másmilyen jellegű problémákkal kell megküzdened. Más eszközök állnak a rendelkezésedre. A felmerülő problémákra a rendelkezésedre álló eszközökkel kell reagálnod.

Miért kellene egy webalkalmazásnak (igen létezik ez a kategória) ugyanúgy [b]működnie[b] mint egy asztali alkalmazásnak?

Direkt visszaolvastam most néhány megnyilvánulásodat és arra jutottam, hogy minden problémád abból adódik, hogy egy asztali alkalmazás működését akarod ráerőltetni egy arra (szerinted is) alkalmatlan környezetre.

Kívülről úgy látom, hogy a számodra két út van. Az egyszerűbb hogy felhagysz a webes fejlesztéssel és elfogadod, hogy számodra ez nem pálya. A másik, lényegesen embert próbálóbb megoldás, hogy nézőpontot váltasz, és nem próbálsz meg "széllel szembe vizelni", és a végén "megsértődni", hogy a cipődre ment.

Remélem ez utóbbit választod!
62

Norbertnek igaza van abban,

Hidvégi Gábor · 2011. Május. 10. (K), 21.02
Norbertnek igaza van abban, hogy jelenleg a weben nincs olyan frontend technológia, amelyik maradéktalanul kielégítené az igényeket. Szükség lenne például alkalmazásplatformra, amelyet hasonlóan lehetne programozni, mint az ExtJS-t, de mindezt natívan (és bugok nélkül) és így tovább. Ilyen jelenleg nincs, és esélyünk sincs rá, hogy belátható időn belül legyen, mert a szabványokat készítő "szakemberek" a saját cégeik igényeit és az aktuális divatot akarják kielégíteni, a valós igényeket nem akarják vagy nem tudják felismerni.

Maguk a sirámok szerintem is feleslegesek, mivel a helyzeten lehetséges változtatni, csak persze időt kell rászánni.
66

Re

Max Logan · 2011. Május. 10. (K), 21.44
Minden egyes gondolat közösbe dobásával formálódik a gondolkodásom, az érvrendszerem és a kommunikációm mikéntje (még ha ez mások számára nem is egyértelműen érzékelhető). Ha a gondolatiam publikálási stílusa és a mögötte érezhető érzelmi töltés számotokra finoman szólva furcsa, vagy nem tudjátok hova tenni, akkor elnézést kérek. Én ilyen vagyok, írásban. Egy kerekasztalbeszélgetés során talán egészen másképpen tudnám közre adni azon gondolatokat, melyek bennem vannak.
64

Re

Max Logan · 2011. Május. 10. (K), 21.38
Röviden: a ma WEB-je felhasználás szempontjából nem esik egybe azzal, amire a technológia ki lett találva sok-sok évvel ezelőtt. Elég a HTML és a HTTP rövidítések feloldása. Ennyi, ezek tények, ezen nincsen mit vitázni. Remélem ebben egyetértünk.

A web nem desktop, ez így van. Viszont a WEB most már közel sem az, ami volt 15 évvel ezelőtt. A háttértechnológiai meg kisebb hackeket leszámítva (értem ez alatt a HTML5-öt is) maradt ugyanaz. Holott az igények jelentős mértékben változtak, sőt olyan irányt vettek, amit szerintem senki nem gondolt volna 15 évvel ezelőtt.

Ebből nekem logikusan az következne, hogy a HTML-t kidobjuk HTTP-stől együtt és nem FF X-et, meg Chrome X-t fejlesztgetünk, mely fejlesztés során toljuk a számmarketinget, hanem megteremtjük a ma és a honlap WEB-jének tehcnológiai alapjait.

Úgy látszik, hogy ez csak nekem ennyire egyértelmű gondolatmenet.

Nem kell egy webalkalmazásnak úgy működnie, mint egy asztalinak, de könyörgöm, amivel ma webalkalmazásokat készítünk azokat az építőköveket nem erre találták ki, hanem láncolt dokumentumok publikálásra.

Építkezzünk abból, ami van. Ok, de akkor ez mellett meg foglalkozzunk azzal, hogy legyen is valami fejlődés, érdemi előrelépés az igények fényében. Ezt írtam fentebb. Ha nem JS motorokat írnánk ezerrel, hogy a jQuery szésebesen fusson, akkor lehetne új alapokat teremteni a ma WEB-jének, ami tegnap még a honlap WEB-je volt.

Tudom, nekem vannak csak olyan idealisztikus gondolataim, hogy emberek képesek távlatokban gondolkoni, nem a pillantnyi érdekeik mentén.

Az én kis naív fejemben olyan gondolatok születnek meg, ha én a WEB jövőjét nézem, hogy a Google, a Facebook, a Microsoft, az Apple, az IBM, a Cisco meg még számos nagy név összeül és kigondolják, hogy mit is lehetne kezdeni a WEB-bel, hogy az jó is legyen. Mert ha ezt tennék, akkor nem kardoskodna az Apple a HTML5 mellett és az Adobe ellen, stb. Nyerhetne ebből mindenki, csak el kellene felejteni azt a gondolkodást, hogy most akkor benyomok egy új cuccot a köztudatba és én vagyok a császár. Ez ideik oráig működik, pénzt lehet vele keresni, de értéket teremteni nem. Az értékteremtés pedig az egész közösség érdeke lenne.

Tudom, túl naív vagyok...

Ami pedig a két utat illeti. Egyfelül a WEB és a programozás nekem már évek óta ténykérdés, hogy egy kedves hobbi, nem pedig hivatás, aminek sok-sok éven át hittem. Jelenleg még pénzért csinálom, de 5 év múlva már biztosan nem fogom és nem is leszek nagyon a web közelében. Ha másik utat kellene választanom, akkor inkább nekiállnék felépíteni az új WEB-et, de legalábbis elkezdeni megszervezni a közösséget, akik ezen dolog iránt elkötelezettek és úgy vélik, hogy a HTTP, HTML, stb. nem megfelelő eszközei a ma és honlap WEB-jének. De nem teszem. Méghozzá azért nem, mert vannak az életben számomra sokkal értékesebb dolgok, amikre sokkal szívesebben áldozok időt és energiát. De ez már nagyon off, nem idevaló téma.
26

minden esetben újra kell

inf · 2011. Május. 10. (K), 11.21
minden esetben újra kell építeni a felhasználói felületet, ami felesleges köröket jelent minden egyes oldaltöltésnél


A php-nél sajnos nem csak a felhasználói felületet, hanem mindent. A felhasználói felület újraépítését ajax-al el lehet kerülni, viszont én még nem találkoztam igazán jó megoldással ebben a témakörben. Nekem a silverlight ami tetszett, de nem volt még időm mélyebben tanulmányozni.

Éppen tegnap futottam bele ebbe. Ha a menü elemei adatok, akkor azt a model rétegnek kell prezentálnia. Hogy melyik az aktív menüelem, ezt ki lehet olvasni az URL-ből. De ha a modelnek átadjuk az URL-t feldolgozásra, akkor már sérül a logikai szétválasztás. Mert a modellnek -- szerintem -- nem kell tudnia, hogy mi az az URL. Ekkor jött a következő lépés, hogy a menü objektumnak legyen egy setActive() metódusa, melyet a controller rétegben hívok meg az egyes action-öknél.


Hát az, hogy egy menüpont aktív e, a view réteg egy állapota, és a model-nek szerintem nem sok köze van hozzá. Szóval szerintem ezzel kapcsolatban az van, hogy a view kirajzoláskor elkéri az urlt (nem is fontos, hogy a controllertől, lehet egy központi kéréssel kapcsolatos adatokat tároló objektum), aztán elemzi, hogy melyik menüpont aktív, majd elkéri a menüpontokat a model-től és végül kirajzolja azokat.


Az én felfogásomban úgy van, hogy minden kommunikál mindennel, csak az nem mindegy, hogy mikor. Elsőre a controller megcsináltatja a modellel az update jellegű dolgokat, aztán letárolja, amit visszakap ezzel kapcsolatban. Utána a view elkezdi kirajzolni az eredményt. Ezzel kapcsolatban elkéri a controllertől a kéréssel kapcsolatos információkat (url, update eredményessége, stb...), aztán meg elkéri a modeltől az adatokat a lap kirajzolásához. Utána meg visszaadja a választ.
29

VIEW, mint megjelenítés

Max Logan · 2011. Május. 10. (K), 11.42
Igen, a VIEW dolga megjeleníteni, hogy mi az aktív. De ha azt vesszük, hogy a VIEW megjelenít (modelltől kapott adatokat -- hogy kontroller adja, vagy a view kéri közvetlen most mindegy), akkor nem neki kell eldönteni, hogy melyik menüpont az aktív, mármint a request adatok alapján (mert szerintem neki nem kell tudnia, hogy milyen formában jött az aktív jelzés), hanem csak egy feltételt vizsgálni az iteráció során, hogy aktív vagy sem.

Ha ezt a feladatot áttesszük a VIEW feladatkörébe, akkor kell egy view helper, ami függésben van a rendszer olyan részeivel, amit el szeretnék (mármint én) kerülni.

Update: de ha azt nézzük, úgy vizsgáljuk, ahogyan te is írod (desktop alkalmazás megközelítésében), hogy az aktív kategória megjelenítés az valójában egy VIEW-ban történt változás (ami végülis semmi egyéb programrészt nem érint; tekintsünk el az esetleges egyéb műveletektől, ami lehet pl. egy tooltip megjelentés), akkor igen, a VIEW-nak meg kell kapnia a menü előállításához szükséges adatokat a MODEL-től (közvetlenül vagy a CONTROLLER közreműködésével; végülis mindegy, én az utóbbira szavazok egyébként), majd magának eldönteni, hogy mit is jelzünk aktívnak.

A jelen környezetben a probléma végülis pont az, hogy újra fel kell építeni az egész környezetet, mind a programlogika, mind a UI tekintetében. Ez pedig nem kis szopás...
30

Hát az, nyilvánvaló, hogy a

inf · 2011. Május. 10. (K), 11.53
Hát az, nyilvánvaló, hogy a php és a html erre nem a legalkalmasabb eszköz.
31

Kár, hogy ...

Max Logan · 2011. Május. 10. (K), 11.57
... ez azoknak nem ennyire egyértelmű, akik befolyásolják azt, hogy milyen technológiai alapokon működjön a WEB. Mert ha az lenne, akkor nem a HTML5 lenne most a központi téma...
32

Hmmm én arra lennék kíváncsi,

inf · 2011. Május. 10. (K), 12.11
Hmmm én arra lennék kíváncsi, hogy miért a html5-öt támogatják, elméletileg ők okosabbak, mint mi, és mégis :D csak van valami érv mellette...
34

Irónia?

Max Logan · 2011. Május. 10. (K), 12.28
Ez irónia akart lenni?
55

Nem, tényleg érdekel, hogy mi

inf · 2011. Május. 10. (K), 16.33
Nem, tényleg érdekel, hogy mi mentén indultak el ilyen irányba. :-)
36

Szerintem jócskán hozzájárul

Hidvégi Gábor · 2011. Május. 10. (K), 12.45
Szerintem jócskán hozzájárul az Apple a HTML 5 népszerűsítéséhez a pillanatnyi érdekei miatt, mert valamiért óckodnak a Flash-től, a sok ötlettelen fejlesztő meg megy a divat után; úgy gondolom, hogy többet vesztünk, ha a HTML5-öt használjuk alkalmazásplatformnak, mert lassabb lesz a programunk, mintha valamilyen előre lefordított kóddal dolgoznánk (flash, silverlight, vagy akár java). Ráadásul a HTML egyáltalán nem erre lett kitalálva.
33

..

Greg · 2011. Május. 10. (K), 12.20
azt mondjuk nem teljesen ertem, hogy a modelnek mi koze a navigacio kiiratasahoz. jobb esetben ezt egy helper vegzi, aminek atadod mondjuk egy tomb formajaban a menuelemeket es ez a helper a request-bol majd meghatarozza melyik az aktiv menuelem. a modelt ahogy fentebb is irta valaki jobb fuggetleniteni a webes felulettol, mert lehet hogy szukseg lesz command line eleresre is hozza.
ahogy latom akiknek az mvc-vel gondja van a controllert nem tudja hova tenni. a contoroller azert is kell a view es a model koze, mert a layout-ot igy tudod fuggetleniteni az alkalmazastol es konnyen modosithatova/cserelhetove tenni.
szerintem.
35

Menü vs. Model

Max Logan · 2011. Május. 10. (K), 12.44
Nos, a menüelemek adatnak minősülnek; az én értelmezésemben. Ha azt vesszük, hogy a modell tetszőleges forrásból tud adatokat visszaadni és a modellt használó rétegnek nem kell tudnia, hogy milyen forrásból származnak az adatok (predefined PHP változó, XML, CSV fájl, adatbázis, stb.), akkor a menüelemek reprezentálása a modell dolga. Legalábbis e logika, értelmezés szerint.

Ennek okán a helper téma élő lehet, de akkor az a VIEW része, aminek a modell adja az adatokat.

Ahogyan kiveséztük, desktop megközelítésben a VIEW feladata, hogy állapotot váltson, amikor egy kattintás történik egy menüpontra. Ez pl. egy AJAX rendszer esetén nem is probléma, de AJAX nélkül újra fel kell építeni a felhasználói felületet, a kattintást érvényre kell juttatni a VIEW-ban is (meg business logic szinten is). És itt jön a kérdés, hogy mit hogyan.

Én a VIEW-t annak értelmeztem, aminek írva vagyon, azaz nézet, ami adatokat kap és _azt_ jeleníti meg egy meghatározott módon. Tehát én úgy értelmeztem, hogy a menü kiválaszottsága a menü adathalmazhoz (modell) logikailag hozzátartozó flag, így ezt a VIEW kapja, nem pedig "kisakkozza". A VIEW helperek meg csak arra valók, hogy az egyes VIEW szinten ismétlődő, vagy bonyolúltabb (ciklus, elágazás) műveleteket becsomagolja, azaz újrahasznosíthatóvá teszi, nem pedig arra, hogy kifelé kommunikáljon. Persze ez is csak egy megközelítés.

Ahogyan fentebb is írtam, ahány cikk, ahány programozó, annyiféle értelmezése van az MVC-nek.

Végkövetkeztetésként megintcsak oda tudok kilyukadni, hogy HTML+PHP alapon nem kéne alkalmazásokat fejleszteni, mert csak a szopás van vele. Az AJAX meg ugye más fronton ad megoldandó feladatokat.
38

Végkövetkeztetésként

Greg · 2011. Május. 10. (K), 13.00
Végkövetkeztetésként megintcsak oda tudok kilyukadni, hogy HTML+PHP alapon nem kéne alkalmazásokat fejleszteni, mert csak a szopás van vele. Az AJAX meg ugye más fronton ad megoldandó feladatokat.

akkor ne tedd :) alternativat is tudsz mondani?
egyebkent ez a PHP+HTML eleg erdekes kiragadas, mert python, ruby es tarsaik is html-t hasznalnak a megjelenitesre es request alapu kommunikaciot alap esetben. de pl android sdk-val is van lehetoseg hogy a GUI html legyen es js-el hivod meg a java metodusokat. ugyhogy eleg szeles korben hodit a html. szerintem.

a menudologhoz meg annyit, hogy nezd meg pl a yii framework hogy oldotta meg. ott van egy CMenu nevezetu helper, aminek egy tombformajaban atadod az elemeket es o a request-bol megallapitja az aktiv elememet es bejeloli ha akarod. tehat a model-nek nem kell tudnia melyik az aktiv elem.
40

Tudtam ...

Max Logan · 2011. Május. 10. (K), 13.17
... hogy oda kellett volna írni, hogy HTML + tetszőleges server side nyelv.

Korábban már hangot adtam annak, hogy a HTML, CSS és alapjában véve a stateless HTTP is arra való, hogy egymással linkelt dokumentumokat jelenítsünk meg.

Annó ezt is kifejtettem az egyik topicban. Ahol a felhasználó is előállíthatja a tartalmat (ilyen a blog is), szűrheti, rendszerezheti azt, ott már alkalmazásról beszélünk, nem pedig honlapról. Az alkalmazásnak egészen más technológiai alapok kellenek, mint egy szöveges tartalomnak, mely némi kiegészítést tartalmaz (képek, zenét, videók, stb.).

Mi lenne a megoldás? Én nem tudom, mert nem én terveztem a WEB-et. De az belátható, hogy egy dokumentumok leírására létrehozott közeg nem alkalmas arra (csak erős hackeléssel), amit ma WEB-ként értelmezünk. Persze működik, eddig is működött, de ahogy látszik, nagyon nem jó megközelítés online alkalmazások megvalósítására.

A HTML+CSS használata GUI kialakítására már alapvetően hibás megközelítés (mert nem erre termett), a Hypertext Transfer Protocol (stateless mivolta miatt) megintcsak hibás megközelítés online alkalmazásokhoz.

Tehát, mi lenne a megoldás? Az hogy terveznek az okosok olyan protokoll(oka)t, olyan technológiákat, amivel valóban platformfüggetlen megjelenítés érhető el és támogatja azt, amit ma elvárnak a WEB-től, hogy online alkalmazásokat tudjunk építeni; szopás nélkül.

És ha már itt tartunk, akkor erőteljesen újra kellene gondolni, hogy mit is akarunk valójában a WEB-től? Mert a browser ugye alapvetően szöveges dokumentumok megjelenítésére lett kitalálva nem pedig online alkalmazások futtatására.

Alternatívát egyébként nem nekem kellene mondani, hanem azoknak, akik évek óta az (X)HTML, CSS és egyéb ma WEB technológiákként értelmezett dolgok fejlesztésén munkálkodtak...
42

A Web mi vagyunk: te, én, a

Hidvégi Gábor · 2011. Május. 10. (K), 13.32
A Web mi vagyunk: te, én, a többi weblabor olvasó és így tovább. Nincs sehol kőbe vésve, hogy csak a W3C alkothat ajánlásokat, ők ráadásul nap mint nap bizonyítják, hogy tökéletesen alkalmatlanok erre a szerepre, mert nem elég az, hogy a valós problémákat nem ismerik fel, ráadásul még elképesztő lassan dolgoznak is mellé.
44

Így van

Max Logan · 2011. Május. 10. (K), 13.52
Mindenki beleszólhat a dolgok alakulásába, csak amíg azok, akiknél érdemi potenciál van arra (mind anyagiakban, mind tudásban), hogy összehozzanak valamit, azok a konkurenseikkel számmarketingelnek, addig nem igazán van kedvem az egésszel foglalkozni...

Amúgy meg nagyon szívesen részt vennék dolgok felépítésében, ha látnám azt, hogy van értelme bármit is csinálni. Számtalanszor leírtam itt a véleményemet, de eddig J. Ádám kivételével még senki nem keresett meg, hogy dolgozzunk, gondolkodjunk együtt...
47

Abba gondolj bele, hogy jelen

Hidvégi Gábor · 2011. Május. 10. (K), 14.21
Abba gondolj bele, hogy jelen pillanatban a nagy cégek úgy alakítják a szabványokat, ahogy a pillanatnyi érdekeiknek megfelel, csöppet sem törődve azzal, hogy ezzel másoknak mennyi kárt okoznak, és ebbe a halmazba te is beletartozol. Rabolják az idődet és a pénzedet, valamint frusztrálttá tesznek.

Szóval a jó hír, hogy a jelenlegi helyzeten lehet változtatni. Nem könnyű, de lehet tenni sokmindent, és lehet a mostani alapokra építkezve is jó dolgokat összehozni.

Én is már jeleztem itt párszor a Weblaboron, hogy a HTML nem jó alap, váltani kéne. Úgy gondolom, hogy egy adat alapú web több szempontból is előnnyel járna a mostani, dokumentum alapú webbel szemben, például könnyebben felírhatnánk az adatok közti összefüggéseket, így pontosabb kereséseket tehetnénk lehetővé.

Ezt XML alapon tudnám elképzelni, mivel ez egy nagyon jól támogatott technológia, platformfüggetlen, és minden kliens (amibe beletartoznak a böngészők mellett a keresőrobotok is) maga dönthetné el, hogy ezeket az adatokat hogyan jeleníti meg, akár HTML segítségével, akár egy Flash animációval, de a döntés mindenképp az övék. Ez a megközelítés egyébként meglehetősen leegyszerűsítené a szerveroldali kódot.

Jómagam írtam már egy (jórészt) kliensoldali JS könyvtárat, ami XSL transformációk segítségével HTML-t állít elő az XML-ekből, kiegészítve URL kezeléssel, valamint azzal, hogy egy kérésre csak az oldal megváltozott részeinek adatait küldi ki. Ez egy jó alap, erre már lehet építkezni.

Lehet, hogy maga a HTTP stateless, de szerveroldalon megoldható az állapotok tárolása, magyarul ott kell elkészíteni egy jó scriptet, ami ezt megoldja - bár hozzá kell tenni, hogy nagyon szükségszerű magának a protokollnak a cseréje vagy frissítése is.

Ha van egy működő dolog, akkor azt már lehet promótálni, és ehhez nem hiszem, hogy olyan sok fejlesztő szükséges.
85

+1

carstepPCE · 2011. Május. 11. (Sze), 14.20
nincs mit hozzafuzni...
84

...

carstepPCE · 2011. Május. 11. (Sze), 14.19
Szerintem, akkor itt az alkalom egy felhivasra, hogy talaljuk ki a jovo WEBjet, vagy legalabbis egy olyan technologiai eszkoztarat(akar a jelenlegibol szemezgetve), ami tenyleg egysegesen (eloszor kis csoportban) hasznalunk.

En nyitott vagyok egy ilyesfajta beszelgetesre, sor mellett vagy a nelkul

Udv
Sanyi
87

ez érdekel engem is!

Arnold Layne · 2011. Május. 11. (Sze), 17.01
ez érdekel engem is! a websocket, meg a flex box model szvsz egy elég okos dolog, azt fel lehetne használni. pl.bár ie nem tudom hogy áll ezekhez, kilences viszi-e már? de igazából ez a szál már egy ideje eléggé letért a fő témáról :)
39

Mint ahogyan az MVC ...

Max Logan · 2011. Május. 10. (K), 13.17
a menudologhoz meg annyit, hogy nezd meg pl a yii framework hogy oldotta meg. ott van egy CMenu nevezetu helper, aminek egy tombformajaban atadod az elemeket es o a request-bol megallapitja az aktiv elememet es bejeloli ha akarod. tehat a model-nek nem kell tudnia melyik az aktiv elem.
... ez is csak értelmezés kérdése.

Ahogyan írtam, ha a klasszikus desktop logikát vesszük, akkor valóban, a VIEW dolga megkeresni, hogy melyik menüpont aktív (van-e egyáltalán aktív menüpont).
41

"szopás nélkül"

Greg · 2011. Május. 10. (K), 13.31
nem ertem, hogy te mivel szopsz, kifejtetned kicsit bovebben :).

Ahogyan írtam, ha a klasszikus desktop logikát vesszük, akkor valóban, a VIEW dolga megkeresni, hogy melyik menüpont aktív (van-e egyáltalán aktív menüpont).


szerintem felejtsd el a desktop logikat webes fejlesztesnel :)
43

Egyszerű

Max Logan · 2011. Május. 10. (K), 13.49
Pl. az oldaltöltés utáni környezet újraépítés. Én ilyennel nem akarnék foglalkozni, a rendszernek sem kellene ilyennel foglalkoznia, csak és kizárólag a business logic műveletekkel. A formba való adatok visszatöltése, majd az adatok escape-elése. Ez éppen egy olyan dolog amivel nem kellene foglalkozni.

Valójában minden szopásként értelmezhető, amit azért kell csinálni, mert a WEB működése stateless. Így meg elég sok mindent bele lehet pakolni a kapba, kinek mi van éppen terítéken...

Ha elfelejtem a desktop logikát fejlesztésnél, akkor mit is kellene szem előtt tartanom? Azt, hogy egy szemétdombon kell várat építeni? Mert ezt csináljuk...

Most akkor döntsük el, hogy alkalmazásokat akarunk fejleszteni, vagy csak valami hasonlót. Ha csak bohóckodunk, akkor mehet minden úgy ahogyan most van. Ha értelmes logikákat akarunk felépíteni, akkor meg dobjanak már össze végre valami olyan környezet a nagyok, ami nem csak immel-ámmal alkalmas online működésű alkalmazások létrehozására.
45

"az oldaltöltés utáni

Greg · 2011. Május. 10. (K), 14.04
"az oldaltöltés utáni környezet újraépítés"
amennyiben kulonbozik a view akkor desktop alkalmazasnal is ujra kell epitened a gui-t, nem? a webesnel is csak akkor kell. az adatok escapelese szinten olyan amit desktop alkalmazasnal is el kellene vegezni, nem?
"Ha értelmes logikákat akarunk felépíteni, akkor meg dobjanak már össze végre valami olyan környezet a nagyok, ami nem csak immel-ámmal alkalmas online működésű alkalmazások létrehozására."

idonkent velem elofordul, hogy azt hiszem mindenki hulye csak en nem. aztan raebredek hogy a dolog forditva igaz. :)
46

Re

Max Logan · 2011. Május. 10. (K), 14.19
Az hogy különbözik a GUI vagy az, hogy meg kell jeleníteni egy-két hibaüzenetet egy változatlan környezetbe, nem éppen ugyanaz az eset. AJAX nélkül post-olt form esetén kell az escapelés, mert kiírás történik. Ez nem kell, ha AJAX post van. De nem támaszkodhatom az AJAX-ra, mert mi van ha nincsen JS támogatás. Tehát építkezünk is olyan dolgokból, akarunk alkalmazást építeni nem erre kitalált építőkövekből...

Nem hülyézek én senkit, de egy dokumentum leírására kitalált felületet nem kéne alkalmazások írására használni. Ez józan paraszti ész kérdése, nem az, hogy ki mekkora IT zseni...
48

egy dokumentum leírására

Hidvégi Gábor · 2011. Május. 10. (K), 14.23
egy dokumentum leírására kitalált felületet nem kéne alkalmazások írására használni

Ez igaz, de amíg nincs alternatíva (a Flash lehetne, de nincs hozzá ingyenes vagy elérhető árú szerkesztő), addig ebből kell kihozni a legjobbat.
50

Amíg nincsen alternatíva...

Max Logan · 2011. Május. 10. (K), 14.46
Lehetne, ha nem a HTML5-tel és a CSS3-mal tököltek volna és nem erre szájkaratézna minde IT mamut, meg az Adobe nem védené azt, ami sokan a pokolba kívánnak...
51

Flex

Poetro · 2011. Május. 10. (K), 14.56
Flex alkalmazást lehet fejleszteni akár milyen szerkesztővel és az SDK pedig ingyenes. Azaz az alkalmazásodat meg tudod írni ingyenes eszközök segítségével is.

Valamint már létezik több eszköz, aminek Flash a kimenete és ingyenes. Ilyen a Haxe, a Ming, MTASC és még létezik számos egyéb eszköz. Ráadásul igyenes IDE-k is vannak például Eclipse alapon, valamint például az igencsak kellemes FlashDevelop.
49

De nem támaszkodhatom az

Greg · 2011. Május. 10. (K), 14.29
De nem támaszkodhatom az AJAX-ra, mert mi van ha nincsen JS támogatás.

kiirod a usernek, hogy kapcsolja be.
egy dokumentum leírására kitalált felületet nem kéne alkalmazások írására használni.

nem alkalmazast irsz benne, hanem annak a megjeleniteset bizod ra. es amiota kitalaltak, azert fejlodott is egy kicsit.
Az hogy különbözik a GUI vagy az, hogy meg kell jeleníteni egy-két hibaüzenetet egy változatlan környezetbe, nem éppen ugyanaz az eset. AJAX nélkül post-olt form esetén kell az escapelés, mert kiírás történik. Ez nem kell, ha AJAX post van. De nem támaszkodhatom az AJAX-ra, mert mi van ha nincsen JS támogatás.

a hibauzenet megjelenitesenel, nem igazan van plusz feladat a layout ujraepitesevel. ugyanabba a view-ba egy feltelellel megjelenited a hibauzenetet ha van olyan. ezzel az ajax nelkuli formanl kell csak az escape, nem teljesen ertem hogy mire gondolsz.
52

Re

Max Logan · 2011. Május. 10. (K), 14.58
Kiírhatom, de ha olyan szinten átlaguser, hogy fogalma sincsen arról, hogy mi fán terem a JS, akkor ez nem éppen egy jó megközelítés. Egy platform kell a WEB-nek, amiben nem lehet semmit se ki, se bekapcsolni, minden gépben éppen ugyanaz a környezet fogad. Erre lehet építeni, a mostani környezetre nem.

Igen, GUI-t hozok létre egy olyan valamivel, amit nem erre terveztek. Ez pedig nem jó, nagyon nem jó irány.

AJAX esetén a GUI változatlan, a háttérben megy a munka, majd vagy lesz egy új részGUI kirajzolás vagy nem, csak kapok egy-két hibaüzenetet. AJAX nélkül _mindent_ újra kell kezdeni a szerver oldalon és még kimeneti escape is kell a form input mezők esetén.

De egyébként innentől már nem konstruktív a dolog részemről, mert nekem van gondom a platformmal és az elvekkel, ezeket a köröket meg már soxor megjártam itt...
54

kiirod a usernek, hogy

Hidvégi Gábor · 2011. Május. 10. (K), 16.22
kiirod a usernek, hogy kapcsolja be

Aztán magyarázhatod a megrendelődnek, miért nem tudják a keresők indexelni az oldalad, emiatt senki sem találja meg, s így veszteséget termel. Szóval itt nincs választási lehetőség, AJAX nélkül is működnie kell.
53

Pár dolog

Ifju · 2011. Május. 10. (K), 16.00
AJAX nélkül post-olt form esetén kell az escapelés, mert kiírás történik. Ez nem kell, ha AJAX post van. De nem támaszkodhatom az AJAX-ra, mert mi van ha nincsen JS támogatás.

Escapelni mindig kell! Ezt jobb, ha ökölszabálynak veszed. A felhasználók nemcsak a rendszerre (code injection), hanem egymásra (XSS) is veszélyt jelenthetnek, és a fejlesztő felelőssége megvédeni mind a rendszert, mind a felhasználókat. Ezért szükség van, mind a bemenetet, mind a kimenetet escapelni.

Vannak szabályok, amiket betartva nyugodtan megírhatsz egy oldalt úgy, hogy az javascript nélkül is működik, és javascripttel/AJAX-szal csupán csak hatékonyabb, jobb felhasználói élményt ad. Ilyen pl, hogy a linkekre, formokra aggathatsz eseménykezelőket javascripttel, amelyek nélkül a rendszered vígan kiszolgálja a felhasználókat, viszont őket használva nem kell folyamatosan mindig újra és újra betölteni az egész oldalt.

Nem hülyézek én senkit, de egy dokumentum leírására kitalált felületet nem kéne alkalmazások írására használni. Ez józan paraszti ész kérdése, nem az, hogy ki mekkora IT zseni...

Ebben van igazságod, ugyanakkor már régen túlhaladtunk azon a ponton, ahol ez még számított vagy sem. Most az a kérdés, hogy mit és hogyan lehet mégis megoldani ezen a platformon, illetve hogyan lehet magát a platformot tovább fejleszteni, hogy mégis alkalmas legyen rá.

Azt kicsit erős kijelentésnek érzem, hogy szemétdombon kellene várat építened, de elhiszem, hogy sokkal ingatagabbnak érzed a webes megoldásokat a desktopalkalmazások fejlesztése után.
56

Nos, a menüelemek adatnak

inf · 2011. Május. 10. (K), 16.37
Nos, a menüelemek adatnak minősülnek; az én értelmezésemben. Ha azt vesszük, hogy a modell tetszőleges forrásból tud adatokat visszaadni és a modellt használó rétegnek nem kell tudnia, hogy milyen forrásból származnak az adatok (predefined PHP változó, XML, CSV fájl, adatbázis, stb.), akkor a menüelemek reprezentálása a modell dolga. Legalábbis e logika, értelmezés szerint.

A logikádban ott van a gubanc, hogy nem csak a model dolgozhat adatokkal, hanem a view és a controller is. Mondjuk ha XML-t vársz, akkor a controller azt validálhatja XSD-vel. A te logikád szerint ezt az xsd fájlt a modeltől kéne elkérnie. Ugyanúgy ha a view beszúr egy sablont a model-hez kéne nyúlnia...
57

Logika

Max Logan · 2011. Május. 10. (K), 17.03
Nos, azért vettem a menü elemeket mint adatokat a modell rétegbe, mert pl. egy sidebar menü, melyben a termékkategóriák vannak listázva, DB-ből nyerhető ki. A DB kezelés pedig a modell dolga, ergó a menü elemek visszaadása a modell dolga. De lehet, hogy ez is csak értelmezés kérdése.

Az XML-es példád esetén mit várunk XML-ben? És azt melyik rétegnek címezzük?
96

A menü adatait visszaadni

inf · 2011. Május. 12. (Cs), 13.23
A menü adatait visszaadni lehet, hogy a model dolga, de azt eldönteni, hogy melyik menüpont az aktív már a view dolga, hiszen ő a felelős azért, hogy kirajzolja a menüt. Szóval a döntés a view kezében van, a model pedig csak adatot szolgáltat a döntésnek megfelelően, de nem dönt arról, hogy mi legyen aktív, és mi nem az ui-n. Szóval kinézeti dolgokban a model az buta, mert nem az a feladata, hogy a kinézettel foglalkozzon.

Az XML-es példánál mondjuk bejönnek egy cikk adatai:

<cikk>
  <cim>A cikk címe</cim>
  <leiras>A cikk arról szól, hogy az <url location="http://xyz.hu">XYZ Kft.</url> becsődölt.</leiras>
</cikk>
Erre írsz egy XSD fájlt, amivel validálod, hogy formailag stimmel e a kérés. Nyilván ezt a model-nek címezzük, hogy tegye be a cikkek közé, de annak ellenőrzése, hogy formailag stimmel e az adat a controller feladata.
97

Re

Max Logan · 2011. Május. 12. (Cs), 14.43
Nos, valóban a modellt úgy kell felépíteni, hogy ne legyen benne függés se a nézet, se a kontroller felé. Ennek okán valóban nem a modell dolga megjelölni, hogy melyik menüpont az aktív.

XML-es példád rávilágít arra, hogy validáció alatt két dolgot értünk. Mert ezek szerint a kontroller feladata egy formai validáció (mondjuk, hogy egy GET paraméter szám-e), míg a modell dolga, hogy validálja a kapott adatokat érték szerint. Ez nekem csak most vált így el, eddig úgy gondoltam, hogy a kétféle validáció egyetlen folyamat (és réteg) feladata. De ezek szerint nem.

A szám-e a kapott GET paraméter az jó példa? Tehát ha a kontroller azt látja, hogy számot várunk, de [a-z] tartományból érkezett mondjuk egy 5 karakteres string, akkor egyből dob egy olyan nézetet, ami a bemeneti adat hibájára utaló üzenetet jelenít meg. Így a modell csak azt validálja majd (ha odáig eljut a folyamat), hogy a kapott szám értékkel van-e az adatbázisban rekord és lehet-e egyébként vele műveletet végezni; pl. komment hozzáadása egy blogbejegyzéshez?
98

Yepp, valahogy így gondolom.

inf · 2011. Május. 12. (Cs), 23.25
Yepp, valahogy így gondolom. Én talán még ennél is tovább mennék, és a modelles validáció meghívását is betenném a controller-be.

Maradjunk a számos példádnál:

class Controller
{
	public function processInput($id)
	{
		if (!is_integer($id))
		{
			throw new InvalidTypeException('Egész számot várunk ID-nek.');
		}
		return $this->model->processInput($id);
	}
}

class Model
{
	protected function validateInput($id)
	{
		if (!$this->table->hasId($id))
		{
			throw new Exception('Nincs ilyen ID az adatbázisban.');
		}
	}
	
	public function processInput($id)
	{
		$this->validateInput($id);
		//üzleti logika
	}
}
ehelyett ilyen kell:

class Controller
{
	public function processInput($id)
	{
		if (!is_integer($id))
		{
			throw new InvalidTypeException('Egész számot várunk ID-nek.');
		}
		if (!this->model->containsId($id))
		{
			throw new Exception('Nincs ilyen ID az adatbázisban.');
		}
		return $this->model->processInput($id);
	}
}

class Model
{
	public function containsId($id)
	{
		return $this->table->hasId($id);
	}
	
	public function processInput($id)
	{
		//üzleti logika
	}
}
Szóval csak a controller dönti el, hogy mi valid és mi nem, ehhez persze segítséget kérhet a modeltől, hogy adjon adatot arról, hogy a cucc szerepel e az adatbázisban vagy sem.
100

ujrahasznositas es dry

Greg · 2011. Május. 13. (P), 08.26
ha a kodot mindel ujrahasznosithatobba es szarazabba akarod tenni, akkor jobb ha van egy validator osztaly, es a modelben pedig beallitod hogy melyik tulajdonsagat mi szerint kell validalni. a controllerben meg csak meghivod a model validalo metodusat. amit szinten erdemes egy szulo modelbol kapni, mert akkor az osszes validalasra szorulo modelledet szarmaztathatod abbol.
109

Én biztosan nem így

inf · 2011. Május. 13. (P), 22.58
Én biztosan nem így csinálnám, mármint az alap koncepció az jó, hogy az adatbázisból a táblák mezőit használjuk fel a validáláshoz adatforrásnak, de egy űrlapnál meg kell adni más paramétereket is, pl: minLength, pattern, required, etc...

Én úgy csinálnám, hogy minden űrlaphoz létrehoznék egy Form objektumot, ami tárolja, hogy milyen input-nál milyen típusok és egyéb paraméterek vannak, a típusokat meg a Model mezőiből is tudná szedni, vagy mondjuk olyan dolgoknál, mint a captcha kód külön meg lehetne adni neki a típust.
103

Re

Max Logan · 2011. Május. 13. (P), 08.59
Nos, én lényegében eddig is így csináltam; mint az utóbbi logika. Van egy Validator abstract osztályom, majd ezt kiterjesztve jön létre az egyes Action-ök validátora. A kontroller példányosítja a megfelelő validátort, majd meghívja az isError() metódust. Ami ha false értékkel tér vissza, a kontroller meghívja a modell megfelelő metódusát, ami módosítja a modell állapotát. True esetén pedig meghív egy view-t, ami jelzi a hibát (vagy dob egy redirect-et a megfelelő oldalra, ami hibát jelez).

Tegnap éppen azon gondolkodtam, hogy szétválasztom a validálást, a formai validálás marad a kontrollerben, az érték szintű validálás pedig a modellben. De akkor azt mondod, hogy az eddigi logikám (a te második példád) megfelelő megközelítés?
104

Nyilvánvaló, hogyha két kódot

inf · 2011. Május. 13. (P), 09.21
Nyilvánvaló, hogyha két kódot azonos jellegű dolgot csinál, akkor azok egy helyre tartoznak. A szétválasztásuk csak az átláthatóságot rontaná.

Mondjuk nézzük meg a jogosultság ellenőrzést.
Csinálhatod azt, hogy beteszed minden egyes controllerbe a jogosultság ellenőrzés meghívását, valahogy így:

class MyController
{
	public function myAction()
	{
		if (!$this->getAuth()->hasRight('MyController','myAction'))
		{
			throw new Exception('nincs jogod ezt tenni');
		}
		//...
	}
	
	public function yourAction()
	{
		if (!$this->getAuth()->hasRight('MyController','yourAction'))
		{
			throw new Exception('nincs jogod ezt tenni');
		}
		//...
	}
}


class FrontController
{
	public function route($controller,$action)
	{
		$this->getController($controller)->callAction($action);
	}
}
Látod, hogy ugyanaz a kód többször szerepel, és minden egyes action meghívja, nyilván akkor feljebb kell tenni egy szinttel, hogy központilag hívjuk meg, így biztosabb a kód, nem fordulhat elő, hogy elfelejted betenni valamelyik action-be.

class MyController
{
	public function myAction()
	{
		//...
	}
	
	public function yourAction()
	{
		//...
	}
}


class FrontController
{
	public function route($controller,$action)
	{
		if (!$this->getAuth()->hasRight($controller,$action))
		{
			throw new Exception('nincs jogod ezt tenni');
		}
		$this->getController($controller)->callAction($action);
	}
}
A refaktorálásnál nagyon sokszor van ez, hogy egy adott kód elkezd felfelé vándorolni (gyakran több szintet is), amíg el nem ér ahhoz az osztályhoz, ahova tényleg tartozik...
58

Érdekes gondolatok

ggabor · 2011. Május. 10. (K), 19.01
Úgy látom sikerült fedobnom egy érdekes témát. Ennek igazán örülök! Ugyanakkor továbbra sem látom azt, hogy gyakorlatilag mi lenne jelen technikai feltételek mellett a legcélravezetőbb szervezési logikai egy új site kialakítása során.

Sok mindent írtatok már pro és kontra az MVC és az OOP, meg úgy általában a web platform tekintetében. A fentiek alapján én most úgy látom, hogy adott egy platform, amely elsősorban "dokumentum publikációt" valósít meg és nem többet. A szerver oldalon - mondjuk php-val - csupán a dokumentumok összeállítása a feladat a kérések alapján.

A php kód szervezését ezek alapján a dokumentum építés alapelvei alapján kell megvalósítani. Így tehát az OOP és MVC paradigmák minden áron történő implementálását talán jogosan érzem erős túlzásnak. Elméleti síkon persze törekedni kell ezen koncepciók követésére, de ez sokkal inkább szervezési mintsem gyakorlati kérdés.

A dolog nyitját abban látom, hogy az MVC-t nem kód szinten, csupán mappa és fájlszinten érdemes elkülöníteni. Így tehát a php-t mint szerver oldali nyelvet az MVC minden komponensében bátran használjuk.

Az adatáramlás és kódszervezés kérdésében pedig a válasz szerintem az, hogy mindent ott kezelünk, ahol ez a "dokumentum" előállítása során első alkalommal szükséges. Ha több helyen szükséges valamilyen kódrész, azt kiemeljük "helperbe".

Egy nagyon egyszerű példa a fentiekre:

- index.php: url értelmezés (authentikáció, nyelv meghatározás, theme meghatározás, paraméterek elkülönítése) és master view betöltése.

- master.php (view): (x)html, amely tartalmaz minden olyan elemet, ami minden oldalon azonos (fejléc, logo, főmenü). A főmenü aktív elemét vagy az index-ben, vagy itt határozzuk meg. Lehetnek olyan állandó elemek, melyek bizonyos esetekben mégsem kellenek: ezeket vagy itt sima if alapján, vagy a content view-kban töltjük be.
Ezután a master view content részében egyszerű include-al betöltjük a kért oldalnak megfelelő view-t. A

- valamiview.php: Meghatározza az oldal tartalmi részét. Bizonyos esetekben olyan elemeket is tartalmaz, melyeket más view-k is használnak. Ezeket a megosztott elemeket külön fájlban tároljuk és hívjuk mondjuk "snippet"-nek.

Minden view fájl közvetlenül hívja a lekérdező és műveleti funkciókat az "app" mappából. Itt az állományokat úgy szervezzük, hogy lehetőség szerint minél kevesebb függvény legyen egy fájlban. Ha az oop elvekre gondolunk, tekintsük az app fájlokat osztálynak, a függvényeket statikus metódusoknak. Mivel egy app.php include-olhat másik app.php-t, ezért az "öröklődés" is megoldható elvi szinten.

A MVC alapján az app-ok nem feltétlenül kell, hogy adatkezelést valósítsanak meg közvetlenül. Erre létrehozhatunk egy "data" könyvtárat és az itt elhelyezett fájlokban oldjuk meg az adatkezelési kérdéseket.

Ábra(!):

-- index.php -> master.php -> view.php <- app.php <- data.php

Extraként, ha fájl alapon gondolkodunk, viszonylag egyszerűen megoldható a nyelvi verziók kezelése is, hiszen elegendő a view/app/data (MVC) állományoknak megfelelő nyelvi fájlok létrehozása, melyek közül csak azokat töltjük be (automatikusan) amire szükség van.

Én tehát azt gondolom, hogy a meglévő feltételek alapján felesleges MVC/OOP kódoláson erőlködni, mert pl. amint "helper" kell már semmi értelme a szervezési erőfeszítéseknek. Márpedig, mint fent láttuk "helper" mindig kell.

Persze lehet, hogy tök hülye vagyok. Ez esetben örülnék egy rövid tutorialnak a témában.
61

Én a következő módon állítom

Hidvégi Gábor · 2011. Május. 10. (K), 20.53
Én a következő módon állítom elő a weboldalaimat:

- feldolgozom az URL-t, megállapítom, hogy milyen oldalsablon tartozik hozzá
- inicializálom az alapobjektumokat (singletonok, pl. adatbáziskapcsolódás, sablonfunkciók)
- a központi tartalmi blokkhoz nem szorosan kapcsolódó egyéb részek (pl. legfrissebb cikkek) lekérdezéseit itt futtatom
- futtatom az adott sablonhoz tartozó php fájlt
- ebben a php-ben végzem el a bejövő adatok feldolgozását (pl. űrlap adatainak mentése)
- az URL-ben megkapott paraméterek alapján futtatom a központi tartalmi blokkhoz tartozó lekérdezéseket
- minden lekérdezés eredményét egy központi indexelt tömbbe pakolom
- ezt a tömböt átadom a php sablonkezelőnek (Smarty), ahol összeállítom a kész XML-t vagy HTML-t
63

nem biztos, hogy jól értem

ggabor · 2011. Május. 10. (K), 21.29
Tehát az index.php feldolgozza az url-t és megállapítja az aktuális sablont. Mit értesz sablon alatt? Egy konkrét fájlt egy template-en belül, vagy magát a template-et?

Az utolsó két pont szerint előbb előállítod a tartalmat, ezt elmented a memóriába, majd átadod feldolgozásra a smarty-nak, ami előállítja a végleges dokumentumot?

Ezt én a fentiek alapján felesleges bonyolításnak látom. Ha már tudod, hogy mit kell megjeleníteni, akkor miért nem jeleníted meg? Miért kell átadni egy "külső" template rendszernek, mikor a php maga is "template" rendszer? Mi a konkrét akadálya annak, hogy az előállított tartalmakat rögtön megjelenítsd?

Nem kötözködni akarok, csak nem tudom, hogy mi az ami ezt a fajta megoldást tényleg indokolja?
65

Mit értesz sablon alatt? Egy

Hidvégi Gábor · 2011. Május. 10. (K), 21.40
Mit értesz sablon alatt? Egy konkrét fájlt egy template-en belül, vagy magát a template-et?

Ezt a sablont a saját rendszeremen belül definiálom, és hozzá tudom rendelni az egyes url-ekhez, pl. a hirek.html sablontípusa: "cikkgyujto".

A smarty valóban valamennyire lassítja a programot, én leginkább megszokásból használom, meg hogy biztosan elkülönüljön a megjelenítés a php kódtól, valamint egyszerű a szintaktikája. Amióta áttértem XML-re, azóta a foreach-nél bonyolultabb dolog nem került bele (minden megjelenítési logika XSLT-ben van), szóval igazából tényleg abszolút fölösleges.
67

Összegzés

Max Logan · 2011. Május. 10. (K), 22.22
Röviden és tömören azt tudnám mondani, hogy mivel a ma WEB-je radikálisan más, mint 15 éve volt, én várnám, hogy az új igényekhez igazodó, radikálisan új technológiai alap jelenjen meg szakmai közösségi munka révén. Tudom, naív vagyok.

Tehát a végkövetkeztetés az, hogy a webfejlesztés ma már nem honlapok, azaz hypertext dokumentumok létrehozása, de nem is a klasszikus értelemben vett szoftverfejlesztés. Egy olyan hibrid közeg, aminek megvannak a szépségei és sok-sok buktatója.
69

várnám, hogy az új igényekhez

Hidvégi Gábor · 2011. Május. 11. (Sze), 07.48
várnám, hogy az új igényekhez igazodó, radikálisan új technológiai alap jelenjen meg szakmai közösségi munka révén
Egyetértek, és úgy gondolom, ezt a munkát akár mi is elkezdhetnénk, mert sokan vannak a Weblaboron, jópár tényleg professzionális tudású szakember, akik tudnak értéket teremteni.
Tudom, naív vagyok.
Ne legyél már kishitű! Teljesen jól látod a problémákat, és hidd el, meg lehet változtatni a dolgokat, csak akarat kell hozzá.
a webfejlesztés ma már nem honlapok, azaz hypertext dokumentumok létrehozása
Én ezt úgy gondolom, hogy nem dokumentumokat kéne visszaadni egy kérésre, hanem adatokat vagy adathalmazokat. Például: repülőjegy adatobjektum, különböző tulajdonságokkal, mint légitársaság, honnan-hova-mikor stb., és a kliens (ami nem feltétlenül böngésző) eldönti, hogy mit kezd vele (kirajzolja a képernyőre vagy feldolgozza és elteszi egy saját adatbázisba).

Másrészt szerintem natív támogatást kéne nyújtania a böngészőknek, hogy alkalmazásokat fejlesszünk, és az alkalmazáshoz widgetszerűen lehessen komponenseket hozzáadni (pl. egyszerű beviteli mezőtől a skinezett listboxig), amelyeket objektumokként lehetne (Javascriptből) vezérelni. Ezeket az objektumokat előre le lehetne fordítani, hogy gyorsabban fussanak.

Ezeket az igényeket kéne összeírni, és elkészíteni a specifikációt, amivel már oda lehet állni egy nagyobb cég vagy szervezet (pl. Mozilla) elé, hogy íme, ezt szeretnénk, segítsetek a megvalósításban.
78

Mozilla Prism XUL

tiku I tikaszvince · 2011. Május. 11. (Sze), 12.20
Épp a Mozilla adja a XUL-t és a Prism nevű eszközt (lehet azóta átkeresztelték), amivel szerintem teljesen ki tudnátok elégíteni az ilyen irányú vágyaitokat.
83

Milyen kár, hogy egyelőre

Endyl · 2011. Május. 11. (Sze), 14.10
Milyen kár, hogy egyelőre szépen lassan megszüntetik a remote xul lehetőségét biztonsági nyűgök és érdeklődés hiánya miatt (értsd már nem dolgoznak fel xul-t, ami nem a böngésző vagy egy böngésző kiegészítő része; egyelőre még meg lehet kerülni, de ki tudja meddig). Pedig a XUL/XBL párosban tényleg van potenciál.
68

Zend Framework

zsoltkunsagi · 2011. Május. 10. (K), 22.42
Zend Framework-t javaslom. NetBeans fejlesztő eszköz alatt van kódolás segítő támogatás.
MVC szerkezet, jogosultság kezelés, űrlap készítés és validálás, cache, ... minden megoldható ZF alatt.

Egy keretrendszernél fontos, hogy sokan használják, legyenek igények, hibajegyek, javaslatok. A hivatalos Manual-on kívül legyen elegendő Tutorial, amiből a kezdő kimazsolázhatja a számára szükséges információt.

ITT egy PHP framework összehasonlító oldal.

A ZF előtt CakePHP-val fejlesztettem. A ZF kissé nehezebb, de több dolog van megírva benne.


Az ASP.NET is jó megoldás, de a tárhely drágább, saját v. virtuális szervernél a windows op. rendszer díjakat is bele kell számolni.


Saját keretrendszert szerintem nem érdemes írni, amikor vannak kész megoldások, amihez X+1 fejlesztő hozzátette a tudását.
70

Meg tudnád fogalmazni, milyen

Hidvégi Gábor · 2011. Május. 11. (Sze), 08.02
Meg tudnád fogalmazni, milyen hátrányokkal jár a keretrendszerek segítségével való fejlesztés?
71

ZF

zsoltkunsagi · 2011. Május. 11. (Sze), 08.20
Szia Gábor!
Ezek szerint félreérthető volt a kommentem. (?) Pont arról írtam, hogy egy ismert, elterjedt keretrendszerrel érdemes fejleszteni. PHP környezetben a Zend Framework-t javasoltam.
Üdv, Zsolt
72

Nem, egyáltalán nem volt

Hidvégi Gábor · 2011. Május. 11. (Sze), 09.01
Nem, egyáltalán nem volt félreérthető. De ha ajánlasz valamit, a felelős döntéshez szükséges tudni a hátrányokat is. Mivel te már dolgoztál pár keretrendszerrel, biztosan meg tudsz néhányat említeni.
73

Hátrány

zsoltkunsagi · 2011. Május. 11. (Sze), 09.41
Szerintem Zend Framework hátránya (ha az hátrány), hogy időt kell fektetni a megismerésébe. Jó a kézikönyve, de úgy tudom, hogy a hivatalos oldalon (framework.zend.com) csak egy példa van. ...volt, amikor egy megoldás miatt sokat gugliztam.
74

miért éppen framework

ggabor · 2011. Május. 11. (Sze), 11.01
Ezt már fentebb részletesebben kitárgyaltuk, de azért megkérdem: Az, hogy egy framework-ben "benne van minden ami kell" nem jelenti egyben azt is, hogy egy rakás felesleges dolgot is tartalmaz, melyek a működést lassítják csupán az adott framework logikai követelményei miatt?

Szerintem az OOP/MVC framework-ök a fejlesztők dolgát talán megkönnyítik, de a teljesítményt rontják. Kicsit úgy érzem, hogy "ha nem értesz a fejlesztéshez, tanulj meg egy keretrendszert" gondolat mentén választják az emberek ezeket. Ugyanakkor mindenhonnét azt hallom, hogy saját rendszer fejlesztése felesleges, mert vannak már jól kidolgozott rendszerek. De egy konkrét oldal konkrét megvalósításához valahogy mégsem találtam olyat, amivel a 0-ról viszonylag rövid idő alatt megoldható a feladat. A zend-el is csupán annyi a gond, hogy kell hozzá legalább 1 év mire az ember tényleg kitanulja. És ekkor megtanultál egy konkrét rendszert, de általánosan fejleszteni még mindig nem tudsz. Ha gondod van, problémába ütközöl türelmetlenül várhatod míg valaki megoldja helyetted és belerakja a rendszerbe. Vagy te magad megoldod és "belgányolsz" a hivatalosba.

Windows desktop-on ugye ott a .NET, ami szerintem az egyik legtökéletesebb fejlesztési platform jelenleg. Nincsenek ellentmondások, minden egyértelmű és világos, pedig szinte bármely nyelven fejleszthetsz hozzá. Ilyen miért nincs webre? (jó, oké, lehet asp.net-ben is fejleszteni...tudom)
75

A zend-el is csupán annyi a

Greg · 2011. Május. 11. (Sze), 11.31
A zend-el is csupán annyi a gond, hogy kell hozzá legalább 1 év mire az ember tényleg kitanulja.

egy ev alatt egy uj programnyelvet meg lehet tanulni, nem egy keretrendszer hasznalatat. ha neked a zend tanulasi ideje egy evnek tunik, akkor szerintem nezz masik szakma utan.
Az, hogy egy framework-ben "benne van minden ami kell" nem jelenti egyben azt is, hogy egy rakás felesleges dolgot is tartalmaz, melyek a működést lassítják csupán az adott framework logikai követelményei miatt?

a rakas felesleges dolgot a jobb frameworkok csak szukseg eseten toltik be, igy egy jobb framework eseteben nincs lassulas.
Kicsit úgy érzem, hogy "ha nem értesz a fejlesztéshez, tanulj meg egy keretrendszert" gondolat mentén választják az emberek ezeket.

ez is erdekes egy godolat. ugy erzed hogy egy ev egy keretrendszer megtanulasa, de szerinted aki nem tud fejleszteni az hasznalja :) altalaban pont azok nem tudjak a keretrendszereket alkalmazni es megerteni, akik gyengek a fejlesztesben es a sajat gondolatmenetukbol ha ki kell mozdulniuk akkor mar elakadnak.
szerintem.
76

érdekes gondolatok

ggabor · 2011. Május. 11. (Sze), 11.45
Tehát azt állítod, hogy a ZendFramework professzionális, részletekbe menő elsajátítása rövid idő alatt lehetséges. Persze nyilván, ha valaki napi 8-10 órát csak ezzel foglalkozik, akkor működhet a dolog. Jellemzőbb azonban, hogy az embernek van egy munkahelye és mondjuk csak napi néhány órát ér rá ezzel foglalkozni.

Köszi szépen amúgy, hogy felhívtad a figyelmem a szakmaváltás esetleges időszerűségére. Megmondom őszintén én magam is egyre többet gondolkodom ezen, bár csupán azért, mert 15 év fejlesztés után kicsit unom már a banánt.

Mutass nekem bármilyen framework-ot és kb. 1 óra alatt írok egy listát azokról az elemekről, melyek minden esetben felesleges köröket jelentenek. De végülis nem az a lényeg, hogy én mit tekintek feleslegesnek, mert egy kész rendszer szempontjából az egyes részeknek nyilván van értelmük, de jellemzően csak a rendszer felépítése miatt.

Azt változatlanul tartom, hogy a keretrendszer használata a fejlesztők 99%-ának annyit jelent, hogy "ezt sem kell megoldanom, hiszen már megvan" és ez az esetek túlnyomó részében egyenlő azzal, hogy nem is foglalkoznak vele, nem is értik egy-egy rész működését. Persze nyilván te az 1% kivételbe tartozol, aki a pl. a Zend minden egyes soráról meg tudná mondani, hogy mit csinál, miért és hogyan?

Mindegy, ne is menjünk el ilyen irányba, mert semmi értelme.
77

Mutass nekem bármilyen

Greg · 2011. Május. 11. (Sze), 12.09
Mutass nekem bármilyen framework-ot és kb. 1 óra alatt írok egy listát azokról az elemekről, melyek minden esetben felesleges köröket jelentenek.

a legtobb rendszer mogotti fejlesztocsapat tobbnyire orul az ilyen eszreveteleknek es ha jogos amit irsz, akkor lehet forkolni.
Jellemzőbb azonban, hogy az embernek van egy munkahelye és mondjuk csak napi néhány órát ér rá ezzel foglalkozni.

napi par oraban el lehet sajatitani eleg rovid ido alatt az alapokat es utana akar melohelyen is be lehet mutatni, aztan belevagni vele egy projectbe es azalatt megtanul az ember sokmindent.
Azt változatlanul tartom, hogy a keretrendszer használata a fejlesztők 99%-ának annyit jelent, hogy "ezt sem kell megoldanom, hiszen már megvan" és ez az esetek túlnyomó részében egyenlő azzal, hogy nem is foglalkoznak vele, nem is értik egy-egy rész működését. Persze nyilván te az 1% kivételbe tartozol, aki a pl. a Zend minden egyes soráról meg tudná mondani, hogy mit csinál, miért és hogyan?

en nem hiszem hogy a 99% ilyen, de vannak ilyenek is. bar ennyi erovel azt is nezhetnem hogy a php egyes gyari fuggvenyei mogott milyen C kod van, ahelyett hogy hasznalom oket.
Persze nyilván te az 1% kivételbe tartozol, aki a pl. a Zend minden egyes soráról meg tudná mondani, hogy mit csinál, miért és hogyan?

nem hasznalom a zend frameworkot, ugyhogy a jelenlegi verziorol eleg szegenyes ismeretekkel rendelkezem.
82

Azt változatlanul tartom,

Hidvégi Gábor · 2011. Május. 11. (Sze), 14.03
Azt változatlanul tartom, hogy a keretrendszer használata a fejlesztők 99%-ának annyit jelent, hogy "ezt sem kell megoldanom, hiszen már megvan" és ez az esetek túlnyomó részében egyenlő azzal, hogy nem is foglalkoznak vele, nem is értik egy-egy rész működését
Teljesen egyetértek, én emiatt inkább azt javasolnám, hogy először mindenki fejlesszen saját rendszert, hogy megismerje a felmerülő problémákat, és utána el tudja dönteni, hogy a sajátja megfelel-e a későbbi munkákhoz, vagy pedig ha keretrendszert használ, az minden szempontból jó-e.
81

Az, hogy egy framework-ben

nova76 · 2011. Május. 11. (Sze), 13.19
Az, hogy egy framework-ben "benne van minden ami kell" nem jelenti egyben azt is, hogy egy rakás felesleges dolgot is tartalmaz, melyek a működést lassítják csupán az adott framework logikai követelményei miatt?


De. Ezért egy "echo helló világ" projekthez nem javaslom. Viszont egy 80-100 táblás weboldalnál már kellhet az összes funkció. Különösen ha átlátható rendszert akarsz készíteni.

Az eredeti kérdésedre a symfonynak van megoldása. Ott ugyanis vannak sfActions és sfComponents osztályok. Van template és van layout. A layoutot az sfActions osztályban tudod beállítani az egyes funkciókra. Ezek amik meghívhatóak az url alapján. Például egy cms oldal, a cms/show/kapcsolat url-en érhető el, ami a kapcsolat nevű tartalmat jeleníti meg.
Igen ám, de te szeretnél ezen a képernyőn is megjeleníteni egy jobb oldali sávot, ami mondjuk tartalmaz egy hírlevél feliratkozást, vagy bármit. Akkor a kapcsolatnak egy olyan layoutot állítasz be, ami tartalmazza a megjelenítést, és tartalmaz egy jobb oldali sávot. A jobb oldali sávban pedig behívod a szükséges komponenst (include_component): megírod az hírlevél sfCmponents osztályába a logikát és kirakod egy templatbe, ami így bekerül a layout jobb oldali sávjába.
Ha belegondolsz, olyan 5-6 féle layoutot kell gyártanod: egy olyat, amin van jobb és baloldali sáv, egy olyat, amin csak jobb oldali van, vagy csak baloldali van, vagy épp egyik sincs. És néha teljesen más dolgok jelenhetnek meg rajta, de nagyjából 5-6-nál több variáció már erősen hatással lesz a felhasználóra is. 5-6 layout felett erősen korrigál a 0 felé a késztetés a visszatérésre, hiszen ki akar visszatérni egy {}olyan oldalra, ahol semmit sem talál meg...
80

Teljes mértékben egyetértek

szabo.b.gabor · 2011. Május. 11. (Sze), 13.11
Teljes mértékben egyetértek ggaborral, a frameworkoket illetően és megértem a problémáját.

Azt nem hiszem, hogy a html (css, js) használhatatlan lenne és szükség volna valami másra. A legnagyobb ereje pont az egyszerűségében van, talán ezért támogatott olyan sok platformon. A bonyolult dolgokat szerintem jobb szerver oldalon tartani. Persze megértem az igényt egy okosabb szabványra, de gondoljatok bele ha azt kellene hackelni, hogy az 'ie adatbázismotorja mit csinál másképp'.. Az most hogy a szerver és kliens között csak adatok mászkálnak még nem tenné egyszerűbbé az alkalmazást, max szerver oldalon, de a kliens ennyivel bonyolultabbá is válna.

desktop alkalmazások.. szerintem inkább (nagyon)vékonykliens.

de hogy az eredeti kérdésre is válaszoljak.
-az egyik dolog ami szükséges az az hogy az url mindig tükrözze az alkalmazás használatának az állapotát. milyen nyelven használom, hol vagyok, mit csinálok, milyen vezérlő paramétereket használok (szűrésre bármire). ezek mindig csak url és get paraméter párosban szerepeljenek. (ha elküldöm valakinek, azt lássa mint én ..persze csak ha megvan hozzá a jogosultsága ez viszont session-ben van tárolva)
-ha olyan kérést küldök a szervernek ami adatokat módosít az menjen post-ban vagy bárhogy de utána legyen egy redirect a frissítések okozta galibák elkerülése végett. post után sosincs tartalommegjelenítés.

MVC példa. legyen fordítóprogram.

Model :: az alkalmazás logikáját valósítja meg.
-keresés
-fordítás felvétele
-fordítás törlése
-fordítás módosítása
-szótár (egy részének) elemeinek visszaadása

View :: kimenet generálása
-keresőform
-fordítás megjelenítése
-elemek listájának megjelenítése
-oldal vázának megjelenítése

Controller :: vezérlés
-mit akarunk éppen csinálni
-milyen adatok vesznek részt a mókában
-milyen model(eke)t, milyen view(ka)t használunk, ezeknek mely metódusait hívjuk meg

Oldal felépítése. Contenido CMS-t volt szerencsém használni, a kód elég fura :) de a logikája szerintem igen jó.
eszerint
-vannak layoutok: html váz, amiben modulokat helyezhetünk el.
-vannak modulok: dinamikus tartalomért felelős alkalmazások (menü, cikk, ajánló, galéria, stb)
-vannak template-ek: layoutok és modulok összerendelése

-jön egy kérés
-template meghatározása
-résztvevő modulok, azok bemeneteinek meghatározása
-modulok meghívása
-kimenetek bepakolása layout-ba
-viszon'látásra

nem teljes a példa, de dolgozni is kell valamikor. én kb így képzelem a dolgot.

az MVC legnagyobb erénye talán, hogy a hármasból bármelyiket lecserélve működhet a dolog, bármelyiket fel lehet használni más kontextusban is. ha olyan kódot írsz hogy észreveszed ezen tulajdonságokat és elámulsz, na akkor programozol MVC-ben :)
86

nagyjából értem

ggabor · 2011. Május. 11. (Sze), 16.24
Nem rossz összefoglaló az MVC elméleti és gyakorlati használatáról! Ugyanakkor a konkrét megvalósítás még számos kérdést vet fel. Megnézem majd ezt a Contenido CMS-t mert amit írtál, az nagyon hasonlít arra amerre én is indultam. Layout+Modules+Tempalates, bár itt a template helyett szerintem más fogalom kéne, ami akár lehetne maga a controller is.

A kérdés még mindig az, hogy "ki" dönti el, hogy mi jelenjen meg az oldalon? Megpróbálom világosabban:
- adott az url
- ez alapján eldöntjük (index.php-ban?), hogy melyik controller melyik metódusát kell meghívni.
- A meghívott controller metódus eldönti, hogy minek kell látszania a page-en.
- A betöltendő oldal elemeket (modulokat) betöltjük és így előáll az adott tartalom-rész.
- Eddig a pontig tehát controller alapján tudjuk, hogy mit kellene megjeleníteni, sőt akár már a konkrét tartalom is megvan.
- Be kellene tölteni egy layout-ot (vagy view-t), amiben viszont már szerepelnie kell minden "placeholder"-nek, amire szükség van.
- Ez azt jelenti, hogy minden lehetséges elrendezéshez kell egy konkrét layout.
- Ha így van akkor viszont simán lehetne layout alapján előállítani a tartalmat és így átrakni a vezérlést a view részbe.

"-kimenetek bepakolása layout-ba"

Lényegében ez az a pont ami számomra nem egyértelmű, hogy konkrétan hogyan történik? Mit hívunk meg miből, mit include-olunk és hol?
88

Ez azt jelenti, hogy minden

nova76 · 2011. Május. 11. (Sze), 18.35
Ez azt jelenti, hogy minden lehetséges elrendezéshez kell egy konkrét layout.

Ha neked minden egyes menüpontod másképp néz ki, akkor igen. De én még nem láttam olyan oldalt, ahol 5-6 layout ne lett volna elég.

Lényegében ez az a pont ami számomra nem egyértelmű, hogy konkrétan hogyan történik? Mit hívunk meg miből, mit include-olunk és hol?

Van egy url: http://weblabor.hu/forumok/temak/108734/hozzaszolas/123456
forumok action, temak metódusa, a többi meg a paraméter. Ez jeleniti meg a hozzászólást a témában. Ez egyetlen sor a layoutban: "echo $sf_data" Mivel ez a függvény mindenképp lefut és legenerálja ezt a változót, és eldönti hogy ezt a 2 hasábos (jobb oldali kicsit vékonyabb) layoutot jeleníti meg. A layoutban a jobb oldali divben szerepel néhány komponens hívás: "könyvajánló", "cikkajánló", "Friss blogmarkok", "Friss csiripek", stb. Ezek megjelenhetnek egy másik layoutban is, így egyetlen függvényhívás mindegyik (include_component). A komponens meg ugyanúgy néz ki, mint az action (más helyeken ezt hívják controllernek), csak ez nem az url alapján hívódik meg, hanem egy helper hívja meg. De ugyanúgy van neki vezérlő része (components class), és templatje(i). Ez a symfony.

Na de ez az, amit nem találsz meg a CakePHP-ban, pedig nagyon kéne. Ott azt tudod megcsinálni hogy az app_controller osztályban előállítod az adatokat és kirakod a layoutba. Mindet egy helyre beömlesztve. Gyönyörű szép spagetti kód kialakítása szinte kötelező.
89

De én még nem láttam olyan

Poetro · 2011. Május. 11. (Sze), 18.49
De én még nem láttam olyan oldalt, ahol 5-6 layout ne lett volna elég.

Akkor gondolom nem látogattál még hírportálokat. Azokon általában 10-20 alatt nem áll meg az elrendezések száma. Azért tudom, mert az utóbbi 5 évben ezeket csinálom.
90

Ok :-) De azért az itt

nova76 · 2011. Május. 11. (Sze), 19.12
Ok :-) De azért az itt leírtakhoz bőven elég lesz. Vagy akár ez a weblabor is max 3-4 layoutban elképzelhető.

Ha most megnézzük az origot, ott persze más a helyzet. De azért nem az az oldal, amiről elmondhatja bárki, hogy jól kiismeri magát rajta. Szerintem akik írják, talán, de én jó ha 4-5 layoutból megoldanám azt, amit láttam eddig belőle. Persze az a tizede sincs, az oldal minden funkciójának. De gondolom, hogy van aki nézi azt a részét is, mert biztos leállítanák, ha nem lenne érdeklődő :-)
92

Amúgy ha egy-egy layout

szabo.b.gabor · 2011. Május. 12. (Cs), 08.14
Amúgy ha egy-egy layout részei között van egyezés, akkor lehet azt is, hogy a közös részek egy layout-ban vannak és csak a különbségek vannak kiemelve.

tehát semmi sem akadályozza meg a kollégát olyan rendszer kialakításában amiben 'sublayout'-ok is vannak
91

Ha több fejlesztő

zsoltkunsagi · 2011. Május. 11. (Sze), 22.38
Ha több fejlesztő dolgozik egyszerre a projekten vagy ha a fejlesztési vezetőnek fontos, hogy megfelelő embert találjon, akkor jobb, ha egy dokumentált, ismert keretrendszerre építkeznek.
93

Contenido-t csak távolról

szabo.b.gabor · 2011. Május. 12. (Cs), 08.20
Contenido-t csak távolról nézni ajánlom :) bár jobb CMS-sel még nem találkoztam. szabad kezet ad, egyszerű, érthető, logikus, de a kód..

a layout ha úgy tetszik egy grid amiben placeholderek vannak a modul kimenetek számára

"-kimenetek bepakolása layout-ba" - modul kimenetek elhelyezése az oldal struktúrában.
94

a Template elnevezés valóban

szabo.b.gabor · 2011. Május. 12. (Cs), 08.35
a Template elnevezés valóban sántít, de a Contenido terminológiában így van. a kontroller sem igazán kerek, inkább nevezném egy konfigurációnak..

ahogy gondolom a hozzászólásaid alapján az egyik fő problémád az, hogy a megjelenő tartalom generálásának a sorrendjét csak úgy tudod elképzelni ahogy azok a html kódban egymást követik.

hagy ajánljam ezt :)

nem 'include' van, hanem 'set'.

és csak a program futásának legeslegvégén van echo és fetch(). ez ugye azért is jó, mert a program futása közben bárhol nyomhatsz egy header() függvényt, vagy akármi..
95

nem egészen

ggabor · 2011. Május. 12. (Cs), 10.44
Nem egészen az a problémám, hogy csak sorrendben tudom elképzelni a tartalom előállítását, sokkal inkább az, hogy célszerűbbnek tartom így megoldani a szervezést. Azt szeretném - lehetőség szerint - elkerülni, hogy a tartalmakat átmeneti változókban kelljen tárolni, majd átadni és feldolgozni. Azt gondolom, hogy lehet olyan vezérlést készíteni, amely révén nem kell átmeneti tartalom tároló változókat létrehozni és így lassítani a betöltést.

Egyre inkább azt látom, hogy a vezérlést át kellene az aktuális view-nak (layoutnak?), amely szépen sorban betöltené a megfelelő helyekre ami szükséges. Tehát a layout mondaná meg, hogy mit kell megjeleníteni. Az elején az url alapján csak azt kellene eldönteni, hogy melyik view kell. Az egyes helyekre betöltött "modulok" meg tovább értelmeznék a maradék url paramétert és aszerint jelenítenék meg a saját tartalmukat mondjuk a kért sorrendben.

Tehát szerintem nagy vonalakban elég egy index.php -> page_<id>.php, amely többféle view<id>.php-t include-olna és ezek az egységek hívnának meg különféle funkciókat a model részből. Valahogy így:

- index //melyik page kell?
--- page1 //layout file, a view részben
----- view1 //egy "önnműködő" blokk a layout-on belül
-------- include 'magazine/news.php'
-------- magazineGetNews(2) //legfrisebb 2 hír
----- view2
-------- include 'catalog/items.php'
-------- catalogGetLast(10) //legújabb 10 hirdetés
----- view3
-------- include 'community/entries.php'
-------- communityGetEntry(5) //legutóbbi 5 hozzászólás


Így az egyes view fájlokat bármelyik page-en be lehet tölteni, akár úgy is, hogy pl. paraméterek alapján különböző sorrendben jeleníti meg a tartalmat a különböző page-eken.
99

azt hiszem értem a logikádat.

szabo.b.gabor · 2011. Május. 13. (P), 08.05
azt hiszem értem a logikádat. próbálom ráhúzni eddigi projektekre agyban, hogy esetleg mi lehet buktató benne.

először az a kérdés merült fel bennem, hogy mi van olyankor ha view1, view2, view3 közös adatokon dolgozik? de végülis lehet azt csinálni hogy ilyenkor a felettük lévő szinten jön létre a közös adat..

mi van akkor ha view3-ban submitolnak egy formot? hogyan küldök redirectet? ob_* függvények használatával (pl a page-ben) ez sem okoz gondot.

belekötni nem tudok. én az OOP-t nem áldoznám fel a teljesítmény oltárán.. de a te projekted azt csinálsz amit akarsz :)
101

további magyarázat

ggabor · 2011. Május. 13. (P), 08.31
Teljesen mindegy, hogy a különböző view-k milyen adatokon dolgoznak, mert azok előállítását a model rétegben oldom meg, így ha több view-nak kell ugyanaz a tartalom, akkor sem lesz többszörös lekérdezés.

Az viszont jó kérdés, hogy mi történik akkor, ha valamely view-ban form-ot küldök. Szerintem egyszerűen ugyanaz a page jön be és csak a kérdéses view rész tartalma változik majd meg. A redirect megoldható úgy, hogy a post-ra meghívom a küldő view feldolgozóját, majd ezután redirect az eredeti page-re.

A php OOP-vel az a gondom, hogy .NET után nem tűnik túl kiforrottnak. Lenne még mit fejleszteni rajta. Így tehát számomra csak felesleges bonyolításnak tűnik ahhoz képest, hogy szinte minden megoldható procedurálisan és sokkal jobb teljesítménnyel. Ez persze semmiképpen nem jelent ész nélküli gányolást, inkább erőteljesebb szervezési szemléletet.

Egyébként meg lehet, hogy megoldom inkább asp.net-el. Most néztem meg egy kicsit részletesebben a MS féle ASP MVC 3-at és nem tűnik rossznak. Azt olvastam, hogy pl. a stackoverflow.com is ezzel készült, ami egy eléggé látogatott, mégis gyors site.

ps.: Túl vagyunk a 100. hozzászóláson! Ezt nem gondoltam volna :)
105

A helyedben én is asp.net-tel

inf · 2011. Május. 13. (P), 12.25
A helyedben én is asp.net-tel oldanám meg, több benne a ráció, mint abban, hogy nekiállsz php-t tanulni évi pár ezer ft megspórolása miatt.
106

ezt is tanulni kell

ggabor · 2011. Május. 13. (P), 14.25
Az asp-t is tanulni kell, bár a C# miatt ez sokkal egyszerűbb lesz. A php-vel sem állok igazából hadilábon, csak hiányolom a letisztult fejlesztési közeget és módszereket. Nem is értem, hogy ennyi év után miért nincs egységes keretrendszer php-hoz?!
107

Nincs pénz benne...

inf · 2011. Május. 13. (P), 16.13
Nincs pénz benne...
113

Egységes keretrendszer

Ifju · 2011. Május. 16. (H), 12.54
Szerintem elsősorban valódi igény nincs rá, hogy legyen egységes keretrendszer.

Egyrészt a PHP egy sokkal vadabb jószág, mint a C# vagy a JAVA. Messze könnyebb vele elkezdeni dolgozni az elején, viszont pont a rugalmassága, szabályozatlansága miatt sokkal nagyobb fegyelmet igényel, és jobban meg kell tanulni vele bánni hosszútávon, különben csak gányol az ember.

A fentieknek köszönhető, hogy a PHP ökoszisztémája rettentő módon kiterjedt és sokszínű, amiatt sincs egységes keretrendszer. Ha valaki vállalkozik arra, hogy egy olyan keretrendszert alakítson ki, ami megőrzi a PHP rugalmasságát, az abban a helyzetben találja magát, hogy olyan szinten kell túlgeneralizálnia mindent, ami nagyon durván az olvashatóság és a teljesítmény rovására megy. Túl rugalmas jószág a PHP ahhoz, hogy egységes keretrendszert lehessen építeni vele, viszont így megmarad a lehetősége az embernek, hogy a feladathoz válasszon keretrendszert, és adott esetben, ha értelme van, akkor keverje őket.

Ugyanígy a PHP rugalmassága az oka annak is, hogy nincsenek letisztult módszerek.

Természetesen meg lehet ezt fogni szarkasztikusan is, és azt mondani, hogy a PHP átgondolatlan, ami látszik az API- és függvénykönyvtár következetlenségén, és emiatt egy hatalmas katyvasz az egész, de azért kiismerhető ez a katyvasz.

Mindehhez én hozzátenném, hogy a PHP mind a mai napig a stateless HTTP protokollhoz igazodik, és nem egy általános célú szkriptnyelv, éppen ezért nincs valódi alkalmazásszerver sem hozzá, és nem igazán hatékony daemonokat írni vele.
102

Ez gyakorlatilag ugyanaz a

inf · 2011. Május. 13. (P), 08.59
Ez gyakorlatilag ugyanaz a logika, mint egy normál MVC-s oldalnál van, csak struktúráltan leprogramozva. Nyilván az oo hiánya miatt kicsit szegényesebb a környezet, de ugyanúgy megoldható így is minden, nem látok kivetni valót benne.

Nálam egy kérés életciklusa ez (elméletben):
(a hibaüzeneteket mindig a front-controller vagy a controller kezeli le)
  1. a bejövő kérést átirányítom a front-controller-re
  2. a front controller utánanéz, hogy az adott controller / action használatához van e joga az user-nek (ha nincs joga, akkor hibaoldalra irányít)
  3. a front controller átadja a kérést a megfelelő controller-nek
  4. a controller validálja a kérést (ha nem valid, akkor hibaoldal)
  5. a controller végrehajtja a model-en az esetleges módosításokat
  6. a controller kirajzoltatja a view-al az oldalt
  7. a view bekéri a skeletont (ehhez header is tartozik), aztán kitölti az egyes blokkokhoz tartozó információkkal (a dokumentum felépítésében a view adatokat kérhet a controller-től és a model-től is)
  8. végül a view elküldi az eredményt
108

Az a helyzet, hogy annyit

inf · 2011. Május. 13. (P), 19.33
Az a helyzet, hogy annyit dumáltunk róla, hogy megint kedvet kaptam saját framework készítéséhez :D
110

Köszi :)

Kérésre törölve 11. · 2011. Május. 16. (H), 07.57
Én meg szeretném megköszönni a résztvevőknek ezt a kis társalgást!
Hónapok óta keresek valami használható leírást, útmutatót, hogy tképp mi is az az MVC és a gyakorlatban ezt hogyan lehet megvalósítani. Ebből a beszélgetésből többet tudtam meg a témáról, mint a korábban talált, sokszor egymásnak is ellentmondó anyagokból összesen.
111

el is kezdted?

ggabor · 2011. Május. 16. (H), 08.43
Komolyan gondolod? Mert végülis úgy döntöttem, hogy php-ban oldom meg a feladatot és már egy pár dologgal készen vagyok. Esetleg összedolgozhatnánk, ha gondolod. :)
112

Hát ha van kedved... Egyelőre

inf · 2011. Május. 16. (H), 10.21
Hát ha van kedved...
Egyelőre annyi történt, hogy összeírtam 20 osztályt, meg hogy azok mit csinálnak. Az a koncepcióm, hogy több Tear(projekt) van (mondjuk frontend, backend), amiknek eltérő a felületük, és egymástól is tudnak átvenni Controllereket. Amikor egy kérés megy, akkor a domain (vagy url) alapján választ egy Tear-t a Bootstrap, és létrehoz belőle egy példányt. Az adott Tear hozza létre a Session és Request osztályokat, így mondjuk a backend-nél beállítható, hogy full máshol tárolja az adminok session adatait, mint a szimpla felhasználókéit.
A Request azt csinálja, hogy elkéri a Session-től a Controller-t, amit éppen használni akar, és meghívja rajta az Action-t. Mivel a Session-ben tárolódnak a jogok, ezért csak ő tudja, hogy milyen Controller-t adhat ki és milyet nem. Mondjuk ha nincs meg a jogosultság egy kérésnél, akkor ErrorController-t ad ki a Session a Request-nek.
Innentől meg hagyományos MVC, talán annyi különbséggel, hogy én jobb szeretek minden Action-nek külön osztályt csinálni, mert úgy egyenként be lehet tölteni őket, és nem kell egy Controller-nél az összes Action-t feleslegesen befordítani.

(A Tear-t nem biztos, hogy jól értelmezem, elvileg az a Controllerek összessége, szóval mondjuk ha van egy publikus része az oldalnak, az is egy Tear, meg az a része is egy Tear, amit csak az adminok láthatnak...)

Egyelőre ennyi, ahogy felépíteném, annyi apró gond van, hogy most a diplomámat írom, és napi 10+ órákat kísérletezek, hétvégén meg szöveget szerkesztek ugyanennyit, szóval időm az nagyon nincs... Majd dobj egy emailt, aztán konzultálunk a továbbiakról, meg hogy te hogy képzeled el a rendszert.
114

egész másképp kezdtem hozzá

ggabor · 2011. Május. 16. (H), 13.52
Én magam is nekiálltam kidolgozni egy saját rendszert, de alapvetően procedurális alapon. Ugyanakkor az MVC logikát megtartottam. Ami már megvan abból úgy látom, hogy egészen jó úton haladok, legalábbis a koncepció működőképes és az osztályok mellőzésével piszok gyors is lesz.

Eddig megvan a központi vezérlés, a router logika, a page-ek és view-k kezelése, valamint a nyelvi verziók és különböző template-ek támogatása.

Ez persze merőben más megközelítés, mint amit te vázoltál, ezért nem hiszem, hogy érdemes lenne együttműködni, hacsak téged nem érdekel az én megoldásom.
115

"Ez persze merőben más

inf · 2011. Május. 16. (H), 14.08
"Ez persze merőben más megközelítés, mint amit te vázoltál, ezért nem hiszem, hogy érdemes lenne együttműködni"

Jah, egyetértek. Hát sok sikert hozzá.
116

Hát úgy látom hiába

nova76 · 2011. Május. 16. (H), 18.15
Hát úgy látom hiába beszéltünk annyit :-)
Azért elárulhatnád hogy mi késztetett a procedurális megoldásra?

osztályok mellőzésével piszok gyors is lesz

És hogyan lesz MVC, ha prodecurális? Például ebből a model hogy lesz? Minden adatbázis tábládhoz külön eljárásokat írsz? Amik aztán közös eljárásokat használnak? Gondolod hogy attól lassúbb lesz egy projekt, mert az egészet becsomagolod egy classba? Én nem hiszem hogy maguk az osztályok legenerálása az, amitől lassú mondjuk egy symfonys projekt. Inkább attól hogy van benne 4000 fájl, aminek a felét/negyedét be is tölti. Persze azt a 1-2000 fájlt Te is létre fogod hozni, mivel ugyanúgy szükséges lesz bizonyos feladatokat szétválasztanod. pl:
- valamilyen biztonságos db függvényeket.
- routing függvényeket
- paraméterek kezelését segítő függvényeket.
- formokat és annak mezőit létrehozó függvényeket (erre már mindenképp egy/több osztály a legideálisabb)
- felhasználói üzenetkezelést kezelő függvényeket
- admin felületet generáló függvényeket
- és még sorolhatnám

Persze írhatsz egy darab index.php fájlt is...

Aztán miután elkészülsz a projekttel és szeretnéd máshová is eladni, kezdheted elölről, mert ott egy kicsit mást is kértek.
117

Beleszólhat egy (majdnem) teljesen zöldfülű?

Kérésre törölve 11. · 2011. Május. 16. (H), 18.54
Még nyoma sem volt webnek, amikor felhagytam a programozással, mostanában próbálom (egyre csökkenő lelkesedéssel) újratanulni, szóval könnyen lehet, hogy hülyeséget beszélek.

Gondolod hogy attól lassúbb lesz egy projekt, mert az egészet becsomagolod egy classba?

Úgy gondolom, nem attól lesz valami objektum orientált, hogy egyetlen class-ba csomagolod. Ha pedig sok osztályod van, amiket minden egyes, a web szerverhez érkező kérésnél példányosítani kell, az már okoz némi overheadet. Megsaccolni sem tudom, mennyit lassít, de valamennyit biztosan. Ha pedig nagy forgalmú oldalt veszünk alapul, akár a felhasználók által is érzékelhető mértékű lehet(ne) az eltérés.

Aztán miután elkészülsz a projekttel és szeretnéd máshová is eladni, kezdheted elölről, mert ott egy kicsit mást is kértek.

Ezt azért nem kellett volna. ;)
Az OOP kitalálása előtt is volt számítástechnika, léteztek nagy projectek, ott sem kellett mindent újraírni, ha máshová akartad eladni a rendszert.

De még1x: tévedés joga fenntartva! :)
126

Overhead...

Ifju · 2011. Május. 17. (K), 11.55
Úgy gondolom, nem attól lesz valami objektum orientált, hogy egyetlen class-ba csomagolod. Ha pedig sok osztályod van, amiket minden egyes, a web szerverhez érkező kérésnél példányosítani kell, az már okoz némi overheadet. Megsaccolni sem tudom, mennyit lassít, de valamennyit biztosan. Ha pedig nagy forgalmú oldalt veszünk alapul, akár a felhasználók által is érzékelhető mértékű lehet(ne) az eltérés.


Ahogy megvan annak is az overheadje, hogy a kismillió eljárást be kell nyalni, és memóriában tartani.

Az objektumorientáltság egyik értelme az, hogy az entitásokat és a velük végzett műveleteket egy helyen tartod, ebbe beleértve a különböző validációkat, amiket procedurális alapon, ha defenzív módon programozol, akkor neked kell minden egyes függvény esetén meghívnod, mert abból nem sokat tudsz megállapítani, hogy van egy array típusú változód. Objektumorientált módszertant alkalmazva az objektum-osztályok validációját elvégzi a Zend engine, és nem neked kell erre kódot írnod.

Egy dologban biztos vagyok: objektumorientáltan könnyebb, gyorsabb, biztonságosabb érzés dolgozni, és a procedurális módszerhez viszonyított időkülönbözetet fel lehet használni arra, hogy az ember optimalizálással és refaktorálással foglalkozzon, és adott idő alatt közel ugyanolyan sebességű és erőforrás-igényű rendszert kapjon.

Az objektumorientáltságnak nem a rendszer működése szempontjából van feltétlenül értelme, hanem inkább a fejlesztési folyamat részéről, és annak a gyorsításában, mert versenyhelyzet van a világban: aki hamarabb készít működő rendszert, az hamarabb tud szolgáltatni, hamarabb jut pénzhez, és hamarabb tud reagálni a változásokra is. Röviden: jó eséllyel életképesebb lesz üzletileg, mint a versenytársai. Cserébe lehet, hogy nem lesz annyi oka lengetni az e-péniszét, mint a csődbejutó versenytársnak.
129

Az objektumorientáltságnak

Hidvégi Gábor · 2011. Május. 17. (K), 15.00
Az objektumorientáltságnak [...] a fejlesztési folyamat részéről, és annak a gyorsításában

Attól, hogy objektumorientáltan programozol, nem fogsz gyorsabban dolgozni, procedurálisan is el lehet készíteni ugyanazt, ugyanannyi kódból.
132

Mégis miért kéne?

ggabor · 2011. Május. 17. (K), 15.40
"Ahogy megvan annak is az overheadje, hogy a kismillió eljárást be kell nyalni, és memóriában tartani."

Az osztályok használatának mellőzése alatt nem azt értem, hogy az összes függvényt bevágjuk egy file-ba és kész. Ennek így tényleg semmi értelme.

Ellenben ha megoldjuk a funkció csoportok létrehozását fájl alapon, akkor lényegében ott vagyunk mintha osztályokkal dolgoznánk. Csak azt töltjük be, amire feltétlenül szükség van.

Emlékeim szerint php alatt is javasolt az 1 osztály / 1 file megoldás alkalmazása. Namost ha ezt osztály alapon betartjuk, akkor fájl alapon, függvényekkel pontosan ugyanezt szeparációt megvalósíthatjuk. Mésgem kell példányosítanunk objektumokat.
133

Hát az 1 osztály 1 fájl

inf · 2011. Május. 17. (K), 15.46
Hát az 1 osztály 1 fájl annyira szerintem nem tuti php-nál, nagyon sok fájl műveletet eredményez.
127

beszólhat :-)

nova76 · 2011. Május. 17. (K), 12.49
Úgy gondolom, nem attól lesz valami objektum orientált, hogy egyetlen class-ba csomagolod.

Pedig minden más megvalósítható procedurálisan is. :-) Például javascriptben úgy is készül egy objektum, hogy egy függvényt példányosítasz.

Ha pedig sok osztályod van, amiket minden egyes, a web szerverhez érkező kérésnél példányosítani kell, az már okoz némi overheadet.

Még a statikus függvényeknél is?

Az OOP kitalálása előtt is volt számítástechnika, léteztek nagy projectek, ott sem kellett mindent újraírni, ha máshová akartad eladni a rendszert.

Nagy projektek? Szerintem a legtöbb OOP nélküli "nagy projekt" egy hétvégén összedobható. Elég régi dolog ez az OOP. De amúgy igazad van, nem feltétlen kell amiatt újraírni. Csak kérdés, hogy hogy emeled ki a különböző funkciókat. Hogyan tudod megoldani azt, hogy egy funkciót felülírsz, ám utána egy javítás ne csak az épp aktuális projektet javítsa. Ha egy aránylag kicsi és egyetlen projektben gondolkozol, akkor nem kell OOP, és nem kell MVC se. De akkor meg azért nem érdemes vele küzdened, mert a 90%-át legenerálja bármelyik MVC keretrendszer.
128

Nagy projektek? Szerintem a

Kérésre törölve 11. · 2011. Május. 17. (K), 14.15
Nagy projektek? Szerintem a legtöbb OOP nélküli "nagy projekt" egy hétvégén összedobható.


Ezt a kijelentésedet betudom fiatal korodnak, tapasztalatlanságodnak. :)
Persze ha te egy hétvége alatt összedobsz egy komplett vállalatirányítási rendszert a 80-as évek elején létező eszközökkel, akkor elhiszem, hogy igazad van.
118

MVC attól lesz, hogy

ggabor · 2011. Május. 16. (H), 22.32
Szerintem meg nem hiába beszéltünk a dolgokról. Engem legalábbis a fenti párbeszéd arról győzött meg, hogy lényegében senki nem tudja ésszerűen megindokolni az osztályok minden áron történő használatát.

Én úgy vagyok vele, hogy php alatt elsőbbséget kell, hogy élvezzen a teljesítmény minden mással szemben. Kivéve persze a biztonságot!

Másrészt meg az OOP számomra inkább szervezési kérdés mint nyelvi. Tehát azt vallom, hogy egy jól szervezett "függvénytár" és hozzá tartozó vezérlő logika könnyen lehet, hogy közelebb van a tényleges OOP-hoz, mint egy rakás nyelvi osztály.

Az MVC meg ott van, hogy a vezérlés, az adatkezelés és a megjelenítés határozottan elkülönül nálam is. Vannak különböző template-ek, ezek alatt master fájlok, page és view fájlok. És egyik sem valósít meg semmilyen működési funkciót, csupán a megjelenítést végzi.

De inkább bemásolom ide az index.php jelenlegi - közel sem teljes! - tartalmát (az authenticate részt most raktam bele, csak úgy a teszt kedvéért - ezért ez nyilván még csak gyenge "demo"):

<?php

	include 'define.php';
	include 'config.php';
	include 'system.php';
	
	

	/*** BOOTSTRAP ****************************************************************************************************************/
	/******************************************************************************************************************************/
	
	session_start();

	//--- CLEANUP REQUEST -----------------------------------------------------------------------------//
	$config[URL][PAGE] = trim(str_replace($_SERVER['QUERY_STRING'],  '', $_SERVER['REQUEST_URI']), '?');
	$config[URL][PAGE] = preg_replace('|^' . trim(ROOT, '/') . '/*|','', trim($config[URL][PAGE], '/')); 
	$config[URL][PAGE] = preg_replace('|^index.php/*|', 	 '', 		 trim($config[URL][PAGE], '/'));
	//-------------------------------------------------------------------------------------------------//
	
	//--- SAVE QUERY STRING FOR EASY FURTHER USE ---------------------------------------------------------//
	$config[URL][URI] = $config[URL][PAGE];
	$config[URL][GET] = trim($_SERVER['QUERY_STRING']) == '' ? '' : ('?' . trim($_SERVER['QUERY_STRING']));
	//----------------------------------------------------------------------------------------------------//
		
	//--- SET LANGUAGE --------------------------------------------------------------------------------------------------//
	if ($config[URL][PAGE] &&   (strlen($config[URL][PAGE]) == 2 || preg_match('|^../|', 		 $config[URL][PAGE])))
	{ configSetNow($config[LANG],substr($config[URL][PAGE], 0, 2));  $config[URL][PAGE] = substr($config[URL][PAGE], 3);  }
	//-------------------------------------------------------------------------------------------------------------------//
	
	//--- LOAD GLOBAL LANG TEXT ---------------------------------------//
	$config[TEXT] = include 'lang/' . $config[LANG][NOW] . '/global.php';
	//-----------------------------------------------------------------//
		
	//--- MERGE ALL PAGE TRANSLATED DATA -------------------------------------------------------------------------//
	$config[PAGE][LANG] = include 'lang/' . $config[LANG][NOW] . '/pages.php';
	foreach ($config[PAGE][ALL] as $name => $data)
	$config[PAGE][ALL][$name] = array_merge($config[PAGE][ALL][$name], $config[PAGE][LANG][$name]);
	//------------------------------------------------------------------------------------------------------------//
		
	//--- LOAD PAGE PATH TRANSLATIONS  ---------------------------------------------------------------------------//
	$config[PAGE][LANG] = include 'lang/pages.php';
	foreach ($config[PAGE][LANG][$config[LANG][NOW]] as $key => $value)	$config[PAGE][ALL][$value][NAME] = $key;
	//------------------------------------------------------------------------------------------------------------//
	
	//--- CREATE EACH PAGE MENU ITEMS ----------------------------------------------------------------------------//
	foreach ($config[PAGE][ALL] as $name => $data)
	{
		if (false != ($pos = strrpos($name, '/'))
		&& (!array_key_exists(MENU,  $data) || $data [MENU] !== false))
		$config[PAGE][ALL][	 substr ($name, 0, $pos)][MENU][] = $name;
	}
	//------------------------------------------------------------------------------------------------------------//
		
	$config[URL][PARAM] = array();
	
	//--- DETECT REQUESTED, SET VALID RESPONSE PAGE ------------------------------------------------------------//
	if ($config[URL][PAGE]) 
	{
		while (!array_key_exists($config[URL][PAGE], $config[PAGE][LANG][$config[LANG][NOW]]))
		{
			if (false === ($pos = strrpos($config[URL][PAGE], '/'))) 
			{//THIS IS THE LAST PART OF THE URI AND NO VALID PAGE WITH THIS NAME

				$config[PAGE][NOW] = null;
				break;
			}
			else 										 
			{
				array_unshift($config[URL][PARAM], substr($config[URL][PAGE], $pos+1));
				$config[URL][PAGE] = substr($config[URL][PAGE], 0, $pos);
			}
		}
		
		$config[PAGE][NOW] 	= $config[PAGE][NOW] === null ? 'error/404'
							: $config[PAGE][LANG][$config[LANG][NOW]][$config[URL][PAGE]];
	}
	else 	
	{
		$config[URL][PAGE]  = $config[PAGE][ALL][$config[PAGE][NOW]][NAME];
	}
	//----------------------------------------------------------------------------------------------------------//

	//FOR EASIER FURTHER USAGE:
	$config[PAGE][PART] = explode('/', $config[PAGE][NOW]); 
	
	//--- SET ACTIVE MAINMENU  -------------------------------//
	if (array_key_exists($config[PAGE][PART][0], $config[MENU]))
		$config[MENU]	[$config[PAGE][PART][0]][NOW] = true;
	//--------------------------------------------------------//
		
	//--- SET AND STORE THEME BY QUERY OR SESSION -----------------------------------------//
	 	 if (isset ($_REQUEST[THEME] )) configSetNow($config[THEME], $_REQUEST[THEME]);
	else if (isset ($_SESSION[THEME] )) configSetNow($config[THEME], $_SESSION[THEME]);
	//-------------------------------------------------------------------------------------//
	
	//--- AUTHENTICATE: CLEAN UP REQUEST --------------------------------------------------------------------------------------------------------------//
	if (isset($_REQUEST['user']) && (trim($_REQUEST['user']) == '' || rtrim($_REQUEST['user'], '.') == $config[TEXT]['email'])) unset($_REQUEST['user']);
	if (isset($_REQUEST['pass']) && (trim($_REQUEST['pass']) == '' || rtrim($_REQUEST['pass'], '.') == $config[TEXT]['pass'] )) unset($_REQUEST['pass']);
	//-------------------------------------------------------------------------------------------------------------------------------------------------//
	
	//--- AUTHENTICATE: CHECK REQUEST -------------------------------------------------//
	if (isset($_REQUEST['login']) && isset($_REQUEST['user']) && isset($_REQUEST['pass']))
	{
		if ($_REQUEST['user'] == 'admin' && $_REQUEST['pass'] == 'admin') 
		{	$_SESSION['user'] =				$_REQUEST['user'];			}
		else 
		{
			if (isset($_SESSION['user'])) unset($_SESSION['user']);
			$config[PAGE][NOW] = 'personal/login';
		}
	}
	else if (isset($_REQUEST['logout']))
	{
		unset($_SESSION['user']);
		
		redirect(pageGetDataNow(AUTH) == 0 ? getRemove(pageHrefNow(), 'logout', 1) : pageHref('home'));
	}
	else if (isset($_SESSION['user']))
	{
		//IS STILL VALID USER?	
	}
	//--------------------------------------------------------------------------------//
		
	/******************************************************************************************************************************/
	/******************************************************************************************************************************/
	

	include 'view/' . $config[THEME][NOW] . '/master.php';
	
	
Mint látható a lényeg egy $config (array) változó, amely többféle config alapján, illetve a futásidejű adatok alapján áll össze a végére. És a végén nincs is más teendő, mint behívni az aktuális template master fájlját (ez meg behívja a $config[PAGE][NOW] page view fájlt - persze nem include-al, hanem egy pageLoadNow() nevű függvénnyel)
119

offtopic(?)

Kérésre törölve 11. · 2011. Május. 17. (K), 06.49
Gábor!
Meg tudnád mondani, miért include-okkal indítod a kódot, miért nem require-t v. inkább require_once-t használsz? Van valami konkrét oka vagy csak a megszokás?
121

csak megszokás

ggabor · 2011. Május. 17. (K), 08.43
Az include vs. require között ha jól tudom annyi a különbség, hogy az include után folytatódik a végrehajtás, a require után nem. Így valóban célszerűbb lenne a require, igazad van. Mondjuk végülis mindegy, mert ha valamelyik nincs meg, akkor megette a fene az egészet.

A *_once függvények viszont ha jól tudom lassabak mert ellenőrzik a korábbi betöltéseket is. Ezeket itt ezért nem használom. Mert felesleges ellenőrizni, hiszen az index-ben vagyunk.
123

Igen, én is úgy tudom, hogy

Kérésre törölve 11. · 2011. Május. 17. (K), 09.28
Igen, én is úgy tudom, hogy ennyi a különbség. Viszont azt látom, hogy következetesen, szinte mindenki include-ol require helyett. Azt hittem, van valami olyan hátránya a require-nek, amit nem ismerek.
Tankjú!
120

Én nem úgy állok hozzá, hogy

inf · 2011. Május. 17. (K), 08.39
Én nem úgy állok hozzá, hogy miért éri meg objektumokat használni, hanem úgy, hogy mennyivel nehezíti az életedet, ha nem használod őket. Osztályok nélkül sokkal jobban oda kell figyelni az átláthatóságra, illetve a függvénynevekkel is gondok lehetnek, ha már foglaltak. Nekem egyáltalán nem éri meg, mert szerintem nem ad annyival nagyobb sebességet, de még ha adna is, akkor is maradnék az objektumoknál, mert nekem egyszerűbb így az élet.
122

persze, hogy könnyebb

ggabor · 2011. Május. 17. (K), 08.52
Teljes mértékben egyetértek veled. Ugyanakkor a php esetében számomra a saját dolgom megkönnyítésével szemben nagyobb prioritás a teljesítmény. Másrészt meg tudom úgy szervezni a rendszert, hogy semmivel sem lesz átláthatatlanabb mint osztályok használata esetén.

Elentétben egy sokrétű desktop alkalmazással a php számomra egy igen egyszerű terület. Ahhoz képest amiket .NET alatt fejlesztetek egy oldal legenerálása számomra gyerekjátéknak tűnik. A nyelvi elemek, konvenciók és technikák elsajátítása, illetve működésük megértése jelent némi tanulni valót, de végső soron minden futás során egyetlen egy darab oldalt kell legyártani - a lehető leggyorsabban.

Én azt mondom, hogy ehhez tökéletesen elég kell, hogy legyen a különböző állományok "összeépítése" egy layoutban. Az összeépítéshez kíváló eszköz a php függvénytár - objektumok nélkül.

Szívesen venném, ha közzétennél egy-egy részt az általad megvalósított osztály alapú vezérlésből, mert így talán megértem végre, hogy mégis szükség van osztályokra valamiért.

Egyébként meg az életemet semmiképpen nem nehezíti a saját megoldásom sem most, sem később, hiszen én készítem. Ezen kívül kellőképpen moduláris a dolog ahhoz, hogy a továbbfejlesztés is könnyedén megoldható legyen.

Mégvalami. Erősen elgondolkodtam azon, hogy a php-s frontend mellett .NET (C#) backend-et készítek, ami így tökéletes desktop admin program lehet és php feladata kizárólag a megjelenítés lesz.
124

Dinamikus honlap

Max Logan · 2011. Május. 17. (K), 09.30
Meglátásom szerint a PHP szintű objektumhegyek létrehozása azért szükséges, hogy "értelmesen" lehessen alkalmazásokat írni. Annó a PHP ha emlékeim nem csalnak, akkor arra termett, hogy megkönnyítse a statikus HTML oldalak generálását. Nem pedig arra, hogy masszív kétirányú kommunikációt megvalósító dinamikus rendszereket fejlesszük vele. Tehát ha olyan jellegű programozást akarunk megvalósítani, mint egy desktop alkalmazás esetén -- mert ugye ilyen jellegű működést várunk el a rendszertől --, akkor kénytelenek vagyunk olyan szintű absztrakcióval élni, mely elfedi, hogy a bemenet egy HTTP kérés, a végeredmény pedig egy statikus HTML oldal lesz. Szerintem.

Így igencsak helytálló a te megközelítésed, hogy a PHP-t annak értelmezed, ami.

Update: éppen a napokban gondolkodtam azon, hogy egy link előállítása a rendszer mely részének a feladata (M-V-C)? Aztán végül visszanyúlva a desktop alkalmazások logikájához, valamint, hogy a kérdés hogyan van megoldva JS esetén, arra jutottam, hogy a nézet feladata. Mert egy link valójában nem más, mint egy eseménykezelő. És ugye itt látszik, hogy miért is érdekes játék HTML frontend-del, stateless HTTP protokoll segítségével alkalmazásokat gyártani...
125

+1 :) A linkek tényleg a

inf · 2011. Május. 17. (K), 11.02
+1 :)

A linkek tényleg a View-hoz tartoznak. Elgondolkodtam kicsit a php-t hívó vezérlő elemeket, pl a lineket lehet remote action-nek tekinteni, mert végülis egy action-t vált ki a szerver oldalon. Ugyanígy az űrlapok is ilyenek. Végülis maga a php szempontjából View réteg is felépíthető MVC szerint, ahogy mondjuk extjs csinálja a gridekkel. Ott is vannak adatok, controllerek (amiknek egy része kérést küld a szerver felé), meg view, amit ténylegesen látunk.

Én sem hiszem, hogy a php oop kifejezetten szükséges, én is csak azért használom, mert objektum orientáltan tudok csak programozni, nem tudom strukturálisan hogyan szokták szervezni a kódot, és nem is szeretném megtanulni. Nekem ez így bőven jó. Kisebb munkáknál a strukturális programozás is megfelel, mert minek túlbonyolítani, a kérdés meg csak annyi, hogy kinek mi a kisebb munka... :-)
130

Másrészt meg az OOP számomra

Hidvégi Gábor · 2011. Május. 17. (K), 15.04
Másrészt meg az OOP számomra inkább szervezési kérdés mint nyelvi.
Nagyjából én is így gondolkozom, egyébként az OOP-nek akkor látom értelmét, ha többen dolgoznak egy munkán, mert azzal jórészt ki lehet zárni a hackelés lehetőségét, hogy priváttá teszel változókat és függvényeket.
131

ezzel nem értek egyet

ggabor · 2011. Május. 17. (K), 15.35
Csapatmunka esetén szerintem nem sokat számít, hogy valami private vagy nem. Sokkal fontosabb, hogy a fejlesztők mindegyike pontosan tisztában legyen az alkalmazott elvekkel. Mondok egy valós példát: dolgozott nekem olyan kolléga, aki a private változót látva létrehozott egy újat ugyanarra a feladatra publikként és a kód további részét azzal oldotta meg. Mondanom sem kell, hogy ez nem éppen nyerő dolog. A gondot az okozta, hogy nem értette meg pontosan, hogy az adott változó mire való és miért private.

Szóval ez számomra nem szempont.
134

A gondot az okozta, hogy nem

inf · 2011. Május. 17. (K), 15.48
A gondot az okozta, hogy nem értette meg pontosan, hogy az adott változó mire való és miért private.


Hát most vagy a kollégával volt a baj, vagy a kóddal... Legalábbis én úgy olvastam, hogy az a jó kód, aminél ránézésre a változónevekből látod, hogy mit csinál...
135

Nálam ez a felállás...

hamlet79 · 2011. Május. 18. (Sze), 12.12
Érdekes olvasni, hogy a szent OOP/MVC felállás sokak számára nem tűnik hatékonynak (végre nem vagyok egyedül).

Az alapvető problémám az OOP-vel, hogy szerintem fölösleges a weben ahol annyi a feladat, hogy generáljunk valami html-t, hiszen a következő requestre úgyis elveszítünk mindent és generáljuk elölről. Természetesen a procedurális programozásnak is megvannak a hátrányai, de ha megfelelően strukturáljuk a kódot akkor az is könnyen átlátható és jóval rövidebb, mint az OOP kód. A OOP előnyét a team munkánál látom, biztos könnyebb több embernek kezelni, viszont ez is csak logikus elrendezés kérdése.

Nálam kb így működik:
- index.php - ide fut be minden, ez van csak a web rootban
- config.php - környezet meghatározása, db kapcsolat, DEFINEok
- init.php - a minden oldalfutás során szükséges teendők elvégzése (COOKIE, SESSION ellenőrzések, jogosultságok (vengéd vagy tag vagy admin), url struktúra feldolgozása, majd az includeok kezelése és engedélyezése)
- functions_helper.php - közösen használt globális függvények (adatbázis / cache kezelése, input/output kezelések és whitelist stb)
- functions_global.php - az oldallal kapcsolatos általános függvények, természetesen célszerű minél több újrahasznosítható (paraméterezhető) kódot írni (általános felhasználói információk lekérése, login, kommentezés, oldallapozás, email küldés stb)
- functions_[aloldal].php - az aloldalak / modulok függvényei, csak az adott aloldalon tölt be
- [aloldal].css, [aloldal].js, ha szükséges, csak az adott aloldalon tölt be

- [aloldal].php - egyedi oldal vagy újrahasznosítható modul - a fenti függvények segítségével lekéri az információt és megjeleníti azt

Persze biztos gányolás(nak tűnik), de nekem nagyon bevált. Minden új oldal/sablon önállóan él és használhatja a globális adatokat. Nagyon egyszerű új funkciókat beépíteni az oldalba, mintha egy nagyon apró önálló php/mysql oldalt raknék össze. Ha egy aloldal túl bonyolult akkor lehet akár al al aloldalakat (modulokat) csinálni amíg kellően egyszerűvé nem válik. Akkor jó, ha 1-2 képernyőre ráfér a teljes kód.

Az egyes modulok különállóságából és egyszerűségéből következik, hogy minden egyes DB query-t agyonoptimalizálhatok / indexelhetek / cachelhetek, nem vagyok semmiben megkötve - kb üres is a slow query logom.

Van egy 3 szintű memória vagy fájl cache (mindegyik lehet lejárati idővel vagy anélkül, de azonosító alapján bármikor újrakérhető):
- minden egyes adatbázis kérés
- komplett modul vagy oldal
- generált html kódrészlet

Bár undorító, de az adatbázisomban is előfordulhat, hogy 1-1 dolgot több táblában is letárolok (csak ha úgysem változtatható). Ez egy csúnya kompromisszum, viszont így a legkomplexebb query is maximum egy db JOIN -t használ, azért ez nem rossz ha megnézel egy alapszintű drupál vagy joomla oldalgenerálást.

Persze a legjobb query az amit le se futtatunk, nálam átlagosan 95% jön cacheből - a memória meg olcsó és gyors.

Ha megnő a szerveren load akkor pl. automatikusan kikapcsol a kép és videó feltöltés / konvertálás vagy az elemek kommentezése, de ez eddig nem fordult elő (sajnos) :)

Ha mindent "szabályosan" csinálnék akkor már legalább 2 szerveren csücsülne az alkalmazás. Egyelőre bejött.
136

Weben

Poetro · 2011. Május. 18. (Sze), 13.01
Az alapvető problémám az OOP-vel, hogy szerintem fölösleges a weben ahol annyi a feladat, hogy generáljunk valami html-t, hiszen a következő requestre úgyis elveszítünk mindent és generáljuk elölről.

Azért szerencsére vannak alkalmazásszerverek, ahol nem ennyiből áll a dolog, azaz nem egy CGI szerű meghívás történik, hanem az alkalmazás folyamatosan fut, és igazából minden egyes új bejövő kapcsolat csak egy újabb függvény meghívását eredményezi. Léteznek ilyen rendszerek Java, Erlang, Python, és újabban a Node.js térnyerésével JavaScript alatt is. Ezekben az alkalmazás folyamatosan fut, és a bejövő kérések, mint egyfajta események történnek, azaz egy új szál nyílik az alkalmazáson belül, aminek van kapcsolata a többi vele párhuzamosan futó szállal, valamint természetesen a folyamatosan futó alkalmazással, ami tárolhat rengeteg prezisztens információt.
138

hogy jön ez ide?

ggabor · 2011. Május. 18. (Sze), 13.27
Itt a php alapon történő fejlesztés lehetséges módjairól folyik a diskurzus. Nem egészen értem, hogy a különböző egyéb technológiák és alkalmazásszerverek hogy jönnek ide bármilyen válaszként a php-s kérdésekre?
137

akkor én sem vagyok már egyedül

ggabor · 2011. Május. 18. (Sze), 13.25
Remekül összefoglaltad amiről én magam is próbáltam itt írni. Az általad vázolt vezérlés nagyon nagy mértékben hasonlít arra, amit én is megcsináltam. Nálam annyi _egyelőre_ a különbség, hogy az init.php-t simán beleraktam az index.php-ba, hiszen csak innen inlcude-olod te is és ráadásul minden esetben. Így megspórolok egy inlcude-ot.

A nyelvkezelést és a különböző tempalate-ek támogatását hogyan oldottad meg?
139

Sehogy...

hamlet79 · 2011. Május. 18. (Sze), 14.14
mert nem volt rá szükségem az adott projecthez. A nyelvkezelés remélhetőleg csak adatbázis-kérdés (modul szintre bontva húznám be a szükséges nyelvi szövegeket), az egyéb nyelvi kép/videó fájlokat pedig könyvtárszinten szedném szét.

Az init-et csak az átláthatóság miatt vettem külön, az az egy include nem oszt nem szoroz, APC vagy xcache amúgy is kell. Nézd meg a drupal include struktúrát, ha ennyit include-olsz akkor kezdhetsz aggódni :)

Érdekes volt Rasmus php előadásában, hogy megemlítette neki is jobban tetszett a régi procedurális programozás, mint ugyanazt megcsinálni 5x annyi OO kódban. :)

Ezt is érdemes megnézni - ha a php atyja a procedurális megközelítést szereti akkor nekem is megfelel. :)
142

Pontosan így látom én is, és

Hidvégi Gábor · 2013. Már. 15. (P), 15.57
Pontosan így látom én is, és így dolgoztam én is, amíg weboldalakat gyártottam.
140

Semmiképp ne legyen saját,

inf · 2013. Már. 15. (P), 14.55
Semmiképp ne legyen saját, mert elfelejted, hogy mi micsoda benne, és nincs hozzá dokumentáció (mondván, hogy úgyis csak te használod), úgyhogy bogarászhatod a kódját... :D
141

PHPDoc

HUNdefined · 2013. Már. 15. (P), 15.38
Ezért kell a kódot dokumentálni, onnan meg már csak egy kattintás kiexportálni egy dokumentációt.
143

Meg még

Pepita · 2013. Már. 16. (Szo), 21.37
további 500 ellenérv, amit itt Inf3no nem írt, ezeket nem könnyű mind indokolni...

CMS-t - ha muszáj - lehet értelme sajátot fejleszteni, de framework-öt nemigazán. Előbbit is csak ritka esetben.
144

Vitatkoznék. Mind

Max Logan · 2013. Már. 16. (Szo), 22.13
Vitatkoznék. Mind framework-öt, mint CMS-t érdemes írni, sajátot. Méghozzá azért, mert vannak feladatok, amikre elég egy max. néhány tucat függvényből vagy osztályból álló megoldás. Megadják a kellő rugalmasságot, amire megszületett a framework és CMS koncepciója és mégsem ágyúval verébre esete.

Nem csak az a CMS, amihez plugin bővíthetőség, sablononozhatóság és komplex admin felület jár, és nem csak az a framework, ami minden problémát lefed és lehetőséget biztosít a plugin alapú bövíthetőségre, módosíthatóságra.

Persze egy szint felett nem feltétlenül van értelme framework-öt írni, CMS-t egy adott framework-re alapozva annál inkább.
145

Én is

Pepita · 2013. Már. 16. (Szo), 23.25
Bár úgy néz ki, hogy én fogalmaztam előbb túl nyersen, majdnem az én (pontos) véleményemet írtad le.

Valójában a fw, amit én kétlem, hogy volna értelme, azért, mert találtam egy olyat, amit most már különösebb gond nélkül, kedvem szerint alakítok (CodeIgniter). Így a fejlesztés rabszolgarészét megírták már helyettem, ami meg nem tetszik / jobbat tudok, azt átírom én. És ez nem ágyú, egész pici, "villámgyors" kis rendszer.

CMS-t viszont - őszintén szólva - szívesebben írok egy adott célra, mint felhasználjak meglévőt. Persze ez sokszor lényegesen több munka, és nem biztos, hogy megéri. És rengeteget kell biztonsági kérdésekkel bajlódni, ezért nem (sem) ajánlom másoknak, mert ha feltörik, csak magát szidhatja.
146

És rengeteget kell biztonsági

BlaZe · 2013. Már. 16. (Szo), 23.50
És rengeteget kell biztonsági kérdésekkel bajlódni, ezért nem (sem) ajánlom másoknak, mert ha feltörik, csak magát szidhatja.

A népszerű cms-eket is érdemes ismerni ilyen szempontból, mert a robotok rápróbálkoznak a biztonsági réseikre. Szóval az ember sehogy nem ússza meg, hogy tisztában legyen a biztonsági kérdésekkel. Ilyen szempontból egy kevésbé tapasztalt fejlesztő, vagy az adott cms-t kevésbé ismerő akár öngólt is lőhet.

Fw kérdésben amúgy hasznos olvasmány: http://jtechlog.blogspot.hu/2011/05/miert-ne-fejlesszunk-sajat.html
147

Nagyon más

Pepita · 2013. Már. 17. (V), 00.29
Azért az egész más helyzet: megérteni vagy leprogramozni a 0-áról. Emellett kétlem, hogy a CMS-felhasználók mindegyike részletesen ismerné az adott CMS felhasználókezelését (pl). Sőt, inkább valószínű, hogy a többség nem. De az igaz, hogy ismerni kellene.

Nemrég talán PP-vel vitáztunk egy hosszabbat erről, ő érvelt azzal is, hogy igen, a népszerű CMS-ekre írnak robotokat is, de a rendszert több ezren fejlesztik, nem te egyedül. Így a robotnak sokkal nehezebb dolga van, mint az egyszemélyes projekt esetén. Erre mondtam én, hogy igen, de az ismeretlen CMS-re meg nem írnak robotot. Ezek vélemények, mindenkinek magának kell eldönteni, hogy mi a számára jobb.

Én itt a wl-en már számtalan olyan "beléptetőrendszert" láttam, amit egy óvodás is feltörne, ezért okosabbnak tartom nem reklámozni a suszterkedést. Persze tisztelet a kivételnek!, van nyilván nem egy fejlesztő (itt), aki nagyon jól meg tud írni ilyesmit.
148

Sajnos nem megy át a

pp · 2013. Már. 17. (V), 08.25
Sajnos nem megy át a meszidzs.

A biztonság nem rendszer, hanem állapot kérdése, és nem függ attól, hogy népszerű, vagy ismeretlen CMS-t használsz.


"az ismeretlen CMS-re meg nem írnak robotot"

Mint írtam korábban is az évrendszered itt bukik, mert az ismert sérülékenységekre, amelyek egy webes alkalmazásban előfordulhatnak írnak robotokat. Ha igazad lenne, akkor a saját fejlesztésű, vagy zárt rendszereket nem találnák meg a SPAM robotok(gondolom ezt nem állítod, de szeretnék rámutatni az érvelésed hibájára). És ahogy a SPAM robotok megtalálják, meg fogják találni egyéb robotok is.

pp
170

Átjött az

Pepita · 2013. Már. 19. (K), 18.22
akkor is és most is.
Nem találtam azt a témát, belinkeltem volna, mert nem ennyi volt, ezt csak emlékezetből emeltem ki.

Ott is azzal érveltem, hogy egy olyan CMS-re, amit többmillió oldalon használnak, "jobban megéri" botot írni, mint ismeretlenekre. Ismert sérülékenység lehet számomra is ismert.

De mindegy, nem akarom ezt újrakezdeni, különbözik a véleményünk és kész. Itt (fentebb) pont azt az igazságodat (is) kívántam hangsúlyozni, hogy többezer fejlesztő többet tud általában, mint egy.

Off: Látom nem szereted, ha hivatkozok rád. Ez is átjött. :)
149

A cikk jó, de a kommentekkel

Hidvégi Gábor · 2013. Már. 17. (V), 11.32
A cikk jó, de a kommentekkel együtt rámutat, hogy nem egyszerű a helyzet. A jelenlegi munkámban használtunk korábban kliensoldali keretrendszert (ext.js), de miután kiderült, hogy az igényelt adatmennyiséget képtelen gyorsan megjeleníteni, valamint az öt-tízszeresen egymásba illesztett osztályok és a gigantikus, átláthatatlan kód miatt végül sajátot készítettünk, ami többet tud, 100k-s az eredeti 1 megás helyett, átlagosan hússzor gyorsabb (ugyannak az űrlapnak a legenerálása 26 ms az eredeti átlag 640 helyett), ráadásul ősöreg böngészőkben is működik.

A mienk egy céleszköz, ami annyit tud, hogy a rendszerünkben generált adatokat megjeleníti, a keretrendszerek pedig általános feladatmegoldásra lettek kitalálva. Nyilvánvaló, ha ismerik őket eléggé, sok mindent gyorsan és hatékonyan meg lehet velük oldani.
150

Ez alapján inkább azt

inf · 2013. Már. 17. (V), 12.58
Ez alapján inkább azt mondanám, hogy a saját keretrendszer ill. cms a drága megoldás, a kész rendszer használata meg az olcsó, mert annál kevesebb energiát kell befektetni a projektbe, hogy elérjen az ember egy bizonyos szintet.
152

Igaz

Hidvégi Gábor · 2013. Már. 17. (V), 13.10
Annyit finomítanék, hogy érzésem szerint ugyanannyi pénzt kell kifizetni mindkét esetben, csak más időpontban.
154

Már miért? Elég rossz

BlaZe · 2013. Már. 17. (V), 13.21
Már miért? Elég rossz tapasztalatod lehet a különböző keretrendszerekkel, ha ezt így tapasztaltad.
156

Például szükség esetén hogy

Hidvégi Gábor · 2013. Már. 17. (V), 13.34
Például szükség esetén hogy skálázol egy külsős által fejlesztett keretrendszert? Vehetsz pl. supportot, esetleg nekiállhatsz te is, lesz ami lesz alapon. Vagy a következő verzióra átírják az API-t, lásd TinyMCE szerkesztő, ext.js stb. Vagy leáll a fejlesztése, mert - ahogy az általad linkelt cikkben is írják - a vezető programozónak elmegy tőle a kedve, új kihívásokat keres. Vagy olyan absztrakciót épít bele, ami a te alkalmazásod esetében teljesen irreleváns, és csak bonyolít/lassít.

Az egyetlen igazán komoly probléma az egész témakörrel, hogy egy harmadik féltől függsz, akire kevés vagy nulla ráhatásod van.
158

Például szükség esetén hogy

BlaZe · 2013. Már. 17. (V), 13.57
Például szükség esetén hogy skálázol egy külsős által fejlesztett keretrendszert?

Sehogy. Keretrendszert nem skálázunk, csak rendszert. És ha a rendszer úgy van megírva, hogy nem lehet skálázni, akkor az a fejlesztő hibája, nem a keretrendszeré, amit használ. Vagy a keretrendszer alkalmatlan arra, amire választotta, tehát a fejlesztő hibája.

Az egyetlen igazán komoly probléma az egész témakörrel, hogy egy harmadik féltől függsz, akire kevés vagy nulla ráhatásod van.

Ennyire az adott rendszertől/nyelvtől stb is függsz, amire fejlesztesz. Vannak azért olyan keretrendszerek, amik belátható időn belül nem lesznek kivezetve. Hogy mást ne mondjak, nagy bankok sorra térnek át nyílt forrású keretrendszerekre, hogy csökkentsék a vendor függőségüket.

Plusz jól kitalált architektúrával és sw tervezéssel elérhető, hogy viszonylag fájdalommentesen leválasztható legyen az alkalmazás a keretrendszerről. Hogy visszadobjam eléd a kalapácsod, amit előszerettel dobálsz: erre való az OOP, a SOLID principles, design patterns stb :)
159

Sehogy. Keretrendszert nem

Hidvégi Gábor · 2013. Már. 17. (V), 14.20
Sehogy. Keretrendszert nem skálázunk, csak rendszert.
Az ext.js esetében mégsem sikerült. Tíz űrlapelemig tökéletes volt, háromszáznál meg használhatatlanra lassul az egész.

Nézd meg az ext.js komboboxának objektumhiearchiáját! Nyolcszoros objektumöröklődés, nyolcszoros mixin öröklődés, hat szükséges alaposztály, ez őrülten bonyolult! És mindez a következő funkcióhoz:
1, rakjunk ki egy beviteli mezőt
2, mellé rakjunk ki egy képet (lefelé mutató nyilacska)
3, ha bármelyikre kattintunk, nyíljon meg egy lista.
4, ha bármit kiválasztok vagy beírok, egy űrlapmező értékét állítsa be
Egyébként OOP, SOLID elvnek megfelel, tökéletes. Csak lassú.

Plusz jól kitalált architektúrával és sw tervezéssel elérhető, hogy viszonylag fájdalommentesen leválasztható legyen az alkalmazás a keretrendszerről.
Ez az elmélet. Meg lehet-e mindent előre tervezni? Biztos, hogy a tervezési fázisban minden leendő problémát látni fog az ember?

Nagyon sokminden csak utólag, akár évek múlva derül ki, akkorra látod át az egészet.
160

Az ext.js esetében mégsem

BlaZe · 2013. Már. 17. (V), 14.42
Az ext.js esetében mégsem sikerült. Tíz űrlapelemig tökéletes volt, háromszáznál meg használhatatlanra lassul az egész.

Az ext.js kliensben fut, azt skálázni sose fogod tudni. Ha lassú, akkor lassú.

Egyébként OOP, SOLID elvnek megfelel, tökéletes. Csak lassú.

Lehet js-ben lassít a nagyfokú öröklődés, nem tudom. De akkor legalább van hova fejlődjön az engine-nek :) Ebben az esetben a UI designernek jár a fekete pont, nem feltétlenül az eszköznek. Meg a tervezőnek/architectnek, aki kiválasztotta az eszközt, és fejlesztés/production közben derült ki, hogy ez nem megfelelő a célokra.

Ez az elmélet. Meg lehet-e mindent előre tervezni? Biztos, hogy a tervezési fázisban minden leendő problémát látni fog az ember?

Nagyon sokminden csak utólag, akár évek múlva derül ki, akkorra látod át az egészet.

Nagyjából azért lehet látni, hogy hol fog a terhelés jelentkezni, és hogy azt hogy lehet értelmesen kezelni. Plusz terheléses tesztek készítése (sok felkiáltójel). De ahogy mondtam is, ha lazán csatolod a rendszered komponenseit, vagyis értelmesen tervezel (és jó tesztjeid vannak), akkor menet közben lehet redesignolni, hogy jobban kielégítse az igényeket. Ha egy összedrótozott spagetti kódhalom az egész, akkor ez egy baromi drága mutatvány.
162

Végül írtatok nulláról egy

inf · 2013. Már. 17. (V), 15.15
Végül írtatok nulláról egy sajátot? Backbone-al szerintem pillanatok alatt össze lehetett volna hozni egyedi view osztályokkal ugyanazt, bármilyen öröklődés nélkül...

Én extjs3-at használtam, de nem voltam elégedett vele. A fa kirajzolója a rakat szorosan csatolt osztályból állt, egyáltalán nem volt használható általános célra. A drag&drop-ot is csak nagy nehézségek árán tudtam belőni arra, amire használni akartam. A vége csúfos kudarc lett... Szóval extjs-t szerintem csak akkor érdemes használni, ha minden benne van a példákban, amire szükséged van. Ha bármi egyedit akarsz, akkor gubanc lesz, mert ilyesmire nincs felkészítve. A nyolcszoros öröklődés meg szerintem tervezési hibára utal, én legalábbis nem tudom elképzelni, hogy bármi indokolna ilyesmit...
163

Igen, száz százalékig saját

Hidvégi Gábor · 2013. Már. 17. (V), 15.23
Igen, száz százalékig saját fejlesztés, kicsit sárga, kicsit savanyú, de a miénk. Amikor kezdtük, jópár éve, még nem volt backbone, azaz kevesebb választási lehetőség volt.
165

Mert a kész rendszert meg

Joó Ádám · 2013. Már. 18. (H), 17.47
Mert a kész rendszert meg kell tanuld használni és testreszabni.
151

Az Ext.js-ről máshonnan is

BlaZe · 2013. Már. 17. (V), 13.01
Az Ext.js-ről máshonnan is hallottam már negatív véleményeket. Egyébként az egyszerre nagy mennyiségű megjelenítendő adat nekem kicsit koncepcionális problémának is tűnik, nem csak technikainak.

Egyébként meg persze, kivételek minden alól vannak. Valamint hozzá kell azért tenni, hogy István írása főleg java frameworkökről szól.
153

Egyébként az egyszerre nagy

Hidvégi Gábor · 2013. Már. 17. (V), 13.17
Egyébként az egyszerre nagy mennyiségű megjelenítendő adat nekem kicsit koncepcionális problémának is tűnik
Ez igaz, látnád az űrlapjainkat, egy repülő pilótafülkéje hozzájuk képest kismiska, még sokat kell rajtuk iterálni, hogy használhatóak is legyenek. Csak hát a cég, akinek készül, most már kb. két évtizede dolgozik az alapváltozaton, és ennyi mindenre volt szükségük, és nem igazán lehet kidobni semmit.

Azért választottuk az ext.js-t, mert úgy tűnt, ezzel legalább a megjelenítéssel nem kell foglalkozni, a példaprogramok alapján jónak tűnt, csak hát abból nem szabad kiindulni, ahol van mondjuk három űrlapelem, az persze gyors lesz.
155

Ez melyik verziója az

inf · 2013. Már. 17. (V), 13.33
Ez melyik verziója az extjs-nek?
157

Négy fő verzió van, négyszer

Hidvégi Gábor · 2013. Már. 17. (V), 13.38
Négy fő verzió van, négyszer írták újra az alapjait, de végeredményben mindegyik ugyanolyan elven működik, ugyanaz az objektumhierarchia.

A legjobb, hogy az ext.js alapkoncepciója , csak nem javascriptben, hanem natívan kéne megvalósítani.
161

Hát ha a böngészőkbe be lenne

inf · 2013. Már. 17. (V), 15.11
Hát ha a böngészőkbe be lenne építve, és el lehetne felejteni a html-t örökre, az nekem is tetszene, de odig szerintem ez a webes w3c-s gányolás sosem fog eljutni...
164

premature optimalization

blacksonic · 2013. Már. 18. (H), 13.37
Nekem kicsit úgy tűnik, hogy jóval előre akarsz optimalizálni, amikor még nem tudod hol lesz a szűk keresztmetszett.
Az esetek nagy részében nem a PHP futtatása hanem az adatbázis műveletek szoktak a lassítani.
Ha a PHP kód lassú még mindig ott van a lehetőség hogy megméred, hogy mi a lassú és azt optmalizálod és nem előre a vakvilágba.
171

Vagy fordítva

Pepita · 2013. Már. 19. (K), 18.36
Az esetek nagy részében nem a PHP futtatása hanem az adatbázis műveletek szoktak a lassítani.
Szerintem inkább fordítva. A legtöbb kiszolgáláshoz lekérdezések kellenek, amik általában elég gyorsak. PHP esetén viszont minden lekérdezés eredményét tömbökké vagy objektumokká kell konvertálnod a kiírás előtt, ez (többnyire) máris lassabb, mint a lekérdezés. És akkor még valami template, HTML, etc.

Persze minden adatbázist el lehet rontani annyira, hogy számottevően lassú legyen, de aki így elrontja, az többnyire PHP vonalon sem zseni...
172

Nem tudom pontosan milyen

inf · 2013. Már. 19. (K), 19.29
Nem tudom pontosan milyen protokollon kommunikál az adatbázis a php-val, de azt gyanítom, jóval lassabb, mint ahogy a memóriában turkál a php...
173

Azt én sem tudom,

Pepita · 2013. Már. 19. (K), 19.51
viszont a kommunikáció idejét nemigazán tudjuk / akarom (én legalábbis) lemérni. Általában mit mérsz könnyen? A PHP teljes futásidejét (beleértve az erdményre várást is) és külön az adatbázisszerveren a lekérdezés idejét. Általában ez utóbbit kivonjuk a teljesből, a maradékot a PHP-nek tulajdonítjuk - igaz, nem túl helyesen.

Egyébként meg többnyire ugye valamilyen osztály(oka)t használsz "adatbázisozni", config fájlokkal, stb., ezek betöltése valószínűleg máris több, mint a lekérdezés idelye. Így, ha a kommunikáció idejét egyiknek sem tulajdonítjuk (vagy fele-fele), akkor is a PHP a "lassabb".
gyanítom, jóval lassabb, mint ahogy a memóriában turkál a php
Gondolom ez az átvitel is memóriában történik. Egy írás, egy címátadás, egy olvasás.
Míg a PHP-ben konvertálgatsz és HTML-t gyártasz, ugyanezt min. kétszer elvégzed.

De ha valaki "nagy mérőember" eldöntené, ill. felhomályosítana, megköszönném.
174

Ez sokmindentől függ, például

Hidvégi Gábor · 2013. Már. 19. (K), 20.03
Ez sokmindentől függ, például attól, hogy mennyi adat van, azok milyen bonyolultan vannak egymásba ágyazva, és hogy utólag mennyi műveletet kell PHP oldalon végezni. De attól is, hogy a lekérdezésekre adott válaszok benne vannak-e a memóriában, az InnoDB pool-ban, be van-e kapcsolva a query_cache (ami fejlesztés során sokat dob, míg élesben a tapasztalatok szerint lassít, mert sok idő megy el annak a keresgélésével, hogy volt-e már olyan lekérdezés a közelmúltban).
176

Na igen

Pepita · 2013. Már. 19. (K), 20.12
mennyi adat van, azok milyen bonyolultan vannak egymásba ágyazva
Erre céloztam fentebb azzal, hogy "ha jó a DB", illetve ha nem jó, akkor valószínű, hogy a PHP se. "Sok adat" lehet túl sok (kiváltható) JOIN vagy beágyazott SELECT miatt, főként, ha túl bonyolultan vannak egymásba ágyazva az adatok. Nekem eddig legtöbbször (mindig?) úgy jött ki a lépés, hogy PHP oldalon min. kétszerannyi mutatvány van az adatokkal.
175

Csak azért írtam, mert

inf · 2013. Már. 19. (K), 20.08
Csak azért írtam, mert blacksonic szerintem arra gondolt, hogy az sql szerverrel történő kommunikáció miatt lassúak az adatbázis műveletek, és ezekhez képest a php-ben történő adat konverzió nem oszt nem szoroz... Általában másik gépen van az adatbázis és a http szerver, ezért érdemes leszorítani a queryk számát. Én legalábbis így tudom. Mondjuk engem is érdekelne, hogy mi ebből az igazság...
177

Ez is igaz

Pepita · 2013. Már. 19. (K), 20.20
Általában másik gépen van az adatbázis és a http szerver, ezért érdemes leszorítani a queryk számát.
Ez is igaz, de ettől még jóval gyorsabb, mint mondjuk pár fájlbetöltés a vrinyóról. A forráskódjaid (szépen, osztályonként) pedig fájlban vannak. Általában úgy gondolom, hogy PHP vonalon többet lehet / kell spórolni, mint akár MySql-ben. Persze ott sem árt, de
elég nagy hülyeséget kell adatbázis-oldalon csinálni ahhoz, hogy látványosan lassabb legyen; de én is valaki hozzáértőbb véleményét is várnám már, hátha én tévedek.
178

Ha jól tudom ezt a fájl

inf · 2013. Már. 19. (K), 21.31
Ha jól tudom ezt a fájl beolvasást is lehet cachelni.
179

Szerintem a page cache-re

BlaZe · 2013. Már. 19. (K), 22.56
Szerintem a page cache-re gondolsz: http://en.wikipedia.org/wiki/Page_cache Tud hasznos lenni.

Ami pedig az sql-t illeti, ha gépen belül van, használhatsz unix socketet, az elég gyors (gyakorlatilag kernelen belüli adatcsere). Hogy ennél mennyivel lassabb a tcp, az már erősen hálózatfüggő. De nyilván a tcp-nek, illetve a sok, nagy rekordmennyiséggel dolgozó adatbázisműveleteknek megvan az overheadje. Többek között ez az értelme a tárolt eljárásoknak is. Értelemszerűen sokkal gyorsabb, ha nem kell berángatni az adatokat adatbázisból, megrágni, aztán visszadobálni. Szóval ha ez tűnik a szűk keresztmetszetnek, érdemes ebbe az irányba gondolkodni. De a webes rendszerek nagy részénél szerintem nem ez a helyzet. Ha lassú a query, az jellemzően inkább user error.
180

Én konkrétan erre gondoltam:

inf · 2013. Már. 19. (K), 23.40
Én konkrétan erre gondoltam: http://en.wikipedia.org/wiki/List_of_PHP_accelerators

A stored procedure egyébként nekem is bejön, gyorsabb, ad egy felületet az adatbázis elérésére, amire akár teszteket is írhatsz.
181

Mi MySQL-ben használtunk

Hidvégi Gábor · 2013. Már. 20. (Sze), 09.16
Mi MySQL-ben használtunk tárolt eljárásokat, nagy elánnal kezdtünk bele, de sajnos dobnunk kellett őket, mert (My)SQL-ben programozni nehézkes (a hibakeresés különösen), ráadásul a tárolt eljárásokban lefutó lekérdezéseket nem gyorstárazza az adatbázismotor.
Amiatt is sajnálom, mert a speciális jogosultságkezelésnek hála jóval biztonságosabb a lekérdezéseket tárolt eljárásban futtatni, mintha bele lennének "égetve" (lazán vagy szorosan) a kedvenc szerveroldali nyelvünkben készített programunkba.

Más a helyzet Postgresql-ben, ott több nyelven is lehet tárolt eljárásokat írni, ráadásul tudomásom szerint ezeket belső bájtkódra fordítja a rendszer, így gyorsabb lesz, mint n darab SQL hívás mondjuk PHP-ből.
182

Hát ja, mysql-nek még van

inf · 2013. Már. 20. (Sze), 18.25
Hát ja, mysql-nek még van hova fejlődnie... Ezek szerint mysql-nél sebességre azonos, mintha n db sql-t hívnál? Vagy esetleg még lassabb?
183

Attól függ, ha inkább csak

Hidvégi Gábor · 2013. Már. 20. (Sze), 18.41
Attól függ, ha inkább csak SELECT-ek vannak benne, akkor a gyorstárazás hiánya miatt lassabb, módosításnál gyorsabb lehet.
190

Result cache?

BlaZe · 2013. Már. 21. (Cs), 12.09
Komoly alkalmazásnál ez a query cache nem csak parasztvakítás? Arra jó, hogy ha lenyomnak egy tesztet, akkor ott villantani fog a mysql, hogy statikus adatbázison, ugyanazokat a queryket futtatva hasít, mint az állat. De mi van, ha nyomok egy update-et? Azt észreveszi? És mekkora költsége van ennek az észrevételnek? És ha én más tranzakcióban vagyok? Stb... Érzésem szerint ez egy használatban lévő adatbázisnál akár még feleslegesen lassíthat is. Ha jól emlékszem írtál is ilyesmit.
204

Találtam ilyet, amivel

inf · 2013. Ápr. 8. (H), 22.34
Találtam ilyet, amivel elvileg lehet debuggolni mysql tárolt eljárásait:
http://mydebugger.com/

Mindjárt megnézem, hogy milyen...
205

Úgy néz ki a mysql tárolt

inf · 2013. Jún. 29. (Szo), 03.51
Úgy néz ki a mysql tárolt eljárásokat én is dobom, semmivel sem jobbak, mint php-ből írni a mysql-t. Csak egy példa:
DELIMITER $$

CREATE PROCEDURE `session_db`.`user_role_update_by_role` (
    IN `param_role_id` INT,
    IN `param_user_ids` TEXT
)
BEGIN
    SET @sql = CONCAT('DELETE FROM `user_role` WHERE `role_id` = ',`param_role_id`,' AND `user_id` NOT IN (', `param_user_ids`, ')');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    
    SET @sql = CONCAT('INSERT INTO `user_role` (`role_id`, `user_id`) SELECT ',`param_role_id`,', `user_id` FROM `user` WHERE `user_id` IN (', `param_user_ids`, ') AND NOT EXISTS (SELECT 1 FROM `user_role` WHERE `user_role`.`user_id` = `user`.`user_id`)');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END
Mondjuk a b változat, hogy temporary table-be töltöm fel az id-ket, aztán azt használom. Egyik sem túl szívmelengető...

A pgsql-nél meg küzdök a szolgáltatóval, hogy ugyanmár ne us-en collation-nel kelljen dolgoznom... Nem is tudom melyik a szánalmasabb...
206

Arra gondoltam, hogy

inf · 2013. Jún. 29. (Szo), 05.33
Arra gondoltam, hogy valószínűleg az én megközelítésem rossz, és mysql-ben máshogy kell programozni. Pl ilyen nagyobb sql-ek helyett mondjuk egy ciklusban is meg lehet hívni kisebbeket. Lehet implementálni split függvényt, amivel fel lehet darabolni ciklusba pl az összefűzött user_id-ket, stb...

A másik, hogy sokkal többet kéne alapoznom a triggerekre, mert bizonyos problémákat könnyebb megoldani velük, mint nélkülük... Ha csak ennél a példánál maradok, van egy permission_cache, amiben a felhasználók jogai vannak, és, amit frissítek, ha változik valakinek a szerepköre. Jelen esetben végig kéne járni az összes olyan felhasználót, aki kikerült a szerepkörből, és az összes olyat, aki bekerült a szerepkörbe. Hát ez trigger nélkül rémálom ... Egyelőre még próbálkozom, de lehetséges, hogy a megfelelő eszköztár birtokában mégiscsak lehet használható kódot csinálni mysql tárolt eljárásban is. Mondjuk nem lehet összehasonlítani semmilyen fejlett nyelvvel sem, szóval ha megcsinálják nekem a collation beállítást, akkor biztosan váltok pgsql-re.
207

Jó, akkor itt a mysql meg is

inf · 2013. Jún. 29. (Szo), 06.22
Jó, akkor itt a mysql meg is bukott:

http://stackoverflow.com/questions/12638686/mysql-very-slow-loop

Nem lehet sok kicsi ciklust használni benne, mert baromi lassú egy normál nyelvhez képest, az ember meg azért használná, hogy gyorsabb legyen a kódja...

A pgsql-ben még reménykedem, hátha abban gyorsabbak a tárolt eljárások...
209

26 sec?

BlaZe · 2013. Jún. 29. (Szo), 10.21
Hát azért ez eléggé sok. Megnéztem a laptopomon.

MySql:
DELIMITER $$ 
CREATE PROCEDURE testWhile() 
BEGIN

    DECLARE start INT;
    DECLARE ending INT;

    SET start = 1;
    SET ending = 4000000;

    WHILE (start <= ending) DO
        SET start = start + 1;
    END WHILE;
END $$
DELIMITER ;
call testWhile;
Query OK, 0 rows affected (5.34 sec)
PgSql:

create or replace function testFor() returns integer as $$
declare
  j integer;
begin
  for i in 1..4000000 loop
    j = i;
  end loop;
  
  return j;
end;
$$ language plpgsql;

create or replace function testWhile() returns integer as $$
declare
  i integer;
begin
  i := 0;
  while i < 4000000 loop
    i := i+1;
  end loop;
  
  return i;
end;
$$ language plpgsql;

select testFor();
select testWhile();
Eredmény:
1 rows returned (execution time: 940 ms; total time: 943 ms)
1 rows returned (execution time: 1.877 sec; total time: 1.880 sec)
Ez azért durva különbség.

Azt nem lehet mondani a pg-re se, hogy gyors. De azért nincs a fele sem. Összehasonlítva pl a javaval, ami ugyanezen a gépen ~31M loop/sec/core sebességgel tekeri ugyanezt a for ciklust, azért igen jelentős a különbség. Ok, java itt már natívban tolja, de akkor is.

De hozzá kell tenni, hogy a tárolt eljárás nem erre való, hanem arra, hogy ne kelljen nagy mennyiségű adatot áthúzni a programba és egyszerű műveleteket helyben el tudj végezni rajta. Kíváncsiságból lehet megnézem majd ezt oracle-n is, ha lesz rá kis időm a héten és nem felejtem el.
211

A teljesség igénye

BlaZe · 2013. Jún. 29. (Szo), 10.30
A teljesség igénye kedvéért:
select version();
                                                   version                                                   
-------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.1.9 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.7.2-22ubuntu5) 4.7.2, 64-bit
select version();
+-------------------------+
| version()               |
+-------------------------+
| 5.5.31-0ubuntu0.13.04.1 |
+-------------------------+
213

Ja hát elég lassú. Végülis

inf · 2013. Jún. 29. (Szo), 12.28
Ja hát elég lassú. Végülis amíg csak párszáz, esetleg párezer soros tábláim vannak talán nem gond ez sem, nem tudom... Oracle biztos, hogy gyorsabb ennél, azt nagyobb adatmennyiségre szokták ajánlani...
210

each core on 100%

BlaZe · 2013. Jún. 29. (Szo), 10.26
Illetve még ez megütötte kicsit a szemem:
(each core on 100%)

Ezt így hogy? :)
208

Triggerekkel azért óvatosan.

BlaZe · 2013. Jún. 29. (Szo), 09.23
Triggerekkel azért óvatosan. Eléggé tökönlövős dolog, ha nem arra használják, amire kell, kb mint az AOP. Debugolásnál meg tud szivatni, ha az alkalmazás kódjáról leválva valami kiveszi az adatot a kezéből, és még varázsol vele. Pl log táblák karbantartására jó, de ha valami komolyabbat kell, akkor már inkább tárolt, azt lehet követni.
212

Kipróbálom, aztán meglátom.

inf · 2013. Jún. 29. (Szo), 12.27
Kipróbálom, aztán meglátom. Nem hiszem, hogy foglalkoznának triggerek terén olyan extra dolgokkal, mint debug, szerintem nem fogok hibaüzenetet kapni :D Azért reménykedem...
214

Nem is a trigger debugolására

BlaZe · 2013. Jún. 29. (Szo), 14.08
Nem is a trigger debugolására gondoltam, hanem az alkalmazáséra :) Pro és kontra.
215

Amíg teljesen egy rétegben

inf · 2013. Jún. 29. (Szo), 14.31
Amíg teljesen egy rétegben vannak a többi sql-el, és csak tárolt eljárásokon keresztül érintkezek velük, addig nem okozhatnak bajt szerintem. Ha az sql-ek egy részét php-ból generáltatom, és mellettük vannak még triggerek, akkor azt már egy fokkal nehezebb debuggolni. Igazából jobban járnék, ha TDD-vel készítenék mindent, és akkor nem lenne ilyen gond, hogy debug, legalábbis sokkal kisebb valószínűséggel... Rá kéne néznem a dbunit-ra, hogy hogy működik.
217

Ezt hogy érted? Hogyhogy

H.Z. · 2013. Jún. 29. (Szo), 15.20
Ezt hogy érted? Hogyhogy "csak tárolt eljárásokon keresztül" érintkezel velük?
A trigger - ha egy dologról beszélünk - egy adatbázisbeli esemény hatására fut le.
Mondjuk be van állítva, hogy adott táblából való törléskor fusson. Bemész SQL-ből, kiadsz egy DELETE parancsot. Lefut a trigger is. Közöd nem volt tárolt eljáráshoz, a triggered mégis lefutott.

Mit értek félre?
218

Azt, hogy a tárolt eljárás

inf · 2013. Jún. 29. (Szo), 17.35
Azt, hogy a tárolt eljárás nevében ott van, hogy mit csinál, ha belenézel az adatbázisba, akkor meg látod, hogy van trigger is. Ezzel szemben egy kézzel php-bne megadott sql-nél viszont ha beletúrsz a kódba, akkor nem látod, hogy van trigger, esetleg comment-be bele lehet írni, de azt meg ki olvassa?!
216

offtopic - stackoverflow

H.Z. · 2013. Jún. 29. (Szo), 15.14
Na ezért utálom a stackoverflow-t.
Van egy értelmes, sokakat foglalkoztató, valóban szakmai téma, erre jön a nagyokos "moderátor" és lezárja, mondván, nem ideillő...
Valami hasonlóba egyszer én is belefutottam, azóta amennyire lehet, kerülöm a lapcsaládot. Pedig jó hely lehetne. :(
219

Hát ja, néha kicsit túllőnek

inf · 2013. Jún. 29. (Szo), 17.37
Hát ja, néha kicsit túllőnek a célon, de nincs más használható nemzetközi oldal, legalábbis nem tudok róla. Én viszonylag ritkán kérdezek ott, inkább az aktuális projektnél szoktam egy issue-t küldeni githubon.
220

Azt kell mondjam, nem

bamegakapa · 2013. Jún. 29. (Szo), 19.22
Azt kell mondjam, nem véletlenül zárják le. Ők alapvetően Q&A oldalként definiálják magukat, nem fórumként, tehát a szakmai vitáknak nem megfelelő hely az oldal, nem is erre van kiképezve. Olyan kérdéseket várnak, amire van válasz - nem pedig olyanokat, amikre csak véleményeket lehet írni. Eleinte ezek is engedélyezve voltak, de rendkívül sok szemetet és flamewart eredményeztek. Jobb így.

Hogy ne vesszen el a tartalom, van aki gyűjti a törölt kérdéseket.
221

Én ezt értem, azt viszont

H.Z. · 2013. Jún. 29. (Szo), 19.54
Én ezt értem, azt viszont nem, hogy — az egyébként úgy látom, szakértő — törzsközönségnek miért nem adnak lehetőséget az ilyen jellegű társalgásokra.
Technikailag kivitelezhető lenne, igény azt hiszem, bőven lenne rá.
Valahogy olyan érzésem van, hogy ezek amolyan cezaromániás dolgok. OK, hogy a flame-et megállítják, de az értelmes, szakmai vitákat teljesen lelőni...
Máshol még nem találtam ennyi IT szakembert egy helyen, mint azon a lapcsaládon.
(a linket köszi! :) )
222

Én megértem. Az oldal valóban

bamegakapa · 2013. Jún. 29. (Szo), 21.32
Én megértem. Az oldal valóban nem erre van kitalálva, szakmai vitáknál és diskurzusoknál nem működik jól ez a kérdés-válasz struktúra.

Tény hogy rengeteg a jó szakember. Van egyébként egy chat funkció is, ott is találni sok segítőkész hozzáértőt és ott nincs megkötve a kezed. Ha jól emlékszem, az épp azért lett létrehozva, mert volt igény a hagyományos diskurzusra is.
184

Hát igen

Pepita · 2013. Már. 20. (Sze), 20.12
Megjegyzem: kíváncsi lennék, hogy manapság (akár csak magyar viszonylatban) a weboldalak milyen hányadában használnak ilyesmit. Azt gondolom, hogy az esetek túlnyomó részében a jóöreg include(), require() játszik. Ha nem így lenne, akkor a fw-k legtöbbjében (is) lenne. Vagy én vagyok tudatlan?

Az az érzésem, nagyon messzire elmentünk a szőrszálhasogatásban (már kezdjük túlbonyolítani), de szeretnék tisztán látni.
185

Hát szerintem nem sokban.

inf · 2013. Már. 20. (Sze), 21.04
Hát szerintem nem sokban. Egyébként zend fw-ben olvastam régebben, hogy próbálnak gyorsítani ezen is, mondjuk autoload helyett tömbökben megadják az összes fájl nevét, amit be kell tölteni. Talán még olyat is elkövettek, hogy több fájlt egymásba csomagoltak. Passz. Nyilván aki olyan szinten hozzáfér a szerverhez az feltesz valamilyen gyorsítót, az átlag viszont nem ilyen szerencsés, nekik vagy felteszi a szolgáltató, vagy nem...
186

Akkor megállapodhatunk

Pepita · 2013. Már. 20. (Sze), 21.11
Akkor azt hiszem megállapodhatunk abban, hogy mégiscsak PHP oldalon megy el a sok idő.

Szerk.: Ezzel nem akarom azt mondani, hogy adatbázis-vonalon nem kell optimalizálni, sőt!
187

Én nem tudom, szerintem

inf · 2013. Már. 20. (Sze), 21.56
Én nem tudom, szerintem konkrét mérések nélkül ne állapodjunk meg semmiben. :-) Mindjárt keresek google-ben erre valamit, hátha megokosodunk...

szerk:
Konkrétat nem nagyon találtam, kb ezeket hozták fel, amiket felsoroltunk: IO, network latency, stb... Szóval szerintem konfiguráció függő, és nem lehet kijelenteni, hogy php-nél vagy mysql-nál van minden esetben. Esetleg egy profilerrel le lehet mérni egy adott oldalon. Azt hiszem ezt meg is csinálom valamikor a hétvégén az egyiknél, kíváncsi vagyok mit dob xdebug...
188

Egész érdekes dolgokat lehet

inf · 2013. Már. 20. (Sze), 22.13
Egész érdekes dolgokat lehet találni sebesség mérés témában:
http://www.ohloh.net/p/boomerang-js

Ez egy apró js, ami méri az oldal betöltődését a felhasználónál, és visszaküldi az adatokat a szervernek...

Ez is egész hasznos kis pdf:
http://ilia.ws/files/zendcon2012_bottlenecks.pdf

Mondjuk azt már tudtam eddig is, hogy tájékozatlan vagyok a témában...
191

Blog

Pepita · 2013. Már. 21. (Cs), 21.22
Azt hiszem ezt meg is csinálom valamikor a hétvégén...
Kíváncsian várom! Szerintem kéne ennek már új téma / blog, nagyon elmentünk már (szokásunkhoz híven :)) "offirányba". Viszont hasznos téma.
197

Na hát nem az a hétvége lett,

inf · 2013. Már. 26. (K), 15.26
Na hát nem az a hétvége lett, de mindjárt felszórok egy xdebug-ot itthoni gépre ahhoz a kódhoz, aztán meglátjuk, hogy ki tudok e olvasni belőle valami használhatót... Egyébként egy kicsit elgányolt kódról van szó, úgyhogy az átlagnál biztosan több lesz majd a php hívás ideje benne.

Az sql lekérés 1-2 msec összesen a microtime szerint, viszont itthon sokkal gyorsabb, mint éles szerveren terhelés alatt. Csak az autoload 300 msec-et elvisz a 200 osztállyal, mert nincs APC itthon.
Az automatikus parsolás rekordokról objektum gráfra szintén 300msec-et elvisz. Ezek ketten kiteszik az összidő felét. Érdekes módon a html generálás objektumokkal nem számottevő, pedig az ember azt gondolná, hogy a dom fa építés sokkal lassabb, mint a sablonozás...

Összességében nekem az jön le, hogy az adatmozgatás az, ami rengeteget fogyaszt. Egyrészt a fájlok beolvasása, másrészt az adatbázisból kiolvasás, és az automatikus átalakítás data transfer objectekre és hasonlókra. Ebben a kódban sokszor csinálom, hogy kiolvasok egy csomó rekordot, áttranszformálom őket mapping adatok alapján objektumokra ill. stringről más típusokra, aztán egy újabb sql-hez meg visszatranszformálom őket paraméter tömbre. Ennek nagyon magas a költsége, úgyhogy a stored procedure fix, hogy nagyon sokat fog hozni a sebességen. A másik, hogyha az éles szerveren külön gépen van az sql szerver, akkor szintén sokat hoz majd a stored procedure. A fájloknál jobb, ha nagyobb csomagokba teszem az osztályokat, ehhez majd írok egy csomagolót, ami névterenként egyberakja őket, és a fontos osztályoknál egyben betöltöm a teljes névteret. Ami még feltűnt, hogy a router-nél ellenőrzöm a fájlok meglétét, és ha nincsenek meg, akkor átírom a 404.jpg-re a képeket. Ez jó nagy hülyeség, inkább a dispatch alatt kellene lekezelnem az olyan kéréseket, amik képekre vonatkoztak. Hasznos dolog ez az xdebug...
189

Vannak vicces dolgok, láttam

inf · 2013. Már. 20. (Sze), 22.31
Vannak vicces dolgok, láttam már olyan kódot, hogy benthagynak hibát, mert úgyis csak notice-t okoz. Viszont ha loggolod a hibákat, akkor minden ilyen notice-nál beleír az error.log-ba, ami meg ugye lockolja azt a fájlt. Szóval ilyen apróság miatt elég keményen megnőhet az oldal betöltés ideje...
192

Kicsit kozmetikázva ugyan, de

deejayy · 2013. Már. 22. (P), 21.53
Kicsit kozmetikázva ugyan, de mondjuk itt egy átlagos webshop lekérés logja:

Magyarázat:
- ahol Class, Function, Args, stb vannak az a metódushívás vagy hívások, nincs minden logolva, tehát nettó php runtime
- ahol 5 jegyű hexa kód van (pl. ff576, sql query md5-je), az adatbázislekérés [ érintett sorok / lekérdezés ideje ] statisztikai adat a sor elején.

Hozzáteszem: a db szerver 9 ms-es ping időre van, tehát van némi overhead a nem helyi lokáció miatt.
D	Get: /control/method/
D	14.9951 ms Class: app, Function: logrotate, Args: 0, Get: 0, Post: 0
D	18.0700 ms Class: app, Function: chain_parse, Args: 1, Get: 0, Post: 0
D	19.8591 ms Class: pre_db, Function: __construct, Args: 4, Get: 0, Post: 0
I	[   0 /  38.5480 ms] (s) 82589 (s, control/method/)
I	[   0 /  22.1090 ms] (s) ff576 (s, control)
I	[   0 /  46.2298 ms] (s) b779e (s, control)
D	175.6890 ms Class: app, Function: call, Args: 1, Get: 0, Post: 0
D	178.3409 ms Class: index, Function: app_init, Args: 0, Get: 0, Post: 0
I	[   1 /  22.9371 ms] (s) 88b9d (s, 1)
I	[   0 /  21.1940 ms] (s) f0826 (s, 103)
I	[   0 /  27.6730 ms] (s) 2b749 (s, 103)
I	[   1 /  26.1419 ms] (s) 043b2 (s, 103)
I	[ 115 / 111.6478 ms] (s) 4ab69 (s, 2)
D	533.6120 ms Class: forex, Function: combo, Args: 4, Get: 0, Post: 0
I	[   2 /  22.4421 ms] (s) 0869a ()
I	[   1 /  21.0011 ms] (s) de19a (s, 1)
I	[   4 /  34.8492 ms] (s) 81d10 (s, 2)
I	[   3 /  26.5441 ms] (s) 9b682 (iiiii, 6491, 6489, 6488, 6482, 1)
I	[   2 /  33.6881 ms] (s) 9976b ()
I	[   4 /  31.9560 ms] (s) c89ef (ss, 20, 2)
I	[   1 /  23.5300 ms] (s) 82589 (s, termekajanlo.html)
I	[   1 /  23.7529 ms] (i) 7c3b6 (sssssssss, 2211, 2013-01-05 20:18:28, control, method, /control/method/, , GET, 0, 0)
I	[   5 /  65.7070 ms] (s) 9ab90 ()
D	839.2611 ms Class: index, Function: app_final, Args: 0, Get: 0, Post: 0
I	Template replace: 1277, Fail: 233
I	Database queries:   599.9510 ms
F	Page generation:    842.2649 ms
A végén lehet látni az összes időt és ebből a DB időt. Utóbbiba beletartozik az összes sor lefetchelése és tömbbe rakása, mert a függvény az elején és a végén nyúl a microtimehoz.

Mindent mérek, így gyönyörűen látni a botleneckeket. Ja és előre is optimalizálok, mert van olyan, amiről már az elején tudom, hogy sok rekorddal csúnyán elszállhat a lekérdezési idő.
193

Én is valami ilyesmire

inf · 2013. Már. 23. (Szo), 05.45
Én is valami ilyesmire számítok. Pepitával valami olyasmin vitatkoztunk, hogy az adatbázis kérésbe beletartozik e a fetch-elés, meg a php-val történő kommunikáció. Ő azt mondta, hogy az már a php része, és anélkül az sql-ek nem visznek el sok időt. Tudnál olyan statisztikát mutatni, amin az látszik, hogy az adatbázison hány msec 1-1 ilyen kérés (a fetch-elés és a php kommunikáció nélkül)? Érdekes lenne megnézni a különbséget. Lehet, hogy a kommunikáció az adatbázissal, ami sokat elvisz, ha jól látom 20 msec feletti 1-1 ilyen kérés, abból elképzelhető, hogy 15 csak a kommunikáció, és 15*16 az ugye 240 msec lenne, tehát már elég rendesen beleszólni az oldal betöltésbe. Jó lenne erről tényleges adatokat látni, mert ha így van, akkor tárolt eljárásokkal akár 200 msec-et is meg lehetne spórolni 1-1 oldalnál függetlenül attól, hogy van e hozzá query cache, vagy nincsen...
195

No, grabbeltem egy éles

deejayy · 2013. Már. 26. (K), 15.18
No, grabbeltem egy éles snapshotot és kipróbáltam úgy, hogy localhoston van a web- és db szerver is:
D	Get: /control/method/
D	28.1219 ms Class: app, Function: logrotate, Args: 0, Get: 0, Post: 0
D	32.5170 ms Class: app, Function: chain_parse, Args: 1, Get: 0, Post: 0
D	35.7020 ms Class: pre_db, Function: __construct, Args: 4, Get: 0, Post: 0
I	[   0 /   1.2171 ms] (s) 82589 (s, control/method/)
I	[   0 /   5.1739 ms] (s) ff576 (s, control)
I	[   0 / 123.3649 ms] (s) b779e (s, control)
D	178.3290 ms Class: app, Function: call, Args: 1, Get: 0, Post: 0
D	180.9919 ms Class: index, Function: app_init, Args: 0, Get: 0, Post: 0
I	[   1 /   2.1660 ms] (s) 88b9d (s, 1)
I	[   1 /   2.1889 ms] (s) 0348f (s, )
I	[ 115 /   9.7160 ms] (s) 4ab69 (s, 1)
D	307.7149 ms Class: sws_forex, Function: combo, Args: 4, Get: 0, Post: 0
I	[   2 /   0.7339 ms] (s) 0869a ()
I	[   1 /   0.5510 ms] (s) de19a (s, 1)
I	[   5 / 362.5441 ms] (s) 81d10 (s, 1)
I	[   4 /   1.9851 ms] (s) dc9a7 (iiiiii, 6642, 6641, 6640, 6639, 6591, 1)
I	[   2 /   0.9501 ms] (s) 9976b ()
I	[   5 /  37.3051 ms] (s) c89ef (ss, 20, 1)
I	[   5 /   2.1229 ms] (s) dc9a7 (iiiiii, 5480, 4388, 4253, 3338, 3268, 1)
I	[   2 /   0.7479 ms] (s) 9976b ()
I	[   1 /   0.8941 ms] (s) 82589 (s, termekajanlo.html)
I	[   1 /   0.8471 ms] (i) 7c3b6 (sssssssss, 2818, 2013-03-26 14:09:32, control, method, /control/method/, , GET, 0, 0)
I	[  19 /  43.2301 ms] (s) 9ab90 ()
D	795.3110 ms Class: index, Function: app_final, Args: 0, Get: 0, Post: 0
I	Template replace: 1365, Fail: 387
I	Database queries:   595.7382 ms
F	Page generation:    798.3580 ms
Itt látszik azért, hogy helyben akár 1 msec alá is mehet egy-egy query, illetve szépen látszik, hogy mi az, amit optimalizálni kellene.
196

Tehát 600 msec az adatbázis,

inf · 2013. Már. 26. (K), 15.24
Tehát 600 msec az adatbázis, 200 msec a kirajzolás. Mennyire bonyolult maga az oldal? Mit használsz a kirajzolására?
198

Egyszerű webshop, saját

deejayy · 2013. Már. 26. (K), 15.33
Egyszerű webshop, saját template-ező (sarkítva: preg_replace_callback), MVC, és nagyjából annyi metódushívás, amennyi query a fenti listában (kis sarkítás ismét: van, amit többször felhasználok).
200

Itt gondolom

Pepita · 2013. Már. 26. (K), 21.55
szintén a fetch-idő is benne van a ~600 ms-ban, így viszont ugyanannyira kétértelmű maradt a kérdés. Mindenesetre érdekes a rajzolásra 200 ms is, ha már előkészített adatokkal dolgozik.
194

Na igen

Pepita · 2013. Már. 23. (Szo), 21.00
Utóbbiba beletartozik az összes sor lefetchelése és tömbbe rakása
Ahogy Inf3rno is írta, ebben már rendesen van PHP idő is. De nem ez a lényeg, hanem az, hogy hol lehet többet spórolni.
Tőlem aztán DB időnek is hívhatjuk a fetch-elést, mivel úgyis majd' minden query után kell, tehát kb. úgy lehet spórolni rajta, ha magán a query-n spórolsz (darabra).
De érdekes felvetés a stored proc is ebből a szempontból.
166

ExtJS, Sencha és a többiek

T.G · 2013. Már. 19. (K), 08.52
Azért valahol mindig megmosolygom, amikor a Weblaboron teljes mellszélességgel ostorozzák az ExtJS-t. Egyszerűen nem látom, hogy egyedi komponens esetén miért lenne bármiféle előny a nulláról nekikezdeni valamit, minthogy az Ext-es core függvényekből felépíteni. Ugyanúgy, ahogy a JQuery és a JQuery UI az ExtJS-ben is külön van választva a Core rész, a böngésző független DOM/Ajax/Esemény kezelő rész. Tehát, ha egy olyan alap komponenst szeretnél, ami nem illik bele a többibe, akkor felépítheted magad az Ext.Observer-ből kiindulva az Ext.Element segítségével.
Vannak nagyon általános komponensek, amik kifejezetten arra készültek, hogy továbbépítsed, ilyen pl. a TriggerField. (mező amihez tartozik egy lenyíló akármi, ami lehet combobox, dátummező, színpaletta vagy tetszőlegesen egyedi megoldás) Illetve vannak nagyon konkrét komponensek, amik sebesség, hatékonyság miatt nehezen (vagy szinte egyáltalán nem) írhatóak felül, ilyen pl. a TreePanel. Ám, ha mégis ebbe az irányba szeretnél elmenni, akkor is, van lehetőséged tetszőleges Store készítésére és tetszőlegesen módosíthatod a DataView-ot is. Bármit fel lehet építeni, csak tisztába kell lenni vele, hogy mi a helyes irány.

Az Ext.Observer illetve az Ext.Element ugyanúgy megtalálható a Sencha Touch-ban is, és akkor a sebességről egy kis videó: http://www.youtube.com/watch?v=wCn3R3-XxBU
Vagy itt egy másik: http://www.youtube.com/watch?v=CvX241gK6gc

Nagyon könnyű az ExtJS-ben rossz kódot írni, sokkal könnyebb, mint JQuery-ben, mert maga a rendszer sokkal nagyobb, de ez nem az Ext hibája.
167

Egyszerűen nem látom, hogy

Hidvégi Gábor · 2013. Már. 19. (K), 09.22
Egyszerűen nem látom, hogy egyedi komponens esetén miért lenne bármiféle előny a nulláról nekikezdeni valamit, minthogy az Ext-es core függvényekből felépíteni.
Például azért, mert egy többszáz űrlapelemet tartalmazó űrlapon már igenis számít, mekkora programrészlet felelős egy elem kirajzolásáért.
Tehát, ha egy olyan alap komponenst szeretnél, ami nem illik bele a többibe, akkor felépítheted magad az Ext.Observer-ből kiindulva az Ext.Element segítségével.
Bizonyos elemszám fölött a hagyományos eseménykezelés, az ext.js-ben használt Observer minta lassú lesz, ha sok adatot kell gyorsan kirajzolni és/vagy frissíteni.
168

Minden kikapcsolható

T.G · 2013. Már. 19. (K), 09.36
Onnantól kezdve, hogy a teljes eseménykezelést ki lehet kapcsolni a komponenseknél, szerintem mindez nem számít.

Viszont azt nehezen hiszem el, hogy amikor egy/néhány programozó mindent a nulláról újraír, akkor hasonló precizitással építi fel az alapokat, mint azt az ExtJS esetén tették.
199

"Viszont azt nehezen hiszem

csulok0000 · 2013. Már. 26. (K), 15.47
"Viszont azt nehezen hiszem el, hogy amikor egy/néhány programozó mindent a nulláról újraír, akkor hasonló precizitással építi fel az alapokat, mint azt az ExtJS esetén tették."


Ezzel nem értek egyet.

1. Ők is fejlesztők és lehet hogy a kis egyedi fejlesztés nagyobb tudással készül.
2. Ahogy minden keretrendszer az ExtJS is általánosított, vagyis nincs kihegyezve egy konkrét feladatra. Az egyedi rendszer adott esetben csak azt szolgálja ki amit ki kell, így egyszerűbb kód készül melyet könnyebb tesztelni is és javítani is. (persze csak ha nem vérPistike a fejlesztő).
201

Welcome! :)

T.G · 2013. Már. 26. (K), 23.13
Tényleg emiatt a hozzászólás miatt regisztráltál be? :)

Véleményem szerint pont a kliens oldali keretrendszerek esetén problémás a tesztelés, amikor elkészült az ExtJS 4-es, akkor azzal reklámozták be, hogy több mint 20 böngészővel működik. (nem tudom, hogy ez mennyire igaz, de jól hangzik:)

Semmiképpen sem mondom, hogy az ExtJS az egyetlen irány, de az biztos, hogy JS keretrendszer nélkül komoly webes alkalmazásokat építeni nagy butaság.
202

több mint 20 böngészővel

Poetro · 2013. Már. 26. (K), 23.14
több mint 20 böngészővel működik

Hát ha működik a Chrome és a Firefox legutóbbi 10 verziójával, akkor már meg is van a 20.
203

:)

T.G · 2013. Már. 26. (K), 23.19
2011. áprilisában még 10 alattiak voltak a verziószámok. :)
169

Alapvetően egyetértek. Nekem

inf · 2013. Már. 19. (K), 15.44
Alapvetően egyetértek. Nekem konkrétan a TreePanel-el volt a legnagyobb gondom a 3-as verzióban, ahogy nézem a 4-esben már sokat javítottak rajta. Egyébként ha core függvényekből, komponensekből indulok ki, akkor nem az extjs-t fogom használni, hanem a jquery-t és valamelyik mvc lib-et; én konkrétan a backbone-t. Én jobb szeretek sok kis modulból építkezni, mert világosabban kirajzolódnak a rétegek, mintha egy monumentális keretrendszert használnék, mint amilyen az extjs. Megbízhatóbbnak érzem így a kódot, és ha valami egyedit akarok csinálni benne, akkor biztosabban ki tudok indulni egy magasabb szintű rétegből, mint mondjuk extjs esetében, ahol a TreePanel alatti rétegből kellett kiindulnom a 3-as verziónál ahhoz, hogy egyedi fát rajzoljak.