Intereting Posts
Почему частные методы не работают с полиморфизмом? Пользовательский модуль Magento, Неустранимая ошибка: вызов функции-члена setFormAction () Как нарисовать фигуру с помощью части изображения в php Загрузка URL-адреса PHP во Flash AS3 php-скрипты получают значение узла, если оно равно заданному значению; изменение значения узла имеет один и тот же родительский узел как я могу получить доступ к моему приложению laravel с другого компьютера? как подсчитать количество пикселей в изображении (php) Как написать выражение регулярного выражения, которое заменяет значение привязки и ссылок сообщение на стене страницы поклонника как страница с другого сайта PHP PHP – вызов функции из img src file_get_contents нет кеширования? kohana3.0 как полностью удалить файл изображения? как отправить тип входного файла через javascript в модулях joomla Что это за строка? Как я неэтериализую эту строку? Получить записи Cname с помощью NetDNS или get_dns_record

Как добавить class = 'active' в html-меню с php

Я хочу поместить мою html-навигацию в отдельный php-файл, поэтому, когда мне нужно ее отредактировать, мне нужно только отредактировать ее один раз. Проблема начинается, когда я хочу добавить класс активным на активную страницу.

У меня есть три страницы и один общий файл.

common.php:

<?php $nav = <<<EOD <div id="nav"> <ul> <li><a <? if($page == 'one'): ?> class="active"<? endif ?> href="index.php">Tab1</a>/</li> <li><a href="two.php">Tab2</a></li> <li><a href="three.php">Tab3</a></li> </ul> </div> EOD; ?> 

index.php: все три страницы идентичны, за исключением того, что их страница $ отличается на каждой странице.

  <?php $page = 'one'; require_once('common.php'); ?> <html> <head></head> <body> <?php echo $nav; ?> </body> </html> 

Это просто не сработает, если я не ставил свою навигацию на каждую страницу, но тогда вся цель отделения навигатора со всех страниц разрушена.

Это то, что я хочу сделать даже возможным? Что я делаю не так?

благодаря

EDIT: При этом код php внутри li не работает, он просто печатается, как если бы он был html

Ваш код index.php верен. Я включаю обновленный код для common.php ниже, тогда я объясню различия.

 <?php $class = ($page == 'one') ? 'class="active"' : ''; $nav = <<<EOD <div id="nav"> <ul> <li><a $class href="index.php">Tab1</a>/</li> <li><a href="two.php">Tab2</a></li> <li><a href="three.php">Tab3</a></li> </ul> </div> EOD; ?> 

Первая проблема заключается в том, что вам нужно убедиться, что объявление конца для вашего heredoc – EOD; – не имеет отступов. Если он отступил, вы получите ошибки.

Что касается вашей проблемы с кодом PHP, который не работает в инструкции heredoc, это потому, что вы смотрите на это неправильно. Использование инструкции heredoc не совпадает с закрытием тегов PHP. Таким образом, вам не нужно пытаться их повторно открыть. Это ничего не сделает для вас. Способ работы синтаксиса heredoc заключается в том, что все между открытием и закрытием отображается точно так же, как написано, за исключением переменных. Они заменяются соответствующим значением. Я удалил вашу логику из heredoc и использовал третичную функцию, чтобы определить класс, чтобы это стало легче видеть (хотя я не верю, что любые логические утверждения будут работать в heredoc в любом случае)

Чтобы понять синтаксис heredoc, это то же самое, что и включение в двойные кавычки («), но без необходимости экранирования. Таким образом, ваш код также может быть написан следующим образом:

 <?php $class = ($page == 'one') ? 'class="active"' : ''; $nav = "<div id=\"nav\"> <ul> <li><a $class href=\"index.php\">Tab1</a>/</li> <li><a href=\"two.php\">Tab2</a></li> <li><a href=\"three.php\">Tab3</a></li> </ul> </div>"; ?> 

Это будет делать то же самое, просто написано несколько иначе. Другое отличие между heredoc и строкой состоит в том, что вы можете выйти из строки в середине, где вы не можете в heredoc. Используя эту логику, вы можете создать следующий код:

 <?php $nav = "<div id=\"nav\"> <ul> <li><a ".(($page == 'one') ? 'class="active"' : '')." href=\"index.php\">Tab1</a>/</li> <li><a href=\"two.php\">Tab2</a></li> <li><a href=\"three.php\">Tab3</a></li> </ul> </div>"; ?> 

