PHP ile Facebook Messenger Botu Nasıl Yapılır?

Videoda hemen hemen her şeyini anlatmaya çalıştım, makale olarakta biraz bahsetmek istiyorum. İhtiyacınız olan bir adet facebook sayfası sahibi olmanız bu kadar 🙂

1. Adım – Uygulama Oluşturmak

https://developers.facebook.com/ adresine giriş yapın. Sağ üstten My Apps‘e tıklayıp Create App diyerek yeni bir uygulama oluşturun.

Çıkan popup’da ilgili alanları doldurup uygulamanızı oluşturun.

2. Adım – Messenger ürününü ekleyin

Uygulama detayına girdiğinizde Ürünler kısmı açılacak . Buradan Messenger‘ı bulup Set Up diyerek kurulumu yapalım.

Okumaya devam et “PHP ile Facebook Messenger Botu Nasıl Yapılır?”

Geliştiricilere Özel Reklam Platformu (Codefund)

Sizi geliştiricilere özel reklam platformu olan Codefund ile tanıştırmak istiyorum. Hali hazırda bir çok proje bu platform sayesinde destekleniyor.

Birkaç ay önce adsense’i bırakıp kişisel web sitem ve prototürk’de bu platforma geçtim. Açıkçası adsense’den daha iyi bir getirisi var, bu sayede projelerimin sunucu maliyetlerini sıfıra indirdim, kendi kendini idare eder hale geldi her birisi.

Hem amaca yönelik reklamlar çıkıyor, hemde şeffaflık sunuyor bu konuda. Eric ile konuştuğumda Türkiye dahil bir çok pazara gireceklerini söyledi ancak kesin bir netlik olmadığını, bu konunun henüz düşünce aşamasında olduğunu bildirdi.

Normalde sanıyorum Türkçe içerikli platformları kabul etmiyorlar ama neyseki kodun dili olmaz 🙂 20$ eşiğini geçtiğinizde size ödeme yapıyorlar, ben ödemeleri paypal ile alıyorum, sizde bir yolunu bulursunuz eminim 🙂 Örnek olması adına son 3 aylık ödemeyi paylaşıyorum;

Öyle çok hitiniz olmasına gerek yok bu tarz rakamlar kazanmak için günlük 1000-1500 arası bir hitiniz olması yeterli. Umarım projelerinize katkı sağlamanızda yardımcı olur. Referansımla kayıt olursanız, banada katkı sağlarsınız.

Kayıt olmak için tıklayın

Seslenirken Yarınlara [Tayfun Erbilen]

Uzun zaman sonra müzik için ilham geldi 🙂 Yazılım bilimi ve kablosuzkediyi içine alan 3 dörtlük yazdım ve söylemeye çalıştım, seviyorum ve eğleniyorum böyle şeyleri yaparken 😀

Şimdi geldiğim noktadan seslenirken yarınlara,
her iki lafı(n|m)dan biri olmuş lan sanki para.
Başlarda eğlenirdim, konuşarak delirirdim,
İzlemezdi kimse ama ben kendimi iyi bilirdim..

..demek zordu ama bu sektörde çoktu.
İki kod yazınca kendine ünvanı koydu,
başladı çalışmaya, ah bizimle yarışmaya,
kendi bile bilmezdi ama bu iş çok zordu..

Sormaktan çekinmeyen, bildiklerini söyleyen,
birinin derdi olduğunda, bi şekil destekleyen,
kablosuzsa kedinin, yazılımsa bilimin,
söyleyin lan artık bana, yoksa ayarı dilimin..

MySQL/PHP ile Tüm Tabloları Truncate Etme (Temizleme)

Bir projede kurulum yaparken tüm tabloları temizlemem gerekiyor. Tek tek elle yapsam olmaz, tablo adlarını bir diziye aktarıp truncate etsem saçma olur. Bunun için information_schema’ı kullanarak tabloları çektim ve döngüye sokarak temizleme işlemi yaptım. Yani sql sorgum şöyle;

