jQuery .end() Metodu

Sıkça kullandığım bir metoddur kendisi.
Yaptığı iş ise, ilk seçilen elemana geri dönmesi. Yani örnek vermek gerekirse;

$('.item').find('a').addClass('external-url').end().on('click', function(e) {
   alert('test');
});

Burada item içerisinde a nesnelerini bulup sınıf atadık. Eğer end metodunu kullanmamış olsaydık click işlemi a nesneleri için geçerli olacaktı. Ancak end kullandığımız için tekrar başa sardık ve filtreleme işlemlerini önemsemeden eventımızı uyguladık.
http://api.jquery.com/end/

Kolay gelsin.

Php Array içinde Değer Değiştirme

Örneğin 2,22,222,2222 şeklinde bir string ifadeniz var. Ve siz 22 değerini 44 yapmak istiyorsunuz. Bunu nasıl yapacaksınız? Bu bir string unutmayın. Eğer düşünceniz şu ise;

$string = '2,22,222,2222';
echo str_replace('22', '44', $string);

Sizi tebrik ederim yanlış cevap. Gelelim doğrusuna, çok fazla istisnai durum olacağından bana kalırsa en mantıklısı dizi haline çevirip dizi elemanını replace etme olacaktır. Örneğin;

$string = '2,22,222,2222';
$string = explode(',', $string);
echo implode(',', array_replace($string, array_fill_keys(
    array_keys($string, 22),
    44
)));

Nerede lazım olacak ki demeyin, bana oldu ki paylaşıyorum ????

Bir tane daha alternatif olabilir;

$string = explode(',', '2,22,222,2222');
$replaced = array_search('22', $string);
$string[$replaced] = 44;

PHP Tarih Sorunu

Bazen bir içerik eklediğinizde bugün eklediğiniz içerik dünü gösteriyor ya da yarını gösteriyor olabilir. Ön tanımlı zaman diliminden kaynaklı bir problemdir. Öncelikle mevcut zaman dilimini öğrenmek için date_default_timezone_get() fonksiyonunu kullanacağız.

echo date_default_timezone_get();

Şimdi biz Europe/Istanbul kullanacağız. Eğer dönen sonuç böyle değil ise kendimiz ayarlayalım. Bunuda date_default_timezone_set() fonksiyonu ile yapıyoruz.

date_default_timezone_set('Europe/Istanbul');

Evet, artık böyle bir sorun yaşamayacaksınız ???? Kolay gelsin.

SASS Dersleri

SASS için hazırladığım 3 bölümden oluşan bir ders serisi var. Aslında prototürk’te paylaştım ancak, kişisel bloğumu takip edenler olabileceğinden birde burada paylaşmak istiyorum ????

SASS ile ilgili daha fazla detay için kendi sitesini ziyaret edebilirsiniz;
http://sass-lang.com/

SASS Kurulumu

SASS Ayarları

SASS Sözdizimi

Bir süre belki yavaş yazabilirsiniz, ancak kesinlikle projelerinizde artık sass kullanmanızı tavsiye ediyorum.

HTML5 autofocus Özelliği

Form elemanlarına otomatik odaklanmasını istiyorsanız html5 ile birlikte gelen autofocus=”autofocus” özelliğini kullanabilirsiniz. Yani artık bunun için jquery kullanmanıza gerek yok ????

<!-- hepsi çalışıyor! -->
<input autofocus="autofocus" />
<button autofocus="autofocus">Selam!</button>
<textarea autofocus="autofocus"></textarea>

Reset CSS Kullanımı

Eric Meyer’in reset.css’ini kullanıyorum. Ancak bazı kısımları hatalı, mesela gitmiş strong’u em’yi sıfırlamış ne eğik yazılıyor ne kalın.. Ee ne anladım o işten ???? Eric reyiz bize yanlış yaptı, bende onun reset.css’ini biraz düzenledim. Böylesi daha tatlı oldu.

