我正在做同一个项目,但我还没有发现需要使用对象。数据库几乎负责结构,而 php 函数可以完成其余的工作。我的解决方案是为页面设置一个父字段,该字段指向一个节名称,就像您一样,但也为节表添加一个父字段,以便节可以指向其他节作为父节。它仍然非常易于管理,因为只有 2 个父字段需要跟踪,每个表一个,并且我可以在将来根据需要嵌套我的结构。
因此,对于动态树的创建,我将递归地检查父级,直到遇到 null,这表明当前元素位于 doc 根上。这样我们就不需要知道函数代码中当前页面结构的任何细节,我们可以专注于在mysql中添加和排列页面。由于另一张海报显示了一些菜单 html,我想我会在这里添加一个动态面包屑路径的示例,因为主题非常相似。
数据
// Sample 3 x 2 page array (php / html pages)
// D1 key = page name
// D2 element 1 = page name for menu display
// D2 element 2 = parent name (section)
$pages = Array
(
'sample-page-1.php' => Array ( 'M' => 'page 1', 'P' => null ),
'sample-page-2.php' => Array ( 'M' => 'page 2', 'P' => 'hello' ),
'sample-page-3.php' => Array ( 'M' => 'page 3', 'P' => 'world' )
);
// Sample 2 x 1 section array (parent directories)
// D1 key = section name
// D2 element = parent name (if null, assume root)
$sections = Array
(
'hello' => null,
'world' => 'hello'
);
$sep = ' > '; // Path seperator
$site = 'test.com'; // Home string
函数
// Echo paragraph to browser
function html_pp ( $text )
{
echo PHP_EOL . '<p>' . sprintf ( $text ) . '</p>' . PHP_EOL;
}
// Get breadcrumb for given page
function breadcrumb ( $page )
{
// Reference variables in parent scope
global $pages;
global $sections;
global $sep;
global $site;
// Get page data from array
$menu = $pages [ $page ] [ 'M' ];
$parent = $pages [ $page ] [ 'P' ];
if ( $parent == null )
{
$path = $site . $sep . $menu;
}
else
{
$path = $site . $sep . get_path ( $parent ) . $sep . $menu;
}
return $path;
}
// Trace ancestry back to root
function get_path ( $parent )
{
// Reference variables in parent scope
global $sections;
global $sep;
if ( $sections [ $parent ] == null )
{
// No more parents
return $parent;
}
else
{
// Get next parent through recursive call
return get_path ( $sections [ $parent ] ) . $sep . $parent;
}
}
用法
// Get breadcrumbs by page name
$p1 = 'sample-page-1.php';
$p2 = 'sample-page-2.php';
$p3 = 'sample-page-3.php';
html_pp ( $p1 . ' || ' . breadcrumb ( $p1 ) );
html_pp ( $p2 . ' || ' . breadcrumb ( $p2 ) );
html_pp ( $p3 . ' || ' . breadcrumb ( $p3 ) );
// or use foreach to list all pages
foreach ( $pages as $page => $data)
{
html_pp ( $page . ' || ' . breadcrumb ( $page ) );
}
输出
sample-page-1.php || test.com > 第 1 页
sample-page-2.php || test.com > 你好 > 第 2 页
sample-page-3.php || test.com > 你好 > 世界 > 第 3 页