SELECT CONCAT("TRUNCATE TABLE ", table_schema, ".", TABLE_NAME, ";") FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema IN("db_adi", "db_adi2")

Burada concat ile değerleri birleştirince tüm tablolarıma ait otomatik truncate kodu çıkmış oldu. Şimdi bunu php ile birleştirdiğimizde;

<?php
// pdo db bağlantı işlemleri ..

$query = $db->query('SELECT CONCAT("TRUNCATE TABLE ", table_schema, ".", TABLE_NAME, ";") FROM INFORMATION_SCHEMA.TABLES WHERE table_schema IN("mvc")')->fetchAll(PDO::FETCH_ASSOC);

foreach ($query as $row){
echo $db->query(current($row))->fetch();
}

Not: Eğer SQLSTATE[42000]: Syntax error or access violation hatası alıyorsanız, foreach’den önce yani sorguları çalıştırmadan önce FOREIGN_KEY_CHECKS değerini 0’a eşitleyip deneyin. Yani;

<?php
// pdo db bağlantı işlemleri ..

$query = $db->query('SELECT CONCAT("TRUNCATE TABLE ", table_schema, ".", TABLE_NAME, ";") FROM INFORMATION_SCHEMA.TABLES WHERE table_schema IN("mvc")')->fetchAll(PDO::FETCH_ASSOC);
$db->query('SET FOREIGN_KEY_CHECKS=0')->fetch();
foreach ($query as $row){
echo $db->query(current($row))->fetch();
}

İşte bu kadar 🙂 Benim hazırladığım BasicDB sınıfında ise son versiyonunu indirdikten sonra şu şekilde kullanmak yeterli;

<?php
// basicdb bağlantı işlemleri ..
$db->truncateAll();

Bu metod içerisinde AUTO_INCREMENT değerleride 1’den başlayacak şekilde ayarlanıyor. Dilerseniz kendi şu sql sorgusu ile tablolarınızın başlangıç değerlerini de ayarlayabilirsiniz.

ALTER TABLE `db_adi`.`tablo_adi` AUTO_INCREMENT = 1; # 1 ya da kaçtan başlayacaksa o

Sıfırdan PHP ve MySQL Derslerim Artık Ücretsiz!

Dün uzun uzun bir videolu anlatım yapmayı planlamıştım bu konuda, ancak şimdi düşünüyorum da çokta önemli değil uzun uzun anlatmak. 1 sene 3 ay önce udemy’de ücretli olarak yayınladığım kursumu, raf ömrünün dolduğunu düşündüğüm ve daha iyisilerine yer açması adına ücretsiz olarak yayınlamaya karar verdim.

2017 yılı benim hayatımın en kötü yılı olmuştu, gerek maddi gerek manevi. Bu dönemde çıkardığım bir kurstu, ilk ücretli kursumdu. Paralı eğitime karşı değilim, hakkıyla yapıldığı sürece. Fakat ilk kursumun acemiliğindendir belki, yeterince hakkını verdiğimi düşünmüyorum. Bundan dolayı, temel eğitimleri ücretsiz olarak paylaşmakta bir problem görmedim.

Eğer kursu daha önceden parayla satın alıpta bu duruma itirazını olan arkadaşlarım varsa ( ki olmayacağını umarım ) paralarını iade edemem 🙂 Fakat bir sonraki çıkaracağım kurs için ücretsiz kuponları bende hazır, merak etmesinler.

Doğru olduğunu düşündüğüm bir şeyi yapmaya karar verdim, kahretsin ki fazla tez canlıyım 🙂 O yüzden düşündüğümü hemen yapma gibi kötü bir huyum var. Neyse, umarım bu temel dersler birilerinin gelişimine fayda sağlar. Kursu alan arkadaşlarım, sizlere sesleniyorum. Sayenizde şu an bu kurs videolarına ücretsiz erişebilecek bir sürü insan, bolca dua alacağız 🙂

Hoşçakalın, sevgiyle kalın.

CSS’de Değişken Kullanımı

Herkese merhaba, bu yazımda sizlere CSS’de native olarak değişkenlerin kullanımını anlatmak istiyorum. Değişkenlere başlamadan önce sizlere bir sözde sınıftan bahsetmek istiyorum.