Not: Mevcut tüm reset.css’lere aşağıdaki bağlantıdan ulaşabilirsiniz.
http://www.cssreset.com/

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, img, ins, kbd, q, s, samp,
small, strike, sub, sup, tt, var,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend, input, select, textarea, button,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed, 
figure, figcaption, footer, header, hgroup, 
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
	margin: 0;
	padding: 0;
	border: 0;
	font-size: 100%;
	font: inherit;
	vertical-align: baseline;
}
article, aside, details, figcaption, figure, 
footer, header, hgroup, menu, nav, section {
	display: block;
}
body {
	line-height: 1;
}
ol, ul {
	list-style: none;
}
blockquote, q {
	quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
	content: '';
	content: none;
}
table {
	border-collapse: collapse;
	border-spacing: 0;
}
a {
    text-decoration: none;
}
img {
    border: 0;
}
:focus {
    outline: 0;
}
.clear {
    clear: both;
}

PHP ile Gmail RSS Servisinden Okunmamış Postaları Çekmek

Gmail hesabınızda oluşturduğunuz label’lara ait ya da gelen, spam gibi kısımlara ait okunmamış mesajlarınızı kendi siteniz üzerinden görmek isterseniz gmail’in rss servisini kullanabilirsiniz.

Örneğin okunmamış mesajlar için;
https://mail.google.com/mail/feed/atom/

ya da spam mesajlar için;
https://mail.google.com/mail/feed/atom/spam

ya da kendi oluşturduğunuz “işler” adında bir labeliniz için;
https://mail.google.com/mail/feed/atom/işler

Bu adreslere girdiğinizde eğer şuan bir gmail hesabınızda oturum açtıysanız onunla ilgili detayları göreceksiniz. Ancak PHP‘de cURL kullanarak herhangi bir başka hesapta anlık oturum açıp postalarımızı görebiliriz. Bunun için öncelikle bize bir cURL fonksiyonu gerekecek. Daha önce cURL hakkında bilgisi olmayanlar şuradan curl derslerime bir gözatabilir.

Şimdi gelelim bize lazım olan cURL fonksiyonuna. Ben sizler için bir tane hazırladım ve 3 parametre alıyor. Bunlar gmail kullanıcı adı, şifresi ve varsa label adı.

function gmailFeed($username, $password, $label = ''){
    $url = "https://mail.google.com/mail/feed/atom/" . $label; 
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_USERPWD, $username . ":" . $password);
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($curl, CURLOPT_ENCODING, "");
    $data = curl_exec($curl);
    curl_close($curl);
    return $data;
}

Kullanımına gelecek olursak;

<?php

require 'gmail.function.php'; // fonksiyon dosyamız

// kullanıcı adı ve şifre tanımı
$gmail_username = '[email protected]';
$gmail_password = 'xxxx';

// gelen kutusu okunmamış postaları çekelim
$feeds = gmailFeed($gmail_username, $gmail_password);
$feeds = new SimpleXMLElement($feeds);
print_r($feeds);

// spam kutusu okunmamış postaları çekelim
$feeds = gmailFeed($gmail_username, $gmail_password, 'spam');
$feeds = new SimpleXMLElement($feeds);
print_r($feeds);

// örnek olarak oluşturduğumuz bir x labeline ait okunmamış mesajları çekelim
$feeds = gmailFeed($gmail_username, $gmail_password, 'x');
$feeds = new SimpleXMLElement($feeds);
print_r($feeds);

?>

Örnek yazdırma işlemi;

<ul>
   <?php foreach ( $feeds->entry as $feed ): ?>
      <li>
         <strong>title; ?></strong><br />
         <?php echo $feed->author->name; ?> (<?php echo $feed->author->email;?>)<br />
         <span style="color: #777">
            <?php echo $feed->summary; ?>..
         </span>
      </li>
   <?php endforeach; ?>
</ul>

İşte hepsi bu kadar ????

HTML5 Audio (Ses Özelliği)

HTML5 ile birlikte sesler üzerindeki hakimiyetimiz arttı. Ses dosyasının bir çok event (olay) ını kontrol edebiliyoruz buna göre işlem yaptırabiliyoruz. Ben size bu yazıda (video daha sonra eklenecek) html5 de seslerle çalışmayı göstereceğiz..

Öncelikle bir ses dosyasını <audio> etiketi ile kullanıyoruz.

<audio controls>
  <source src="ses.mp3" type="audio/mpeg">
  Tarayıcınız bu özelliği desteklemiyor.
</audio>

HTML5 Audio ile Hangi Ses Formatlarını Oynatabiliyoruz?

Sadece Mp3, Wav ve Ogg formatlarını oynatabilirsiniz. Bunların her birinin mime tipi farklıdır. Kısaca göstereyim;

<!-- mp3 -->
<source src="ses.mp3" type="audio/mpeg">

