Giriş yapmadınız.

#1 29.01.2013 15:14:53

Pirovla
Üye
Kayıtlı: 26.12.2012
Mesajlar: 43

Bootstrapper Autocomplete

Merhaba,

Bir formum var ve bu formda, kitap alanına yazı yazıldığında otomatik veritabanından çekip en yakın seçenekleri göstermek istiyorum. Bunun için bu videoyu izleyerek bir şeyler yapmaya çalıştım ama beceremedim bir türlü.

Öncelikle, view dosyamdaki form satırı ve script:

<p>{{ Form::label('kitap', 'Kitap') }}</p>
{{ $errors->first('kitap', '<p class="error">:message</p>') }}
<p>{{ Form::text('kitap', Input::old('kitap'), array('class' => 'typeahead', 'data-provide'=>'typeahead') ) }} </p>
...
@section('script')
<script>
$(function() {
	$("#kitap").autocomplete({
		source: "/kitapcek",
		minLength: 2,
		select: function( event, ui ) {
			$('#kitap').val(ui.item.id);
		}
	});
});
</script>
@endsection

Bu da controller'daki db'den veri çekmeyi sağlayan kod:

public function get_kitapCek() {
	$veri = Input::get('kitap');
	$data = array();
	$query = DB::query("
		select *
		from kitap 
		where match (adi)
		against('+($veri)*' IN BOOLEAN MODE)
	");

	foreach ($query as $results => $kitap) {
		$data[] = array(
			'id' => $kitap->id,
			'value' => $kitap->adi,
		);
	}
	return json_encode($data);
}

Nerede hata yapıyo olabilirim?

Son düzenleyen Pirovla (29.01.2013 15:33:59)

Çevrimdışı

#2 30.01.2013 00:09:13

drlinux
Moderatör
Yer: İstanbul
Kayıtlı: 28.12.2012
Mesajlar: 98
Website

Yanıt: Bootstrapper Autocomplete

madem bootstrap kullanıyorsunuz typeheadı değerlendirmenizi öneririm.

ama madem bu şekilde kullanacaksanız şöyle olması gerekir:

<p>{{ Form::text('kitap', Input::old('kitap'), array('class' => 'typeahead', 'data-provide'=>'typeahead', 'id'=>'kitap') ) }} </p>

Neden çünkü selector $('#kitap') arıyor wink

Yine de tavsiyem :

http://twitter.github.com/bootstrap/jav … #typeahead


Man is a slow, sloppy and brilliant thinker; the machine is fast, accurate and stupid. ~ William M. Kelly

Çevrimdışı

#3 30.01.2013 03:07:22

Pirovla
Üye
Kayıtlı: 26.12.2012
Mesajlar: 43

Yanıt: Bootstrapper Autocomplete

Ne yaptığımı tam olarak bilmiyorum ama sanırım typeahead yapınca düzeldi birden. Minimum harf sayısını 2'den 1'e düşürmemin de etkisi olabilir smile

Ancak şimdiki sorun mesela "h" harfine basıyorum, altalta 3 tane h gösteriyor sadece. "a" harfine basıyorum, 2 tane a gösteriyor. Sorgum mu yanlış acaba?

Edit: aramayı source içindeki kelimeden yapıyormuş. Sorunu buldum, nasıl çözeceğimi bulmaya geldi sıra smile Source yerine ne yazmalıyım ki, site/kitapcek route'una post ile göndersin?

	$(function() {
		$("#kitap").typeahead({
			source: "kitapcek",
			minLength: 1,
			items: 8,
			select: function( event, ui ) {
				$('#kitap').val(ui.item.value);
			}
		});
	});

Son düzenleyen Pirovla (30.01.2013 03:20:11)

Çevrimdışı

#4 30.01.2013 10:47:50

drlinux
Moderatör
Yer: İstanbul
Kayıtlı: 28.12.2012
Mesajlar: 98
Website

Yanıt: Bootstrapper Autocomplete

hayır sorgunuz yanlış değil. array tipinizde bir sorun var. büyük ihtimalle. örnek olması açısından aşağıya bakabilirsiniz:

Controller:

->with('page_titles', Pages::where_page_status('deleted')->get('page_title'));
					
<input id="search_bar" class="filter input-mini span6" style="height:16px;font-size:11px;margin-bottom:0" type="text" placeholder="{{Str::title(__('pages.page_title'))}}" value="" />
<!-- Twitter Bootstrap Typhead-->
<?php
$titles=array();
foreach ($page_titles as $page_title) {
	$titles[]=$page_title->page_title;
}
$titles = '['.'"'.implode(", ", $titles).'"'.']';
$titles = str_replace(', ', '", "', $titles);

?>
<script type="text/javascript">
	$(document).ready(function() {
		var titles = <?php echo $titles; ?>;
		$('#search_bar').typeahead({source: titles});
		});
</script>

Son düzenleyen drlinux (30.01.2013 13:04:27)


Man is a slow, sloppy and brilliant thinker; the machine is fast, accurate and stupid. ~ William M. Kelly

Çevrimdışı

#5 01.02.2013 17:19:43

Pirovla
Üye
Kayıtlı: 26.12.2012
Mesajlar: 43

Yanıt: Bootstrapper Autocomplete

Anladığım kadarıyla burda öncelikle title kısmını çekip daha sonra, zaten çekilmiş olan veri içinde aratma yapıyor böyle. Ben anlık sorgulama yapmak istemiştim veritabanından, çünkü binlerce satır var ve her seferinde tekrar tekrar çekmesi yanlış olabilir ve yüklenmesi de uzun sürebilir gibi.

Sanırım şu linkteki kodu kullanıcam ama yine de beceremedim.

Son düzenleyen Pirovla (01.02.2013 19:38:57)

Çevrimdışı

#6 05.02.2013 18:50:11

drlinux
Moderatör
Yer: İstanbul
Kayıtlı: 28.12.2012
Mesajlar: 98
Website

Yanıt: Bootstrapper Autocomplete

Sizin yaptığınız yöntemle sunucu üzerindeki yük daha da artıyor. Çümkü her keyup ya da keypress eventında veritabanına bir sorgu gönderiyorsunuz. Oysa önceden tanımlanmış bir veri kümesi içinde arama yapmak her zaman için çok daha hızlı ve az yük getiren bir yöntem olur. Ancak bu mantık birden çok yerden sürekli veri girilen sistemler için elbette geçerli değil. Eğer böyle bir yapınız yoksa yukarıdakine benzer bir "statik" yöntem daha performanslı bir seçim olacaktır.

Son düzenleyen drlinux (05.02.2013 18:50:45)


Man is a slow, sloppy and brilliant thinker; the machine is fast, accurate and stupid. ~ William M. Kelly

Çevrimdışı

#7 07.02.2013 01:02:13

Pirovla
Üye
Kayıtlı: 26.12.2012
Mesajlar: 43

Yanıt: Bootstrapper Autocomplete

Şimdi elimde iki seçenek var.
1-) Binlerce satırı ilk sorguda çekmek ve sizin yönteminizle yapmak.
2-) Her tuşa basıldığında yeni sorgu yapmak ve gelen ilk 8-10 satırı çekmek.