Затем вы можете включить логику непосредственно в строку, как вы изначально предполагали.

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

почему бы вам не сделать это так:

на страницах:

 <html> <head></head> <body> <?php $page = 'one'; include('navigation.php'); ?> </body> </html> в <html> <head></head> <body> <?php $page = 'one'; include('navigation.php'); ?> </body> </html> 

в navigation.php

 <div id="nav"> <ul> <li> <a <?php echo ($page == 'one') ? "class='active'" : ""; ?> href="index1.php">Tab1</a>/</li> <li> <a <?php echo ($page == 'two') ? "class='active'" : ""; ?> href="index2.php">Tab2</a>/</li> <li> <a <?php echo ($page == 'three') ? "class='active'" : ""; ?> href="index3.php">Tab3</a>/</li> </ul> </div> 

Фактически вы сможете контролировать, где на странице, на которую вы отправляете навигацию, и какие параметры вы передаете ей.

Позже отредактируйте: исправлена ​​синтаксическая ошибка.

Это очень простое решение этой проблемы.

 <ul> <li class="<?php if(basename($_SERVER['SCRIPT_NAME']) == 'index.php'){echo 'current'; }else { echo ''; } ?>"><a href="index.php">Home</a></li> <li class="<?php if(basename($_SERVER['SCRIPT_NAME']) == 'portfolio.php'){echo 'current'; }else { echo ''; } ?>"><a href="portfolio.php">Portfolio</a></li> <li class="<?php if(basename($_SERVER['SCRIPT_NAME']) == 'services.php'){echo 'current'; }else { echo ''; } ?>"><a href="services.php">Services</a></li> <li class="<?php if(basename($_SERVER['SCRIPT_NAME']) == 'contact.php'){echo 'current'; }else { echo ''; } ?>"><a href="contact.php">Contact</a></li> <li class="<?php if(basename($_SERVER['SCRIPT_NAME']) == 'links.php'){echo 'current'; }else { echo ''; } ?>"><a href="links.php">Links</a></li> </ul> 

Что будет выводить

 <ul> <li class="current"><a href="index.php">Home</a></li> <li class=""><a href="portfolio.php">Portfolio</a></li> <li class=""><a href="services.php">Services</a></li> <li class=""><a href="contact.php">Contact</a></li> <li class=""><a href="links.php">Links</a></li> </ul> 

Я думаю, вам нужно поставить ваш $page = 'one'; выше require_once. В противном случае я не понимаю вопроса.

Я знаю, что это старо, но ни один из этих ответов не очень хорош (sry ppl)

ЛУЧШИЙ способ сделать это (без написания свернутых классов) – сравнить текущий $ _SERVER ['REQUEST_URI'] с href ссылки. Ты почти там.

