Argument handler for terms restricted to vocabulary

  1. function taxonomy_combination_views_arguments()
  2. {
  3.   $arguments = array();
  4.   foreach (taxonomy_get_vocabularies() as $vocabulary) {
  5.     if($vocabulary->taxonomy_combination_show)
  6.     {
  7.       $arguments['tc_taxinvoc_' . $vocabulary->vid] = array(
  8.         'name' => t('Taxonomy: Term Name from ' . $vocabulary->name),
  9.         'handler' => 'views_handler_tc_taxinvoc',
  10.         'help' => t('The argument will filter by a taxonomy term name from the vocabulary ' . $vocabulary->name),
  11.       );
  12.     }
  13.   }
  14.   return $arguments;
  15. }
  16.  
  17. function vocab_id_from_typename($typename)
  18. {
  19.   return end(explode('_', $typename));
  20. }
  21.  
  22. function views_handler_tc_taxinvoc($op, &$query, $argtype, $arg = '') {
  23.   static $field = NULL;
  24. /*  drupal_set_message($op);
  25.   echo "\n<br>op<br>\n";
  26.   echo "$op<br>\n";
  27.   echo "query<br>\n";
  28.   print_r($query);
  29.   echo "argtype<br>\n";
  30.   print_r($argtype);
  31.   echo "arg<br>\n";
  32.   print_r($arg);
  33.   echo "<br>vocab id would be:<br>";
  34.   echo vocab_id_from_typename($argtype);*/
  35.   echo "<br>\n";
  36.   echo $op;
  37.   echo "<br>\n";
  38.   switch($op) {
  39.     case 'summary':
  40.       //$argtype has typename
  41.       //summary for the second one won't work
  42.       $tnum = $query->add_table('term_data', true);
  43.       $tablename = $query->get_table_name('term_data', $tnum);
  44.       $len = intval($arg);
  45.       $field = $fieldinfo['field'] = ($len <= 0 ? "$tablename.name" : "LEFT($tablename.name, $len)");
  46.  
  47.       $fieldinfo['fieldname'] = 'letter';
  48.       $query->add_field('tid', $tablename);
  49.       $query->add_where('%s.name IS NOT NULL', $tablename);
  50.       $vid = vocab_id_from_typename($argtype);
  51.       $query->add_where('%s.vid = %d', $tablename, $vid);
  52.       return $fieldinfo;
  53.       break;
  54.     case 'sort':
  55.       //no typename
  56.       //this looks ok, sorts summary by name.
  57.       $query->add_orderby('', $field, $argtype, 'letter');
  58.       break;
  59.     case 'filter':
  60.       //$argtype['type'] has typename
  61.       $len = intval($argtype['options']);
  62.      
  63.       $tnum = $query->add_table('term_node');
  64.       $tablename = $query->get_table_name('term_node', $tnum);
  65.  
  66.       $tnum = $query->add_table('term_data', true, 1, array('left' => array('table' => $tablename, 'field' => 'tid'), 'right' => array('field' => 'tid')));
  67.       $tablename = $query->get_table_name('term_data', $tnum);
  68.       $vid = vocab_id_from_typename($argtype['type']);
  69.       $query->add_where($tablename . '.vid = %d', $vid);
  70.      
  71.       if ($len <= 0) {
  72.         $query->add_where("%s.name = '%s'", $tablename, $arg);
  73.       } else {
  74.         $query->add_where("LEFT(%s.name, $len) = '%s'", $tablename, $arg);
  75.       }
  76.       break;
  77.     case 'link':
  78.       //$argtype has typename
  79.       //this is fine
  80.       return l($query->letter, "$arg/$query->letter");
  81.     case 'title':
  82.       //$argtype has typename
  83.       //I guess this is fine too, for now.
  84.       return check_plain($query);
  85.   }
  86. }