Knowing the error, I started googling for answers but that exercise just made me run around in circles. Until I got to himerus' blog (he's also the guy working on the omega theme, you should check it out) and a drupal.org node.
With the solutions I started trying them out. I settled for the "custom" module solution. The first time I tried it, it didn't work right off the bat. Take a look at the code:
<?php // $Id$ /** * Implementation of hook_views_pre_render * This function is in place to filter out duplicate taxonomy terms * From listings. It will cycle each result, and store a new array of * unique terms, and when a duplicate is found, will unset that result * * @param $view */ function your_module_views_pre_render($view){ // first we make sure we are dealing with the correct view if ($view->name == "your_view_name") { // create our array for comparisons $unique_tids = array(); // let's cycle through each default result, and do some dirty stuff foreach($view->result AS $k => $result){ if(in_array($result->node_node_data_YOUR_FIELD__term_data_tid, $unique_tids) || !$result->node_node_data_YOUR_FIELD__term_data_tid) { /* we already have seen this TID in the results, so blow that crap away * also will blow away any that are empty for some odd reason */ unset($view->result[$k]); } else { // this is a term we haven't seen, so let's not blow it away, but add // it to our array of unique id's to present as the "true" result of this view $unique_tids[$k] = $result->node_node_data_YOUR_FIELD__term_data_tid; } } /* now, we have an accurate unique list of terms in $unique_tids * next, we cycle those to reorder the crap random ordering * since these tids were pulled from the nodes in the order they were * set to sort from the node type view */ $alpha_arr = array(); // cycle each of our unique tids, referencing the original key of the view->result array ($k) foreach($unique_tids AS $k => $tid) { // we need to grab the term now, not the tid to sort alpha $alpha_arr[$k] = strtolower($view->result[$k]->node_node_data_YOUR_FIELD__term_data_name); } // sort the array, maintaining the $k key so that we may again reference back to the original data asort($alpha_arr); // create new array of results to overwrite the current one $new_results = array(); /* cycle one last time now that we have unique terms, sorted alphabetically * the point of this is to now take our $k reference, and grab the original $view->result data * that references this item */ foreach($alpha_arr AS $v => $term_name) { $new_results[] = $view->result[$v]; } // get rid of the original result set unset($view->result); // replace it with our new, accurate result set $view->result = $new_results; } }
Take a look at the "your_view_name", node_node_data_YOUR_FIELD__term_data_name and node_node_data_YOUR_FIELD__term_data_tid items. It should be easy to figure out the "your_view_name" thing. Just replace it with name of your views.
The node_node_data_YOUR_FIELD__term_data_name and node_node_data_YOUR_FIELD__term_data_tid items is slightly different and made me to install a devel module to figure it out. Take a look at the $result array, I relized that I needed NOT to use the node_node_data_YOUR_FIELD__term_data_name or the node_node_data_YOUR_FIELD__term_data_tid but instead used a much shorter array key. So instead of "node_node_data_term_id__term_data_tid" use "term_id".
What's left is to turn on the module and flush the cache.
You should be golden!
No comments:
Post a Comment