Posted by pontus_nilsson on February 12, 2009 at 11:15am
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
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
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 enStyle: Listunder 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/blockfö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 Sjösten
Tobias har förstås rätt.
Tobias har förstås rätt. Jag fick tunnelseende av kodsnutten. :)
Henrik Sjökvist // Sixshooter
Tack det där blev ganska
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
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
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(). Funktionenl()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
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
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
Jakob Persson – Leancept – Results-only digital and marketing consultants – Personal blog