Friday 26 January 2007 8:19:11 am
Hi, If you need to sort content based on attributes, you can use this approach: First, install the <b>sort template plugins</b>. I used them on eZ 3.8.6 and it was flawless (my thanks to the author). http://ez.no/community/contribs/template_plugins/arraysortoperator Once the extension is installed, you can use it like so:
{def $sorted_month_array=array()}
{foreach $months as $k => $v}
{set $sorted_month_array=$sorted_month_array|append(concat($v.data_map.month.value.0,'-',$k))}
{/foreach}
{set $sorted_month_array=$sorted_month_array|sort('numeric')}
In this case, I created an array of the attribute value (<i>$v.data_map.month.value.0</i>), a dash (<i>-</i>) that serves as a separator, and the array index (<i>$k</i>). Then, the <b>sort</b> template operator was used, with the numeric option - to ensure 11 came after 2. To access the array, you loop through the elements, exploding out the data from the strings and using it as an index into the array.
{* Loop through the sorted array and if the month is supposed to be displayed in the slot - display it *}
{def $bits=''}
{def $m=0}
{for 1 to 12 as $i}
<td>
{set $bits=$sorted_month_array[$m]|explode('-')}
{if $bits.0|eq($i)}
{node_view_gui content_node=$months[$bits.1] view='line' format='cell'}
{set $m=$m|inc}
{else}
{/if}
</td>
{/for}
In this case, the months were being displayed in a table, in a row of 12 cells. I wanted each month to go into the proper cell (January would be first, February second). The array did not necessarily have all 12 months - so the loop creates the 12 cells and decides whether to put the content in based on the content. <b>$bits</b> is the cross-reference. The first number is the month, the second is the position in the array (fetched). Hope this helps.
|