PHP-навигация, есть ли лучший способ сделать это?

Я новичок в использовании PHP, до этой навигации степень моего использования PHP была простой.

Я написал файл navigation.php, который динамически генерирует ссылки для навигации, используя переменные, извлеченные из массива внутри variable.php.

Общая цель состоит в том, чтобы добавлять/удалять ссылки, вложенные элементы навигации, вложенные вложенные элементы навигации, вложенные элементы вложенных элементов навигации только путем редактирования файла variable.php

Метод, который я использую для создания структуры HTML, кажется мне неуклюжим, он отлично работает, но мне кажется, что есть более простой способ сделать это...

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

Тем не менее, мои вопросы:

  1. Есть ли более простой способ сделать это?
  2. Есть ли способ генерировать мои динамически на основе наличия вспомогательной навигации?

Каждая страница имеет следующий код, который меняется в зависимости от страницы.

<?php $title = 'Home'; ?>

Мои переменные.php:

<!-- NAVIGATION ARRAY -->

<?php
$nav_mini = array(
    'Home' => 'index.php',
    'About' => 'about.php',
    'Services' => 'services.php'
    );
?>

<?php
$nav_main = array(
    'Home' => 'index.php',
    'About' => 'about.php',
    'Services' => 'services.php',
    'Portfolio' => 'contact.php',
    'Clients' => 'about.php',
    'Gallery' => 'services.php',
    'News' => 'services.php',
    'Contact Us' => 'contact.php'
    );
?>

<?php // SUB NAV ARRAYS

$nav_sub_about = array(
    'Our Team' => 'about.php'
    );

$nav_sub_michael = array(
    'Michael' => 'index.php',
    'Aaron' => 'about.php',
    'Kenny' => 'about.php',
    'David' => 'about.php'
    );

$nav_sub_services = array(
    'Get Found' => 'about.php'
    );

?>

Навигационный PHP-файл main-nav.php

    <?php 

        foreach ( $nav_main as $key => $value ) {

            echo "<li><a ";
                echo "class='"; // STARTS CLASS=
                if ( $title == $key) { 
                echo "active "; }// ADDS ACTIVE CLASS TO LINK OF CURRENT PAGE
            echo "' "; // END QUOTES FOR CLASS="


            echo "href='$value'>$key";

                if ( $key == "About") { // STARTS IF SEQUENCE FOR SUBNAV ARROWS
                    echo "<span class='arrow'> +</span>";}
                elseif ( $key == "Services") {
                    echo "<span class='arrow'> +</span>";}

            echo "</a>\n";  // END ANCHOR TAG FOR MAIN NAV LINKS



//----------------------------------------------------------------------------------------------------------//
// PLEASE START SUB-NAVS HERE ------------------------------------------------------------------------------//
// AT THIS POINT A NEW <LI> IS GENERATED FROM THE FIRST FOREACH, IF THE BELOW IS TRUE IT POPULATES A SUBNAV //      


        if ( $key == "About"){  // START SUBNAV FOR ABOUT
            echo "<ul class='main-sub-nav'>"; // THIS LINE WAS ADDED TO START THE <UL> FOR THE SUBNAV, IT ENDS ON LINE 14

            foreach ( $nav_sub_about as $key => $value ) {
                echo "<li><a href='$value'>$key";

                    if ( $key == "Our Team") { // STARTS IF SEQUENCE FOR SUBNAV ARROWS
                    echo "<span class='arrow'> +</span>";}

                echo "</a>\n"; // ENDS ANCHOR TAG FROM SUBNAV LI

                    // SUB-SUB-NAV STARTS HERE
                        if ( $key == 'Our Team') {
                        echo "<ul class='main-sub-sub-nav'>"; // THIS STARTS THE UL FOR SUB-SUB-NAV

                            foreach ($nav_sub_michael as $key => $value ) {
                        echo "<li><a href='$value'>$key</a></li>\n";
                    }
                    echo "</ul>"; // THIS ENDS THE SUB-SUB-NAV UL STARTED ON LINE 34
                echo "</li>";}// THIS IS THE END IF <LI> FROM THE SECOND FOREACH ON LINE 35

        }

        echo "</ul>"; // THIS WAS ADDED TO END THE SUBNAV <UL> STARTED ON LINE 11
        echo "</li>";} // THIS IS THE END OF THE <LI> FROM THE FIRST FOREACH ECHO FROM LINE 8

//----------------------------------------------------------------------------------------------------------//
// AT THIS POINT A NEW <LI> IS GENERATED FROM THE FIRST FOREACH, IF THE BELOW IS TRUE IT POPULATES A SUBNAV //

            if ( $key == "Services"){
                echo "<ul class='main-sub-nav'>"; // THIS LINE WAS ADDED TO START THE <UL> FOR THE SUBNAV, IT ENDS ON LINE 14

                foreach ( $nav_sub_services as $key => $value ) {
                    echo "<li><a href='$value'>$key</a></li>\n";}
                echo "</ul>"; // THIS WAS ADDED TO END THE SUBNAV <UL> STARTED ON LINE 11
                echo "</li>";} // THIS IS THE END OF THE <LI> FROM THE FIRST FOREACH ECHO FROM LINE 8



        } // THIS BRACKET ENDS THE ENTIRE SET OF PHP.  ITS PAIR IS ON LINE 19

?>

Общая цель состоит в том, чтобы добавлять/удалять ссылки, вложенные элементы навигации, вложенные вложенные элементы навигации, вложенные элементы вложенных элементов навигации только путем редактирования файла variable.php

Вот живой пример работы этой навигационной структуры... /а>


person Michael    schedule 14.02.2013    source источник
comment
С первого взгляда мне интересно, почему вы просто не используете многомерный массив или не используете php для написания html. И отвечая на ваш вопрос - да и да.   -  person Kai Qing    schedule 14.02.2013
comment
Я попробовал многомерный массив, но не смог заставить его работать, даже после просмотра другого кода. Несомненно, из-за недостатка знаний с моей стороны.   -  person Michael    schedule 14.02.2013


Ответы (2)


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

$menu_items = array(
    'Home' => 'index.php'
    'About' => array('about.php', 
         array('Our Team'=>'ourteam.php'),
     etc
    );
?>
  • Начните с <ul>
  • Перебрать заданный массив
  • Добавить <li>
  • Если is_string() добавляется один элемент <a href>
  • If is_array() there are sub items,
    • add the <a href>
    • отправьте второй элемент в эту функцию и добавьте возвращаемый html
  • закрыть </li>
  • закрыть </ul>
  • верни это

Одна функция обрабатывает все элементы, независимо от того, являются ли они основными или вспомогательными, и вызов ее один раз завершает ваш список, независимо от того, сколько у вас подсписков.

Теперь для вашего мини-меню просто выберите элементы из основного массива по их ключу (Главная, О программе, Услуги) перед созданием html с одной функцией.

person Popnoodles    schedule 14.02.2013
comment
Это имеет смысл. Можете ли вы привести пример того, как может выглядеть эта функция, или ссылку на что-нибудь, где я мог бы пройти через нее? Спасибо! - person Michael; 14.02.2013

Гораздо более чистое решение — построить навигацию с помощью многомерных массивов, а затем перебрать их. Если value массива является другим массивом, то вы знаете, что у него есть подменю.

person Webnet    schedule 14.02.2013