Giriş yapmadınız.

Duyuru

TÜRKÇE KİTAP DUYURUSU:
Laravel 5 : Laravel 5.1 Güzelliği (Türkçe)
Vue.js 2 : Vue.js 2 Majesteleri (Türkçe)

#1 28.09.2014 16:28:47

nodoubt
Üye
Kayıtlı: 01.09.2014
Mesajlar: 140

[ÇÖZÜLDÜ] Online uyeler gibi bir sistem nasıl yapılır ?

İşin mantıgı hakkında biraz bahsederseniz sevinirim arkadaşlar.  Üye login olunca session mı kullanmalıyım ,veritabanıyla ilgili bir işlemim olması gerekirmi ? yada laravelde bunun için basit bir yol varmıdır. Saygılarla..

Birşeyler denedim ama tam sonuç alamadım . yaptıklarım ;

login controllerimde ;

Session::put('online', Auth::user()->id);

         //  Sessionda kullanici id ' si taşımakta bir sıkıntı yaşarmıyım ?

Online controllerimde ;

public function getOnlinelistele() {
        $deger = Session::get('online');
        
        $kullanicilar = User::where('id','=',$deger)->get();
        
        return View::make('backend.online.listele', array('users' => $kullanicilar));
        
    }

ve view 'imde ;

@foreach($users as $user)
                    <tr>
                        <td>{{$user->namesurname}}</td>
                        <td>{{$user->email}}</td>
                       
                  
                    </tr>
                    @endforeach

Bu şekilde deneme yaptım ancak farklı bir tarayıcıdan farklı bir kullanıcı ismiyle girince  online listemde gözükmedi.  Sanırım birşeylerde yanlışlık var. yardımcı olabilirseniz sevinirim.saygılar.

Son düzenleyen nodoubt (01.10.2014 18:14:30)

Çevrimdışı

#2 28.09.2014 21:25:53

okursan
Üye
Kayıtlı: 31.08.2014
Mesajlar: 36

Yanıt: [ÇÖZÜLDÜ] Online uyeler gibi bir sistem nasıl yapılır ?

Veritabanında online üyeler için bir tablo açabilirsiniz.
id -> autoincrement
uye_id
last_seen ->datetime son işlem yaptığı tarih saat olur

üye girişi yapıldıktan sonra her üye hareketinde online üyeler tablosunda kullanıcının olup olmadığına bakılır. Yoksa eklenir, varsa last_seen güncellenir.
Üyeleri göstermek istediğiniz yerde de örneğin son 5 dakika içinde online olanlar için o anki datetime değerinden 5 dk. çıkartıp o aralıkta işlem yapmış tüm id kullanıcıları gösterebilirsiniz.

Ayrıca üye olmayanları da saymak isterseniz tabloya bir IP alanı ekleyip giriş yapmamış kişileri IP ile eklersiniz. Bu durumda uye_id 'leri 0 olabilir. Ziyaretçi giriş yapınca üye_id değeri kendi değeri ile güncellenir. Gerisi aynı mantık.

Başka alternatif görüşler olabilir. İlk etapta ben nasıl yapardım diye düşününce bunlar geldi aklıma.

Üye olmayanları saymazsanız en fazla üye sayınız kadar satır ek yük olacak veritabanında ama üye olmayanlar da sayılırsa yüksek hitlerde aşırı büyüme söz konusu olabilir. Bu nedenle belirli aralıklarla last_seen kolonu (örneğin 1 saatten eski olanlar gibi) üye olmayanlar için temizlenmeli.

Son düzenleyen okursan (28.09.2014 21:30:06)


~~~

Çevrimdışı

#3 28.09.2014 21:46:28

nodoubt
Üye
Kayıtlı: 01.09.2014
Mesajlar: 140

Yanıt: [ÇÖZÜLDÜ] Online uyeler gibi bir sistem nasıl yapılır ?

Cevap için teşekkürler , kaç saattir ugrasıyorum bende ama çözüme ulaşamadım hala ..    laravel de  su kodları kullanarak bir veritabanı tablosu olusturuyor;
php artisan session:table
composer dump-autoload
php artisan migrate
daha sonra  session.php 'de 'driver' => 'file',  kısmını  'driver' => 'database' ,     olarak değiştriince   veritabanına eklemeler yapıyor ama tam beceremedim .  Aslında bu işi veritabanına bulasmadan   'driver' => 'file',   sürücüsü ile çözmek daha mantıklı geliyor. ama yukarıda denediğim kodlarlada cözemedim  .sanırım sizde daha once laravelde boyle bir şey yapmadınız ? Ayrıca online uye kısmını cozdukten sonra ip alma olayınada girecegim smile yani daha cok işim var

