Ultrakezdők Kérdései
#1
Posted 11 October 2012 - 11:13 AM
ezt a topicot arra hozom létre hogy az ultrakezdők is tudjanak valahol kérdezni. természetesen mivel én is ultrakezdő vagyok a yii-oop-mvc területén, kéretik nem kinevetni a kérdéseimért, és köszönöm a türelmet.
szóval ultrakezdő vagyok, de nem reménytelen, remélem. rendeltem könyveket, amiből tanulok. próbálom megérteni az oop-t. igazából az elvekkel nagyjából már tisztában vagyok (na lehet hogy ez a probléma, hogy csak nagyjából), de valahogy mindig eljutok egy olyan pontra a könyvekben (is) amit nem értek (vagy valami más megvilágítás hiányzik, ami számomra is érthetővé tenné a dolgot, vagy valami agyi funkcióm nem teljes).
a lényeg hogy párhuzamosan olvasok php5 könyvet és yii-t, merthát persze elsősorban a yii az ami engem érdekel, csak gondoltam azért kínai mert nem értem az oop-t. hát most már kicsit kezdem kapizsgálni az oop-t, a yii azonban továbbra is kínai... :/ így inkább elhatároztam magam hogy kérdezek, akármilyen égő is.
szóval az első kérdésem: van egy adatbázis táblám, és hozzá gii-vel generáltam egy alap CRUD-ot. az insert és update formnál szeretnék egy ellenőrzést hogy a bevitt adatok (ill. adatkombinációk) léteznek-e már esetleg az adatbázisban.
találtam ilyet hogy:
- beforeSave()
- onBeforeSave
és találtam ilyet hogy:
- exists()
elvileg ez a kettő elég lehet a dolog megoldására.
elsődlegesen kérdésem az, hogy ezeket a metódusokat egyáltalán hova a rákba és hogyan kell betenni hogy valami történjen is, hibaüzeneteken kívül. a modellbe, vagy a kontrollerbe? és hogyan? ígérem ha segítséget kapok, és megértem, még egyszer már nem kell majd elmagyarázni nekem, de persze jönnek majd a következő kérdések. valahogy úgy érzem hogy igazából elég kicsi választ el attól hogy megértsem a dolog logikáját, és lehet hogy egy kis kavics is egy lavinát tudna elindítani a megvilágosodási folyamatomban.
előre is köszi.
#2
Posted 12 October 2012 - 06:52 AM
Ugyanis ez a CActiveRecord osztály egyik tagfüggvénye, és a CActiveRecord pedig a CModel osztályhoz tartozik. Itt implementáld le a függvényt a beforeSave()-et, az onBeforeSave egy esemény vezérlő, ami azt jelenti, hogy végre hajt egy mentés előtti valamit... ezt hívja meg amúgy a beforeSave()... ha gondolod csinálhatsz olyat, hogy beforeMitTudomÉnMiértSave() függvény, ami meghívja ezt az eseményt... de hagyjuk
Szal a model mappában egy CActiveRecord-ból öröklöt osztályban írd felül ezt a függvényt (csak hozd létre PHP-ban
És majd controllerben meghívod ezt a függvényt, például az actionInsert vagy actionUpdate vezérlőben.
Vagy majd jönnek az Okosabbak és ők mondanak többet.
#3
Posted 12 October 2012 - 01:20 PM
blaces, on 12 October 2012 - 06:52 AM, said:
egy kérdés: amikor a gii-vel létrehozom az adott adatbázistábla modelljét, akkor az eleve így kezdődik, hogy:
class Mrsk2 extends CActiveRecord
{...
én végig értek és meg tudok csinálni mindent ami a leírásban van, addig a pontig, amikor el kellene kezdeni testre szabni a kódot. na jó nem egészen mert ilyen empirikus módon még abban is tudtam kicsit ügyködni meg egy-két apróságot megoldani, de persze az alap logika ami szerint működik az még nincs meg.
tehát. elvileg akkor magát ezt az osztályt nem kell még egyszer külön létrehoznom már, nem? hiszen ez is a CActiveRecord-ot bővíti (a CActiveRecord-ról annyit tudok hogy miért felelős meg hogy kb. mire jó, de hogy hogy épül fel stb. azt még nem).
blaces, on 12 October 2012 - 06:52 AM, said:
ezt még értem.
blaces, on 12 October 2012 - 06:52 AM, said:
ilyen mélyen még nem ástam bele magam, ezt most nem is értem egyelőre, de biztos igazad van.
blaces, on 12 October 2012 - 06:52 AM, said:
mármint hol? itt az Mrsk2 modell-ben?
és hogyan? ez itt a fő kérdésem!
szóval a kérdésem az hogy hogyan kell ezt.
blaces, on 12 October 2012 - 06:52 AM, said:
ok, értem.
blaces, on 12 October 2012 - 06:52 AM, said:
ok, hagyjuk.
blaces, on 12 October 2012 - 06:52 AM, said:
tehát úgy tudom működésbe hozni, hogy még egyszer (azaz újra-) definiálom? azaz berakom ezt a kódot?:
protected function beforeSave()
{
if($this->hasEventHandler('onBeforeSave'))
{
$event=new CModelEvent($this);
$this->onBeforeSave($event);
return $event->isValid;
}
else
return true;
}
ezt most kopiztam ki a class reference-ből.
de ez a bizonyos "még egyszer", nem mond egy kissé ellent az OOP-nak? mármint nem az a lényege hogy ne kelljen még egyszer leírni ezt a kódot? vagy mit keverek össze mivel? vagy ez a kód most még tkp. nem is létezik az én applikációm viszonylatában? ezt nem valahogyan a yii alap framework-jéből szedné valahogyan ki az applikáció? mert én azt hittem hogy ezek a dolgok már mind léteznek, meg rendelkezésre állnak, nekem csak valahogy nagyon egyszerűen meg kell hívnom, vagy hivatkoznom rá vagy valami.
blaces, on 12 October 2012 - 06:52 AM, said:
nagyszerű-nagyszerű, és ezt hogyan? most vagyok a lényeg megtudásának a küszöbén.
blaces, on 12 October 2012 - 06:52 AM, said:
nekem ez így megfelel ha egy icipicit még szájbarágósabban el tudod mondani, de persze ettől még jöhetnek az Okosabbak is, mit bánom én!
köszi!
#4
Posted 13 October 2012 - 03:14 AM
Quote
és hogyan? ez itt a fő kérdésem! végül is maga a függvény már létezik, nekem csak meg kéne hívnom (azaz működésbe hoznom) valahogy, nem?
Jah, itt ebben az Mrsk2-ben kell meghívni, egy kis trükkel... ahogy én láttam
class Comment extends yiiTrackStarActiveRecord {...} // Egy könyvből van a példa
// Source Code from: Agile Web Application Development with Yii 1.1 and PHP5 Book
abstract class yiiTrackStarActiveRecord extends CActiveRecord // CActiveRecord pedig a CModelből jön.
{
/**
* Prepares create time, create user id, update time and update user id attributes before performing validation.
*/
protected function beforeValidate()
{
//parent::beforeValidate();
if($this->isNewRecord)
{
// set the create date, last updated date and the user doing the creating
$this->create_time=$this->update_time=new CDbExpression('NOW()');
$this->create_user_id=$this->update_user_id=Yii::app()->user->id;
}
else
{
//not a new record, so just set the last updated time and last updated user id
$this->update_time=new CDbExpression('NOW()');
$this->update_user_id=Yii::app()->user->id;
}
return parent::beforeValidate();
//return true;
}
}
Ez nem beforeSave, hanem beforeValidate.
Quote
Igen, ez az OOP egyik alapja, override-nak hívják angolul, magyarul felülírod a szülőjét. PHP-ban annyira nincs ez külön jelezve
Controllerben kell meghívni, ha jól tudom, de szerintem a YiiBlog tutorialban van erre példa, ha nem majd keresek később. Amúgy én inkáb novemberben fogok yii webalkalmazást megírni, eddig én is csak tanultam inkább
Inkább Skype-on elmondom neked szájbarágosan, most kevés időm van
De az OOP szemléletet nézd át mégjobban
Még felnézek majd
#5
Posted 13 October 2012 - 05:33 AM
Ott a /models/post.php és a /controller/PostController.php fájlt nézd át. Na most már így nekem is tiszta.
Modelben hozod felülírod a beforeSave() és afterSave() függvényeket: Ez azt jelenti, hogy a függvény név megegyzik az ősosztályban létrehozott fv. névvel, de a { } közötti rész teljesen más. Ez a felülírás, azaz a függvény belseje más.
Ennél az esetben az extends CModel részt majd át kell írnod extends CActiveRecord-ra de ezt tárgyaltuk, mert a CActiveRecord osztály tartalmazza a felülírndó beforeSave() fv-t, a CModel nem tartalmazza, ebből futás idejű hibád lesz! (vagy fordítási, nem tudom a PHP hogy működik ilyen téren... JAVA már fordításkor szól)
Itt a mentés előtt lehet csinálni az adott "objektummal" jelen esetben ez nem más mint egy adat, például egy adott 'post' objektum (ami ugyebár egy adat amit majd beszúrsz az adatbázisba) (Más itt beszólhat, de nem akarom kifejteni az ORM és a mögötte lévő egyéb nyalánkságok, utánaolvashatsz!) A post objektumnál pedig mentés előtt betudod állítani, hogy a szerzőnek (author) adatbázisban mezőnek, mi legyen az értéke, vagy a létrehozás dátuma.
Kész, és ennyi a dolgod.
Ezt a metódust sehol sem (beforeSave függvény-t) nem kell neked sehol sem explicit módon (azaz beleírnod a controller osztályba, hogy beforSave() ) meghívnod. Hanem ez implicit (magyarul a rendszer automatikusan meghívja) módon mindig meghívja a 'save()' függvény!
Magyarul neked mindig csak a save()-t kell a Controller-ben (lásd: PostController) meghívnod, és ez automatikusan meghívja a beforeSave() és afterSave() metódusokat!
Érted?
#6
Posted 13 October 2012 - 07:46 AM
de amit ki tudtam hámozni belőle, az az, hogy amikor ez van:
$model->save();
akkor ez tartalmazza már a BeforeSave-et is, ugye? csak nekem azt át kell írnom (ill. újradefiniálnom), hogy benne legyen az exists() vizsgálat is, ugye?
tehát van egy ilyenem:
protected function beforeSave()
{
if($this->hasEventHandler('onBeforeSave'))
{
$event=new CModelEvent($this);
$this->onBeforeSave($event);
return $event->isValid;
}
else
return true;
}
meg egy ilyenem:
public function exists($condition='',$params=array())
{
Yii::trace(get_class($this).'.exists()','system.db.ar.CActiveRecord');
$builder=$this->getCommandBuilder();
$criteria=$builder->createCriteria($condition,$params);
$table=$this->getTableSchema();
$criteria->select='1';
$criteria->limit=1;
$this->applyScopes($criteria);
if(empty($criteria->with))
return $builder->createFindCommand($table,$criteria)->queryRow()!==false;
else
{
$criteria->select='*';
$finder=new CActiveFinder($this,$criteria->with);
return $finder->count($criteria)>0;
}
}
és ha azt szeretném hogy BeforeSave-kor lefusson az ellenőrzés, akkor a kettőt valahogy egymásba kellene pakolnom, ugye?
Quote
tehát csak ennyit írjak?:
protected function beforeSave()
{
}
és ebbe pakoljam a exists-et? és ott is csak ennyit írjak akkor?:
public function exists($condition='',$params=array())
{
}
tehát így?:
protected function beforeSave()
{
public function exists($condition='',$params=array())
{
}
}
na jó ez biztos nagyon naiv ötlet volt. de valahogy így?
Quote
kapizsgálom, akkor ezek szerint:
$model->save();
ennyi. ugye?
csak annyit kell csinálnom, hogy ezt a kettőt valahogy (hogy?) egymásba ágyazom:
protected function beforeSave()
{
}
public function exists($condition='',$params=array())
{
}
hogyan kell ilyesmit csinálni?
köszi!
#7
Posted 13 October 2012 - 05:21 PM
Quote
protected function beforeSave()
{
public function exists($condition='',$params=array())
{
}
}
na hát így biztos nem mert kapásból csak hibaüzenetet kaptam... de akkor hogy?
#8
Posted 14 October 2012 - 03:14 PM
protected function beforeSave(){
$this->setAttributes($this::model()->find(conditions, params)->attributes, false);
}
illetve nem pont így van ott, ezt már én logikáztam össze a válaszokból, de nem értem még hogy pontosan ez hogyan és miért, de úgy tűnik működik.
volt egy olyan érzésem hogy valami pofátlanul "egyszerű", vagyis inkább rövid megoldása kell ennek legyen yii-ben.
azt mondjuk tudtam hogy a find() is nagyjábol azt csinálja, de amit szintén nem értek, miért nem az exists()-et használja?
és ha azt szeretném hogy ez mindig, minden adatbázis táblánál így működjön, akkor hogy lehetne ezt a legegyszerűbben megoldani, hogy ne kelljen minden egyen tábla modelljébe betenni ezt a kódot? valahol a yii alap működésébe kellene belenyúlni?
meg még azt sem értem hogy mi aktiválja a figyelmeztetést.
#9
Posted 17 October 2012 - 01:31 PM
Hidd el nekeme, hogy az alapok tényleg kellenek.
Én személy szerint alap Java-t ajánlanék, az beléd verni az Objektum orientált gondolkodást.
Ehhez pedig csak annyit kérdeznék, hogy tudsz-e angolul? Mert van itt egy tutorial, yiiBlog néven, azt átkéne nézni, elvégezni mégegyszer. Abból megértenéd a lényeget, de előtte 1 hétig csak PHP Objektum oreintál gyakorlást javaslok
Az nagyon jó, hogy ilyen lelkes vagy, de az alapok kellenek!
Majd 1 hét után dumálunk! Priviben jelezd, addig meg tessék azt a 2 dolgot megcsinálni!!! (ha meg volt, akkor mégegyszer, addig amíg nem érted meg!)
#10
Posted 17 October 2012 - 03:13 PM
Quote
erre gondolsz, ugye?
Quote
public function exists($condition='',$params=array()){
}
}
elkezdtem én azt a tutorialt, csak először ott szívtam meg, hogy a yii verzió már közben újabb lett, és nem működtek dolgok. akkor felraktam a régit, azzal tudtam haladni, de érteni azt se értettem annyira, ezért kezdtem el előbb könyvet olvasni. itt már kapizsgálom de még mindig kissé magas, pedig a könyv elég szájbarágós (Bevezetés a PHP5 programozásába). de mégis az OOP résznél egyszerűen valami hiányzik nekem ahhoz hogy teljesen megértsem. nem baj majd ezen a részén még 1x (2x, 3x...) átrágom magam, mert vannak részek amikre hivatkoznak de csak később fejtik ki.
meg az a bajom hogy én mindjárt csinálni szeretném a lényeget, ami engem érdekel, és azon keresztül megérteni. nagyon nehezemre esik ádámévától elkezdeni. ezen a könyvön is a feléig kb majdnem elaludtam, mert az alapok végülis már elég jók, csak az OOP rész magas. de azt is már kezdem kicsit érteni egyébként. de gondoltam inkább végigmegyek az egészen hátha vmi hiányosságra lelek ami megakadályozza hogy megértsem az OOP alapokat. kiváncsi voltam hogy van-e UML a yii-ről és van! tökre meglepődtem, kellemesen. gondoltam segítene valamelyest elképzelni mégis valamit. ebből láttam hogy tkp. a CComponent a magja, vagy legalábbis egyik alappillére a yii-nek. jó most ettől nem lettem sokkal okosabb, de azért mégis valami. igazából biztos vagyok benne hogy van egy alap logikája ami megmondja hogy mit miért úgy kell ahogy, és ehhez nem biztos hogy kell ismernem a yii egész felépítését.
a lényeg hogy nagyon jót tenne ha valaki tudna tanítani és a kérdéseimen keresztül megvilágítani számomra az egészet. nagyon szeretném megérteni.
#11
Posted 18 October 2012 - 02:33 AM
Google: Nagy Gusztáv Java jegyzet - erre keres rá, bocsi, de nem enged linket beszúrni nekem, mert újfiú vagyok itt.
Meg még a prohardver.hu-t ajánlom fórum/szoftverfejlesztés/php topicban segítenek neked.
Java jegyzet 1. és 2. fejezetét olvasd át az OOP-ot talán így megérted jobban
Írd le az ötletedet papíron, jegyezd meg, és ha meg vannak az alapok akkor fogj bele

Help













