Sortera taxonomi efter count

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

Hej,

Jag försöker sortera en av mina vokabulärer efter hur många gånger varje term använts. Jag är osäker på hur jag får till detta.
Denna kod genererar en lista över mitt vokabulär men här printas de i den ordning de är inskrivna i taxonomin antar jag?

Hur sorterar jag listan efter hur många gånger termerna använts? Har sett drupal kommandot theme_list, är det den rätta vägen att gå?

<?php
  $vid
= 1;         /* <---- put correct vocabulary ID here <em>/
  $depth = 0;
  $terms = taxonomy_get_tree($vid);      /</em> need code from below to handle nesting <em>/
  print "<ul>";
  foreach ( $terms as $term ) {
      $count = db_result(db_query("SELECT COUNT(nid) FROM {term_node} WHERE tid = %d", $term->tid));
      if ($count) {   /</em> don't show terms with 0 count <em>/
         print "<li>".$term->name." (".$count.")</li>";
       }
   } /</em> end foreach */
 
print "</ul>";
?>

Comments

Det är väl bara att

henrrrik's picture

Det är väl bara att sortera med vanlig hederlig PHP.

Nåt i den här stilen t.ex (reservationer för ev. stavfel och annat, jag har inte provkört detta):

<?php
  $vid
= 1;         /* <---- put correct vocabulary ID here <em> */
 
$depth = 0;
 
$terms = taxonomy_get_tree($vid);     
 
$term_array = array();
 
  foreach (
$terms as $term ) {
   
$count = db_result(db_query("SELECT COUNT(nid) FROM {term_node} WHERE tid = %d", $term->tid));
    if (
$count) {   // don't show terms with 0 count
     
$term_array[$term->name] = $count;
    }
  }
 
arsort($term_array); // Sortera i omvänd ordning

 
print "<ul>";
  foreach (
$term_array as $sorted_name => $sorted_count) {
    print
"<li>". $sorted_name." (". $sorted_count .")</li>";
  }
  print
"</ul>";
?>

Henrik Sjökvist // Sixshooter

Underbara Views

tobiassjosten's picture

I vanlig ordning vill jag rekommendera Views. :)

Skapa en vy och lägg till ett argument, Taxonomy: Term. Action to take if argument is not present: sätter du till "Summary, sorted ascending". Under Validator options, Validator väljer du "Taxonomy term" och kryssar sedan för de vokabulär du vill använda. När du lagt till det argumentet ser du en Style: List under den, vilken du kan konfigurera för att få vyn att spotta ur sig information som du vill ha den, samt styra andra utseende-relaterade aspekter (klicka även på stjärnan till höger).

När vyn väl är klar så är frågan bara var och hur du vill presentera den för besökaren. Antagligen vill du använda ett block. Skapa isåfall bara en ny display, "Block", och gå därefter till admin/build/block för att konfigurera blocket.

Om du däremot vill presentera det på annat sätt kan du använda module_invoke('views', 'block', 'view', '<ditt blocknamn>') för att hämta ut ett objekt som innehåller ditt block, färdigrenderat och klart att printas ut. I annat fall kan du läsa vidare om mer avancerad Views-användning på Starting Views2 Documentation.


Tobias Sjösten | NodeOne

Tobias har förstås rätt.

henrrrik's picture

Tobias har förstås rätt. Jag fick tunnelseende av kodsnutten. :)

Henrik Sjökvist // Sixshooter

Tack det där blev ganska

pontus_nilsson's picture

Tack det där blev ganska bra. Dock listar den inte de mest använda taggarna först utan listan är xxx (1) xxx (3) xxx (2) osv.

Jag använder drupal 5 och hittar inte "Validator options, Validator", antar att det är samma som filter taxonomy vocabulary?

För att krångla till det ytterliggare :) så är vokabulären hierarkisk och jag vill bara ta ut lägsta nivån.

Tacksam för hjälp, har slitit i håret en del för att få igång detta.

//Pontus Nilsson, Digitalist

Fick inte till det med

pontus_nilsson's picture

Fick inte till det med hjälp av views. Jag modifierade Henriks kod på ett sätt som säkert inte är det snyggaste men denna kod tar ut taxonomitermer från första nivå i hierarkin och sorterar dem efter mest använda termer (länkade). Jag fick inte till länkar på något snyggt sätt, nedan fungerar i alla fall.

<?php
  $vid
= 1;   
 
$terms = taxonomy_get_tree($vid);    
 
$term_array = array();

  foreach (
$terms as $term )
    {
      if (
$term->depth == 0)
      {
     
$count = db_result(db_query("SELECT COUNT(nid) FROM {term_node} WHERE tid = %d", $term->tid));
            if (
$count)
            {  
// don't show terms with 0 count
         
$term_array[$term->name] = $count;          
           }
      }
  }

 
arsort($term_array); // Sortera i omvänd ordning

print "<div class='item-list'>";
  print
"<ul>";
  foreach (
$term_array as $sorted_name => $sorted_count)
  {
print
"<li>";

$tester = taxonomy_get_term_by_name($sorted_name);
$tester2 = $tester[0];
$tester3 = taxonomy_term_path($tester2);
$tester4 = drupal_get_path_alias($tester3);

print
l($sorted_name, $tester4) . ', ';

print
"($sorted_count)";
  print
"</li>";
  }
  print
"</ul>";
print
"</div>";
?>

//Pontus Nilsson, Digitalist

Ja, det är möjligt att det

henrrrik's picture

Ja, det är möjligt att det krävs lite hokus-pokus för att få Views att sortera efter antal förekomster.

Du kan använda en theme-funktion istället så blir andra halvan av koden lite prydligare:

<?php
...           

$items = array();

  foreach (
$term_array as $sorted_name => $sorted_count)
  {
   
$tester = taxonomy_get_term_by_name($sorted_name);
   
$tester2 = $tester[0];
   
$tester3 = taxonomy_term_path($tester2);
   
   
$items[] = array(
     
'data' => l($sorted_name, $tester3) . ", ($sorted_count)",
     
'class' => '', // Här kan du lägga till en class om du vill.
   
);
  }

print
theme('item_list', $items);

?>

Jag tog bort drupal_get_path_alias(). Funktionen l() fixar det själv.

Antar att du kör det här i ett PHP-block eftersom du använder print. Jag rekommenderar starkt att du gör en liten modul av det istället. Då slipper du ha kod i databasen och det blir mycket enklare att underhålla. Det är ett bra sätt att komma igång med lite modulbyggande också.

Henrik Sjökvist // Sixshooter

Tack, nu har jag städat i

pontus_nilsson's picture

Tack, nu har jag städat i koden.

När jag ändå är igång kan theme('item_list', $items); spotta ut en tabell istället? Jag skulle vilja ha resultatet som kolumner term | antal förekomster
Eller ska jag använda CSS för att styla upp <li> och <ul> taggarna theme('item_list', $items) spottar ut?

//Pontus Nilsson, Digitalist

En lösning med

solipsist's picture

En lösning med Context-modulen är lättare att underhålla då den inte innebär en massa PHP-kod utspridd i block. Nu när du fått detta att funka rekommenderar jag du försöker göra det med Context-modulen istället.

Du kan använda theme('table',...) för att göra en tabell:
http://api.drupal.org/api/function/theme_table/6


Jakob Persson - NodeOne

Sweden

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds:

Hot content this week