Создать боковое меню с подстраницами из существующей строки, используя PHP - PullRequest
1 голос
/ 07 декабря 2011

Я хочу создать боковое меню.У меня есть полное меню веб-сайта в переменной.Теперь я хочу собрать подстраницы / родителей текущей страницы.

В мою помощь у меня есть классы "предок" и "текущий".

См. Мой код ниже.Мне нужна помощь с Q1, Q2, Q3 и Q4.Пожалуйста, прокомментируйте, если это трудно понять, и я объясню лучше.

<?php


// this is the menu for the complete site
$menu = '
<ul>
<li class="ancestor">page1
    <ul class="child">
    <li>page11</li>
    <li class="parent">page12
        <ul class="child">
        <li>page111</li>
        <li class="current">page112</li>
        <li>page113</li>
        <li>page114</li>
        </ul>
    </li>
    <li>page13</li>
    <li>page14</li>
    </ul>
</li>
<li>page2</li>
<li>page3</li>
<li>page4</li>
</ul>
';



// I guess that DOM document is the right metodh for the job?
$doc = new DOMDocument();
$doc->loadHTML($menu);


$doc->removeChild($doc->firstChild); // remove doctype
$doc->replaceChild($doc->firstChild->firstChild->firstChild, $doc->firstChild); // remove <html><body></body></html>



// START
if ('Q1: check to see if li with class "current" has subpages or parent pages. With other words, determine if there shall be a sidebar menu or not')
{

    if ('Q2: If there is a li with class "ancestor", then get all the children of this class')
    {

    }

    elseif ('Q3: if there is no li with class "ancestor", then get all the children of "current" instead')
    {

    }


    // Q4 remove the first ul



    $wanted_li_s = $doc->saveHTML();
    $sidebar = '<ul class="new-class">'.$wanted_li_s.'</ul>';
} // END if has subpages

else
{
$sidebar = ''; // if there are no subpages sidebar menu should return nothing
}


?>

В приведенном выше примере я хочу, чтобы $ sidebar был таким же, как:

<ul class="new-class">
<li>page11</li>
    <li class="parent">page12
        <ul class="child">
        <li>page111</li>
        <li class="parent">page112</li>
        <li>page113</li>
        <li>page114</li>
        </ul>
    </li>
    <li>page13</li>
    <li>page14</li>
</ul>

1 Ответ

0 голосов
/ 09 декабря 2011

С помощью этого метода вы можете создать подменю easy in almoast для любой CMS (без изучения языка CMS).Все, что вам нужно сделать, это получить HTML-код в переменной и найти способ обнаружения подстраниц.

Все, что вам нужно, это включить http://simplehtmldom.sourceforge.net/ (думайте, что это как jQuery для PHP, выне пожалеете)

Вот пример создания подменю для пользовательских меню WordPress.

include('simple_html_dom.php');

$meny = wp_nav_menu( array(
'fallback_cb' => '' ,
'echo' => 0,
'container' => false,
'container' => '',
'items_wrap' => '%3$s'
));


$menu_string = str_get_html($meny);


foreach($menu_string->find('li[class=current-menu-item]') as $foreach_current_menu_item) // for each current-menu-item (only one of this)
{



if (strpos($foreach_current_menu_item->parent()->class,'sub-menu') !== false) // if you are on a subpage
{
    foreach($menu_string->find('li[class=current-menu-ancestor]') as $foreach_current_menu_item2) //
    {
    $sidebar_menu= $foreach_current_menu_item2;
    }
}



elseif (strpos($foreach_current_menu_item->last_child()->class,'sub-menu') !== false) // if you are on a head page WITH subpages
{
$sidebar_menu= $foreach_current_menu_item;
}



else // if you are on a head page WITHOUT subpages
{
$sidebar_menu = '';
}


}

// echo the menu where ever you want in your page
echo '<ul id="new-id-for-the-menu">'.sidebar_menu.'</ul>';

Чтобы заставить его работать на страницах 3-го уровня в меню боковой панели, вы можете использовать:

if (strpos($foreach_current_menu_item->parent()->class,'sub-menu') !== false) 
{
    $i = 0;
    foreach($menu_string->find('li[class=current-menu-ancestor]') as $foreach_current_menu_ancestor) 
    {
        if ($i == 0)
        {
        $sidomeny = $foreach_current_menu_ancestor;
        }
        $i++;
    }
}
...