Bloglarda çokca rastladığımız bir özellik de etiket bulutu opsiyonudur. Yazıların sahip olduğu etiketler toparlanarak, yazı sıklığına göre font büyüklüğüne çevrilir ve ekrana bastırılır. CodeIgniter kullanarak etiket bulutu nasıl hazırlanır uygulama dosyaları da yayımlayarak anlatmaya çalışacağım.
Öncelikle üç tane veritabanı tablomuz olduğunu düşünelim. Bunlar yazıların tutulduğu posts tablosu, etiketlerin tutulduğu tags tablosu ile yazı ve etiketlerin ilişkilendirildiği tag_post tablosu olsun. Yazı içinde sadece yapılarını verdiğim bu tablolara değişkenler de girilmiş halleri, yazının sonunda verdiğim linkteki dosyada mevcuttur.
CREATE TABLE IF NOT EXISTS `tags` ( `id` int(11) NOT NULL auto_increment, `tag_title` varchar(40) default NULL, PRIMARY KEY (`id`), KEY `tag_title` (`tag_title`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ; CREATE TABLE IF NOT EXISTS `tag_post` ( `id` int(11) NOT NULL auto_increment, `tag_id` int(1) default NULL, `post_id` int(1) default NULL, PRIMARY KEY (`id`), KEY `tag_id` (`tag_id`), KEY `post_id` (`post_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=42 ; CREATE TABLE IF NOT EXISTS `posts` ( `id` int(11) NOT NULL auto_increment, `post_title` varchar(100) default NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Erwin Setiawan, S.Kom tarafından CodeIgniter için yazılmış buradaki tag_cloud isimli kütüphaneyi alıp application/libraries dizini altına tag_cloud.php dosyası adı ile kopyalayalım.
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
//tag_cloud.php
class Tag_cloud{
private $arrTags;
private $sort;
private $fMaks;
private $fMin;
/**
* konstruktor
* @param $arrTags tag array
* @param $sort Boolean sort by aphabet
* @param $fMaks Int maximum size of font
* @param $fMin Int minimum size of font
*/
function __construct($arrTags, $sort = true, $fMaks = 36, $fMin = 12){
if(!is_array($arrTags)){
exit('First Argument must array!');
}
$this->arrTags = $arrTags;
$this->sort = $sort;
$this->fMaks = $fMaks;
$this->fMin = $fMin;
}
/**
*Create and print tag cloud
*
*/
function show(){
$arrTags = $this->arrTags;
if ($this->sort){
//sort by aphabet
ksort($arrTags);
}
//maximum item
$jmlMaks = max(array_values($arrTags));
//minimum item
$jmlMin = min(array_values($arrTags));
//Range total max and min
$range = $jmlMaks - $jmlMin;
//avoid divide by zero
if ($range == 0){
$range = 1;
}
//for increment font tag size
$step = ($this->fMaks - $this->fMin)/$range;
$size = 0;
$arr_item=array();
$arr_jml=array();
$arr_size=array();
$out=array();
$n=0;
while (list($item, $jml)=each($arrTags)){
//increment font size
$size =round($this->fMin+(($jml-$jmlMin)*$step));
$arr_item[$n]=$item;
$arr_jml[$n]=$jml;
$arr_size[$n]=$size;
$n++;
}
$arr1 = array_values($arr_item);
$arr2 = array_values($arr_jml);
$arr3 = array_values($arr_size);
foreach($arr1 as $key1 => $value1) {
$out[(string)$value1][0] = $arr2[$key1];
$out[(string)$value1][1] = $arr3[$key1];
}
return $out;
}
}
Bu kütüphaneyi yüklerken, indeks adı etiket, değeri ise yazı sayısı olan bir dizi ile birlikte yüklememiz gereklidir. Maksimum ve minimum font büyüklüğü 36 ve 12 varsayılmıştır. Değiştirmek ise mümkündür. Kütüphanemizi yükledikten sonra application/models dizini altına tag_model.php isimli dosyamızı oluşturalım. Dosyamızın içeriği aşağıdadır.
<php
class Tag_model extends Model {
function Tag_model()
{
parent::Model();
}
function tag_clouds()
{
$this->db->select('t.tag_title as title, COUNT(*) as psys');
$this->db->join('tag_post tp','tp.tag_id = t.id');
$this->db->group_by('t.id');
$this->db->order_by('psys',"desc");
$query = $this->db->get('tags t', 20,0);
if($query->num_rows() >= 1) {
$result = $query->result_array();
foreach($result as $items)
{
$tags[$items['title']] = $items['psys'];
}
return $tags;
}else return FALSE;
}
}
Bu kod ile tags isimli tablomuzla tag_post tablomuzu birleştirip çektiğimiz değişkenleri kütüphanemize göndermek üzere indeks adı etiket, değeri ise yazı sayısı olan bir dizi haline getiriyor, controller dosyamıza gönderiyoruz. Controller dosyamız ise application/controllers dizini altına eklediğimiz etiket.php dosyasıdır ve içeriği aşağıdadır.
<php
class Etiket extends Controller {
function Etiket()
{
parent::Controller();
}
function index()
{
$this->load->model('Tag_model', 'Tag');
$this->load->library('tag_cloud', $this->Tag->tag_clouds());
$this->load->view('etiket_view');
}
}
Burada dikkat edeceğimiz nokta, kütüphanemizi yüklerken model dosyamızdan çektiğimiz dizini de gönderiyor olmamız. Eğer bunu iki ayrı adımda yapmak isterseniz tag_cloud.php isimli dosyamızdaki kütüphaneyi değiştirmeniz gereklidir. Kütüphanemizi yükledikten sonra application/views dizini altındaki etiket_view.php dosyamızı çağırıyoruz. Dosyamızın içeriği aşağıdadır:
<html>
<head>
<title>Etiket Bulutu Uygulaması</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h4 >Etiket Bulutu</h4>
<p style="width:200px;">
<?
$arr_tags=$this->tag_cloud->show();
foreach($arr_tags as $item => $value):
foreach ($value as $row => $val):
$jml=$value[0];
$size=$value[1];
endforeach;
?>
<a href="<?=base_url()?>tag/show/<?=$item?>" style="font-size:<?=$size?>px" title="<?=$jml?> adet <?=$item?> yazısı var.">
<?=$item?>
</a>
<?
endforeach;
?>
</p>
</body>
</html>
$this->tag_cloud->show() komutu ile ölçeklediğimiz dizini kütüphanemizden çekiyoruz. Sonra ekrana yazdırıyoruz. Bu yazıda geçen dosyaları çalışan bir uygulama olarak CI_etiket_bulutu.zip dosyası adı altında kaydettim, buradan indirebilirsiniz. Bu yazıyı hazırlamada kullandığım ilgili kütüphaneyi gönderen Ali Çetin`e teşekkür ederim.
Yazarı : Fatih BAZMAN | Yorum Ekle | Etiketler : Etiket bulut tag
Türkiye