Smarty özyinelemeli işlevi çağırmak nasıl?

1 Cevap php
$sql = "select menu_id , menu_name , parent_id from menu " ;
$dbc->setFetchMode(DB_FETCHMODE_ASSOC);
$res = $dbc->query($sql);
while($row = $res->fetchRow()){
    $menu[$row['parent_id']][$row['menu_id']] = $row['menu_name'];
}

function make_menu($parent)
{
    global $menu ;
    echo '<ul>';
    foreach($parent as $menu_id=>$menu_name)
    {
    	echo '<li>'.$menu_name ; 
    	if(isset($menu[$menu_id]))
    	{
    		make_menu($menu[$menu_id]) ;
    	}
    	echo '</li>';
    }
    echo '</ul>';
}
$P['menu_bilder_data'] = $menu[0] ; 
//menu :off
$smarty->register_function('make_menu' , 'make_menu') ;

ok i almak ve smarty geçmek için kod bölümü var.

Ben smarty ile özel bir kullanıcı fonksiyonu olarak benim make_menu fonksiyonu kayıtlı ve şablonda ben bu kodu vardır:

{make_menu parent_id=$P.menu_bilder_data}

I endeksi dosyasında $P dizisi geçiyorum. Bu çalışması gerekir ama bunu yerine baskılı iç içe uls bir dizi döndürür, özyinelemeli bir fonksiyon çünkü bana hiçbir şey verir; ben nasıl bu sorunu düzeltebilirim?

1 Cevap

The problem

The $Smarty->register_function() and {make_menu parent_id=$P.menu_bilder_data} causes the function to be called with ($params, &$smarty)
where $params =

array(
  'parent_id' => array(
     0 => array(
       1 => > "menu item 1",
)

Bu işlev bekler veri yapı değildir.

Solution

Siz "register_function" kullanmadan işlevini diyebiliriz

{$P.menu_bilder_data|@make_menu}

Pipe "|" işlevinin ilk bağımsız değişken olarak $ P ['menu_bilder_data'] geçecek. Ve "@" dizisi geçirmek için boru neden olur. "@" Olmadan işlevi dizideki tüm elemanlar için çağırdı olacaktır.

Just a tip

$ Parent_id için (bir dizidir) $ ebeveynden parametreyi değiştirin, tüm menü veriler global $ menüsünden kullanılabilir.

function make_menu($parent_id)
{      
  global $menu;
  if (!isset($menu[$parent_id])) {
     return;
  }
  $nodes = $menu[$parent_id];
  echo '<ul>';
  foreach($nodes as $menu_id => $menu_name)
  {
    echo '<li>'.$menu_name ; 
    make_menu($menu_id) ;
    echo '</li>';
  }
  echo '</ul>';
}

Smarty Gönderen:

{0|make_menu}