Son düzenleyen nodoubt (28.09.2014 21:47:37)

Çevrimdışı

#4 28.09.2014 22:34:23

okursan
Üye
Kayıtlı: 31.08.2014
Mesajlar: 36

Yanıt: [ÇÖZÜLDÜ] Online uyeler gibi bir sistem nasıl yapılır ?

Evet, Laravel ile henüz hiç uygulama geliştirmedim.


~~~

Çevrimdışı

#5 28.09.2014 22:37:51

nodoubt
Üye
Kayıtlı: 01.09.2014
Mesajlar: 140

Yanıt: [ÇÖZÜLDÜ] Online uyeler gibi bir sistem nasıl yapılır ?

çözemedim bende hala , çözüme ulasırsam paylasırım .

Çevrimdışı

#6 29.09.2014 14:11:21

nodoubt
Üye
Kayıtlı: 01.09.2014
Mesajlar: 140

Yanıt: [ÇÖZÜLDÜ] Online uyeler gibi bir sistem nasıl yapılır ?

Konuda fikir verebilecek olursa sevinirim saygılarla.

Çevrimdışı

#7 29.09.2014 20:00:48

sergin
Üye
Kayıtlı: 17.07.2013
Mesajlar: 130
Website

Yanıt: [ÇÖZÜLDÜ] Online uyeler gibi bir sistem nasıl yapılır ?

Laravel authentication bileşeninin kullanıcı giriş yapınca ateşlenen auth.login ve çıkış yapınca ateşlenen auth.logout eventları vardır. Bu olayları dinleyebilir ve dinleyicilerde işlem yapabilirsiniz. users tablonuzda, kullanıcının giriş yaptığı son zamanı tutan last_login adlı bir alan olduğunu varsayalım. auth.login olayı için bir dinleyici yazalım ve bu dinleyicide bu alanı o anki zamanla güncelleyelim.

Event::listen('auth.login', function($uye)
{
    $uye->last_login = new DateTime;
    $uye->save();
});

Dinleyiciler genel olarak ilk yüklenecek kodlar bölümünde kodlanır. Örneğin 4.0-4.2 sürümü için app/start/global.php gibi start dosyalarınızın birisinde kayda geçirebilirsiniz. Çıkış yaptığında da bu alanı başka türlü güncellemek için de auth.logout eventi için bir dinleyici yazabilirsiniz.

Son x dakikada giriş yapmış kullanıcıları, users tablosunun last_login alanı ile şimdiki zamanı kıyaslayarak gösterebilirsiniz.

