io ho risolto un problema simile in questo modo:
Codice PHP:
    public function categories_tree($parent=0$spacer '') {
        
$sql "select * from categories where parent = $parent order by parent";
        
$result $this->db->fetchAll($sql);
        
$num count($result);
        
$spacer .= '- ';
        foreach(
$result as $k => $v) {
            if(
$num == || $result[$k]['parent'] == '0') {
                
$spacer '';
            }
            
$this->arrCategoriesTree[$result[$k]['id']] = $spacer.$result[$k]['category'];
            
$this->q++;
            
$this->categories_tree($result[$k]['id'], $spacer);
        }
        return 
$this->arrCategoriesTree;
    } 
questo metodo dentro una classe. $arrCategoriesTree è una variabile di classe, ovviamente, puoi valorizzarlo cosi:
Codice PHP:
private $arrCategoriesTree = array(); 
il metodo è richiamata da uno script php, il risultato lo passiamo a smarty:

Codice PHP:
$smarty->assign('loopcategorie'$c->categories_tree()); 
infine in smarty recupero il valore passato:

Codice PHP:
{foreach from=$loopcategorie key="keyvar" item="itemvar"}
    {
$itemvar}
{/foreach} 
se vuoi metterle in una select fa semplicemente cosi

Codice PHP:
<select>
{
html_options options=$loopcategorie}
</
select
nel mio caso il value è la colonna "id" della tabella.

non è esattamente il tuo caso ma secondo me puoi riadattarlo facilmente.
ciao