PHP рекурсивная функция для получения хлебных крошек - PullRequest
0 голосов
/ 29 октября 2010

Потратил на это несколько часов и ему нужна помощь специалиста.

У меня есть такая таблица:

[id] [name] [parent_id]
1    fruits  0
2    orange  1
3    lemon   2
4    steak   0

Когда я иду к лимону, я хочу, чтобы хлебная крошка была такой:

Главная> Фрукты> Апельсин> Лимон

И лимон не будет ссылкой, а остальное будет ссылкой.

Есть предложения?

Лучшее, что я нашел, это то, что оно превращает все в ссылку.

    function createPath($id, $category_tbl) {

        $s = "SELECT * FROM ".$category_tbl." WHERE ID = $id";
        $r = mysql_query($s);
        $row = mysql_fetch_array($r);

        if($row['parent_id'] == 0) {
            $name = $row['name'];
            return "<a href='index.php'>Admin</a> > <a href='index.php?folder_id=$id'>".$name."</a> > ";
        } else {
            $name = $row['name'];
            return createPath($row['parent_id'],$category_tbl). " <a href='index.php?folder_id=$id'>".$name."</a> >";
        }
    }

Ответ ниже от Эрвина дал мне то, что мне нужно, чтобы это сработало.

function createPath($id, $category_tbl, $except = null) {
    $s = "SELECT * FROM ".$category_tbl." WHERE ID = $id";
    $r = mysql_query($s);
    $row = mysql_fetch_array($r);
    if($row['parent_id'] == 0) {
        $name = $row['name'];
        if(!empty($except) && $except == $row['id']) {
            return "<a href='index.php'>Admin</a> &raquo; ".$name."";
        }
        return "<a href='index.php'>Admin</a> &raquo; <a href='index.php?folder_id=$id'>".$name."</a> &raquo; ";
    } else {
        if(!empty($except) && $except == $row['id']) {
            $name = $row['name'];
            return createPath($row['parent_id'],$category_tbl, false). " $name";
        } 
        $name = $row['name'];
        return createPath($row['parent_id'],$category_tbl, false). " <a href='index.php?folder_id=$id'>".$name."</a> &raquo;";
    }
}

Ответы [ 3 ]

3 голосов
/ 29 октября 2010

добавить третий параметр, который будет именем ссылки, которая предположительно не будет отображаться в теге

function createPath($id, $category_tbl, $except = null) {

    $s = "SELECT * FROM ".$category_tbl." WHERE ID = $id";
    $r = mysql_query($s);
    $row = mysql_fetch_array($r);

    if($row['parent_id'] == 0) {
        $name = $row['name'];  
        return "<a href='index.php'>Admin</a> > <a href='index.php?folder_id=$id'>".$name."</a> > ";
    } else {
        $name = $row['name'];
        if(!empty($except) && $except == $name)
            return createPath($row['parent_id'],$category_tbl, $except)." ".$name;
        }
        return createPath($row['parent_id'],$category_tbl, $except). " <a href='index.php?folder_id=$id'>".$name."</a> >";
    }
}
1 голос
/ 29 октября 2010

Разве этот код не возвращает результаты назад Lemon > Orange > Fruits > Home?Как предложил Джони, я бы поместил результаты в массив, а затем построил строку вывода.

Если у вас есть другая необходимая информация в базе данных, например, URL-адрес помимо folder_id=$id, вы можете сохранить его.as

$breadcrumb_items = array(
      0 => array( 'id' => '3', 
                  'title' => 'Lemon', 
                  'url' => 'LemonURL'
                ),
      1 => array( 'id' => '2', 
                  'title' => 'Orange', 
                  'url' => 'OrangeURL'
                ),
      2 => array( 'id' => '1', 
                  'title' => 'Fruit', 
                  'url' => 'FruitURL'
                ),
      3 => array( 'id' => '0', 
                  'title' => 'Home', 
                  'url' => 'HomeURL'
                )
);

Затем вызовите array_reverse, чтобы исправить порядок массивов и создать свой HTML.Обязательно установите флажок, чтобы последний элемент не превратился в ссылку.

$targetID = 3; //Lemon
foreach( $breadcrumb_items as $breadcrumb ){
...
   if( $breadcrumb['id'] != $targetID ){ //if the id does not match our target id
      //add link code
   }
...
}
0 голосов
/ 29 октября 2010

Вместо того, чтобы выводить его вовремя, создайте массив и буферизуйте результаты там. После того, как массив заполнен createPath(), вы можете вывести крошку с помощью цикла for, который затем знает, каким является последний элемент (count()) и может избежать создания ссылки из него.

...