Попробуй это. (Взято из http://ma.tt/scripts/intellimenu/ )

 $nav = <<<EOD <div id="nav"> <ul> <li><a href="index.php">Tab1</a></li> <li><a href="two.php">Tab2</a></li> <li><a href="three.php">Tab3</a></li> </ul> </div> EOD; $lines = explode("\n", $nav); foreach($lines as $line) { if(preg_match('/href="([^"]+)"/', $line, $url)) { if(substr($_SERVER['REQUEST_URI'], 0, 5) == substr($url[1], 0, 5)) { $line = str_replace('><a', ' class="current-menu-item"><a', $line); } } echo $line . "\n"; } 

Почему бы вам не создать функцию или класс для этой навигации и не разместить там активную страницу в качестве параметра? Таким образом, вы бы назвали это, например:

 $navigation = new Navigation( 1 ); 

или

 $navigation = navigation( 1 ); 
  1. $page='one' должно произойти, прежде чем require_once() не будет после. Слишком поздно – код уже требуется, и $nav уже определен.

  2. Вы должны использовать include('header.php'); и include('footer.php'); вместо того, чтобы на раннем этапе устанавливать переменную $nav . Это повышает гибкость.

  3. Сделайте больше функций. Что-то вроде этого действительно облегчает работу:

     function maybe($x,$y){return $x?$y:'';} function aclass($k){return " class=\"$k\" "; } 

    то вы можете написать свое «условие» следующим образом:

     <a href="..." <?= maybe($page=='one',aclass('active')) ?>> .... 
 CALL common.php <style> .ddsmoothmenu ul li{float: left; padding: 0 20px;} .ddsmoothmenu ul li a{display: block; padding: 40px 15px 20px 15px; color: #4b4b4b; font-size: 13px; font-family: 'Open Sans', Arial, sans-serif; text-align: right; text-transform: uppercase; margin-left: 1px; color: #fff; background: #000;} .current .test{ background: #2767A3; color: #fff;} </style> <div class="span8 ddsmoothmenu"> <!-- // Dropdown Menu // --> <ul id="dropdown-menu" class="fixed"> <li class="<?php if(basename($_SERVER['SCRIPT_NAME']) == 'index.php'){echo 'current'; }else { echo ''; } ?>"><a href="index.php" class="test">Home <i>::</i> <span>welcome</span></a></li> <li class="<?php if(basename($_SERVER['SCRIPT_NAME']) == 'about.php'){echo 'current'; }else { echo ''; } ?>"><a href="about.php" class="test">About us <i>::</i> <span>Who we are</span></a></li> <li class="<?php if(basename($_SERVER['SCRIPT_NAME']) == 'course.php'){echo 'current'; }else { echo ''; } ?>"><a href="course.php">Our Courses <i>::</i> <span>What we do</span></a></li> </ul><!-- end #dropdown-menu --> </div><!-- end .span8 --> add each page <?php include('common.php'); ?> 
  <ul> <li><a <?php echo ($page == "yourfilename") ? "class='active'" : ""; ?> href="user.php" ><span>Article</span></a></li> <li><a <?php echo ($page == "yourfilename") ? "class='active'" : ""; ?> href="newarticle.php"><span>New Articles</span></a></li> </ul> 

Решение, которое я использую, является следующим и позволяет вам установить активный класс на php-страницу.

Дайте каждому из ваших пунктов меню уникальный класс, я использую .nav-x (nav-about, here).

<li class="nav-item nav-about"> <a class="nav-link" href="about.php">About</a> </li>

В верхней части каждой страницы (about.php здесь):

 <!-- Navbar Active Class --> <?php $activeClass = '.nav-about > a'; ?> 

В другом месте (header.php / index.php):

 <style> <?php echo $activeClass; ?> { color: #fff !important; } </style> 

Просто измените .nav-about > a на страницу, .nav-forum > a , например.

Если вам нужен другой стиль (цвета и т. Д.) Для каждого элемента навигации, просто присоедините встроенный стиль к этой странице, а не страницу индекса / заголовка.

отделите свою страницу от навигационной панели.

pageOne.php:

 $page="one"; include("navigation.php"); 

navigation.php

 if($page=="one"){$oneIsActive = 'class="active"';}else{ $oneIsActive=""; } if($page=="two"){$twoIsActive = 'class="active"';}else{ $twoIsActive=""; } if($page=="three"){$threeIsActive = 'class="active"';}else{ $threeIsActive=""; } <ul class="nav"> <li <?php echo $oneIsActive; ?>><a href="pageOne.php">One</a></li> <li <?php echo $twoIsActive; ?>><a href="pageTwo.php"><a href="#">Page 2</a></li> <li <?php echo $threeIsActive; ?>><a href="pageThree.php"><a href="#">Page 3</a></li> </ul> 

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

  $page="one"; $title="This is page one." include("navigation.php"); 

и просто возьмите $ title var и поместите его между тегами «title». Хотя я отправляю его на мою заголовочную страницу над моей навигационной панелью.

Вы можете использовать этот PHP, надеюсь, что это поможет.

 <?php if(basename($_SERVER['PHP_SELF'], '.php') == 'home' ) { ?> class="active" <?php } else { ?> <?php }?> 

Таким образом, список будет выглядеть следующим образом.

 <ul> <li <?php if( basename($_SERVER['PHP_SELF'], '.php') == 'home' ) { ?> class="active" <?php } else { ?> <?php }?>><a href="home"><i class="fa fa-dashboard"></i> <span>Home</span></a></li> <li <?php if( basename($_SERVER['PHP_SELF'], '.php') == 'listings' ) { ?> class="active" <?php } else { ?> <?php }?>><a href="other"><i class="fa fa-th-list"></i> <span>Other</span></a></li> </ul>