node.tpl.php sayfasında içerikle ilgili etiketleri yazdıran bir kod var. Bu kodda şöyle bir değişiklik yapmak istiyorum. Misal etiketleri ekrana getirirken, taxonomyde etiketler seviyeye göre ekrana basılsın. daha açık anlatmam gerekirse misal A Üst kategorisinin altında B alt kategoirisi olsun , C de B nin Alt Kategorisi olsun. İçerik girerken C kategorisi etiket olarak seçilmiş olsun. Doğal olarak üst kategorilerde içerikle etiketlenmiş oldu. Bu durumda aşağıda ki kod etiketleri ekrana getirirken C etiketini yazdırmasın. Yani en alt kategori hiç bir zaman yazdırılmasın. Şartı şu şekilde de düşünebiliriz yalnızca "child" yani çocuk alt kategorisi olan kategorileri ekrana getirilebilir. Nasıl yapacağımı düşündüm düşündüm bulamadım. Bilgilerini yardımlarını paylaşanlara şimdiden teşekkürler. alt kategorisi olanlar alt seviyedeki kategoriyi ekrana getirmesin.
Comments
node.tpl.php dosyasındaki
node.tpl.php dosyasındaki değişkenler değerlerini ilgili eklentiden ya da genellikle template.php dosyasından alırlar. Büyük ihtimalle kullandığın temanın template dosyasında "function phptemplate_preprocess_node(&$vars) " fonksiyonu vardır. yoksa da böyle bir fonksiyon ekle. Fonksiyonda
$vars['terms']değerine yaptığın işlemin sonucunu yükle. Bu fonksiyon varsa da yine aynı şekilde$vars['terms']değerini değiştirirsin. Ayrıca bu fonksiyonda, node.tpl.php sayfasında kullandığın tüm değişkenleri değiştirebilirsin. Örn: "$vars['submitted']". Buradan da anlaşıldığı gibi page.tpl.php için "preprocess_page(&$vars)"... gibi bütün tpl lerinle oynayabilirsin.Örnek(deneme):
function phptemplate_preprocess_node(&$vars) {
$vid=1;// Buradaki 1 sayısı sözlük id. Önemli yani. Sendeki başkaysa değiştirirsin.
$term_delimiter=", ";
$term_items="";
$terms = taxonomy_node_get_terms_by_vocabulary($vars['node'], $vid);
if ($terms) {
foreach ($terms as $term) {
$velet=taxonomy_get_children($term->tid, $vid, 'tid');
if($velet){ //Bunun çocuğu var. Yani bunu yazdırıyoruz.
$term_link = l($term->name, taxonomy_term_path($term), array('attributes' => array('rel' => 'etiket', 'title' => $term->description)));
$term_items .= $term_link . $term_delimiter ;
}
}
}
$vars['terms'] =$term_items;
}
bilvanlisli harika iş
bilvanlisli harika iş çıkardın bence. $vid=1;// acaba buradaki kategorileri çoğoltmamız mümkün mü ? misal $vid=1,2,3,4; gibi...
şöyle yapabiliriz: function
şöyle yapabiliriz:
function phptemplate_preprocess_node(&$vars) {
$vocabularies = taxonomy_get_vocabularies($vars['node']->type);
$term_delimiter=", ";
$term_items="";
foreach ($vocabularies as $vocabulary) {
$terms = taxonomy_node_get_terms_by_vocabulary($vars['node'], $vocabulary->vid);
if ($terms) {
foreach ($terms as $term) {
$velet=taxonomy_get_children($term->tid, $vocabulary->vid, 'tid');
if($velet){ //Bunun çocuğu var. Yani bunu yazdırıyoruz.
$term_link = l($term->name, taxonomy_term_path($term), array('attributes' => array('rel' => 'etiket', 'title' => $term->description)));
$term_items .= $term_link . $term_delimiter ;
}
}
}
}
$vars['terms'] =$term_items;
}
bu kodda oynamalar yaparak her sözlük için farklı listeler de oluşturabilirsin. bu kodda hepsini aynı listede gösteriyor.
İyileştirme
Yukarıdaki kod son terimden sonra gereksiz bir virgul basar yanılmıyorsam. Prensip olarak zaten preprocess fonksiyonlarında sunumla (presentation, nasıl gösterileceği) ilgili tercih yapmamak bunu theme dosyalarına bırakmakta fayda var. Preprocess sadece veriyi hazırlamalı. Yani bu örnek özelinde ilgili terimleri bir diziye toplamak sonra node.tpl.php dosyasında bu diziyi isteğe göre bastırmak daha uygun.
Demeye çalıştığım:
<?phpfunction phptemplate_preprocess_node(&$vars) {
$vocabularies = taxonomy_get_vocabularies($vars['node']->type);
$term_items= array(); // değişti
foreach ($vocabularies as $vocabulary) {
$terms = taxonomy_node_get_terms_by_vocabulary($vars['node'], $vocabulary->vid);
if ($terms) {
foreach ($terms as $term) {
$velet=taxonomy_get_children($term->tid, $vocabulary->vid, 'tid');
if($velet){ //Bunun çocuğu var. Yani bunu yazdırıyoruz.
$term_link = l($term->name, taxonomy_term_path($term), array('attributes' => array('rel' => 'etiket', 'title' => $term->description)));
$term_items[] = $term_link; // değişti
}
} // foreach $terms
} // if
} // foreach $vocabularies
$vars['terms'] =$term_items; // dizi olarak tpl dosyalarına geçir
}
?>
Daha sonra node.tpl.php dosyasının ilgili kısmında:
<?phpprint implode(",", $terms); // aralara virgul atarak tek string olarak birleştir - sonda virgul kalmaz
?>
Veyahut mesela sunum olarak theme ile uyumlu bir liste tercih edilirse:
<?phpprint theme_item_list($terms);
?>
peki konuyla ilgili bir
peki konuyla ilgili bir yardım daha rica edicem senden pembeci. sadece belirteceğim bir sözlüğün içindeki terimleri nasıl listeyebilirim. parent term child term önemsemeden. teşekkürler.
taxonomy_get_tree
Aradığın fonksiyon şu olsa gerek : taxonomy_get_tree
Terim nesnelerini düz liste olarak bir diziye atıyor. Her terim nesnesinde 'name' sana terim ismini veriyor. 'parent' ve 'depth' sayesinde ise terim hiyerarşinin neresinde bulabilirsin. Terim dizisini aralarda virgüllü bastırmak için hazır bir api fonksiyonu varmış 6.x'den itibaren: taxonomy_implode_tags.
Özetlersek (test etmedim):
<?php$vid = 12; // ilgilendiğimiz sözlük (vocabulary)
$terms = taxonomy_get_terms($vid);
// print "<pre>"; print_r($terms); print "</pre>"; // nasıl bir diziymiş görmek istersen
$str = taxonomy_implode_tags($terms);
print $str;
// veyahut alt alta yazdırmak istersek
foreach ($terms as $t) {
print $t->name . "<br>";
}
?>
pembeci verdiğin kod u node
pembeci verdiğin kod u node tpl içinde kullandım hata verdi. verdiğin bu kodu tam olarak hangi dosyada ve tam olarak nasıl kullanmam gerek. anlayabileceğim şekilde tekrar kod yazarmısın?
Benim hatam
taxonomy_get_treeyerinetaxonomy_get_termsyazmışım. node.tpl'de terimleri nerede yazdırmak istiyorsan o noktada kullanabilirsin bu kodu (denedim oldu). Her node'da gözükmesini istemiyorsan page.tpl'de uygun bir yer olabilir. Sen nerelerde gözüksün istiyorsun? div'le sarmalayıp uygun bir sınıf ile de stilini ayarlayabilirsin.$viddeğerini değiştirmeyi unutma. Bir daha hata verirse hata mesajı ve drupal sürümünü gönder buraya.print_rli satırı açıp onun da çıktısını göndermen iyi olur.<?php$vid = 1; // ilgilendiğimiz sözlük (vocabulary)
$terms = taxonomy_get_tree($vid); // değişti
// print "<pre>sonuç: <br>"; print_r($terms); print "</pre>"; // nasıl bir diziymiş görmek istersen
$str = taxonomy_implode_tags($terms);
print $str . "<br>";
// veyahut alt alta yazdırmak istersek
foreach ($terms as $t) {
print $t->name . "<br>";
}
?>