Ultrakezdők Kérdései

sziasztok!

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… :confused: í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.

Nem vagyok benne biztos, de szerintem a Model mappába rakd… HOzz létre egy külön osztályt, ami a CActiveRecord osztályt bővíti. Pl.: public class beforeToDo extendes CActiveRecord.

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.

először is köszi és szia. végtelenül hálás vagyok hogy válaszra méltattál!

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).

ezt még értem.

ilyen mélyen még nem ástam bele magam, ezt most nem is értem egyelőre, de biztos igazad van.

mármint hol? itt az Mrsk2 modell-ben?

é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?

szóval a kérdésem az hogy hogyan kell ezt.

ok, értem.

ok, hagyjuk. :) egyelőre.

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.

nagyszerű-nagyszerű, és ezt hogyan? most vagyok a lényeg megtudásának a küszöbén.

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!

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.

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 :) De ha van JAVA vagy C# tudásod, akkor egyértelmű, és ott jobban meg lehet tanulni az egész OOP (öröklődés) lényegét. Ott ilyenkor a függvények előtt (amelyett felülakarsz írni) van egy override kulcsszó, PHP-ban nincs. A függvéynen belüli kódot ne írd le mégegyszer! Ami a dokumentációban van, hanem az alkalmazáshoz írd meg, megfelőlen, lásd a felső példát :).

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 :) Az fontos lesz itt :)

Még felnézek majd :)

Na, figyu amikor letöltöd a yiiframework-öt akkor ott van benne olyan, hogy ‘demos’ mappa, azon belül a ‘blog’ mappa az ami lényeges.

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? :)

hú ez most egy kissé tú máccs volt így hirtelen… :(

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?

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?

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!

na hát így biztos nem mert kapásból csak hibaüzenetet kaptam… de akkor hogy?

ezt találtam a yiianswers.com-on:




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.

Röviden :). Tényleg kezdj el egy Objektum Orientált könyvet olvasni a PHP-ról, vagy tutorial nézni, az az egymásba rakott függvény, még feljebb, az nem jó, nagyon nem jó, abból látszik, hogy azt nem érted.

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!)

erre gondolsz, ugye?

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.

Igen, arra a függvény részre gondoltam. Az nagyon rossz OOP.

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 :)