Yii Framework’de Session ve CDbCriteria Kullanımı

Bir önceki yazıda basitçe CFormModel’i incelemiştik. Ancak orada işlemimiz basit olsun diye veritabanı kullanmadık. Bu yazımızda veritabanı ile de işlem yapacağız.

Önceden varolan bir hello uygulamamız var. İsterseniz baştan bir hello isminde uygulama oluşturun veya yeni bir isimde uygulama oluşturun. Ben yeni birhello uygulaması oluşturdum.

Yine bir form olacak ve veritabanında bilgiler varsa kullanıcıya hoşgeldiniz diyeceğiz.

Öncelikle bir veritabanı oluşturun. Sonra şu SQL’i dump edin.

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
CREATE TABLE IF NOT EXISTS `bilgiler` (
 `id` int(10) NOT NULL AUTO_INCREMENT,
 `kullaniciadi` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
 `parola` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
INSERT INTO `bilgiler` (`id`, `kullaniciadi`, `parola`) VALUES
(1, 'deneme', '8f10d078b2799206cfe914b32cc6a5e9'),
(2, 'abc', '900150983cd24fb0d6963f7d28e17f72');

protected/config/main.php dosyasının 55. satırından başlayıp, 61. satırda biten MySQL bağlantısını başlatın. Tabii Gii’yi de aktif edin.

Şimdi Gii’den giris adında bir Controller oluşturun. Ardından Bilgiler adında bir de Model oluşturun.

Öncelikle GirisController’ı düzenleyelim.

GirisController.php

<?php

class GirisController extends Controller {
    public function actionIndex()   {
        $this ->render('index');
    }

    public function actionGiris(){

        $veri = new Bilgiler;

        if(isset(Yii::app()->session['logged'])){
            $this->render('dogru');
        }
        else{

            if(isset($_POST['Bilgiler'])){
                $veri->attributes = $_POST['Bilgiler'];

                if($veri->validate()){

                    $bilgi = new CDbCriteria;

                    $bilgi->condition = 't.kullaniciadi = :kullanici';
                    $bilgi->condition = 't.parola = :parola';

                    $bilgi->params = array(':kullanici' => $_POST['Bilgiler']['kullaniciadi']);
                    $bilgi->params = array(':parola' => md5($_POST['Bilgiler']['parola']));

                    $sonuc = Bilgiler::model()->findAll($bilgi);

                    if(!empty($sonuc)){
                        Yii::app()->session['logged'] = 'yes';
                        $this->render('dogru');
                    }
                    else{
                        $this->render('yanlis');
                    }
                }
                else{
                    $this->render('hata', array('eleman' => $veri));
                }
            }

            else{
                $this->render('giris', array('eleman' => $veri));
            }
        }

    }
}

Açıklamaya geçmeden önce kısaca Yii Framework’unda Session kullanımlarından kısaca söz etmek istiyorum.

İki farklı kullanım vardır:

Eklemek için

Yii::app()->session[‘key’] = ‘value’;
Yii::app()->session->add(‘key’, ‘value’);

şeklinde… Ben bu yazıda 1. yapıyı kullanacağım.

Yukarida yeni bir session değeri oluşturduk.

Çağırmak için:

echo Yii::app()->session[‘key’];
echo Yii::app()->session->get(‘key’);

Silmek için

unset(Yii::app()->session[‘key’]);
Yii::app()->session->get(‘key’)->destroy();

Devam…

(actionGiris() metodunu açıklıyorum)

Öncelikle daha önce logged isminde bir session oluşturulmuş (yani giriş yapılmış mı) diye bakıyoruz. Eğer varsa direk dogru sayfasını açarız.

Ama eğer giriş yapılmamışsa…

Sonra bu Controller’a herhangi bir POST işlemi yapılmış mı bakıyoruz. Eğer yapılmamışsa kullanıcı girişi yapılacak olan formu render ediyoruz. Eğer POST yapılmışsa Bilgiler model’ındaki rules() fonksiyonundaki kurallara uyuyor mu diye validate() fonksiyonuyla kontrol ediyoruz. Eğer uygunsa CDbCriteria class’ı ile kontrol yapıyoruz. PDO kullananlar CDbCriteria’nın yapısına aşinadır. condition ile kuralları belirliyoruz. params ile anahtarların değerlerini belirliyoruz. Ardından $sonuc = Bilgiler::model()->findAll($bilgi); ile sorguyu gönderiyoruz. Eğer veri varsa logged session’ının atayıp dogru sayfasını, eğer yoksa yanlis sayfasını render ediyoruz.

$this->render(‘hata’, array(‘eleman’ => $veri)); Burası nedir?

Eğer ki POST edilen veri rules() fonksiyonundan geçemezse hata verilecek. (Örn: inputlardan birisi dolu birisi boşsa..)

Eğer POST işlemi yapılmamışsa giris bölümü render ediliyor (kullanıcı girişinin olduğu bölüm).

View katmanındaki dosyalar:

dogru.php

<?php
echo "Üye girişi yapıldı. Hoşgeldiniz.";

yanlis.php

<?php
echo "Böyle bir kullanıcı bulunamadı.";

hata.php

<?php
echo "Lütfen formdaki bütün alanları doldurun";

giris.php

<?php 
$bilgiler = '';

$bilgiler .= CHtml::beginForm();
$bilgiler .= CHtml::errorSummary($eleman);

$bilgiler .= CHtml::activeLabelex($eleman, 'Kullanıcı adınız:');
$bilgiler .= CHtml::activeTextField($eleman, 'kullaniciadi');

$bilgiler .= CHtml::activeLabelex($eleman, 'Parolanız: ');
$bilgiler .= CHtml::activeTextField($eleman, 'parola');

$bilgiler .= CHtml::submitButton('Gönder');
$bilgiler .= CHtml::endForm();

echo $bilgiler;

Not: md5 şifreleme yöntemi kullandım. En ufak bir parola saklama işlemlerinde dahi md5 kullanmanızı öneririm.

Test için http://localhost/hello/index.php?r=giris/giris adresini açıp formlara abc abc yazabilirsiniz.

 
6 Kudos
Don't move
  1. Merhaba Adil bey;
    Bana yii’de dizileri okuyabilir misiniz mesela bu kodu nasıl okuyabilirim.
    array(‘label’=>’Logout (‘.Yii::app()->user->name.’)’, ‘url’=>array(‘/site/logout’), ‘visible’=>!Yii::app()->user->isGuest)

  2. Merhaba Adil bey;
    Bana yii’de dizileri okuyabilir misiniz mesela bu kodu nasıl okuyabilirim.
    array(‘label’=>’Logout (‘.Yii::app()->user->name.’)’, ‘url’=>array(‘/site/logout’), ‘visible’=>!Yii::app()->user->isGuest
    ..şimdiden teşekkürler

  3. Cemal,

    O kodu nasıl okuyabilirsin, önce kullandığın bootstap eklentisinin sitesine git ve TbMenu widget’ini incele.

    Orada fikir sahibi olacaksın.

    Kod;
    Menüye ‘Logout (Kullanıcı Adı)’ ekle, linki site/logout aksiyonuna ver ve bunu giren kişi üye ise yap. diyor

Yorum Yap


Not - Bunları KullanabilirsinizHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>