Normal koşullarda olması gerek gibi, nasıl bir şekilde çağırıyorsunuz acaba
TDKSozluk(htmlspecialchars($_GET['q']), 2, 1, 5);
böyle yapınca olmuyor mu ki?
Ben yine de opsiyonlu bir şeyler hazırladım :) Gelen kelimeye, anlama ve benzer kelimelere istediğiniz gibi limit koyabilirsiniz
<?php
/**
* @param $kelime
* @return string
* - PHP de sadece baş harfini büyük yapan Türkçe uyumlu fonksiyon olmadığı için kendimiz yazdık
*/
function mb_ucfirst($kelime): string
{
return mb_strtoupper(mb_substr($kelime,0, 1)) . mb_substr($kelime, 1);
}
/**
* @param string $kelime - Aranacak olan kelime
* @param string|false $kelimeLimit - Aranacak kelimenin kaç tane eş sesli anlamının döneceğini belirten parametre. false verilirse limit olmaz
* @param int $anlamLimit - Kelimenin en fazla kaç anlamı geri dönsün
* @param int $benzerLimit - Benzer kelimelerden en fazla kaç tane dönsün
* @return array
*/
function TDKSozluk(string $kelime, $kelimeLimit = false, int $anlamLimit = 2, int $benzerLimit = 10): array
{
$ch = curl_init("https://sozluk.gov.tr/gts?ara=$kelime");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false
]);
$sonuc = curl_exec($ch);
curl_close($ch);
$sonuc = json_decode($sonuc,true);
$return = [];
for ($i = 0; $i <= count($sonuc); $i++) { // En fazla kaç tane kelime anlamı dönsün limiti. Yani eş anlamlı kaç kelime görünsün. Verdiğim hak örneği, hâk ve ikinci sırada bulunan hak kelimesini döndürür varsayılan 2 ile
if ($kelimeLimit !== false) {if ($i == $kelimeLimit) break; }
if (isset($sonuc[$i])) {
$madde = mb_ucfirst($sonuc[$i]['madde']);
$return[$sonuc[$i]['kac']]['kelime'] = $madde;
for ($j = 0; $j < count($sonuc[$i]['anlamlarListe']); $j++) {
if ($j == $anlamLimit) break;
if (isset($sonuc[$i]['anlamlarListe'][$j])) {
$return[$sonuc[$i]['kac']]['anlamlar'][$j] = [
'anlam' => $sonuc[$i]['anlamlarListe'][$j]['anlam'],
'ozellik' => $sonuc[$i]['anlamlarListe'][$j]['ozelliklerListe'][0]['tam_adi'] ?? null // Sadece ilk sıradaki özelliğin değeri
];
}
}
$birlesikler = $sonuc[$i]['birlesikler'];
if (strlen($birlesikler)) {
$explode = explode(', ', $birlesikler);
$return[$sonuc[$i]['kac']]['birlesikler'] = array_slice($explode, 0, $benzerLimit); // Birleşik kelimelerden en fazla kaç tane geri dönsün
}
}
}
return $return;
}
$h = TDKSozluk('hak', 2, 1, 5);
print_r($h);
Bu sözlük meselesinde zamanında çok uğraşmıştım, mesele veriyi almak değil de onu tüm ayrıntılarıyla işlemek. Biraz mükemmeliyetçi olmaya çalışınca gerçekten öyle oluyor :)
Mesela elma gibi basit kelimelerde işiniz kolay, API dan gelen veri tek bir indis içeriyor. Ama hak
gibi bir kelimeden 4 farklı kelime dönüyor. Sizin kod yapınızla arayan kişi yalnızca anlamı toprak olan hâk
kelimesini görecek. Maksimum 3 sözlük verisinden kastınız dönen bu değerlerin sınırı mı? Öyle bile olsa yine eksiklik oluşacak :)
Örneğin yine gelen kelimenin bir anlam sınırlaması olacak mı, örneğin çıkmak
kelimesinin tam 56 farklı anlamı var. Bu kadar anlamı alt alta sıraladığınızda sözlük için sitede ayırdığınız kısım için görsel bir sorun oluşturacak mı?
Siz tam olarak hangi verileri işlemek istediğinizi biraz daha detaylı açıklayın, onları php ile işlemek işin en kolay kısmı :) Kıstas olarak hak
kelimesini kullanabilirsiniz.
Link
Sadece bu göründüğü şekliyle var ve kendi içerisinde bir bütün,özelleştirmesi epeyi bir zaman alır. Bu durumda autocomplete için size bütün kelime listesini gönderebilirim. Sorunuza yardım için de bilgisayara geçince bakacağım.
Şu an bilgisayarda olmadığım için bakamayacağım ama size şu adreste hazırlamış olduğum basit sözlük uygulamasını verebilirim. Hem veri tabanı hem de tdk api ile uyumlu çalışıyor
Aslında ekstra sortable kullanmanıza gerek yok. reorder eklentisi ile birlikte gelen row-reorder
event ini dinleyerek sıralama işlemini gerçekleştirebilirsiniz. Şöyle ki;
id değerinin yanında ilk sütunda order yani sıra değerini vermeniz gerek. Bu değer yeniden sıralamada işimize yarayacak. Sunucudan aldığınız veri olacak büyük ihtimal, yeniden düzenledikten sonra yine sunuuya göndereceğiz
id yi alırken yapılan split işlemlerine gerek olmaması için $(row).attr('id', 'data-'+dataid);
kodunuzu doğrudan $(row).attr('id', dataid);
hatta $(row).attr('id', data.id);
diye değiştirirseniz daha kulalnışlı olur, split kullanmaya gerek kalmaz. Bu kısımları yapabileceğiniz biliyorum o yüzden sadece ufak bir öneri :)
$(function () {
let table = $('#example').DataTable( {
rowReorder: {
snapX: true,
dataSrc: 0 // Bunun değeri zaten varsayılan olarak 0, yani sıralama işlemi tetiklendikten sonra geri dönen değerin sütun index değeri 0 olunca ilk sütundaki değer, 3 olunca da 4. sütundaki değer döner. Yani tabloda sıra değerini kaçıncı sütuan koyduysan o olarak ayarla
},
columnDefs: [
{ orderable: true, className: 'reorder', targets: 0 },
{ orderable: false, targets: '_all' } // Diğer bütün sıralamaları kapatır. Sıralama tablosu için ideal bir seçenek
],
scrollY: '63vh', // Bu iki ayarı açarsan bence datatable üzerinde sıralama işin daha kolay olacaktır
paging: false, // Bu iki ayarı açarsan bence datatable üzerinde sıralama işin daha kolay olacaktır
scrollX: true,
scrollCollapse: true,
rowCallback: (row, data, index) => {
$(row).attr('id', `data-${data[0]}`); // Bu bendeki statik örnek için, sen burayı değiştir
}
})
table.on( 'row-reorder', function (e, diff, edit) {
let sendData = [];
for (let i=0, ien = diff.length ; i < ien ; i++) {
let orderData = {
id: +$(diff[i].node).attr("id").split('-')[1],
newOrder: +diff[i].newData, // dataSrc değerinin belirlediği hücre değeri (başında artı var,yani sayı olmasını bekliyoruz, string to integer için)
oldOrder: +diff[i].oldData // dataSrc değerinin belirlediği hücre değeri (başında artı var,yani sayı olmasını bekliyoruz, string to integer için)
}
sendData.push(orderData)
}
if (sendData.length) { // Eğer sıralamadan bir değişiklik yapıldıysa sunucuya gönder
$.ajax('ajax.php',{
data: {
reOrder: sendData
},
method: 'POST'
})
}
})
})
Sonra bu veriyi sunucu tarafında döngü ile döndürüp newOrder değerlerini sql sorgusunda WHERE olarak id kullanarak döngü içerisinde db ye kaydet.
Elinizde gerekli data olunca bunu işleyebileceğinize eminim. Kolay gelsin :)
Bugün tevafuk o ki bana da datatable içerisinde sıralama lazım oldu. Ve rowreorder eklentisini kullanınca az buçuk hâkim oldum.
Mantık olarak bir satırı (tr) yer değiştirince bütün satırlara ait spesifik bir değerin o anki sırasını alıp sunucuya göndermek üzere bir mantığı var. Bu mantık üzerine olması gerekiyor. Şu an mobildeyim. Birkaç saat sonra benim çalıştığım kodları paylaşacağım.
Siz de bunun haricinde bir şey eklemek isterseniz ekleyin.
Haklısınız aslında ama dokümanlarda örneğin serverMethod ayarına ulaşamadım bir türlü ondan kafam karıştı :) Neyse gereksiz uzattım sanırım, biraz çözüm odaklı olalım.
Şöyle bir şey deneyin bakalım konsolda nasıl bir çıktı verecek
var o = $("#anasayfa-list").DataTable({
processing: true,
serverSide: true,
serverMethod: 'POST',
ajax: {
url: "/SayfaData/",
},
columns: [
{data: 'id'}
],
rowReorder: {
dataSrc: 'id',
selector: 'tr'
},
rowCallback: function (row, data) {
console.log(data.id)
},
});
Şöyle bir kendi kullandığım DataTables kodları ile karşılaştırdım, internette de biraz araştırma yaptım. Anladığım kadarıyla eski sürüm bir datatables kullanıyorsunuz. Son sürüm datatables ile daha anlaşılır şekilde yapabilirsiniz. https://datatables.net/
İllaki çalışır da benim bilgi dahilim dışında parametreler içeriyor sizdeki kodlar.