Görseli PHP ile boyutlandırmak için örnek
1. Google'a "image library php" yazdığımda karşıma "PHP'de görüntü işlemek için en iyi 5 kütüphane" başlıklı bir yazı çıktı:
designbolts.com/2021/02/04/top-5-libraries-for-image-processing-in-php
2. Bu sayfada incelediğim kütüphaneler içinde biri gözüme kolay göründü: WideImage
wideimage.sourceforge.net
3. Diyelim ki şöyle bir form'dan PHP'ye görseli aktarıyorsunuz:
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="my_file">
<button type="submit">Yükle</button>
</form>
Butona basıldığında seçilen görsel upload.php sayfasına "my_file" key'iyle gönderilecek.
4. Görseli upload.php sayfasında yakalayıp kaydedin.
// Bu sayfayı json sonuç dönecek bir sayfa gibi düşünerek,
// kolay sonuç döndürmek için birkaç fonksiyon yazıyorum.
function sendJson($type, $message='') {
header('Content-Type: application/json; charset=utf-8');
echo json_encode(["type"=>$type, "message"=>$message]);
exit();
}
function sendError($message='') { sendJson("error", $message); }
function sendSuccess($message='') { sendJson("success", $message); }
// İşlemler buradan sonra başlıyor...
if(!isset($_FILES['my_file'])) sendError("Dosya bulunamadı.");
$fileName = basename($_FILES['my_file']['name']);
$fileSize = $_FILES['my_file']['size'];
$fileTmpName = $_FILES['my_file']['tmp_name'];
$fileType = $_FILES['my_file']['type'];
$fileExtension = strtolower(end(explode('.',$fileName)));
if (!in_array($fileExtension,['jpeg','jpg','png'])) sendError('Dosya uzantısı geçersiz. Lütfen jpg veya png dosya seçin');
if ($fileSize > 4 * 1024 * 1024) sendError('Dosya boyutu 4 mb üzerinde olamaz.');
$bigImagePath = 'images/'.$fileName; // Bu php dosyasının olduğu aynı yerde images klasörü de olmalı.
$smallImagePath = 'images/small/'.$fileName; // Bu php dosyasının olduğu aynı yerdeki images klasörü altında small klasörü de olmalı.
$uploaded = move_uploaded_file($fileTmpName, $bigImagePath);
if(!$uploaded) sendError('Dosya kaydedilemedi.');
5. WideImage kütüphanesini kullanarak görseli yeniden boyutlandırın ve ilgili klasörlerine kaydedin.
//... önceki kodlardan devam
include "libraries/WideImage.php"; // Bu php dosyasının olduğu aynı yerde libraries klasörü de olmalı. İçine de WideImage.php dosyası eklenmiş olmalı.
$bigImage = null;
$smallImage = null;
try {
$bigImage = WideImage::load($bigImagePath);
$smallImage = WideImage::load($bigImagePath);
}
catch (Exception $e) { sendError("Görsel upload edilememiş."); }
$bigImage = WideImage::load($bigImagePath);
$smallImage = WideImage::load($bigImagePath);
$bigImageResized = $bigImage->resize(1000, 1000, 'inside'); // Görseli 1000x1000 piksellik alana sığacak şekilde boyutlandırır.
$smallImageResized = $smallImage->resize(300, 300, 'inside'); // Görseli 300x300 piksellik alana sığacak şekilde boyutlandırır.
try {
$bigImageResized->saveToFile($bigImagePath);
$smallImageResized->saveToFile($smallImagePath);
}
catch (Exception $e) { sendError("Görsel boyutlandırma başarısız oldu."); }
Kodları test etmeden direkt buraya yazdım. WideImage sınıfını da hiç kullanmadım. Umarım bu şekilde çalışır.
6. Görseli değil, görselin ismini veritabanına kaydedin.
Görselin adı $fileName
değişkeninde bulunuyor. Veritabanına bağlanmak için kullanıyorsunuz bilmiyorum. PDO için örnek vereyim:
//...önceki kodlardan devam
$db = null;
try { $db = new PDO("mysql:host=localhost;dbname=test;charset=utf8", "root", "123456"); }
catch ( PDOException $e ){ sendError("Veritabanına bağlanılamadı."); }
$query = $db->prepare("INSERT INTO gorseller SET dosya_adi = :fileName");
$insert = $query->execute(["fileName"=>$fileName]);
if(!$insert) sendError("Görsel adı veritabanına yazılamadı.");
sendSuccess("Görsel başarıyla kaydedildi.");
Bu örneklerin yardımcı olacağını sanıyorum.
Eğer yanlış yazdığım bir yer bulursanız lütfen belirtin, bu gönderimi düzenleyeyim.
Sorunuzun cevabı şu gönderinizde mevcut sanıyorum:
prototurk.com/soru/jquery-ile-veri-guncelleme-js-kodunda-duzenleme
Evet, güncellenmeyecektir. Siz aslında #tablo1USDTRYdegisim elementine hep aynı değeri basıyorsunuz.
$source
adlı değişkende tuttuğunuz adrese bir istek atılıyor ve bu isteğe yanıt geldikten sonra front-end tarafında alış ve satış alanlarını dolduruyorsunuz. Bu alış-satış değerlerinin hesaplanmasını yine front-end tarafında javascript ile yapmalısınız.
$.getJSON('<?=$source?>', function(data) {
var alis = Number(data.data.ALTIN.alis);
var satis = Number(data.data.ALTIN.satis);
var kapanis = Number(data.data.ALTIN.kapanis);
var degisim = "%" + (((satis - kapanis) * 100) / satis).toFixed(2);
$("#tablo1USDTRYalis").html(alis);
$("#tablo1USDTRYsatis").html(satis);
$("#tablo1USDTRYdegisim").html(degisim);
});
Sizin kodunuzun neden çalışmadığının cevabı, sunucunun çalışma mantığında saklı.
Siz bu javascript kodunuzun bulunduğu php dosyasına erişmek istediğinizde, yani istek attığınızda,
- Önce sunucu bu dosyayı yukarıdan aşağıya okumaya başlar.
- PHP tag'ı gördüğü yerlerde php işlemlerini yapar ve buralara çıktılarını basar.
- Sunucu sayfayı okumayı bitirdiğinde artık PHP tagları içine yazdığınız hiçbir şey ortada yoktur. PHP tagları ortadan kalkmıştır. Bu tagların yerine, PHP'nin hesapladığı değerler siz elinizle sonuçları hesaplayıp düz yazıyla yazmışsınız gibi yazılmıştır.
- Sunucu size yanıtı gönderirken artık PHP ile bir bağınız kalmamıştır. İstek yapan tarayıcıya dümdüz bir metin gelir.
- Tarayıcı bu dümdüz metni alıp anlamlandırmaya çalışır. İçinde kendince yorumlayabileceği neler var diye yukarıdan aşağıya tarar. Tabii ki burada tarayıcı hiçbir PHP tag'ıyla karşılaşmaz. PHP taglarının yerinde çoktan hesaplanmış değerleri görür.
- Sıra sizin
$.getJSON()
fonksiyonunuza geldiğinde tarayıcının gördüğü şey'<?= $source ?>'
değil, onun yerinde hangi ifade olması gerekiyorsa odur. Aynı şekilde$("#tablo1USDTRYdegisim").html('<?= $hasdegisim ?>')
için de öyle. Aslında siz otomatik değişecek bi'şey yazdığınızı düşünürken tarayıcı o satıra geldiğinde gördüğü şöyle bi'şeydir:$("#tablo1USDTRYdegisim").html('0.231232')
. Böylece tarayıcı #tablo1USDTRYdegisim elementine hep aynı ifadeyi yazmaya çalışır. - Tarayıcılar PHP gibi sunucu taraflı dillerin kodlarını göremezler. Sadece PHP işini bitirdikten sonraki halini görebilirler. PHP'yi görselerdi bile çalıştıramazdı çünkü PHP yorumlamayı bilmiyorlar. Bu yüzden, isteğe yanıt döndüğünde, yani siz sayfayı gördüğünüzde artık PHP ile bağınız kalmamıştır. Geri kalan işlemleri ancak javascript'le halledebilirsiniz.
Style tanımlarken buna direk tanımlama yapabilir miyim?
Evet, React Native'de bir component'e inline olarak stil verebilirsiniz.
<View style={{ width:200, height:200, backgroundColor:"red" }} />
CSS'te misal .alan.kutu
tarzında tanımlama yapınca alan içindeki kutulara işlem yapıyoruz. React ile bu mümkün mü?
Evet, React ve React Native'de bir component'e birkaç stil verebilirsiniz. style
prop'una obje değil objeler içeren bir dizi göndermeniz yeterli.
<View style={[{ width:200, height:200, backgroundColor:"red" }, {borderWidth:1, borderColor:"blue"}]} />
Ama siz mesela ekrandaki tüm View'lerde belli bir stil kullanılsın istiyorsanız bunun yolu yok. Yani var ama duruma göre kod kalabalığı yaratır. Mesela MyView adında bir component oluşturur ve ona belli bir stil verirsiniz. Böylece bu component'i kullandığınız her yerde aynı stil geçerli olur.
const RedView = (props) => <View style={{backgroundColor:"red"}}>{props.children}</View>;
const BlueView = (props) => <View style={{backgroundColor:"blue"}}>{props.children}</View>;
const Screen = () => {
return (
<View>
<RedView><Text>Kırmızı Arkaplanlı View</Text></RedView>
<RedView><Text>Kırmızı Arkaplanlı View</Text></RedView>
<BlueView><Text>Mavi Arkaplanlı View</Text></BlueView>
<View><Text>Normal View</Text></View>
</View>
);
}
Alında title ile aynı yöntemle yapabilirsiniz.
Hatta aslında bir masterpage oluşturup sayfalarınızı buraya aktarmanız daha da güzel olur.
Böylece header.php, footer.php gibi ayrımlara gitmek zorunda kalmaz ve PHP-HTML ayrımını güçlendirmiş, MVC mantığına yaklaşmış olursunuz.
View sayfanıza göndereceğiniz verileri kendinizce organize edeceğiniz bir değişkene aktarın.
haber.php
$viewBag = [
'page' => "haber.php",
'title' => "Güncel Haberler",
'headTags' => [
'<link id="stylecall" rel="stylesheet" href="./css/haber.css" />',
'<link id="stylecall" rel="stylesheet" href="./css/baska.css" />'
],
'footTags' => [
'<script src="./js/haber.js"></script>',
'<div>İstenen herhangi bir kod</div>'
]
];
include("masterpage.php");
masterpage.php
<html>
<head>
<title><?=$viewBag['title']?></title>
<link id="stylecall" rel="stylesheet" href="./css/master.css" />
<?=implode($viewBag['headTags'])?>
</head>
<body>
<?php include($viewBag['page']) ?>
<script src="./js/jquery3.min.js"></script>
<script src="./js/master.js"></script>
<?=implode($viewBag['footTags'])?>
</body>
</html>
masterpage.php'de kullandığınız tüm $viewBag
key'lerini haber.php gibi sayfalarınızda oluşturmalısınız. Mesela haber.php'de footTags kısmına bi'şey eklemek istemiyorsanız bile footTags key'ini oluşturup boş dizi göndermelisiniz. Bu masterpage için bir standart oluşturmuş olacaksınız.
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