Laravel Dokümanlarındaki Olaylar konusunu (http://laravel.gen.tr/docs/events) gözden geçirmenizde yarar var.
Not: Remember me kullanıldığında, bu yolla yapılan sonraki girişlerde auth.login olayı ateşlenmez.

Çevrimdışı

#8 30.09.2014 19:41:17

nodoubt
Üye
Kayıtlı: 01.09.2014
Mesajlar: 140

Yanıt: [ÇÖZÜLDÜ] Online uyeler gibi bir sistem nasıl yapılır ?

Üstadım database kullanarak farklı bir şekilde çözdüm ilgilendiğiniz için teşekkürler..Konuda sıkıntı çeken olduğu takdirde yaptıgım yolu anlatabilirim.Saygılarla

Son düzenleyen nodoubt (30.09.2014 19:45:22)

Çevrimdışı

#9 01.10.2014 17:24:39

okursan
Üye
Kayıtlı: 31.08.2014
Mesajlar: 36

Yanıt: [ÇÖZÜLDÜ] Online uyeler gibi bir sistem nasıl yapılır ?

nodoubt yazdı:

Üstadım database kullanarak farklı bir şekilde çözdüm ilgilendiğiniz için teşekkürler..Konuda sıkıntı çeken olduğu takdirde yaptıgım yolu anlatabilirim.Saygılarla

Forumda bulunsun lazım olabilir ileride. Çözümü vakit bulunca yazın bence.


~~~

Çevrimdışı

#10 01.10.2014 18:06:08

nodoubt
Üye
Kayıtlı: 01.09.2014
Mesajlar: 140

Yanıt: [ÇÖZÜLDÜ] Online uyeler gibi bir sistem nasıl yapılır ?

İlk olarak app/config altındaki session.php 'de  sürücü kısmını database olarak degiştiriyoruz. 

'driver' => 'database',

başlat cmd  yaparak önce htdocs dizininize inerek  komut satırına  ;

php artisan session:table

composer dump-autoload

php artisan migrate

yazıp yeni oluşan sessions adlı databesimizi acıp oluşan id,payload,last_activity  alanlarının altına (user_id  , int 11 ve Null'a izin ver ) olacak şekilde user_id kısmını ekliyoruz.

Sıra geldi Model dosyası olusturmaya .. ben modelimi online.php olarak tanımladım siz istediginiz adı verebilirsiniz.Model dosyam ;

<?php

use Illuminate\Database\Eloquent\Model;

//use Session;

class Online extends Model {

    /**
     * {@inheritDoc}
     */
    public $table = 'sessions';

    /**
     * {@inheritDoc}
     */
    public $timestamps = false;

    /**
     * Returns all the guest users.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeGuests($query)
    {
        return $query->whereNull('user_id');
    }

    /**
     * Returns all the registered users.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeRegistered($query)
    {
        return $query->whereNotNull('user_id')->with('user');
    }

    /**
     * Updates the session of the current user.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeUpdateCurrent($query)
    {

            return $query->where('id', Session::getId())->update(array(
                'user_id' => !trim(Auth::user())==false ? Auth::user()->id : null
            ));

    }


     /**
     * Returns the user that belongs to this entry.
     *
     * @return \Cartalyst\Sentry\Users\EloquentUser
     */
    public function user()
    {
        return $this->belongsTo('User'); # Sentry 3
        // return $this->belongsTo('Cartalyst\Sentry\Users\Eloquent\User'); # Sentry 2
    }

}

KAydedip modelimizide kapatabiliriz artık.Sıra geldi controller olusturmaya . Ben OnlineController olarak adlandırdım. kodlarım ;

<?php

class Backend_OnlineController extends BackendController {
    /*
      |--------------------------------------------------------------------------
      | Default Home Controller
      |--------------------------------------------------------------------------
      |
      | You may wish to use controllers instead of, or in addition to, Closure
      | based routes. That's great! Here is an example controller method to
      | get you started. To route to this controller, just add the route:
      |
      |	Route::get('/', '[email protected]');
      |
     */

    

    

    public function getOnlinelistele() {
       
$guests = Online::guests()->get();
$totalGuests = Online::guests()->count();
$registered = Online::registered()->get();
$totalRegistered = Online::registered()->count();

       
        
        return View::make('backend.online.listele', array('guests' => $guests,
            'totalGuests' => $totalGuests,'registered' => $registered,'totalRegistered' => $totalRegistered));
        
    }

KEndi yolunuza göre  backend.online.listele kısmını ayarlarsınız ...   Benim yolum views/backend/online/listele.blade.php  idi.

Ve sonra views imizde online üyeleri listelemeye geldi.  listele.blade.php 'imde ki gereken kodlarım ;

<div class="span12 widget">
        <div class="widget-header">
            <span class="title">Online Üye = {{$totalRegistered}}</span><br>
            <span class="title">Online Misafir = {{$totalGuests}}  </span>
        </div>
        <div class="widget-content table-container">
            <table class="table table-striped data">
                <thead>
                    <tr>
                        <th>Ad Soyad</th>
                        <th>E-Posta Adresi</th>
                        <th>Slug</th>
                       

                   
                    </tr>
                </thead>
                <tbody>

                    @foreach ($registered as $online)
                    <tr>
                        
                        <td>{{$online->user->namesurname}}</td>
                        <td>{{$online->user->email}}</td>
                         <td>{{$online->user->namesurnameslug}}</td>
                     
                  
                    </tr>
                    @endforeach

                    </tbody>
            </table>
         
        </div>
    </div>

Son düzenleyen nodoubt (01.10.2014 18:07:13)

Çevrimdışı

#11 04.12.2015 10:08:22

loc
Üye
Yer: İstanbul
Kayıtlı: 08.06.2015
Mesajlar: 270
Website

Yanıt: [ÇÖZÜLDÜ] Online uyeler gibi bir sistem nasıl yapılır ?

nodoubt yazdı:

İlk olarak app/config altındaki session.php 'de  sürücü kısmını database olarak degiştiriyoruz. 

'driver' => 'database',

başlat cmd  yaparak önce htdocs dizininize inerek  komut satırına  ;

php artisan session:table

composer dump-autoload

php artisan migrate

yazıp yeni oluşan sessions adlı databesimizi acıp oluşan id,payload,last_activity  alanlarının altına (user_id  , int 11 ve Null'a izin ver ) olacak şekilde user_id kısmını ekliyoruz.

Sıra geldi Model dosyası olusturmaya .. ben modelimi online.php olarak tanımladım siz istediginiz adı verebilirsiniz.Model dosyam ;

<?php

use Illuminate\Database\Eloquent\Model;

//use Session;

class Online extends Model {

    /**
     * {@inheritDoc}
     */
    public $table = 'sessions';

    /**
     * {@inheritDoc}
     */
    public $timestamps = false;

    /**
     * Returns all the guest users.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeGuests($query)
    {
        return $query->whereNull('user_id');
    }

    /**
     * Returns all the registered users.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeRegistered($query)
    {
        return $query->whereNotNull('user_id')->with('user');
    }

    /**
     * Updates the session of the current user.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeUpdateCurrent($query)
    {

            return $query->where('id', Session::getId())->update(array(
                'user_id' => !trim(Auth::user())==false ? Auth::user()->id : null
            ));

    }


     /**
     * Returns the user that belongs to this entry.
     *
     * @return \Cartalyst\Sentry\Users\EloquentUser
     */
    public function user()
    {
        return $this->belongsTo('User'); # Sentry 3
        // return $this->belongsTo('Cartalyst\Sentry\Users\Eloquent\User'); # Sentry 2
    }

}

KAydedip modelimizide kapatabiliriz artık.Sıra geldi controller olusturmaya . Ben OnlineController olarak adlandırdım. kodlarım ;

<?php

class Backend_OnlineController extends BackendController {
    /*
      |--------------------------------------------------------------------------
      | Default Home Controller
      |--------------------------------------------------------------------------
      |
      | You may wish to use controllers instead of, or in addition to, Closure
      | based routes. That's great! Here is an example controller method to
      | get you started. To route to this controller, just add the route:
      |
      |	Route::get('/', '[email protected]');
      |
     */

    

    

    public function getOnlinelistele() {
       
$guests = Online::guests()->get();
$totalGuests = Online::guests()->count();
$registered = Online::registered()->get();
$totalRegistered = Online::registered()->count();

       
        
        return View::make('backend.online.listele', array('guests' => $guests,
            'totalGuests' => $totalGuests,'registered' => $registered,'totalRegistered' => $totalRegistered));
        
    }

KEndi yolunuza göre  backend.online.listele kısmını ayarlarsınız ...   Benim yolum views/backend/online/listele.blade.php  idi.

Ve sonra views imizde online üyeleri listelemeye geldi.  listele.blade.php 'imde ki gereken kodlarım ;

<div class="span12 widget">
        <div class="widget-header">
            <span class="title">Online Üye = {{$totalRegistered}}</span><br>
            <span class="title">Online Misafir = {{$totalGuests}}  </span>
        </div>
        <div class="widget-content table-container">
            <table class="table table-striped data">
                <thead>
                    <tr>
                        <th>Ad Soyad</th>
                        <th>E-Posta Adresi</th>
                        <th>Slug</th>
                       

                   
                    </tr>
                </thead>
                <tbody>

                    @foreach ($registered as $online)
                    <tr>
                        
                        <td>{{$online->user->namesurname}}</td>
                        <td>{{$online->user->email}}</td>
                         <td>{{$online->user->namesurnameslug}}</td>
                     
                  
                    </tr>
                    @endforeach

                    </tbody>
            </table>
         
        </div>
    </div>

Yaptıklarınızı birebir uyguladım fakat bir sonuç alamadım. Sessions tablosunda user_id alanı hep null kalıyor.

Not: Laravel 5'te deniyorum

Son düzenleyen loc (04.12.2015 11:11:52)

Çevrimdışı

Forum alt kısmı