Как исправить проблему динамического множественного выпадающего меню в codeigniter? - PullRequest
0 голосов
/ 09 января 2011

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

private $Section = array();
function _menu($root){

    $this->db->select('id,title,p_id');

    $this->db->Where('p_id',$root);

    $this->db->Where('status','active');

    $this->db->Where('type','page');

    $this->db->order_by('sort');

    $query = $this->db->get('pages');

    foreach ($query->result() as $row)

    {

        $this->Section[] = '<ul>';

            $this->Section[] = '<li>';

            $this->Section[] = anchor('site/page/'.$row->id.'#cont_main',$row->title);

            $this->_menu($row->id);

            $this->Section[] = '</li>';

        $this->Section[] = '</ul>';

    }



    $query->free_result();

    return $this->Section;

}



//get menu tree    

function MenuTree(){

    return $this->_menu(0);

}

в вышеупомянутом _menu (), если у nav есть два или более дочерних элемента, он не отображается, потому что заполненный им источник дает дополнительные </ul> and <ul>. источник выглядит так

<ul>
<li><a href="#">menu 1</a>
    <ul>
        <li><a>menu 1 sub1</a></li>
    </ul>
    <ul>
        <li><a>menu 1 sub2</a></li>
    </ul>
</li>

пока я предполагаю получить:

<ul>
<li><a href="#">menu 1</a>
    <ul>
        <li><a>menu 1 sub1</a></li>
        <li><a>menu 1 sub2</a></li>
    </ul>
</li>

изм Я должен добавить меню в соответствии с дочерним элементом. изображение появляется во всех меню, у которых тоже нет потомка из-за дополнительных <ul></ul>, если я использую ul перед циклом. источник выглядит так.

<ul>
<li><a href="#">menu 1</a>
    <ul>
        <li><a>menu 1 sub1</a>
            <ul></ul>
        </li>
        <li><a>menu 1 sub2</a></li>
    </ul>
</li>

любая идея была бы заметна.

Ответы [ 2 ]

0 голосов
/ 09 января 2011

Вам нужно добавить свой ul вне цикла foreach И убедиться, что у вас уже есть результаты!

if ($query->num_rows() > 0) { // we actually have results, open a UL and loop to add the LIs
    $this->Section[] = '<ul>';
    foreach ($query->result() as $row) {
0 голосов
/ 09 января 2011

Вы используете

foreach ($query->result() as $row) {
   $this->Section[] = '<ul>';

, который, конечно, всегда отображает ul, поскольку он делает это для КАЖДОГО элемента. Вам необходимо разместить

$this->Section[] = '<ul>';

и это закрывающий блок вне цикла. Если вы хотите, чтобы он срабатывал только при наличии более одного родителя, оператор IF, который проверяет это и реагирует соответствующим образом, должен всем необходимым.


Похоже, проблема заключается в размещении ul. Вы могли бы сделать

function MenuTree() {
    return "<ul>" . $this->_menu(0) . "</ul>";
}

и полностью удалите упомянутый ul сверху, чтобы получить только внутренние петли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...