node.tpl.php içinde etiketleri yazdırma istek

Events happening in the community are now at Drupal community events on www.drupal.org.
uzmankodra's picture

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.

http://img819.imageshack.us/img819/5097/taxonomy.png

Comments

node.tpl.php dosyasındaki

bilvanisli's picture

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ş

uzmankodra's picture

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

bilvanisli's picture

şö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

pembeci's picture

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:

<?php
function 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:

<?php
 
print implode(",", $terms); // aralara virgul atarak tek string olarak birleştir - sonda virgul kalmaz
?>

Veyahut mesela sunum olarak theme ile uyumlu bir liste tercih edilirse:

<?php
 
print theme_item_list($terms);
?>

peki konuyla ilgili bir

uzmankodra's picture

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

pembeci's picture

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

uzmankodra's picture

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

pembeci's picture

taxonomy_get_tree yerine taxonomy_get_terms yazmışı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. $vid değ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>";
   }
?>