<!-- wav -->
<source src="ses.wav" type="audio/wav">

<!-- ogg -->
<source src="ses.ogg" type="audio/ogg">

Otomatik Başlatma (autoplay)

Sesin otomatik başlaması için audio etiketine autoplay niteliği eklenir.

<audio controls autoplay>

Sürekli Olarak Çalması (loop)

Sesin bittikten sonra tekrar başlaması ve buna sürekli devam etmesi için audio etiketine loop niteliği eklenir.

<audio controls autoplay loop>

Sessida Çalması (muted)

Sesin sessizde çalması için audio etiketine muted niteliği eklenir.

<audio controls autoplay muted>

Ön yüklemeyi iptal etme (preload)

Sesin başlamadan önce ön yüklemesini iptal etmek için audio etiketine preload=”none” niteliği eklenir.

<audio controls autoplay preload="none">

Oynatma (play) ve Durdurma (pause) Özelliği

Artık biraz daha eğlenceli kısma geçelim. JavaScript ile (tabi biz jquery’i dahil ederek kullanacağız) oynatma ve durdurma işlemlerini yapalım. Öncelikle html yapımız şöyle olsun;

<audio controls>
  <source src="ses.mp3" type="audio/mpeg">
  Tarayıcınız bu özelliği desteklemiyor.
</audio>

<button id="play">Oynat</button> <button id="pause">Durdur</button>

Şimdi jquery’de click olaylarına ses dosyamızı durdurup oynatalım. Bunun için play() ve pause() metodlarını kullanacağız.

// html audio nesnesi
var audio = $('audio');

// oynatma olayı
$('#play').on('click', function(e){
    audio[0].play();
    e.preventDefault();
});

// durdurma olayı
$('#pause').on('click', function(e){
    audio[0].stop();
    e.preventDefault();
});

$(‘audio’) sonuna [0] yazarak html ses elemanına çevirdim. Aksi halde bir jquery nesnesi olacaktı. Ancak ses metodları sadece ses elemanlarında çalışacağı için bunu yapmak zorundayız.

Oynatma Olayı

Ses dosyası oynarken bunu yakalamak istersek timeupdate event’ını kullanacağız. Örnek vermek gerekirse;

var audio = $('audio');
audio.bind('timeupdate', function(){
   console.log('ses oynatılıyor..');
});

ancak tabi bu şekilde bir anlamı yok. Bir alttaki örnek ile daha anlamlı olacaktır.

Toplam Süreyi (duration) ve Geçen Süreyi (currentTime) Hesaplamak

Ses dosyasının toplam süresini ve oynatırken ki mevcut süresini hesaplatmak için duration ve currentTime kullanılır.
Mevcut süresi yukarıdaki oynatma olayını kullanarak alacağız.

// saniyeyi çeviren fonksiyon
function readableDuration(seconds) {
    sec = Math.floor( seconds );    
    min = Math.floor( sec / 60 );
    min = min >= 10 ? min : '0' + min;    
    sec = Math.floor( sec % 60 );
    sec = sec >= 10 ? sec : '0' + sec;    
    return min + ':' + sec;
}

// html audio nesnesi
var audio = $('#audio');

// oynatma olayı
$('#play').on('click', function(e){
    audio[0].play();
    e.preventDefault();
});

// durdurma olayı
$('#pause').on('click', function(e){
    audio[0].pause();
    e.preventDefault();
});

// hazır olduğunda toplam süreyi yazdır
audio.bind('canplay', function(){
    var duration = audio[0].duration;
    $('.duration').text( readableDuration(duration) );
});

// değişiklik olduğunda mevcut süreyi yazdır
audio.bind('timeupdate', function(){
    var current = audio[0].currentTime;
    $('.current').text( readableDuration(current) );
});

Saniyeyi düzgün gösterebilmek için şuradaki fonksiyonu kullandık.
canplay eventı da ses dosyası hazır olduğunda çalışmakta. Bu yüzden toplam süreyi bu event içinde aldık yoksa sıkıntı büyük ????

Progress Bar

Kendimize özel bir progress bar yapmak istersek önce % değeri hesaplamalıyız. Sonra bu değeri progress bar’da göstermek çocuk oyuncağı ????
Bir değerin 100% ünü hesaplamak için formül şöyledir;

MEVCUT DEĞER / TOPLAM DEĞER * 100