:root

:root sözde sınıfı, en üst düzey ebeveyn öğesini temsil eder. Yani bir html sayfada bu html etiketi anlamına geliyor. Fakat css’in kullanım alanlarının artmasıyla örneğin svg ve xml’de kullanılırken, :root sözde sınıfı başka bir öğeyi temsil ediyor olabilir.

Örnek bir değişken tanımlaması

Genelde değişkenleri tanımlarken başına iki tane tire işareti koyulması gerektiği söyleniyor. Ancak ben tiresizde denediğimde çalışıyordu, yine de ayırt edici olması adına başına iki tire koyarak :root içerisinde global bir değişen tanımlayalım.

:root {
--color: green;
}

Değişkenlerin kullanımı

Değişkenleri kullanırken var() fonksiyonunu kullanacağız. Örneğin yukarıdaki değişkeni bir etiketin rengi olarak belirlemek istersek;

h3 {
color: var(--color);
}

Local olarak değişken tanımlamak

:root içerisinde biz global olarak değişkenimizi tanımladık. Yani orada tanımlanan değişken sayfanın tamamında kullanılabilirdi. Ancak local olarak belli bir scope’u kapsayacak şekilde oluşturmak istersek, html etiketini seçip değişkeni oluşturuyoruz.

.box {
--color: blue;
}

Artık .box divinin içinde kullanılan değişken değer olarak maviyi alacak. Çünkü local tanımı bu şekilde yapmış olduk.

jQuery ile Değişkenlerin Değerini Değiştirmek

Genelde jQuery kullandığımız için bundan da bir örnek vermek istiyorum. Örneğin yukarıda oluşturduğumuz renk değişkenini jquery ile dinamik olarak ayarlamak istersek;

<input type="color" id="color">
<script src="jquery.min.js"></script>
<script>
$('#color').on('input', () => {
$(':root').css('--color', $(this).val());
});
</script>

Yaş oldu 26!

Şaka bir yana 21 yaşına girdim diyeli daha 5 sene olmuş şu yazımda son paragrafta yazmışım 🙂 Şimdi göz açayıp kapayıncaya kadar 26. yaşıma geldim, daha yeni yeni farkına varıyorum akıp giden zamanın, birikmiş anıların, öğretici tecrübelerin ve bitmek bilmeyen sevgilerin.

Bu sene doğum günümde 5 sene önce olduğu gibi yine İstanbul’dayım, hayat beni bir yerlerde döndürüp duruyor ama dur bakalım çıkar yakında kokusu 😀

Yalnız pastadaki nargile efsane değil mi ya 😀

Terminal’de Bulunduğumuz Dizini phpStorm ile Açmak

Videolarda sublime ile kolayca klasörü açtıklarında sinir oluyordum, ufak bir araştırma ile bunu phpStorm içinde yapmak mümkünmüş. Efenim öncelikle terminalde ilgili klasöre girdikten sonra şu kodu çalıştırırsanız;

open -a PhpStorm ./

./ yazdığım için mevcut dizini phpStorm ile açacaktır. Bu çok uğraştırıcı derseniz bi alies tanımlayıp kısa olarak kullanabilirsiniz. Terminalde bir alies oluşturun, adını feriha koyun.

alias feriha ='open -a PhpStorm'

Artık bir klasörü phpStorm’da açmak için ferihayı kullanabilirsiniz.

feriha ./

Kolaylıklar dilerim 🙂

PSR-4 Autoloader Standardı ve Composer ile Kullanımı

Bilmiyorum daha önce PHP-FIG.org’u duydunuz mu? Bu arkadaşlar, PHP yapısı kuran kişilere standart olmayı öncülüyorlar. Yani diyorlar ki, bir yapı kuracaksan en azından belirlediğimiz standartlara göre yap ki, bi boka benzesin 🙂 Bende sizlere en basiti olan PSR-4 autoloading olayını anlatacağım.