Bana göre 2. seçenek daha mantıklı geliyor, öyle değil midir? Her sorgu yorar mı sunucuyu?

Çevrimdışı

#8 07.02.2013 03:18:03

drlinux
Moderatör
Yer: İstanbul
Kayıtlı: 28.12.2012
Mesajlar: 98
Website

Yanıt: Bootstrapper Autocomplete

Binlerce satırı çekmiyorsunuz aslında. Binlerce satırdan bazı alanları bir araya topluyorsunuz.
Benim bahsettiğim yöntemle:

Bir evi bir araçla taşıyor bunları evin en geniş odasına koyup üstündeki notlarınıza bakarak döşemek istediğiniz odaya uygun olanları seçiyorsunuz.

Sizin yönteminizle:

O (odaya göre kısmen) küçük aracın içinde kolileri yer değiştirerek odanıza uygun olanları bulup teker teker odaya çıkartıyorsunuz.

Hangisi sizi daha fazla yorardı?

Beni ikinci yöntem daha çok yorardı. Nakliyeciden ve taşıma elemanlarından dayak yeme riskini de göze almak istemiyorum. tongue

Son düzenleyen drlinux (07.02.2013 03:19:34)


Man is a slow, sloppy and brilliant thinker; the machine is fast, accurate and stupid. ~ William M. Kelly

Çevrimdışı

#9 07.02.2013 12:55:02

Pirovla
Üye
Kayıtlı: 26.12.2012
Mesajlar: 43

Yanıt: Bootstrapper Autocomplete

Bana da şöyle geliyor o zaman o smile
Evin önüne 1000 dairelik eşyayı dizip gerekeni almak mı yoksa evin ihtiyaçlarını belirledikçe eşyaları almak mı?

Çevrimdışı

#10 07.02.2013 13:02:14

drlinux
Moderatör
Yer: İstanbul
Kayıtlı: 28.12.2012
Mesajlar: 98
Website

Yanıt: Bootstrapper Autocomplete

Evin önüne dizmiyorsunuz evin içine eşyaları alıyorsunuz; eşyaları dışarıda bırakan yöntem sizin yönteminiz. Ben I/O dar boğazına maruz kalmamak için bahsettiğim yöntemi kullanıyorum. Uygulamaya x adet kullanıcının bağlanıp aynı anda x*n adet sorgu gönderdiğini düşününce bana çok mantıklı gelmiyor. En azından SQL tabanlı bir yapı için. Tartışmayı uzatmaya gerek yok. İstediğiniz yöntemi seçmek size kalmış. smile

Son düzenleyen drlinux (07.02.2013 13:02:44)


Man is a slow, sloppy and brilliant thinker; the machine is fast, accurate and stupid. ~ William M. Kelly

Çevrimdışı

#11 07.02.2013 13:16:26

Pirovla
Üye
Kayıtlı: 26.12.2012
Mesajlar: 43

Yanıt: Bootstrapper Autocomplete

Sistemi kurduktan sonra ikisini de sırayla deneyip bir test yapıcam sanırım smile Sonuçları açıklarım o zaman.

Çevrimdışı

#12 12.02.2013 15:14:32

drlinux
Moderatör
Yer: İstanbul
Kayıtlı: 28.12.2012
Mesajlar: 98
Website

Yanıt: Bootstrapper Autocomplete

Burada eklemem gereken bir - iki açıklama var. Esasen SQL tabanlı RDBMS'ler tamamen bu tarz sorgularda yüksek performans vermek üzere dizayn edilmişlerdir. Buradaki anahtar nokta sorgulanacak alanların index yapısıdır. Düzgün index yapısı + tutarlı relationlar = performans. Satır sayınız atıyorum 10K üzerinde ise hiç JSON filan uğraşmayın direk sorguyu sizin yönteminizle yapın derim smile


Man is a slow, sloppy and brilliant thinker; the machine is fast, accurate and stupid. ~ William M. Kelly

Çevrimdışı

Forum alt kısmı