Burada mevcut değer currentTime toplam değer duration olacağından bizim % dilimimizi bulduk bile ???? Hadi şimdi bunu kodlara dökelim.

// saniyeyi çeviren fonksiyon
function readableDuration(seconds) {
    sec = Math.floor( seconds );    
    min = Math.floor( sec / 60 );
    min = min >= 10 ? min : "0" + min;    
    sec = Math.floor( sec % 60 );
    sec = sec >= 10 ? sec : "0" + sec;    
    return min + ":" + sec;
}

// html audio nesnesi
var audio = $('#audio'),
    trackbar = $('.trackbar'),
    percent = $('.percent'),
    duration = 0;

// oynatma olayı
$('#play').on('click', function(e){
    audio[0].play();
    e.preventDefault();
});

// durdurma olayı
$('#pause').on('click', function(e){
    audio[0].pause();
    e.preventDefault();
});

// hazır olduğunda toplam süreyi yazdır
audio.bind('canplay', function(){
    duration = audio[0].duration;
    $('.duration').text( readableDuration(duration) );
});

// değişiklik olduğunda mevcut süreyi yazdır
audio.bind('timeupdate', function(){
    
    var current = audio[0].currentTime;
    $('.current').text( readableDuration(current) );
    
    // yüzdeyi hesapla
    var currentPercent = Math.ceil( (current / duration) * 100 );
    trackbar.width( currentPercent + '%' );

});

Ancak bu şekilde çok kullanışlı değil.. Progress bar a tıkladığımızda da tıklanan yerden çalmaya devam etmeli.. Bu yüzden kodlarımızda ufak değişiklikler yapalım ve bu sorunu da çözelim.

// saniyeyi çeviren fonksiyon
function readableDuration(seconds) {
    sec = Math.floor( seconds );    
    min = Math.floor( sec / 60 );
    min = min >= 10 ? min : '0' + min;    
    sec = Math.floor( sec % 60 );
    sec = sec >= 10 ? sec : '0' + sec;    
    return min + ':' + sec;
}

// html audio nesnesi
var audio = $('#audio'),
    progress = $('.progress'),
    trackbar = $('.trackbar'),
    percent = $('.percent'),
    duration = 0;

// oynatma olayı
$('#play').on('click', function(e){
    audio[0].play();
    e.preventDefault();
});

// durdurma olayı
$('#pause').on('click', function(e){
    audio[0].pause();
    e.preventDefault();
});

// hazır olduğunda toplam süreyi yazdır
audio.bind('canplay', function(){
    duration = audio[0].duration;
    $('.duration').text( readableDuration(duration) );
});

// değişiklik olduğunda mevcut süreyi yazdır
audio.bind('timeupdate', function(){
    
    var current = audio[0].currentTime;
    $('.current').text( readableDuration(current) );
    
    // yüzdeyi hesapla
    var currentPercent = Math.ceil( (current / duration) * 100 );
    trackbar.width( currentPercent + '%' );

});

progress.on('click', function(e){
    
    // farenin  x konumu
    var posX = $(this).offset().left;
    
    // progress barın toplam genişliği
    var totalWidth = $(this).width(),
    
        // farenin tıklanan nesneden x ekseninda uzaklığı (genişliği)
        currentWidth = e.pageX - posX;
    
    // tıklanan yere göre % değeri
    var clicked = (currentWidth / totalWidth) * 100;

    // bilinen % değerine göre zaman hesabı
    var resultSecond = duration * clicked / 100;

    trackbar.width(clicked + '%');
    audio[0].currentTime = resultSecond;
    
    audio[0].play();
    
});

Yükleneni Progressda Gösterme (buffered)

Bunun için progress eventını kullanacağız. Ve bu event içinde oynatmadan önce yüklenmiş ya da yüklenmekte olan değeri alacağız.

// saniyeyi çeviren fonksiyon
function readableDuration(seconds) {
    sec = Math.floor( seconds );    
    min = Math.floor( sec / 60 );
    min = min >= 10 ? min : '0' + min;    
    sec = Math.floor( sec % 60 );
    sec = sec >= 10 ? sec : '0' + sec;    
    return min + ':' + sec;
}

// html audio nesnesi
var audio = $('#audio'),
    progress = $('.progress'),
    trackbar = $('.trackbar'),
    percent = $('.percent'),
    buffered = $('.buffered'),
    duration = 0;