Sınıflara yeni başladıysanız namespace’ler size çok anlamlı gelmemiş olabilir. Neden kullanayım ki? Şimdi çok fazla sınıfın kullanıldığı projelerde, sınıf isimlerinin çakışmaması için sınıflara namespace tanımlanır yani nickname gibi düşünün. Benim adım Tayfun, ve aynı sınıfta 2 tayfun daha var. Birbirimizi karıştırmamak için Ben Prototürk Tayfun, Bir diğeri Yufka Yürek Tayfun, bir diğeri Yakışıklı Tayfun 😀

Bu şekilde her Tayfun’un nickname’i olunca kimse birbirini karıştırmıyor. İşte namespace’lerde bu amaçla kullanılıyor. Şimdi bu ne alaka diyebilirsiniz, bende bilmiyorum ufaktan bi bilgi vereyim dedim 😀 Bizim asıl konumuz, sınıflarımızı nasıl otomatik yükleteceğiz.

Normalde yaptığımız

Eskiden __autoload() fonksiyonunu kullanıyorduk, ancak bu PHP 7.2 ile önerilmemeye başlandı. Yerini spl_autoload_register() fonksiyonu aldı. Bunu nasıl kullanıyoruz;

spl_autoload_register(function($class){
$file = __DIR__ . '/src/classes/' . strtolower($class) . '.php';
if (file_exists($class))
require $class;
});

Fakat bu yeterli gelmiyor. Ve çokta doğru bir mantık sayılmaz. Başka klasörlerde başka sınıflarımda olabilir. Dolayısı ile bunu sadece biz sorun etmemişiz belli ki, bu FIG bizim için PSR-4 adını verdikleri autoloading standardını belirtmişler. Onlara göre bu işlemi yaparken şunlar olmalı;

\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>

Yani sınıflar bir top-level namespace’e sahip olmalılar. Ayrıca vendor namespace olarakta biliniyormuş bu.
Ve ek olarak 1 ya da daha fazla alt namespace’e sahip olması gerekiyormuş.
E tabi birde sınıf ismi 🙂

Bu arkadaşların mantığına göre işlemimi şöyle yaparsak;

spl_autoload_register(function($class){

// top-level namespace
$prefix = 'Erbilen\';

// namespace için ana dizin
$base_dir = __DIR__ . '/src/libraries/';

// çağırılan sınıf prefix'i içermiyorsa bir sonraki yükleme işlemine geç
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0){
return;
}

// prefix hariç sınıfın kalanı
$relative_class = substr($class, $len);

// hepsini birleştirip dizin yolunu oluştur
$file = $base_dir . str_replace('\', '/', $relative_class) . '.php';

// sınıf dosyası var ise yükle
if (file_exists($file))
require $file;

});

// Aslında bu sınıf şurada yer alıyor
// src/libraries/validators/testvalidator.php
$test = new Erbilen\Validators\TestValidator();

// src/libraries/database/testdatabase.php
$db = new Erbilen\Database\TestDatabase();

Composer ile Kullanımı?

Eğer bu işlemi composer ile yapmak isterseniz, composer.json dosyasını açın yoksa bir tane oluşturun anadizinde ve içine şu kodları yazın;

{
"autoload": {
"psr-4": {
"Erbilen\": "src/libraries"
}
}
}

Burada yine gördüğünüz gibi ilk değerimiz top-level namespace’imiz ve karşılığı olarak namespace’in bulunduğu ana dizini belirttik. Terminale gidip composer update komutunu çalıştırdığınızda ana dizinde vendoradında bir klasör ve onun içinde autoload.php olduğunu göreceksiniz. Ayrıca birde composer diye klaör var, işlemleri burada yapıyor ancak biz index dosyamızda bu autoload.php’yi çağırıyoruz. Ve sınıflarımızı kullanmayı deniyoruz.

<?php
require __DIR__ . '/vendor/autoload.php';

$test = new Erbilen\Validators\TestValidator();
$db = new Erbilen\Database\TestDatabase();

Sonuç? Evet, çalışıyor. Tebrik ederim, ilk standardı kullanmayı başardık, darısı diğerlerinin başına.