Bu işlemi PHP ile değil front-end kısmında javascript ile yapabilirsiniz.
Öncelikle namaz vakitlerini veren bir API yardımıyla bugünün ve yarının namaz vakitlerini elde etmelisiniz.
Google'de "namaz vakitleri api" yazdığım zaman çıkan sitelerden birinde namaz vakitlerinin güzel bir api ile sunulduğunu gördüm.
Kaynak: namaz-vakti-api.herokuapp.com
Bu sitede API'yı nasıl kullanmanız gerektiği yazıyor.
Önce ülkenizin kodunu buluyorsunuz. Türkiye'nin kodu 2 olarak verilmiş.
Sonra ülke kodunuzu kullanarak namaz vaktini alacağınız şehrin kodunu buluyorsunuz: Şehir kodları Örneğin Adana'nın kodu 500 olarak verilmiş.
Sonra da şehir kodunu kullanarak ilçe kodunu buluyorsunuz ki bize asıl lazım olan bu: İlçe kodları Adana'yı bilmiyorum ama sanırım merkezin kodu 9146 olarak verilmiş.
Bu kodu kullanarak bu konumun namaz vakitlerini alabiliyorsunuz: Namaz Vakitleri
Şu anda bugünün sahur vaktinden öncede miyiz, bugünün sahur ve akşamı arasında mıyız yoksa yarının sahurundan önce miyiz? Bunu tespit etmelisiniz.
Sonra da şu andan sonraki ilk hedef tarihle şu anın arasındaki farkı her saniye ekrana yazdırabilirsiniz.
var targetLocationId = 9146;
$("body").prepend("\
<div style='min-height:50px; background:#ccc; display:flex; align-items:center; justify-content:center;' id='test'>\
<span id='test-countdown-name'></span>\
<span id='test-countdown' style='margin-left:5px;'></span>\
</div>\
");
var $test = $("body > #test").eq(0);
$countdownName = $test.find("#test-countdown-name");
$countdown = $test.find("#test-countdown");
var now = new Date();
var tomorrow = new Date(now);
tomorrow.setDate(tomorrow.getDate()+1);
$.ajax({
type:"get",
url:"https://namaz-vakti-api.herokuapp.com/data?region="+targetLocationId,
success:function(response){
var todayImsak = response[0][1].split(":");
var todayAksam = response[0][5].split(":");
var tomorrowImsak = response[1][1].split(":");
var todayImsakDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), todayImsak[0], todayImsak[1], 0);
var todayAksamDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), todayAksam[0], todayAksam[1], 0);
var tomorrowImsakDate = new Date(tomorrow.getFullYear(), tomorrow.getMonth(), tomorrow.getDate(), tomorrowImsak[0], tomorrowImsak[1], 0);
if(now <= todayImsakDate) $countdownName.text("Sahura kalan süre:");
else if(now > todayImsakDate && now <=todayAksamDate) $countdownName.text("İftara kalan süre:");
else $countdownName.text("Sahura kalan süre:");
calculateCountdown(todayImsakDate, todayAksamDate, tomorrowImsakDate, $countdown);
setInterval(function() {
calculateCountdown(todayImsakDate, todayAksamDate, tomorrowImsakDate, $countdown);
},1000);
}
});
function calculateCountdown(imsakDate, aksamDate, tomorrowImsakDate, $element) {
now = new Date();
var targetDate = null;
if(now <= imsakDate) targetDate = imsakDate;
else if(now > imsakDate && now <=aksamDate) targetDate = aksamDate;
else targetDate = tomorrowImsakDate;
var hours = parseInt((targetDate - now) / (1000 * 60 * 60) % 24);
var minutes = parseInt((targetDate.getTime() - now.getTime()) / (1000 * 60) % 60);
var seconds = parseInt((targetDate.getTime() - now.getTime()) / (1000) % 60);
$element.text(hours + " saat " + minutes + " dakika " + seconds + " saniye");
}
Bu sitede (prototurk) JQuery kullanıldığı için, yukarıda verdiğim örnek kodu bu sayfanın firebug konsoluna yapıştırarak çıktısını görebilirsiniz.
Sayfanın üstünde bir <div>
oluşacak ve içinde geri sayım belirecektir.
Kullanıcının kendi konumunu kendi seçtiği bir sistem geliştirecekseniz yine bu API size yardımcı olacaktır.
O kısımlar bu sorunun kapsamını aştığı için cevabı burada kesiyorum. Örnek kodu inceleyip geliştirerek istediğiniz sonucu alabilirsiniz.
XML biraz kafa karıştırıcı hazırlanmış. Dizinin altındaki elemanın altında yine tek elemanlı bir dizi tutmuşlar. Ama kendi içinde tutarlı.
Öncelikle verdiğiniz linkten PHP'de curl ile xml'i string olarak elde ettim ve $xmlString
adlı değişkenime aldım.
Bu aşamadan sonrasını yazıyorum:
$xml = simplexml_load_string($xmlString, 'SimpleXMLElement', LIBXML_NOCDATA);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
foreach($array['item'] as $itemKey=>$item) {
echo "<h1>Ürün $itemKey</h1>";
echo '<strong>Ürün Adı:</strong> '.($item['urunadi']).'<br>';
echo '<strong>Çeşitler:</strong>';
echo '<ul>' ;
foreach($item['variants']['variant'] as $variant) {
echo '<li>';
echo '<strong>Stok Kodu:</strong> '.$variant['vStockCode'].'<br>';
foreach($variant['options']['option'] as $option) {
echo '<b>'.$option['variantName'].'</b>: '.$option['variantValue'].'<br>';
}
echo '</li>';
}
echo '</ul>';
}
Burada örnek olarak tüm ürünlerin içine girip tüm varyasyonlarını yazdırdım.
Kodu inceleyip kendinize göre düzenleyebilirsiniz.
Görselleri orantılı boyutlandırmak için CSS'in aspect-ratio özelliğini kullanabilirsiniz. Örneğin:
img {
width:100%;
aspect-ratio: 16/9;
}
Böylece <img />
elementiniz genişliğie göre kendini boyutlandırırken yüksekliğini de orantılı olarak koruyacaktır.
Eğer img boyutları sabit olsun ama görsel bu alanda kendini yerleştir istiyorsanız CSS'in object-fit özelliğini kullanabilirsiniz. Örneğin:
img {
width:300px;
height:300px;
background-color:#000;
object-fit: cover; /* görseli kırpılmış şekilde 300x300'lük alana yerleştirir. cover yerine contain derseniz kırpmadan boyutlandırma yapar. */
}
Javascript ile yapabilirsiniz.
var $telcode = document.getElementById("telcode");
var $input = document.getElementById("inputTel");
var placeholderValues = { TR: "+90", US: "+1", UK: "+44", Japan: "+81" };
$telcode.addEventListener("change",function(e) {
var targetValue = placeholderValues[e.target.value];
$input.placeholder = targetValue ? targetValue : "?";
});
md5 herhangi uzunluktaki bir veriyi alıp 32 adet hexadecimal sayıya (toplam 128 bit) çevirir.
sha1 ise tıpkı md5 gibi çalışır ama bu kez 40 adet hexadecimal sayı (160 bit) elde edilir.
Verdiğiniz örnek kodda hexadecimal olmayan karakterler mevcut ve sonu = karakteriyle bitmiş.
Büyük ihtimalle bir base64 encoding yapılmış.
Base64 hakkında bilgi edinmek için: Base64 - Vikipedi
Görselleri doğrudan veritabanında tutmak yerine görsellerin dosya adlarını veritabanında tutmanız daha uygun olacaktır. Genellikle böyle yapılır.
Görselin PHP tarafında yeniden boyutlandırılması konusu burada işlenmiş: yusufsezer.com.tr/php-resim-boyutlandirma
Burada örneğin telefondan çekilmiş 5mb boyutlu bir fotoğrafın önce sunucuya upload edilmesi, sonra PHP tarafından işlenmesi durumu var. Bu kaynak yönetimi açısından maliyetli bir işlem.
Upload etmeden önce boyut kontrolü de yapsanız bu sefer de kullanıcılar upload işleminden önce görseli düzenlemekle uğraşmak zorunda kalırlar.
Benim tavsiyem görseli front-end tarafında boyutlandırmanız ve tam istediğiniz boyutlarda büyük ve küçük görselleri upload etmenizdir.
Bu adreste görselin front-end tarafında nasıl boyutlandırılacağı örneklendirilmiş: imagekit.io/blog/how-to-resize-image-in-javascript
Burada görseli alıp bir <canvas></canvas>
elementi içinde yeniden boyutlandırıyor ve yeni oluşan görüntüyü bir <img />
elementine basıp gösteriyor. Sizin kodu kendinizce düzenlemeniz gerekecek.
Görselleri alan PHP kodunun yalnızca boyut ve ebat kontrolü yapması sunucuya daha az yük bindirmiş olur.
Merhaba. Infinity, javascript'te sonsuzu ifade etmek için kullanılmış bir anahtar kelimedir. Number.POSITIVE_INFINITY diyerek elde edilebilir.
Sizin durumunuzda çok büyük ihtimalle bir sayıyı 0'a bölüyorsunuz ve js bir sayıyı sıfıra sonsuz defa bölebileceğinizi söylemeye çalışıyor.
Aldığınız değerlerden biri sayfa ilk yüklendiğinde (ilk Infinity bastığına göre) 0 olup sonradan başka bir değere dönüşüyor olabilir.
Böyle bir siteyi yapabilmek için şu konulara hakim olmak gerekiyor:
1) Site içi SEO çalışmaları yapılmış.
2) Google Analytics ve Google Etiket Yöneticisi (GTM) kullanılmış.
3) HTML, CSS, Javascript zaten bilinmeli.
4) Sitede React kullanılmış. Tek sayfa site. Backend olarak Next kullanılmış. Yani temel bir NodeJS bilgisi üzerine ReactJS ve NextJS hakimiyeti gerekiyor.
5) Sunucu gereksinimini sanırım Vercel üzerinden sağlamış ki bu NextJS'i en keyifli kullanıldığı platform.
6) Vercel kullanıyorsa (kullansın kullanmasın fark etmez gerçi ama) Git de kullanıyordur.
7) Kodlama üzerine ileri düzeye çıkmış kişiler genelde tasarım için tasarım becerileri yüksek kişilerle çalışırlar. Bu sitenin yazılımcısı React Native ile mobil uygulama da geliştirdiğini belirtmiş. Muhtemelen tasarımı yapan kişi bu sitenin yazılımcısıyla tasarımını net şekilde paylaşabilmek için Adobe XD veya Figma kullanıyordur. Ayrıca tasarımcı, görselleri düzenlemek için Adobe ürünleri olan Photoshop, Illustrator vb programlardan da yararlanıyordur.
Bu işlere yeni girişecek biri için yol haritası belirtmek gerekirse,
!) İngilizce! Bundan sonraki adımlara devam ederken bir yandan da İngilizcenizi ilerletmelisiniz. Buna mutlaka zaman ayırmak zorundasınız. Çünkü Türkçe kaynaklar bi'yerden sonra tükenecek ve yeni teknolojileri takip edemez hale geleceksiniz ve ayrıca yurtdışından iş alma fırsatlarını da kaçıracaksınız. Yani iki işi bir arada yürütün: Kodlama ve dil.
1) HTML ve CSS'in temel düzeyde öğrenilmesi.
2) "Tasarım yanım güçlüdür, çok hoşa giden tasarımlar çıkarabileceğime inanıyorum." diyen biri için Figma kullanımının öğrenilmesi. Eğer tasarım üzerine uzmanlaşılacaksa diğer görsel düzenleme programları da öğrenerek buradan devam edilir. HTML ve CSS'i temel düzeyde bilen yetenekli bir tasarımcı, kodlamaya en elverişli tasarımları bu programlar yardımıyla oluşturacaktır.
!) Spor ve beslenme! Çok önemli. Vaktinizin çoğu bilgisayar başında geçecek. Eğer yatkınlığınız varsa karadelik gibi sizi içine çekecek bir yoldasınız. Sağlınızı siz hiç fark etmeden, sinsice bozulabilir ve bu listeyi tamamlayamadan tıkanabilirsiniz. Mutlaka spora da önem verin. Hiç spor yapamadığınız gün bile mutlaka 15 dk olsun tempolu yürüyüş yapın. Sağlıklı besinler tüketin. Sağlıksız olanları tüketecekseniz de abartmadan tüketin. Su içmeyi unutmayın. Yoğurt yemeyi unutmayın. Bedeninize gereken önemi vermezseniz vakitsizce size karşılık verir! "He hee taam taam" demeyin. Ciddiyim.
3) HTML ve CSS'e hakimiyet ve temel Javascript'in öğrenilmesi.
!) Git kullanımı. Github kullanımı. Yaptığınız projeleri arşivlemeli ve paylaşmalısınız. Hangi tarihte hangi teknolojiyle ilgilendiğiniz Github profilinizden görülebilecektir ki bu da size iş verecek olanların güvenini artırır. Ayrıca artık projeleriniz için belli bir bilgisayara bağlı kalmayacaksınız. İstediğiniz bilgisayara projenizi hemen indirip çalışmaya devam edebileceksiniz. Projelerinizde bir hata yaptığınızda geri dönebileceksiniz. Git kullanımını öğrenin ve bundan sonraki adımlarda kullanın.
4) Javascript'e hakimiyet ve yardımcı kütüphanelerin kullanımı. Özellikle JQuery öğrenilmeli çünkü Javascript temeli olan kişi için öğrenimi kolaydır. Bu noktada artık front-end tasarımlar yapabilirsiniz hatta muhammederdem.com'un aynı görünümünü dâhi oluşturabilirsiniz. JQuery öğrenmeye gerek olmadığını, onun artık eskidiğini söyleyenlere aldırmayın. Doğru söylüyorlar ama aldırmayın. Çünkü çoğunluktaki sitelerin front-end'i halen JQuery kullanıyor. Yani şu ana kadarki bilginizle para kazanmaya ve güzel tasarımları kodlamaya başlayabilirsiniz. Diğer adımdaki teknolojileri öğrenmek başlangıçta zor gelebilir. Sonuçta bu yolda motivasyon da önemli. Ayrıca front-end yazılımcıya ihtiyaç duyan birçok şirkette işe girebilir veya freelance işlerden (tabi bunun yasal ayağını da hesaba katarak) para kazanabilirsiniz. Direkt web yazılım işindeki bazı şirketlerde veya web sitesi hizmeti de veren reklam ajanslarında front-end olarak çalışmanız mümkün.
5) Site içi SEO hakkında bilgi. Arama motorlarının sitenizi tararken nelere dikkat ettiğinin öğrenilmesi. Özellikle dinamik içeriklerin arama motorlarına nasıl bildirileceğinin öğrenilmesi. Yaptığınız sitelerin Google'da hızlı şekilde üst sıralara çıkmasını sağlamanın yollarını öğrenmeniz gerekiyor.
!) LinkedIn üyeliği. Mutlaka olsun ve özen gösterin. Artık güzel işler hayata geçiren bir yazılımcısınız. Buradan zaman içine kendinize bir ağ oluşturun. Burada kendinizi nasıl olması gerektiği gibi gösterebileceğinizle ilgili araştırmalar yapın. Burası size beklenmedik kapılar açabilecek bir mecra.
6) NodeJS nedir? Ne işe yarar? (Ne işe yaramaz ki?) Temel bir bilgi edinilmeli. Bundan sonra her şeyi NodeJS üzerine inşa etmeye başlayacaksınız.
7) Piyasaya hakimiyeti nedeniyle ReactJS'e temel düzeyde başlangıç. Kodun derlenerek çalışmasının mantığını anlamanız gerekiyor. Burada tarayıcı uyumluluğu probleminden sıyrılıp Javascript'in de yeni nesil kodlarını kullanmaya başlayacaksınız. 4.adımda eski tarayıcılarda da çalışabilmesi için Javascript'in birçok yeni nesil kodundan mahrumdunuz. Artık Promise(), map(), filter(), arrow functions ve daha birçok avantaj emrinize amade olacak ve kodlarınız NodeJS ile kullanılan bazı araçlar yardımıyla eski tarayıcılara da uyumlu hale dönüştürülecek.
8) Piyasaya hakimiyeti nedeniyle ReactJS'e hakimiyet. Routing yapısıdır, useMemo(), useCallback(), useContext() kullanımıdır, Redux'tır vb. artık ne varsa öğrenilmeli, kullanılmalı. Bu aşamayı tamamladığınızda artık büyük ölçekli şirketlerde front-end olarak çalışabilirsiniz. Maaşınız iyi durumdadır. Mesai sonrası front-end işler alabileceğinizi de düşünürsek... Eğer İngilizceniz de yeterince ilerlediyse artık yurtdışından front-end iş almanız da mümkün.
9) Svelte'e göz atın. Evet belki React piyasaya hakim ama Svelte bize gösterdi ki birçok iş React'a göre çok daha basit ve performanslı yapılabilirmiş. Meğerse sanal-dom yaklaşımı en iyi yaklaşım olmayabilirmiş. Yepyeni bir versiyonla karşımıza çıkmazsa bi'gün React da JQuery gibi eski teknoloji sayılabilir. React'ı çok iyi bilin ama geleceğiniz için sakın React bağımlısı olmayın.
!) Azıcık sosyalleşin yahu. Yetenekli ve iyi huylu arkadaşlar edinin. Sevginiz yoksa birini bulun. Ruhunuzu aç bırakmayın.
10) Artık React üzerine kendini geliştirmiş bir front-end uzmanısınız. Svelte'e bakın ve kendinizi geliştirin, hatta yapacağınız profesyonel bir işte Svelte'e şans verin derim. Peki VueJS? Bence VueJS ReactJS'den daha hoştur ama neticede ikisi de aynı yaklaşıma sahip: sanal-dom. Ama Svelte gibi bir örnek çıkmışken bi'gün Vue'nin React'ı tahtından edebileceğini sanmıyorum. Bu adımda demem o ki, React dışındaki front-end teknolojilere de göz atın. Farklı yaklaşımlar görmek dizi daha da geliştirecektir.
11) Backend'e geçme zamanı! Buraya kadar geldiğinize göre PHP, NextJS, .NET, Python vs. karşılaştınız. Web servislerden veri çekip sitenizde gösterdiniz. Artık bu teknolojilere girme zamanı. React'çı olduğunuz için NextJS, sunucu tarafı için size uygundur. Bunun kullanımını öğrenin ve Vercel ile kullanımını da araştırın. Sanırım Vercel ücretsiz host sağlıyor. Bunun yanında veritabanlarına da girmeniz gerekecek. Şu an için çok ileri düzeye çıkmanıza gerek yok ama NextJS ve bir veritabanı kullanarak örneğin üyelikli basit bir film sitesi örneğini tek başınıza çıkarabilecek düzeye gelmelisiniz. İlle de NextJS kullanmak zorunda değilsiniz tabi ama ReactJS bildiğiniz için çoğunlukla karşınıza NextJS çıkacaktır.
12) Firebase nedir öğrenin. Kullanın. Bir noktaya kadar ücretsiz hizmet sunar. Firebase deneyiminiz olması sizin için büyük artı olacak.
13) ExpressJS öğrenin. API'lar yazmaya başlayın. Web sitelerinizi bu API'lardan beslemeye başlayın. Güvenli ve performanslı çalışacak endpoint'leriniz olsun.
14) Mikroservis mimarisini araştırın. Bu yaklaşımın neden kullanıldığını, mantığını anlayın.
15) Docker kullanmayı öğrenin ve Docker üzerinde mikroservis mimarisini kullanmayı deneyimleyin. Farklı web servisleriniz arasında iletişim kurmayı deneyimleyin. Sunucu tarafında performans artışı sağlayabileceğiniz yolları araştırın.
16) Artık sunucu yönetimine geçmeye başladığınız için burada kesiyorum. Nereye doğru dallanacağınız size kalmış. Ama artık gönül rahatlığıyla evlenebilecek, çoluk çocuğa karışabilecek, istediğiniz bir ülkede iyi bir hayat yaşayabilecek durumdasınız. Çalıştığınız yerler, yaptığınız işler sizi bi'yerlere doğru çekecektir. Kendinizi yapmaktan hoşlanmadığınız bir işi profesyonel olarak yapmaya başlamış bulabilirsiniz. Ara sıra profesyonel yaşantınıza dışarıdan bakın ve aldığınız/almak üzere olduğunuz kararlarla kendinizi 1-2-3-5-10 yıl sonra nerede gördüğünüzü düşünün. Gireceğiniz/girmeyeceğiniz yol sizi ideallerinize yaklaştırır mı diye düşünerek hareket edin.