// oynatma olayı
$('#play').on('click', function(e){
    audio[0].play();
    e.preventDefault();
});

// durdurma olayı
$('#pause').on('click', function(e){
    audio[0].pause();
    e.preventDefault();
});

// hazır olduğunda toplam süreyi yazdır
audio.bind('canplay', function(){
    duration = audio[0].duration;
    $('.duration').text( readableDuration(duration) );
});

// değişiklik olduğunda mevcut süreyi yazdır
audio.bind('timeupdate', function(){
    
    var current = audio[0].currentTime;
    $('.current').text( readableDuration(current) );
    
    // yüzdeyi hesapla
    var currentPercent = Math.ceil( (current / duration) * 100 );
    trackbar.width( currentPercent + '%' );

});

progress.on('click', function(e){
    
    // farenin  x konumu
    var posX = $(this).offset().left;
    
    // progress barın toplam genişliği
    var totalWidth = $(this).width(),
    
        // farenin tıklanan nesneden x ekseninda uzaklığı (genişliği)
        currentWidth = e.pageX - posX;
    
    // tıklanan yere göre % değeri
    var clicked = (currentWidth / totalWidth) * 100;

    // bilinen % değerine göre zaman hesabı
    var resultSecond = duration * clicked / 100;

    trackbar.width(clicked + '%');
    audio[0].currentTime = resultSecond;
    
    audio[0].play();
    
});

audio.bind('progress', function(){
    try {
        var currentBuffered = audio[0].buffered.end(audio[0].buffered.length - 1) / duration * 100;
        buffered.width(currentBuffered + '%');
    } catch ( err ){
        // err
    }
});

Sesin Bittiğini Anlamak (ended)

Ses bittiğinde bunu yakalamak için ended eventını kullanıyoruz.

audio[0].addEventListener("ended", function() {
    alert("ses bitti!");
});

Diğer Bazı İşe Yarar Şeyler

var audio = $('#audio')[0];

// sesi kapatma
audio.muted = true;

// sesin ayarını oynama
audio.voluma = 0.2;

// sesin mevcut zamanını alma
audio.currentTime;

// sesion toplam zamanını alma
audio.duration;

// sesion zamanını ayarlama
audio.currentTime = 15; // 15. sn

// sesi otomatik oynatma
audio.autoplay = true;
audio.load();

// sesin kontrollerini açmak ya da gizlemek için
audio.controls = true;
audio.controls = false;

// sesion kaynak adresini almak için
audio.currentSrc;

// sesin durup durmadığını anlamak için
audio.paused;

// sesin oynayıp oynamadığını anlamak için
audio.played;

// ön yüklemeyi kapatma
audio.preload = "none";

strtolower() ile Türkçe Karakterlerin Küçültülmesi (Php)

Bildiğiniz gibi strtolower() fonksiyonu ile türkçe (latin karakterleri) düzgün şekilde küçültemiyoruz. Aslında bu sadece küçültme işlemi için geçerli değil, latin karakterlerde her zaman bir sorun yaşıyoruz. Büyültmede, kesmede vs. Bu yüzden php bize karakter seti tanımlayabileceğimiz mb_ li fonksiyonları türetmiştir. Hemen bir örnekle açıklayalım;

$harf = 'İ';

echo strtolower($harf); // Çıktı: Ä°

echo mb_strtolower($harf, 'utf8'); // Çıktı: i

kolay gelsin ????

Dizi Değerlerini Get Parametresine Dönüştürme (Php)

Normal şartlarda hiç işime yaramadı ama yaradığı yerler vardır illaha ki ???? Bilmeyenler için paylaşıyorum.
Elinizdeki mevcut dizinin anahtar ve değerlerini baz alarak size bir get parametre çıktısı döndürür. İşinizi kolaylaştırır.

Bu fonksiyonun adı http_build_query() dir.

Hemen bir örnekle şenlendirelim;

$array = array(
    'ad' => 'tayfun',
    'soyad' => 'erbilen',
    'dtarih' => 1993
);

$get = http_build_query($array);
echo $get; // Çıktı: ad=tayfun&soyad=erbilen&dtarih=1993

bazen query’deki & işaretinin & şeklinde olmasını isteyebiliyoruz. Bunun için fonksiyonu şöyle değiştirmek yeterli;

http_build_query($array, '', '&');

bkz: http://us3.php.net/manual/en/function.http-build-query.php