<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GhazaliTajuddin.com</title>
	<atom:link href="http://www.ghazalitajuddin.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ghazalitajuddin.com</link>
	<description>My Daily Note As Photographer &#124; Web Designer &#38; Developer</description>
	<lastBuildDate>Tue, 24 Apr 2012 02:21:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Personal Tips Berhenti Merokok</title>
		<link>http://www.ghazalitajuddin.com/general/personal-tips-berhenti-merokok/</link>
		<comments>http://www.ghazalitajuddin.com/general/personal-tips-berhenti-merokok/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 02:07:58 +0000</pubDate>
		<dc:creator>Ahmad Ghazali Ahmad Tajuddin</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[bad]]></category>
		<category><![CDATA[bad smoking]]></category>
		<category><![CDATA[berhenti merokok]]></category>
		<category><![CDATA[cigarette]]></category>
		<category><![CDATA[ecigar]]></category>
		<category><![CDATA[electronic cigarette]]></category>
		<category><![CDATA[esmokers]]></category>
		<category><![CDATA[health]]></category>
		<category><![CDATA[lung disease]]></category>
		<category><![CDATA[lung infection]]></category>
		<category><![CDATA[malaysia stop smoking]]></category>
		<category><![CDATA[merokok merbahayakan kesihatan]]></category>
		<category><![CDATA[nikmat rokok]]></category>
		<category><![CDATA[no smoking]]></category>
		<category><![CDATA[retired smoking]]></category>
		<category><![CDATA[smokers]]></category>
		<category><![CDATA[stop]]></category>
		<category><![CDATA[stop smoking]]></category>
		<category><![CDATA[stop smoking effect]]></category>
		<category><![CDATA[stop smoking sypmtom]]></category>
		<category><![CDATA[stop smoking tips]]></category>
		<category><![CDATA[stop smoking withdawal effect]]></category>
		<category><![CDATA[stop smoking withdrawal symptom]]></category>
		<category><![CDATA[symptom]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tips berhenti merokok]]></category>

		<guid isPermaLink="false">http://www.ghazalitajuddin.com/?p=1343</guid>
		<description><![CDATA[Hari ini, aku nak share sesuatu yang penting. Penting pada aku, penting pada ko. Aku dan ko hampir sama. Sebab aku pernah merokok dan kau mungkin sedang mencuba untuk berhenti. Atau ko mungkin tak merokok, baguslah, ko memang bijak dan<span class="ellipsis">&#8230;</span> <a href="http://www.ghazalitajuddin.com/general/personal-tips-berhenti-merokok/"><div class="read-more">Read more &#8250;</div><!-- end of .read-more --></a>]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignnone" style="width: 650px"><img title="Stop smoking" src="http://farm6.staticflickr.com/5103/5686960725_08b10fc4e5_z.jpg" alt="" width="640" height="425" /><p class="wp-caption-text">Stop smoking</p></div>
<p>Hari ini, aku nak share sesuatu yang penting. Penting pada aku, penting pada ko.</p>
<p>Aku dan ko hampir sama. Sebab aku pernah merokok dan kau mungkin sedang mencuba untuk berhenti.</p>
<p>Atau ko mungkin tak merokok, baguslah, ko memang bijak dan beruntung, tetapi mungkin orang yang kau sayang merokok. Boleh juga ko baca untuk dikongsi bersama mereka dan memahami mereka. Sebab berhenti merokok bukan mudah. Memang dipandang enteng pada mereka yang tidak merokok, tetapi bukan perkara kecil bagi mereka perokok tegar. Perokok merupakan penyumbang ekonomi negara terbesar juga. Mereka orang kaya bayar tax antara termahal di Malaysia. Mereka tidak boikot, mereka orang yang redha dan pasrah ketentuan Ilahi terhadap poket mereka. Hahahah.</p>
<p>Tapi jika ko merokok, tahniah, ko sampai juga ke sini. Aku memang menunggu ko membacanya supaya ko boleh cuba pula sebab aku pasti ko masih berusaha mencari satu solusi kepada berhenti merokok. Ini bukan kaedah yang pasti boleh, ini cuma pengalaman aku, mungkin boleh disuaikan dengan diri ko untuk berhenti merokok.</p>
<p>Berhenti merokok sudah pasti suatu perkara terhebat jika berjaya dilakukan. Ko pasti akan jumpa juga bagaimana mahu berhenti mengikut gaya dan cara diri ko sendiri.</p>
<p><span id="more-1343"></span></p>
<p><strong>Cerita Aku</strong></p>
<p>Sebelum aku bercerita bagaimana aku berhenti, terlebih dahulu aku berkongsi cerita tentang diri aku sebagai perokok.</p>
<p>Aku dah merokok 16 tahun. Separuh umor aku sekarang. Kategori aku sekotak rokok sehari, masih lightweight tetapi kadangkala pergi juga 2 kotak sehari bergantung kepada apa aktiviti harian aku. Aku pernah hisap Dunhill, Winston, Semporna, Surya dan lain2 brand tanpa masalah. Bangun pagi nak masuk toilet rokok, nak meneran atas jamban rokok, start kereta panas enjin rokok, dalam kereta sebelum sampai ofis rokok, lepas bekpes rokok, cari idea rokok, sebelum sepak bola rokok, habis main rokok, tension sket rokok, boring takde kerja pn rokok dulu seround. Biasanya camtulah life as smokers. Ini punya jenis, dipanggil <strong>Heavy Smokers</strong>. Sampai satu peringkat, hisap rokok dah tak rasa apa. Nak muntah pon ada. Ye tak? Itu bermakna sudah tepu. Kalau orang gila, mungkin dia boleh pergi main dadah. Nauzubillah.</p>
<p>Aku sendiri pernah lalui satu peringkat aku rasa dah tak feel sangat hisap rokok ni. Tetapi kenapa tak berhenti? Kenapa? Why x 3? Kerana ketagihan. Kita masih lekat dengan merokok sebab ketagihan. Ketagihan apa? Yerp. Ketagihan nikotin. Aku dah hidup 16 tahun dengan nikotin beb. 16 tahun  ko dah merokok, bukan perkara mainan untuk berhenti. Aku berkepit dengan rokok lagi lama dari aku berkepit dengan awek aku mahupun mak aku. Betul? Ko fikirlah sendiri . Tetapi sampai bila? Sampai bila kita nak terus merokok. Itu pun tanya pada diri sendiri. Semuanya bermula dari diri sendiri.</p>
<p>Aku dah mencuba berhenti merokok ini secara sirius sejak tahun 2006, sehingga lah sekarang. Sebenarnya nak berhenti merokok ni memang memerlukan persediaan mental yang kuat. Ko bayang la berapa ramai orang hisap rokok ni? Ayah aku, adik aku, kawan2 aku selalu jumpa 80% smoker lah. Kalau ko berhenti macammana ko nak berdepan dengan rakan-rakan perokok lain? Goyang beb. Sebab tu kena asuh secara psikologi jugak. Bukan takat pakai berhenti je. Memang mencabar la nak bertahan lama. Alhamdulillah berkat usaha sekian tahun, berkat doa ibu tersayang, berkat doa isteri tersayang, berkat lahir anak2 yang sihat, dengan macam-macam cara aku dah cuba. Akhirnya berjaya juga, dan aku harap terus berpanjangan sampai bila-bila.</p>
<p><strong>Cara Aku</strong></p>
<ol>
<li>Persediaan berhenti merokok</li>
<ul>
<li>Niat &amp; Lafaz</li>
<ul>
<li>Berhenti merokok ni sebenarnya pokok pangkalnya bermula dari niat kita sendiri. Sentiasa ada niat nak berhenti. Biar  pun kita tak buat apa pun lagi, tetapi niat tetap ada. Rokok kat jari ni, tetapi tetap niat nak berhenti. Rokok menjuih kat bibir ni ada niat nak berhenti. Memang selalu sebut nak berhenti. Setiap kali hisap rokok fikir nak berhenti. Sirius punya niat nak berhenti kena tanam dalam hati walaupun masih merokok. Pandang rokok tu dan fikirkan tentang berhenti merokok. Keep on niat dan lafaz.</li>
</ul>
<li>Benci</li>
<ul>
<li>Bila kita dah niat. Nawaitu dah kuat. Tanamkan perasaan benci pada rokok pulak.</li>
<li>Bagus dekat kotak rokok sekarang ada gambar-gambar. Ko jeling2lah pada gambar tu. Jangan buat2 tak nampak pulak. Rokok itu buruk! Rokok itu jijik! Lawak tapi berulang kali hati kita akan menerima sebagai kebenaran dan hakikat. Sebab tu ada orang tua kata, bila buat satu perkara cukup 40 hari, ia akan jadi tabiat. See?</li>
<li>Ko surf internet tentang keburukan merokok. Dapatkankan semua maklumat tentang keburukan merokok dan sentiasa fikirkan tentang maklumat tadi setiap kali ko nak merokok. Ini melatih jiwa kita kearah berhenti merokok.</li>
<li>Ada poster lung / peparu rosak ke, or apa2 poster kerosakan disebabkan rokok ko tampak kat tempat selalu ko pergi. Dekat meja ofis, depan pintu bilik, belakang pintu jamban pun terbaekkkk&#8230;.</li>
<li>Selagi kita tak mengajar diri kita membenci rokok, selagi itu kita takde jiwa yang bersih, jitu dan azam tinggi untuk berhenti.</li>
</ul>
<li>Sayang</li>
<ul>
<li>Fikirkan apa yang merugikan diri sendiri bila merokok? Kesihatan yang semakin teruk, paru-paru rosak, duit poket. Semua perkara yang kita sayang, yang hilang bila merokok.</li>
<li>Fikirkan tentang orang lain, orang terdekat yang paling disayangi, anak ke, isteri ke, awek ke, mak ke, ayah ke dan mereka-mereka yang terpenting dalam hidup ko. Somebody yang ko perlu survive untuk menjaga mereka.</li>
</ul>
</ul>
<li>Strategi mengurangkan rokok</li>
<ul>
<li>Tukar rokok</li>
<ul>
<li><strong>Semporna/Surya(keretek) ke Dunhil/Marlboro (dan seangkatan lain)</strong>. Uiks? Biar betoi? Iyer&#8230; Siapa pernah hisap semporna dia tau kenapa. Especially semporna hijau, ko memang akan hisap lebih dari perokok lain sebab &#8220;tak puas&#8221;. Rasa dan bau dia plak yang soft tak seberat Gudang Garam menyebabkan ko merokok lebih banyak sebab layan. Bertukarlah segera ke Dunhill Light ke atau rokok lain. Keretek mengandungi lagi macam2 bahan yang tidak elok untuk kesihatan. Ko bukan tak tahu, saja buat2 tak tahu. Malas aku nak cerita.</li>
<li><strong>Akhiri dengan rokok gulung</strong>. Yerps, rokok terakhir aku hisap adalah rokok gulung. Alah yang jenis pakai mesin tu, bukan rokok daun tu. Yang tembakau dia sebundle beli kat 7eleven. Kenapa rokok gulung? Rokok gulung ni melambatkan proses nak hisap rokok. Dahle nak bawak tu leceh. Nak hisap pun bersepah2 tembakau sebab nak gulung hahahaha. Ni pengalaman aku lah. Kalau ko betul nak berhenti boleh la cuba. Tak cuba tak tahu. Betol tak? Dalam kereta pun ko susah nak hisap sebab nak kena gulung dulu. Tp jangan la ko tunjuk cerdik sangat, pergi gulung siap2, memang failed la kalau ko fikir camtu. Sampai sudah la tak boleh nak berhenti.</li>
</ul>
<li>Nicotine Replacement</li>
<ul>
<li>Terdapat beberapa cara dalam menggunakan nicotine replacement. Aku pernah try 2 cara.</li>
<ul>
<li><strong>Rokok Electronic / eCigar</strong> &#8211; Kaedah guna rokok letrik ni pun bagus, memang boleh replace terus sebenarnya. Cuma ada feel &#8220;merokok&#8221; tu lagi. Jadi mungkin bila ko nak tunggalkan ecigar ni pulak susah nanti. Aku dah cuba tapi tak berjaya. Sebabnya barang ni pakai bateri, kena charge, filter yang digunakan yang mengandungi nikotin tu susah nak dapat, penyebab utama spoil pada aku waktu guna ecigar ni bateri rosak, nak replace susah dan harganya agak mahal maka terbantutla usaha ketika itu. Ketika itu tahun 2009 camtu la. Sekarang ni aku dengar ada product baru yang aku sendiri tak pernah test sebab dah stop. Kalau ko nak try <a href="http://www.bigvapors.com/">http://www.bigvapors.com/</a></li>
<li><strong>Niquitine Tablet</strong> &#8211; Yerps. Lately kalau korang perasan banyak keluar dekat tv pasal niquitine ni. Memang product ni agak mahal, mungkin lebih mahal daripada eCigar lagi. Tetapi sekiranya mampu. Pejam mata aje. Memang product ni menyebabkan ko tak rasa nak merokok. Jadi peringkat awal, aku makan niquitine ni untuk mengurangkan rasa nak merokok tu. Tapi kalau dah nak merokok jugak, belasah ajer. Cuma memang produk ni berkesan. Aku memang mengesyorkan korang cuba Niquitine ni. Ada dua jenis tablet, 2mg dan 4mg. Jika ko heavy smokers, ko belasah 4mg. Satu papan ada 12 biji, harganya RM17. Hahahaha. Aku sure korang terkejut. Mahal dari rokok. Tapi tu ler. Demi kesihatan, aku beli juga. Mula2 memang rabak la beb, sebab rokok pun beli jugak. Hahahah memang giler. Tapi lama-lama, sekotak rokok tu boleh bertahan 2 hari. Sebiji 4mg tu boleh tahan 4 jam pada aku. Ko pun tau benda tu mahal so pandai2 lah ko ejas. Especially lepas makan memang aku belasah, sebab lepas makanlah paling susah ko nak tinggal rokok kan. Hahahah. So bila ko dah start ejas cara ko merokok, ko leh start ambil yang 2mg je, aku dapat dalam RM13, still mahal tapi murah la sket. Cuma memang beza 4mg dan 2mg ni. Kalau ko first time ambil 4mg, silap aribulan muntah ko hahahaha. Sampai sekarang aku masih beli 2mg ni, tetapi sehari mungkin sebiji dua ajer. Alhamdulillah makin kurang.</li>
</ul>
</ul>
<li>Bersukan</li>
<ul>
<li>Bila nak berhenti tu, ada masa pergilah bersukan. Sebab bila berhenti merokok, nafsu makan akan menggila hahaha. So selain jaga badan, kita boleh membantu memantapkan lagi paru-paru kita yang dah rosak teruk. Atleast pergi lah joging dalam setengah jam ke sejam. Peringkat awal ni buat lah intensif sket, seminggu empat atau lima kali.</li>
</ul>
</ul>
<li>Simptom / Withdrawal Effect &#8211; Withdrawal siptom ni temporary effect selepas ko berhenti merokok. Jangan ko rasa pelik la tiba2 ia berlaku pada ko atau tak berlaku pun pada ko.</li>
</ol>
<ul>
<ul>
<li><strong>Stress</strong> &#8211; Antara perkara kita kena handle adalah elakkan stress. Bila stress memang ko akan teringat kat rokok ko balik. Ko teringat balik feel bersama rokok dan asap itu hahaha. Ni bukan perkara main-main. So pada peringkat awal kalau boleh elakkan berada dalam lingkungan stress. Bersedialah dengan tablet Niquitin tu. Elakkan peluang untuk merokok.</li>
<li><strong>Sakit kepala</strong> &#8211; Aku takde la sakit kepala mana. Tapi ramai juga orang lain sakit kepala. Mungkin sebab stress so bersedialah untuk sakit kepala.</li>
<li><strong>Pendek nafas</strong> &#8211; Ni paling aku tak larat. Tetapi inilah yang membuatkan aku terus tak nak merokok. Azab weh. Dalam keadaan normal ko memang rasa pendek nafas ni, macam nafas tak cukup. Ko tarik nafas rasa cam tak abes tarik, oksigen tak lekat. Mula rasa down semacam. Rasa nak mati pun ada.  Tetapi bila aku pergi main futsal ke, jogging je dalam masa 5-10minit kembali normal ko rasa lebih energetic. Nafas tip top. Cuma bila ko buat aktiviti biasa memang terasa la something wrong pada sistem pernafasan ko. Aku sampai bawak diri ke hospital check paru2, check tekanan darah, check jantung, Alhamdulillah semua sihat. Admit je lah, sapa suruh ko merokok, dah dapat penyakit baru tau bersyukur Nikmat Kesihatan. Huhuhuhuhu. So kepada ko aku nasihat, teruslah berusaha berhenti. Lagi awal lagi bagus, aku harap ko tak lalui apa aku lalui sekarang. Memang agak suffer nafas pendek ni.</li>
</ul>
</ul>
<p>Fuhhhh, panjang aku menulis kali ini. Aku harap pengisian kali ni dapat memberi sesuatu yang bermanfaat pada ko untuk terus mencuba berhenti merokok. Sirius bro, kalau bukan sekarang bila lagi? Masa sihatlah nak berbuat baik sebelum masa sakit. InsyaAllah. Selamat berjaya!
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Fpersonal-tips-berhenti-merokok%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Fpersonal-tips-berhenti-merokok%2F&amp;source=ghazalitajuddin&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ghazalitajuddin.com/general/personal-tips-berhenti-merokok/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yii Example How To Install Mail Extension (Swiftmailer Wrapper)</title>
		<link>http://www.ghazalitajuddin.com/general/yii-example-how-to-install-mail-extension-swiftmailer-wrapper/</link>
		<comments>http://www.ghazalitajuddin.com/general/yii-example-how-to-install-mail-extension-swiftmailer-wrapper/#comments</comments>
		<pubDate>Thu, 19 Apr 2012 03:30:29 +0000</pubDate>
		<dc:creator>Ahmad Ghazali Ahmad Tajuddin</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[ICT]]></category>
		<category><![CDATA[Component]]></category>
		<category><![CDATA[Controller]]></category>
		<category><![CDATA[Extension]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Kuantan]]></category>
		<category><![CDATA[kuantan programmer]]></category>
		<category><![CDATA[kuantan web developer]]></category>
		<category><![CDATA[kuantan webmaster]]></category>
		<category><![CDATA[Mail]]></category>
		<category><![CDATA[Malaysian Yii]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programmer]]></category>
		<category><![CDATA[sendmail]]></category>
		<category><![CDATA[SwiftMailer]]></category>
		<category><![CDATA[View]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[Yii Framework]]></category>

		<guid isPermaLink="false">http://www.ghazalitajuddin.com/?p=1327</guid>
		<description><![CDATA[Download this mail extension here  http://www.yiiframework.com/extension/mail. Extract the files. Move the vendors folder to protected/components/vendors/ Move YiiMail.php and YiiMailMessage.php to protected/components/ Add on protected/config/main.php Configure in controller Create our model Finally create our view]]></description>
			<content:encoded><![CDATA[<div id="attachment_1105" class="wp-caption aligncenter" style="width: 735px"><a href="http://www.ghazalitajuddin.com/general/understanding-yii-cform/attachment/yii/" rel="attachment wp-att-1105"><img class="size-full wp-image-1105" title="Yii Framework" src="http://www.ghazalitajuddin.com/wp-content/uploads/2012/03/yii.png" alt="Yii Framework" width="725" height="157" /></a><p class="wp-caption-text">Yii Framework</p></div>
<ul>
<li>Download this mail extension here  <a href="http://www.yiiframework.com/extension/mail">http://www.yiiframework.com/extension/mail</a>.</li>
<li>Extract the files.</li>
<li>Move the vendors folder to <strong>protected/components/vendors/</strong></li>
<li>Move <strong>YiiMail.php</strong> and <strong>YiiMailMessage.php</strong> to<strong> protected/components/</strong></li>
<li>Add on protected/config/main.php</li>
</ul>
<pre class="brush: php; title: ; notranslate">

'components'=&gt;array(

...
 'mail' =&gt; array(
 'class' =&gt; 'YiiMail',
 'transportType' =&gt; 'php',
 'transportType' =&gt; 'smtp',
 'transportOptions'=&gt;array(
 'host'=&gt;'ghazalitajuddin.com',
 //'encryption'=&gt;'tls',
 'username'=&gt;'***@ghazalitajuddin.com',
 'password'=&gt;'******',
 'port'=&gt;25,
 ),
 'logging' =&gt; true,
 'dryRun' =&gt; false
 ),

...

),
</pre>
<ul>
<li>Configure in controller</li>
</ul>
<pre class="brush: php; title: ; notranslate">&lt;/pre&gt;
$message = new YiiMailMessage;
 $message-&gt;setBody($model-&gt;message);
 $message-&gt;subject = $model-&gt;subject;
 $message-&gt;addTo($model-&gt;to);
 $message-&gt;from = Yii::app()-&gt;params['adminEmail'];
 Yii::app()-&gt;mail-&gt;send($message);
&lt;pre&gt;</pre>
<ul>
<li>Create our model</li>
</ul>
<pre class="brush: php; title: ; notranslate">
class EmailForm extends CFormModel
{
 public $email;
 public $to;
 public $subject;
 public $message;
 public $from;

/**
 * Declares the validation rules.
 */
 public function rules()
 {
 return array(
 // name, email, subject and body are required
 array('email, to, subject, message', 'required'),
 // email has to be a valid email address
 array('email', 'email'),
 // verifyCode needs to be entered correctly
 //array('verifyCode', 'captcha', 'allowEmpty'=&gt;!CCaptcha::checkRequirements()),
 );
 }

/**
 * Declares customized attribute labels.
 * If not declared here, an attribute would have a label that is
 * the same as its name with the first letter in upper case.
 */
 public function attributeLabels()
 {
 return array(
 'verifyCode'=&gt;'Verification Code',
 );
 }
}
</pre>
<ul>
<li>Finally create our view</li>
</ul>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$this-&gt;pageTitle=Yii::app()-&gt;name . ' - Email Others';
$this-&gt;breadcrumbs=array(
 'Email',
);
?&gt;

&lt;h1&gt;Email others&lt;/h1&gt;

&lt;?php if(Yii::app()-&gt;user-&gt;hasFlash('email')): ?&gt;

&lt;div class=&quot;flash-success&quot;&gt;
 &lt;?php echo Yii::app()-&gt;user-&gt;getFlash('email'); ?&gt;
&lt;/div&gt;

&lt;?php else: ?&gt;

&lt;p&gt;
If you have business inquiries or other questions, please fill out the following form to contact us. Thank you.
&lt;/p&gt;

&lt;div class=&quot;form&quot;&gt;

&lt;?php $form=$this-&gt;beginWidget('CActiveForm', array(
 'id'=&gt;'email-form',
 'enableClientValidation'=&gt;true,
 'clientOptions'=&gt;array(
 'validateOnSubmit'=&gt;true,
 ),
)); ?&gt;

&lt;p class=&quot;note&quot;&gt;Fields with &lt;span class=&quot;required&quot;&gt;*&lt;/span&gt; are required.&lt;/p&gt;

&lt;?php echo $form-&gt;errorSummary($model); ?&gt;

&lt;div class=&quot;row&quot;&gt;
 &lt;?php echo $form-&gt;labelEx($model,'email'); ?&gt;
 &lt;?php echo $form-&gt;textField($model,'email'); ?&gt;
 &lt;?php echo $form-&gt;error($model,'email'); ?&gt;
 &lt;/div&gt;

&lt;div class=&quot;row&quot;&gt;
 &lt;?php echo $form-&gt;labelEx($model,'to'); ?&gt;
 &lt;?php echo $form-&gt;textField($model,'to'); ?&gt;
 &lt;?php echo $form-&gt;error($model,'to'); ?&gt;
 &lt;/div&gt;

&lt;div class=&quot;row&quot;&gt;
 &lt;?php echo $form-&gt;labelEx($model,'subject'); ?&gt;
 &lt;?php echo $form-&gt;textField($model,'subject',array('size'=&gt;60,'maxlength'=&gt;128)); ?&gt;
 &lt;?php echo $form-&gt;error($model,'subject'); ?&gt;
 &lt;/div&gt;

&lt;div class=&quot;row&quot;&gt;
 &lt;?php echo $form-&gt;labelEx($model,'message'); ?&gt;
 &lt;?php echo $form-&gt;textArea($model,'message',array('rows'=&gt;6, 'cols'=&gt;50)); ?&gt;
 &lt;?php echo $form-&gt;error($model,'message'); ?&gt;
 &lt;/div&gt;

&lt;div class=&quot;row&quot;&gt;
 &lt;?php echo $form-&gt;labelEx($model,'from'); ?&gt;
 &lt;?php echo $form-&gt;textArea($model,'from'); ?&gt;
 &lt;?php echo $form-&gt;error($model,'from'); ?&gt;
 &lt;/div&gt;

&lt;div class=&quot;row buttons&quot;&gt;
 &lt;?php echo CHtml::submitButton('Submit'); ?&gt;
 &lt;/div&gt;

&lt;?php $this-&gt;endWidget(); ?&gt;

&lt;/div&gt;&lt;!-- form --&gt;

&lt;?php endif; ?&gt;
</pre>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Fyii-example-how-to-install-mail-extension-swiftmailer-wrapper%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Fyii-example-how-to-install-mail-extension-swiftmailer-wrapper%2F&amp;source=ghazalitajuddin&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ghazalitajuddin.com/general/yii-example-how-to-install-mail-extension-swiftmailer-wrapper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yii guideline for good schema design</title>
		<link>http://www.ghazalitajuddin.com/general/yiiguideline-for-good-schema-design/</link>
		<comments>http://www.ghazalitajuddin.com/general/yiiguideline-for-good-schema-design/#comments</comments>
		<pubDate>Sat, 14 Apr 2012 18:29:23 +0000</pubDate>
		<dc:creator>Ahmad Ghazali Ahmad Tajuddin</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[ICT]]></category>

		<guid isPermaLink="false">http://www.ghazalitajuddin.com/?p=1320</guid>
		<description><![CDATA[DO name your database tables in the singular, not plural DON&#8217;T prepend db table names to field names DON&#8217;T include a table prefix in the model class name DO name each table&#8217;s primary key &#8220;id&#8221; AVOID semantically-meaningful primary key names<span class="ellipsis">&#8230;</span> <a href="http://www.ghazalitajuddin.com/general/yiiguideline-for-good-schema-design/"><div class="read-more">Read more &#8250;</div><!-- end of .read-more --></a>]]></description>
			<content:encoded><![CDATA[<div id="attachment_1105" class="wp-caption aligncenter" style="width: 735px"><a href="http://www.ghazalitajuddin.com/general/understanding-yii-cform/attachment/yii/" rel="attachment wp-att-1105"><img class="size-full wp-image-1105" title="Yii Framework" src="http://www.ghazalitajuddin.com/wp-content/uploads/2012/03/yii.png" alt="Yii Framework" width="725" height="157" /></a><p class="wp-caption-text">Yii Framework</p></div>
<div>
<ul>
<li><a href="http://www.yiiframework.com/wiki/227/guidelines-for-good-schema-design/#hh0">DO name your database tables in the singular, not plural</a></li>
<li><a href="http://www.yiiframework.com/wiki/227/guidelines-for-good-schema-design/#hh1">DON&#8217;T prepend db table names to field names</a></li>
<li><a href="http://www.yiiframework.com/wiki/227/guidelines-for-good-schema-design/#hh2">DON&#8217;T include a table prefix in the model class name</a></li>
<li><a href="http://www.yiiframework.com/wiki/227/guidelines-for-good-schema-design/#hh3">DO name each table&#8217;s primary key &#8220;id&#8221;</a></li>
<li><a href="http://www.yiiframework.com/wiki/227/guidelines-for-good-schema-design/#hh4">AVOID semantically-meaningful primary key names</a></li>
<li><a href="http://www.yiiframework.com/wiki/227/guidelines-for-good-schema-design/#hh5">DO define foreign-key relationships in the database schema</a></li>
<li><a href="http://www.yiiframework.com/wiki/227/guidelines-for-good-schema-design/#hh6">DO name your foreign key fields ending in &#8220;id&#8221;</a></li>
<li><a href="http://www.yiiframework.com/wiki/227/guidelines-for-good-schema-design/#hh7">DO name relations to reflect their singular/plural nature</a></li>
</ul>
</div>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Fyiiguideline-for-good-schema-design%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Fyiiguideline-for-good-schema-design%2F&amp;source=ghazalitajuddin&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ghazalitajuddin.com/general/yiiguideline-for-good-schema-design/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yii CActiveDataProvider</title>
		<link>http://www.ghazalitajuddin.com/general/yii-cactivedataprovider/</link>
		<comments>http://www.ghazalitajuddin.com/general/yii-cactivedataprovider/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 05:14:25 +0000</pubDate>
		<dc:creator>Ahmad Ghazali Ahmad Tajuddin</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[ICT]]></category>
		<category><![CDATA[$data]]></category>
		<category><![CDATA[CActiveDataProvider]]></category>
		<category><![CDATA[CGridView]]></category>
		<category><![CDATA[CListView]]></category>
		<category><![CDATA[Controller]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Kuantan]]></category>
		<category><![CDATA[kuantan programmer]]></category>
		<category><![CDATA[kuantan web developer]]></category>
		<category><![CDATA[kuantan webmaster]]></category>
		<category><![CDATA[Malaysian Yii]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programmer]]></category>
		<category><![CDATA[View]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[Yii Framework]]></category>

		<guid isPermaLink="false">http://www.ghazalitajuddin.com/?p=1293</guid>
		<description><![CDATA[Sample using CActiveDataProvider Sample 1: Sample 2: Sample 3: Sample 4:]]></description>
			<content:encoded><![CDATA[<div id="attachment_1105" class="wp-caption aligncenter" style="width: 735px"><a href="http://www.ghazalitajuddin.com/general/understanding-yii-cform/attachment/yii/" rel="attachment wp-att-1105"><img class="size-full wp-image-1105" title="Yii Framework" src="http://www.ghazalitajuddin.com/wp-content/uploads/2012/03/yii.png" alt="Yii Framework" width="725" height="157" /></a><p class="wp-caption-text">Yii Framework</p></div>
<p>Sample using CActiveDataProvider<br />
Sample 1:</p>
<pre class="brush: php; title: ; notranslate">
$dataProvider=new CActiveDataProvider('User',array(
 'criteria'=&gt;array(
 'condition'=&gt;'activationstatus = 1'),
 ));
</pre>
<p>Sample 2:</p>
<pre class="brush: php; title: ; notranslate">
$dataProvider=new CActiveDataProvider('Event', array(
'criteria'=&gt;array(
'condition'=&gt;'date &gt;= &quot;'.date('Y-m-d', strtotime('-2 years')).'&quot;',
 ),
));
</pre>
<p>Sample 3:</p>
<pre class="brush: php; title: ; notranslate">
$dataProvider=new CActiveDataProvider('Post', array(
'pagination'=&gt;array(
'pageSize'=&gt;5,
),
'criteria'=&gt;$criteria,
));
</pre>
<p>Sample 4:</p>
<pre class="brush: php; title: ; notranslate">
$dataProvider=new CActiveDataProvider('User')
</pre>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Fyii-cactivedataprovider%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Fyii-cactivedataprovider%2F&amp;source=ghazalitajuddin&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ghazalitajuddin.com/general/yii-cactivedataprovider/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yii Lookup</title>
		<link>http://www.ghazalitajuddin.com/general/yii-lookup/</link>
		<comments>http://www.ghazalitajuddin.com/general/yii-lookup/#comments</comments>
		<pubDate>Wed, 04 Apr 2012 08:18:56 +0000</pubDate>
		<dc:creator>Ahmad Ghazali Ahmad Tajuddin</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[ICT]]></category>
		<category><![CDATA[$data]]></category>
		<category><![CDATA[CActiveDataProvider]]></category>
		<category><![CDATA[CGridView]]></category>
		<category><![CDATA[CListView]]></category>
		<category><![CDATA[Controller]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Kuantan]]></category>
		<category><![CDATA[kuantan programmer]]></category>
		<category><![CDATA[kuantan web developer]]></category>
		<category><![CDATA[kuantan webmaster]]></category>
		<category><![CDATA[lookup]]></category>
		<category><![CDATA[lookup table]]></category>
		<category><![CDATA[Malaysian Yii]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programmer]]></category>
		<category><![CDATA[View]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[Yii Framework]]></category>

		<guid isPermaLink="false">http://www.ghazalitajuddin.com/?p=1270</guid>
		<description><![CDATA[Some function is created to make code easy to read and manageable. The Lookup function is so powerfull to simplified data storage. Usually we store Approve, Not Approved, Qualified, Not Qualified in words for each records, but with Lookup class,<span class="ellipsis">&#8230;</span> <a href="http://www.ghazalitajuddin.com/general/yii-lookup/"><div class="read-more">Read more &#8250;</div><!-- end of .read-more --></a>]]></description>
			<content:encoded><![CDATA[<div id="attachment_1105" class="wp-caption aligncenter" style="width: 735px"><a href="http://www.ghazalitajuddin.com/general/understanding-yii-cform/attachment/yii/" rel="attachment wp-att-1105"><img class="size-full wp-image-1105" title="Yii Framework" src="http://www.ghazalitajuddin.com/wp-content/uploads/2012/03/yii.png" alt="Yii Framework" width="725" height="157" /></a><p class="wp-caption-text">Yii Framework</p></div>
<p>Some function is created to make code easy to read and manageable. The Lookup function is so powerfull to simplified data storage. Usually we store Approve, Not Approved, Qualified, Not Qualified in words for each records, but with Lookup class, we can make it short to an integer for each properties.</p>
<p>Table scheme &#8220;tbl_lookup&#8221;</p>
<pre class="brush: php; title: ; notranslate">

CREATE TABLE tbl_lookup
(
 id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
 name VARCHAR(128) NOT NULL,
 code INTEGER NOT NULL,
 type VARCHAR(128) NOT NULL,
 position INTEGER NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
</pre>
<p>Insert some records like this</p>
<pre class="brush: php; title: ; notranslate">
INSERT INTO tbl_lookup (name, type, code, position) VALUES ('Activated', 'ActivationStatus', 1, 1);
INSERT INTO tbl_lookup (name, type, code, position) VALUES ('Not Activated', 'ActivationStatus', 2, 2);
INSERT INTO tbl_lookup (name, type, code, position) VALUES ('Pending Approval', 'membership_status', 1, 1);
INSERT INTO tbl_lookup (name, type, code, position) VALUES ('Approved', 'membership_status', 2, 2);
INSERT INTO tbl_lookup (name, type, code, position) VALUES ('Not Approved', 'membership_status', 3, 3);
</pre>
<p><span id="more-1270"></span></p>
<pre></pre>
<p>Class Lookup.php</p>
<pre class="brush: php; title: ; notranslate">

&lt;?php

class Lookup extends CActiveRecord
{
 /**
 * The followings are the available columns in table 'tbl_lookup':
 * @var integer $id
 * @var string $object_type
 * @var integer $code
 * @var string $name_en
 * @var string $name_fr
 * @var integer $sequence
 * @var integer $status
 */

private static $_items=array();

/**
 * Returns the static model of the specified AR class.
 * @return CActiveRecord the static model class
 */
 public static function model($className=__CLASS__)
 {
 return parent::model($className);
 }

/**
 * @return string the associated database table name
 */
 public function tableName()
 {
 return '{{lookup}}';
 }

/**
 * Returns the items for the specified type.
 * @param string item type (e.g. 'PostStatus').
 * @return array item names indexed by item code. The items are order by their position values.
 * An empty array is returned if the item type does not exist.
 */
 public static function items($type)
 {
 if(!isset(self::$_items[$type]))
 self::loadItems($type);
 return self::$_items[$type];
 }

/**
 * Returns the item name for the specified type and code.
 * @param string the item type (e.g. 'PostStatus').
 * @param integer the item code (corresponding to the 'code' column value)
 * @return string the item name for the specified the code. False is returned if the item type or code does not exist.
 */
 public static function item($type,$code)
 {
 if(!isset(self::$_items[$type]))
 self::loadItems($type);
 return isset(self::$_items[$type][$code]) ? self::$_items[$type][$code] : false;
 }

/**
 * Loads the lookup items for the specified type from the database.
 * @param string the item type
 */
 private static function loadItems($type)
 {
 self::$_items[$type]=array();
 $models=self::model()-&gt;findAll(array(
 'condition'=&gt;'type=:type',
 'params'=&gt;array(':type'=&gt;$type),
 'order'=&gt;'position',
 ));
 foreach($models as $model)
 self::$_items[$type][$model-&gt;code]=$model-&gt;name;
 }
}
</pre>
<p>In User.php class just add</p>
<pre class="brush: php; title: ; notranslate">
class User extends CActiveRecord
{

 const STATUS_ACTIVATED=1;
 const STATUS_NOT_ACTIVATED=2;

...
</pre>
<p>And finally at my list view</p>
<pre class="brush: php; title: ; notranslate">
&lt;b&gt;&lt;?php echo CHtml::encode($data-&gt;getAttributeLabel('activationstatus')); ?&gt;:&lt;/b&gt;
 &lt;?php echo Lookup::item('ActivationStatus',$data-&gt;activationstatus); ?&gt;
</pre>
<p>Another example</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php echo $form-&gt;dropDownList($model,'membership_status',Lookup::items('membership_status')); ?&gt;
</pre>
<p>And another one</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php echo $form-&gt;dropDownList($model,'user_id', CHtml::listData( User::model()-&gt;findAll(),'id','username'));
</pre>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Fyii-lookup%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Fyii-lookup%2F&amp;source=ghazalitajuddin&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ghazalitajuddin.com/general/yii-lookup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial Menukar Theme WordPress</title>
		<link>http://www.ghazalitajuddin.com/general/tutorial-menukar-theme-wordpress/</link>
		<comments>http://www.ghazalitajuddin.com/general/tutorial-menukar-theme-wordpress/#comments</comments>
		<pubDate>Wed, 04 Apr 2012 08:01:51 +0000</pubDate>
		<dc:creator>Ahmad Ghazali Ahmad Tajuddin</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[ICT]]></category>

		<guid isPermaLink="false">http://www.ghazalitajuddin.com/?p=1256</guid>
		<description><![CDATA[Bagaimana menukar Theme / Template WordPress. 1. Download Template 2. Ftp Template 3. Activate Template]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ghazalitajuddin.com/general/tutorial-menukar-theme-wordpress/attachment/wordpress-logo-stacked-rgb/" rel="attachment wp-att-1257"><img class="aligncenter size-full wp-image-1257" title="wordpress-logo-stacked-rgb" src="http://www.ghazalitajuddin.com/wp-content/uploads/2012/04/wordpress-logo-stacked-rgb.png" alt="" width="499" height="310" /></a></p>
<p>Bagaimana menukar Theme / Template WordPress.<br />
1. Download Template<br />
2. Ftp Template<br />
3. Activate Template</p>
<p><iframe src="http://www.youtube.com/embed/kpLZMMPHCgc" frameborder="0" width="420" height="315"></iframe>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Ftutorial-menukar-theme-wordpress%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Ftutorial-menukar-theme-wordpress%2F&amp;source=ghazalitajuddin&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ghazalitajuddin.com/general/tutorial-menukar-theme-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FTP Tutorial @ GhazaliTajuddin.com</title>
		<link>http://www.ghazalitajuddin.com/general/ftp-tutorial-ghazalitajuddin-com/</link>
		<comments>http://www.ghazalitajuddin.com/general/ftp-tutorial-ghazalitajuddin-com/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 02:54:25 +0000</pubDate>
		<dc:creator>Ahmad Ghazali Ahmad Tajuddin</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[ICT]]></category>
		<category><![CDATA[Access]]></category>
		<category><![CDATA[directory]]></category>
		<category><![CDATA[File Transfer Protocol]]></category>
		<category><![CDATA[folder]]></category>
		<category><![CDATA[FTP]]></category>
		<category><![CDATA[Host]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Localhost]]></category>
		<category><![CDATA[public_html]]></category>
		<category><![CDATA[Remote]]></category>
		<category><![CDATA[Server]]></category>

		<guid isPermaLink="false">http://www.ghazalitajuddin.com/?p=1244</guid>
		<description><![CDATA[Mari2 belajar FTP!!! File Transfer Protocol! Tak paham kasi komen ajer&#8230;.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;">
<p><a href="http://www.ghazalitajuddin.com/general/ftp-tutorial-ghazalitajuddin-com/attachment/filezilla/" rel="attachment wp-att-1288"><img class="aligncenter size-full wp-image-1288" title="filezilla" src="http://www.ghazalitajuddin.com/wp-content/uploads/2012/04/filezilla.jpg" alt="" width="225" height="225" /></a></p>
<p>Mari2 belajar FTP!!! File Transfer Protocol!</p>
<p><iframe src="http://www.youtube.com/embed/b_FZgcKLwck" frameborder="0" width="560" height="315"></iframe></p>
<p>Tak paham kasi komen ajer&#8230;.
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Fftp-tutorial-ghazalitajuddin-com%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Fftp-tutorial-ghazalitajuddin-com%2F&amp;source=ghazalitajuddin&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ghazalitajuddin.com/general/ftp-tutorial-ghazalitajuddin-com/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Yii CGridView</title>
		<link>http://www.ghazalitajuddin.com/general/yii-cgridview/</link>
		<comments>http://www.ghazalitajuddin.com/general/yii-cgridview/#comments</comments>
		<pubDate>Fri, 30 Mar 2012 14:46:13 +0000</pubDate>
		<dc:creator>Ahmad Ghazali Ahmad Tajuddin</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[ICT]]></category>
		<category><![CDATA[CGridView]]></category>
		<category><![CDATA[CListView]]></category>
		<category><![CDATA[Controller]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Kuantan]]></category>
		<category><![CDATA[kuantan programmer]]></category>
		<category><![CDATA[kuantan web developer]]></category>
		<category><![CDATA[kuantan webmaster]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programmer]]></category>
		<category><![CDATA[View]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[Yii Framework]]></category>
		<category><![CDATA[Zii Component]]></category>

		<guid isPermaLink="false">http://www.ghazalitajuddin.com/?p=1199</guid>
		<description><![CDATA[CGridView is one of Zii Components There is other than CGridView, CDetailView, CListView. Look here. CGridView use DataProvider which define in controller CGridView display data in tables. Supports paginating, sorting, searching. Also support view, update, delete method Define our data<span class="ellipsis">&#8230;</span> <a href="http://www.ghazalitajuddin.com/general/yii-cgridview/"><div class="read-more">Read more &#8250;</div><!-- end of .read-more --></a>]]></description>
			<content:encoded><![CDATA[<div>
<div id="attachment_1105" class="wp-caption aligncenter" style="width: 735px"><a href="http://www.ghazalitajuddin.com/general/understanding-yii-cform/attachment/yii/" rel="attachment wp-att-1105"><img class="size-full wp-image-1105" title="Yii Framework" src="http://www.ghazalitajuddin.com/wp-content/uploads/2012/03/yii.png" alt="Yii Framework" width="725" height="157" /></a><p class="wp-caption-text">Yii Framework</p></div>
</div>
<ul>
<li>CGridView is one of Zii Components</li>
<li>There is other than CGridView, CDetailView, CListView. <a title="Zii Component" href="http://www.yiiframework.com/doc/api/1.1/#zii.widgets">Look here.</a></li>
<li>CGridView use DataProvider which define in controller</li>
<li>CGridView display data in tables.</li>
<li>Supports paginating, sorting, searching.</li>
<li>Also support view, update, delete method</li>
</ul>
<div>Define our data provider in controller like this</div>
<div>
<pre class="brush: php; title: ; notranslate">

/**
 * Lists all models.
 */
 public function actionIndex()
 {
$dataProvider=new CActiveDataProvider('User',
array(
'pagination'=&gt;array(
'pageSize'=&gt;10,
),
'sort'=&gt;array(
'defaultOrder'=&gt; array('id'=&gt;false),
)
));

$this-&gt;render('index',array(
 'dataProvider'=&gt;$dataProvider,
 ));
 }
</pre>
<p><span id="more-1199"></span></p>
<pre></pre>
</div>
<p>Then just put code below at the view (currently index.php). Minimal code to use CGridView</p>
<pre class="brush: php; title: ; notranslate">

$this-&gt;widget('zii.widgets.grid.CGridView', array(

'dataProvider'=&gt;$dataProvider,
 ));
</pre>
<p>The code above will view all data from the selected table / model.</p>
<p>If we would like to view selected column only. We could do like this</p>
<pre class="brush: php; title: ; notranslate">

$this-&gt;widget('zii.widgets.grid.CGridView', array(
 'dataProvider'=&gt;$dataProvider,
 'columns'=&gt;array(
 'id',
 'username',
 //'password',
 'email',
 'joined',
 ),
));
</pre>
<p>To allow view, update and delete action. We add the CButtonColumn like this.</p>
<pre class="brush: php; title: ; notranslate">

$this-&gt;widget('zii.widgets.grid.CGridView', array(
'dataProvider'=&gt;$dataProvider,
'columns'=&gt;array(
'id',
'username',
//'password',
'email',
'joined',

array(
 'class'=&gt;'CButtonColumn',
 ),
),
));
</pre>
<p>To customize just view button only, we do like this</p>
<pre class="brush: php; title: ; notranslate">
		array(
			'class'=&gt;'CButtonColumn',
            'template'=&gt; '{view}',
		),
</pre>
<p>To go customize more detail, we need to use <a title="Role Base Access Control" href="http://www.yiiframework.com/doc/guide/1.1/en/topics.auth#role-based-access-control" target="_blank">RBAC</a> where we need to define &#8216;deleteAccess&#8217; rules. We can customize like this</p>
<pre class="brush: php; title: ; notranslate">
array(
                        'class'=&gt;'CButtonColumn',
            'template'=&gt;'{update}{delete}',
            'buttons'=&gt;array(
                'update'=&gt;array(
                    'label'=&gt;'Update details',
                    'url'=&gt;'Yii::app()-&gt;createUrl(&quot;whatever/update&quot;, array(&quot;id&quot;=&gt;$data-&gt;id))',
                ),
                'delete' =&gt; array(
                    'label'=&gt;'Delete',
                    'url'=&gt;'Yii::app()-&gt;createUrl(&quot;whatever/delete&quot;, array(&quot;id&quot;=&gt;$data-&gt;id)',
                    'visible'=&gt;Yii::app()-&gt;user-&gt;checkAccess('deleteAccess'),
                    ),
                ),
            ),
</pre>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Fyii-cgridview%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Fyii-cgridview%2F&amp;source=ghazalitajuddin&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ghazalitajuddin.com/general/yii-cgridview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Understand Yii Authentication Intermediate</title>
		<link>http://www.ghazalitajuddin.com/general/understand-yii-authentication-intemediat/</link>
		<comments>http://www.ghazalitajuddin.com/general/understand-yii-authentication-intemediat/#comments</comments>
		<pubDate>Fri, 30 Mar 2012 02:06:25 +0000</pubDate>
		<dc:creator>Ahmad Ghazali Ahmad Tajuddin</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[ICT]]></category>
		<category><![CDATA[Authentication]]></category>
		<category><![CDATA[Controller]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Kuantan]]></category>
		<category><![CDATA[kuantan programmer]]></category>
		<category><![CDATA[kuantan software developer]]></category>
		<category><![CDATA[kuantan webmaster]]></category>
		<category><![CDATA[Login]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RBAC]]></category>
		<category><![CDATA[View]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[Yii Framework]]></category>

		<guid isPermaLink="false">http://www.ghazalitajuddin.com/?p=1176</guid>
		<description><![CDATA[In this tutorial we will discuss about setting up our Yii application Our Web Apps will have user registration page Our Web Apps will varified user registration trough emails activation The first thing is we need to look into our<span class="ellipsis">&#8230;</span> <a href="http://www.ghazalitajuddin.com/general/understand-yii-authentication-intemediat/"><div class="read-more">Read more &#8250;</div><!-- end of .read-more --></a>]]></description>
			<content:encoded><![CDATA[<div id="attachment_1105" class="wp-caption aligncenter" style="width: 735px"><a href="http://www.ghazalitajuddin.com/general/understanding-yii-cform/attachment/yii/" rel="attachment wp-att-1105"><img class="size-full wp-image-1105" title="Yii Framework" src="http://www.ghazalitajuddin.com/wp-content/uploads/2012/03/yii.png" alt="Yii Framework" width="725" height="157" /></a><p class="wp-caption-text">Yii Framework</p></div>
<p>In this tutorial we will discuss about setting up our Yii application</p>
<ul>
<li>Our Web Apps will have user registration page</li>
<li>Our Web Apps will varified user registration trough emails activation</li>
</ul>
<p>The first thing is we need to look into our User table or our User model. Im setting up my tbl_user as below. Im also insert sample record :</p>
<pre class="brush: php; title: ; notranslate">

--
-- Table structure for table `tbl_user`
--

CREATE TABLE IF NOT EXISTS `tbl_user` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `username` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
 `password` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
 `salt` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
 `email` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
 `joined` date NOT NULL,
 `activationcode` int(11) NOT NULL,
 `activationstatus` int(11) NOT NULL,
 `profile` text COLLATE utf8_unicode_ci,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=11 ;

--
-- Dumping data for table `tbl_user`
--

INSERT INTO `tbl_user` (`id`, `username`, `password`, `salt`, `email`, `joined`, `activationcode`, `activationstatus`, `profile`) VALUES
(1, 'demo', '2e5c7db760a33498023813489cfadc0b', '28b206548469ce62182048fd9cf91760', 'webmaster@example.com', '0000-00-00', 0, 0, NULL);
</pre>
<p><span id="more-1176"></span>Then we customize our model User.</p>
<ul>
<li>We make change at rules().</li>
<li>We make change at attributeLabels()</li>
<li>We create generateActivationCode()</li>
</ul>
<pre class="brush: php; title: ; notranslate">

&lt;?php

/**
 * This is the model class for table &quot;tbl_user&quot;.
 *
 * The followings are the available columns in table 'tbl_user':
 * @property integer $id
 * @property string $username
 * @property string $password
 * @property string $salt
 * @property string $email
 * @property string $profile
 * @property string $activationcode
 * @property string $activationstatus
 */
class User extends CActiveRecord
{
 /**
 * Returns the static model of the specified AR class.
 * @param string $className active record class name.
 * @return User the static model class
 */
 public static function model($className=__CLASS__)
 {
 return parent::model($className);
 }

/**
 * @return string the associated database table name
 */
 public function tableName()
 {
 return 'tbl_user';
 }

/**
 * @return array validation rules for model attributes.
 */
 public function rules()
 {
 // NOTE: you should only define rules for those attributes that
 // will receive user inputs.
 return array(
 array('username, password, salt, email, activationcode, activationstatus', 'required'),
 array('username, password, salt, email', 'length', 'max'=&gt;128),
 array('profile', 'safe'),
 // The following rule is used by search().
 // Please remove those attributes that should not be searched.
 array('id, username, password, salt, email, profile', 'safe', 'on'=&gt;'search'),
 );
 }

/**
 * @return array relational rules.
 */
 public function relations()
 {
 // NOTE: you may need to adjust the relation name and the related
 // class name for the relations automatically generated below.
 return array(
 );
 }

/**
 * @return array customized attribute labels (name=&gt;label)
 */
 public function attributeLabels()
 {
 return array(
 'id' =&gt; 'ID',
 'username' =&gt; 'Username',
 'password' =&gt; 'Password',
 'salt' =&gt; 'Salt',
 'email' =&gt; 'Email',
 'profile' =&gt; 'Profile',
 );
 }

/**
 * Checks if the given password is correct.
 * @param string the password to be validated
 * @return boolean whether the password is valid
 */
 public function validatePassword($password)
 {
 return $this-&gt;hashPassword($password,$this-&gt;salt)===$this-&gt;password;
 }

 /**
 * Create activation code.
 * @param string email
 */

 public function generateActivationCode($email){

 return sha1(mt_rand(10000, 99999).time().$email);
 }

/**
 * Generates the password hash.
 * @param string password
 * @param string salt
 * @return string hash
 */
 public function hashPassword($password,$salt)
 {
 return md5($salt.$password);
 }

/**
 * Generates a salt that can be used to generate a password hash.
 * @return string the salt
 */
 public function generateSalt()
 {
 return uniqid('',true);
 }
}
</pre>
<p>Next, we then need to setup new model name RegisterForm. Why? Because this model will handle the registration form data.</p>
<ul>
<li>Define all attributes/properties use in the Registration Form Page</li>
<li>Define all rules() for properties needed at the Registration Form.</li>
<li>Define Labels</li>
</ul>
<pre class="brush: php; title: ; notranslate">

&lt;?php

/**
 * RegisterForm class.
 * RegisterForm is the data structure for keeping
 * user login form data. It is used by the 'register' action of 'SiteController'.
 */
class RegisterForm extends CFormModel
{
 public $username;
 public $password;
 public $password_repeat;
 public $joined;
 public $activationcode;
 public $activationstatus;
 public $salt;
 public $email;
 public $verifyCode;

 private $_identity;

/**
 * Declares the validation rules.
 * The rules state that username and password are required,
 * and password needs to be authenticated.
 */
 public function rules()
 {
 return array(
 // username, password, email are required
 array('username, password , password_repeat, email', 'required'),
 // username and email should be unique
 array('username, email', 'unique', 'className' =&gt; 'User'),
 // email should be in email format
 array('email', 'email'),
 array('password', 'compare', 'on'=&gt;'registration', 'compareAttribute'=&gt;'password_repeat'),
 array('password_repeat', 'safe'),
 array('verifyCode', 'captcha', 'allowEmpty'=&gt;!CCaptcha::checkRequirements()),

 );
 }

/**
 * Declares attribute labels.
 */
 public function attributeLabels()
 {
 return array(
 'username'=&gt;'Username',
 'password'=&gt;'Password',
 'password_repeat'=&gt;'Verified Password',
 'email'=&gt;'Email',
 'verifyCode'=&gt;'Verification Code',
 );
 }

/**
 * Authenticates the password.
 * This is the 'authenticate' validator as declared in rules().
 */
 public function authenticate($attribute,$params)
 {
 if(!$this-&gt;hasErrors())
 {
 $this-&gt;_identity=new UserIdentity($this-&gt;username,$this-&gt;password);
 if(!$this-&gt;_identity-&gt;authenticate())
 $this-&gt;addError('password','Incorrect username or password.');
 }
 }

}
</pre>
<p>At SiteController.php,</p>
<ul>
<li>Create action named actionRegister() to handle data from registration form .</li>
<li>Create action named actionActivate() to handle activation url from user email</li>
</ul>
<pre class="brush: php; title: ; notranslate">

//--------------------------------------------------------------------------------------
 public function actionRegister() {

 $model=new RegisterForm;
 $newUser = new User;

 // if it is ajax validation request
 if(isset($_POST['ajax']) &amp;&amp; $_POST['ajax']==='login-form')
 {
 echo CActiveForm::validate($model);
 Yii::app()-&gt;end();
 }

// collect user input data
 if(isset($_POST['RegisterForm']))
 {
 $model-&gt;attributes=$_POST['RegisterForm'];

 // if ($model-&gt;validate()) {
 $newUser-&gt;username = $model-&gt;username;
 //$newSalt = $newUser-&gt;generateSalt();
 $newSalt=$newUser-&gt;generateSalt();

 $newUser-&gt;password = $newUser-&gt;hashPassword($model-&gt;password,$newSalt);
 $newUser-&gt;salt = $newSalt;

 $newUser-&gt;activationcode = $newUser-&gt;generateActivationCode($model-&gt;email);
 // $newUser-&gt;activationcode = sha1(mt_rand(10000, 99999).time().$email);
 $newUser-&gt;activationstatus = 0;

//return $this-&gt;hashPassword($password,$this-&gt;salt)===$this-&gt;password;
 $newUser-&gt;username = $model-&gt;username;

$newUser-&gt;email = $model-&gt;email;
 $newUser-&gt;joined = date('Y-m-d');

 if ($model-&gt;validate() &amp;&amp; $newUser-&gt;save()) {
 //if want to go login, just uncomment this below
 // $identity=new UserIdentity($newUser-&gt;username,$model-&gt;password);
 // $identity-&gt;authenticate();
 // Yii::app()-&gt;user-&gt;login($identity,0);
 //redirect the user to page he/she came from

 //email activation code starts-----------------------------------------

 $to = $model-&gt;email;
 $subject = &quot;Welcome To GhazaliTajuddin.com!&quot;;
 $message = &quot;Thank you for joining!, we have sent you a separate email that contains your activation link&quot;;
 $from = &quot;FROM: mr.ghazali@gmail.com&quot;;

 mail($to,$subject,$message,$from);

 //echo $to.$subject.$message.$from;

 $headers = 'MIME-Version: 1.0' . &quot;\r\n&quot;;
 $headers .= 'Content-type: text/html; charset=iso-8859-1' . &quot;\r\n&quot;;
 $headers .= 'From: Mr. Ghazali &lt; mr.ghazali@gmail.com&gt;' . &quot;\r\n&quot;;

 $subject2 = &quot;Your Activation Link&quot;;

$message2 = &quot;&lt;html&gt;&lt;body&gt;Please click this below to activate your membership&lt;br /&gt;&quot;.
 Yii::app()-&gt;createAbsoluteUrl('site/activate', array('email' =&gt; $newUser-&gt;email)).

 &quot;

 Thanks you.
 &quot;. sha1(mt_rand(10000, 99999).time().$email) .&quot;
 &lt;/body&gt;&lt;/html&gt;&quot;;

 mail($to, $subject2, $message2, $headers);
 //email activation code end-----------------------------------------

 $this-&gt;redirect(Yii::app()-&gt;user-&gt;returnUrl);

 }
 // }

 }
 // display the register form
 $this-&gt;render('register',array('model'=&gt;$model));
 }
//--------------------------------------------------------------------------------------

/**
 * Activation Action
 */
 public function actionActivate()
 {

 $email = Yii::app()-&gt;request-&gt;getQuery('email');

 // collect user input data
 if(isset($email))
 {

 $model = User::model()-&gt;find('email=:email', array(':email'=&gt;$email));

 if($email == $model-&gt;email){
 $model-&gt;activationstatus=1;
 $model-&gt;validate();
 $model-&gt;save();
 }

 }

 // display the login form
 $this-&gt;render('activate',array('model'=&gt;$model));

}
</pre>
<p>Finally, we then need to create a view name register under /webapp/protected/views/site/register.php. This views content user registration forms.</p>
<pre class="brush: php; title: ; notranslate">

&lt;?php
$this-&gt;pageTitle=Yii::app()-&gt;name . ' - Register';
$this-&gt;breadcrumbs=array(
 'Register',
);
?&gt;

&lt;h1&gt;Register&lt;/h1&gt;

&lt;p&gt;Please fill out the following form:&lt;/p&gt;

&lt;div class=&quot;form&quot;&gt;
&lt;?php $form=$this-&gt;beginWidget('CActiveForm', array(
 'id'=&gt;'register-form',
 'enableClientValidation'=&gt;true,
 'clientOptions'=&gt;array(
 'validateOnSubmit'=&gt;true,
 ),
)); ?&gt;

&lt;p class=&quot;note&quot;&gt;Fields with &lt;span class=&quot;required&quot;&gt;*&lt;/span&gt; are required.&lt;/p&gt;

&lt;div class=&quot;row&quot;&gt;
 &lt;?php echo $form-&gt;labelEx($model,'username'); ?&gt;
 &lt;?php echo $form-&gt;textField($model,'username'); ?&gt;
 &lt;?php echo $form-&gt;error($model,'username'); ?&gt;
 &lt;/div&gt;

 &lt;div class=&quot;row&quot;&gt;
 &lt;?php echo $form-&gt;labelEx($model,'email'); ?&gt;
 &lt;?php echo $form-&gt;textField($model,'email'); ?&gt;
 &lt;?php echo $form-&gt;error($model,'email'); ?&gt;
 &lt;/div&gt;

&lt;div class=&quot;row&quot;&gt;
 &lt;?php echo $form-&gt;labelEx($model,'password'); ?&gt;
 &lt;?php echo $form-&gt;passwordField($model,'password'); ?&gt;
 &lt;?php echo $form-&gt;error($model,'password'); ?&gt;
 &lt;/div&gt;

 &lt;div class=&quot;row&quot;&gt;
 &lt;?php echo $form-&gt;labelEx($model,'password_repeat'); ?&gt;
 &lt;?php echo $form-&gt;passwordField($model,'password_repeat'); ?&gt;
 &lt;?php echo $form-&gt;error($model,'password_repeat'); ?&gt;
 &lt;/div&gt;

&lt;?php if(CCaptcha::checkRequirements()): ?&gt;
 &lt;div class=&quot;row&quot;&gt;
 &lt;?php echo $form-&gt;labelEx($model,'verifyCode'); ?&gt;
 &lt;div&gt;
 &lt;?php $this-&gt;widget('CCaptcha'); ?&gt;
 &lt;?php echo $form-&gt;textField($model,'verifyCode'); ?&gt;
 &lt;/div&gt;
 &lt;div class=&quot;hint&quot;&gt;Please enter the letters as they are shown in the image above.
 &lt;br/&gt;Letters are not case-sensitive.&lt;/div&gt;
 &lt;?php echo $form-&gt;error($model,'verifyCode'); ?&gt;
 &lt;/div&gt;
 &lt;?php endif; ?&gt;
 &lt;div class=&quot;row buttons&quot;&gt;
 &lt;?php echo CHtml::submitButton('Register'); ?&gt;
 &lt;/div&gt;

&lt;?php $this-&gt;endWidget(); ?&gt;
&lt;/div&gt;&lt;!-- form --&gt;
</pre>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Funderstand-yii-authentication-intemediat%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Funderstand-yii-authentication-intemediat%2F&amp;source=ghazalitajuddin&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ghazalitajuddin.com/general/understand-yii-authentication-intemediat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Understanding Yii Basic User Authentication</title>
		<link>http://www.ghazalitajuddin.com/general/understanding-yii-basic-user-authentication/</link>
		<comments>http://www.ghazalitajuddin.com/general/understanding-yii-basic-user-authentication/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 04:41:52 +0000</pubDate>
		<dc:creator>Ahmad Ghazali Ahmad Tajuddin</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[ICT]]></category>
		<category><![CDATA[Authentication]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Controller]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Kuantan]]></category>
		<category><![CDATA[kuantan programmer]]></category>
		<category><![CDATA[kuantan software developer]]></category>
		<category><![CDATA[kuantan webmaster]]></category>
		<category><![CDATA[Login]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[View]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[Yii Framework]]></category>

		<guid isPermaLink="false">http://www.ghazalitajuddin.com/?p=1119</guid>
		<description><![CDATA[Basicly, Yii basic skeleton already come with aunthentication system which is very simple by checking username and password both admin or demo. The default authentication files is UserIdentity.php LoginForm.php SiteController.php Login.php The process description The process started when user click<span class="ellipsis">&#8230;</span> <a href="http://www.ghazalitajuddin.com/general/understanding-yii-basic-user-authentication/"><div class="read-more">Read more &#8250;</div><!-- end of .read-more --></a>]]></description>
			<content:encoded><![CDATA[<div id="attachment_1105" class="wp-caption aligncenter" style="width: 735px"><a href="http://www.ghazalitajuddin.com/general/understanding-yii-cform/attachment/yii/" rel="attachment wp-att-1105"><img class="size-full wp-image-1105" title="Yii Framework" src="http://www.ghazalitajuddin.com/wp-content/uploads/2012/03/yii.png" alt="Yii Framework" width="725" height="157" /></a><p class="wp-caption-text">Yii Framework</p></div>
<p>Basicly, Yii basic skeleton already come with aunthentication system which is very simple by checking username and password both admin or demo.</p>
<p><strong>The default authentication files is</strong></p>
<ol>
<li>UserIdentity.php</li>
<li>LoginForm.php</li>
<li>SiteController.php</li>
<li>Login.php</li>
</ol>
<div><strong><span id="more-1119"></span>The process description</strong></div>
<div></div>
<div>
<ol>
<li>The process started when user click the login menu.</li>
<li>When user click the Login menu, the SiteController will launch actionLogin() method. <em><strong>(SiteController.php)</strong></em></li>
<li>The <em>actionLogin()</em> method will initiate new object from LoginForm model, called $model.</li>
<li>The <em>actionLogin()</em> method will check<em> $_POST['LoginForm']</em> if carry data</li>
<li>If <em>$_POST['LoginForm']</em> carry data, assign <em>$model-&gt;attributes = $_POST['LoginForm']</em></li>
<li>The new assign<em> $model-&gt;attributes</em> will be validate by calling<em> $model-&gt;validate()</em> and <em>$model-&gt;login()</em>.<em> $model-&gt;login()</em> is inherits from LoginForm class which check the user is valid or not. <em><strong>(LoginForm.php)</strong></em></li>
<li>In Login() method a new instant created,</li>
<ol>
<li> <code>$this</code><code>-&gt;_identity=</code><code>new</code> <code>UserIdentity(</code><code>$this</code><code>-&gt;username,</code><code>$this</code><code>-&gt;password); <em><strong>(UserIdentity.php)</strong></em></code></li>
<li><strong style="font-style: italic;"><code> </code><code>$this</code><code>-&gt;_identity-&gt;authenticate(); <em><strong>(UserIdentity.php)</strong></em></code></strong></li>
<li>The cookie is set here too. <em><strong>(LoginForm.php)</strong></em></li>
</ol>
<li>If both check on <em>$model-&gt;attributes &amp;&amp; $model-&gt;login()</em> is valid, redirect to previous page.</li>
<li>else is not valid, return to Login page <em><strong>(login.php)</strong></em> with error notification.</li>
</ol>
</div>
<div><strong>The page detail</strong></div>
<p>1. root/webapps/protected/components/UserIdentity.php</p>
<pre class="brush: php; title: ; notranslate">

class UserIdentity extends CUserIdentity
{
 /**
 * Authenticates a user.
 * The example implementation makes sure if the username and password
 * are both 'demo'.
 * In practical applications, this should be changed to authenticate
 * against some persistent user identity storage (e.g. database).
 * @return boolean whether authentication succeeds.
 */
 public function authenticate()
 {
 $users=array(
 // username =&gt; password
 'demo'=&gt;'demo',
 'admin'=&gt;'admin',
 );
 if(!isset($users[$this-&gt;username]))
 $this-&gt;errorCode=self::ERROR_USERNAME_INVALID;
 else if($users[$this-&gt;username]!==$this-&gt;password)
 $this-&gt;errorCode=self::ERROR_PASSWORD_INVALID;
 else
 $this-&gt;errorCode=self::ERROR_NONE;
 return !$this-&gt;errorCode;
 }
}
</pre>
<p>2. root/webapps/protected/model/LoginForm.php</p>
<pre class="brush: php; title: ; notranslate">

&lt;?php

/**
 * LoginForm class.
 * LoginForm is the data structure for keeping
 * user login form data. It is used by the 'login' action of 'SiteController'.
 */
class LoginForm extends CFormModel
{
 public $username;
 public $password;
 public $rememberMe;

private $_identity;

/**
 * Declares the validation rules.
 * The rules state that username and password are required,
 * and password needs to be authenticated.
 */
 public function rules()
 {
 return array(
 // username and password are required
 array('username, password', 'required'),
 // rememberMe needs to be a boolean
 array('rememberMe', 'boolean'),
 // password needs to be authenticated
 array('password', 'authenticate'),
 );
 }

/**
 * Declares attribute labels.
 */
 public function attributeLabels()
 {
 return array(
 'rememberMe'=&gt;'Remember me next time',
 );
 }

/**
 * Authenticates the password.
 * This is the 'authenticate' validator as declared in rules().
 */
 public function authenticate($attribute,$params)
 {
 if(!$this-&gt;hasErrors())
 {
 $this-&gt;_identity=new UserIdentity($this-&gt;username,$this-&gt;password);
 if(!$this-&gt;_identity-&gt;authenticate())
 $this-&gt;addError('password','Incorrect username or password.');
 }
 }

/**
 * Logs in the user using the given username and password in the model.
 * @return boolean whether login is successful
 */
 public function login()
 {
 if($this-&gt;_identity===null)
 {
 $this-&gt;_identity=new UserIdentity($this-&gt;username,$this-&gt;password);
 $this-&gt;_identity-&gt;authenticate();
 }
 if($this-&gt;_identity-&gt;errorCode===UserIdentity::ERROR_NONE)
 {
 $duration=$this-&gt;rememberMe ? 3600*24*30 : 0; // 30 days
 Yii::app()-&gt;user-&gt;login($this-&gt;_identity,$duration);
 return true;
 }
 else
 return false;
 }
}
</pre>
<p>3. root/webapps/protected/controllers/SiteController.php</p>
<pre class="brush: php; title: ; notranslate">

...

/**
 * Displays the login page
 */
 public function actionLogin()
 {
 $model=new LoginForm;

// if it is ajax validation request
 if(isset($_POST['ajax']) &amp;&amp; $_POST['ajax']==='login-form')
 {
 echo CActiveForm::validate($model);
 Yii::app()-&gt;end();
 }

// collect user input data
 if(isset($_POST['LoginForm']))
 {
 $model-&gt;attributes=$_POST['LoginForm'];
 // validate user input and redirect to the previous page if valid
 if($model-&gt;validate() &amp;&amp; $model-&gt;login())
 $this-&gt;redirect(Yii::app()-&gt;user-&gt;returnUrl);
 }
 // display the login form
 $this-&gt;render('login',array('model'=&gt;$model));
 }

...
</pre>
<p>4. root/webapps/protected/views/site/login.php</p>
<pre class="brush: php; title: ; notranslate">

&lt;?php
$this-&gt;pageTitle=Yii::app()-&gt;name . ' - Login';
$this-&gt;breadcrumbs=array(
 'Login',
);
?&gt;

&lt;h1&gt;Login&lt;/h1&gt;

&lt;p&gt;Please fill out the following form with your login credentials:&lt;/p&gt;

&lt;div class=&quot;form&quot;&gt;
&lt;?php $form=$this-&gt;beginWidget('CActiveForm', array(
 'id'=&gt;'login-form',
 'enableClientValidation'=&gt;true,
 'clientOptions'=&gt;array(
 'validateOnSubmit'=&gt;true,
 ),
)); ?&gt;

&lt;p class=&quot;note&quot;&gt;Fields with &lt;span class=&quot;required&quot;&gt;*&lt;/span&gt; are required.&lt;/p&gt;

&lt;div class=&quot;row&quot;&gt;
 &lt;?php echo $form-&gt;labelEx($model,'username'); ?&gt;
 &lt;?php echo $form-&gt;textField($model,'username'); ?&gt;
 &lt;?php echo $form-&gt;error($model,'username'); ?&gt;
 &lt;/div&gt;

&lt;div class=&quot;row&quot;&gt;
 &lt;?php echo $form-&gt;labelEx($model,'password'); ?&gt;
 &lt;?php echo $form-&gt;passwordField($model,'password'); ?&gt;
 &lt;?php echo $form-&gt;error($model,'password'); ?&gt;
 &lt;p class=&quot;hint&quot;&gt;
 Hint: You may login with &lt;tt&gt;demo/demo&lt;/tt&gt; or &lt;tt&gt;admin/admin&lt;/tt&gt;.
 &lt;/p&gt;
 &lt;/div&gt;

&lt;div class=&quot;row rememberMe&quot;&gt;
 &lt;?php echo $form-&gt;checkBox($model,'rememberMe'); ?&gt;
 &lt;?php echo $form-&gt;label($model,'rememberMe'); ?&gt;
 &lt;?php echo $form-&gt;error($model,'rememberMe'); ?&gt;
 &lt;/div&gt;

&lt;div class=&quot;row buttons&quot;&gt;
 &lt;?php echo CHtml::submitButton('Login'); ?&gt;
 &lt;/div&gt;

&lt;?php $this-&gt;endWidget(); ?&gt;
&lt;/div&gt;&lt;!-- form --&gt;
</pre>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Funderstanding-yii-basic-user-authentication%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.ghazalitajuddin.com%2Fgeneral%2Funderstanding-yii-basic-user-authentication%2F&amp;source=ghazalitajuddin&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ghazalitajuddin.com/general/understanding-yii-basic-user-authentication/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

