Sınıf php ile html menüye = 'aktif' nasıl eklemek

7 Cevap

Bunu düzenlemek için gerektiğinde ben ayrı bir php dosyasında benim html navigasyon koymak istiyorum ki, ben sadece bir kez düzenlemek zorunda. Ben aktif olan sayfaya aktif sınıf eklemek istediğiniz zaman sorun başlar.

Ben üç sayfa ve ortak bir dosya var.

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 : All three pages are identical except their $page is different on each page.

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

Ben her sayfada benim nav koymak, ama sonra tüm sayfalardan nav ayıran bütün amacı mahvoldu sürece bu sadece çalışmaz.

Ben bile mümkün başarmak istediğiniz nedir? Ben yanlış ne yapıyorum?

Teşekkürler

EDIT: Bunu yaparken, li içinde php kod çalıştırmak için görünmüyor html sanki, sadece basılı ediliyor

7 Cevap

Index.php kodu doğru. Sonra ben farklılıkları açıklayacağız aşağıda common.php için güncellenmiş kod dahil ediyorum.

<?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;
 ?>

EOD; - - girintili hiç değil ilk konu sizin yorumlu metin için son bildirim emin olmak gerekir olmasıdır. Bu girintili ise, o zaman hatalar alırsınız.

Eğer yanlış bakıyoruz çünkü PHP kodu heredoc deyimi içinde çalışmadığı ile meselesine gelince, olmasıdır. Bir heredoc deyimini kullanarak PHP kapatma etiketleri gibi aynı değildir. Gibi, bunları yeniden açmayı deneyin gerekmez. Bu sizin için bir şey yapacağız. Metin sözdizimidir çalışır şekilde değişkenlerin hariç yazılı tam olarak açılması ve kapanması ile her gösterilir olmasıdır. Bu ilişkili değeri ile değiştirilir. Ben yorumlu metin sizin mantığı kaldırılır ve (herhangi bir mantıksal ifadeler zaten yorumlu metin içinde çalışacaktır inanmıyorum ama) görmek için bu kolay hale getirmek için sınıfını belirlemek için bir tersiyer işlevi kullanılır

. Yorumlu metin sözdizimi anlamak için, çift tırnak (") içerisine dahil olarak aynı, ancak Yani kodu da bu böyle yazılmış olabilir kaçan gerek olmadan:

<?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>";
 ?>

Sadece biraz farklı yazılır, tam olarak aynı şeyi yapacağız. Yorumlu metin ve dize arasındaki bir diğer fark, nerede yorumlu metin içinde olamaz ortasında dize dışına kaçmak olabilir. Bu mantığı kullanarak, aşağıdaki kodu üretebilir:

<?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>";
 ?>

Eğer başlangıçta amaçlanan gibi Sonra dize doğrudan mantık içerebilir.

Hangi yöntemi seçerseniz seçin script performans çok az (varsa) fark yaratıyor. Çoğunlukla tercih aşağı kaynar. Her iki durumda da, sen nasıl her çalıştığını anlamak emin olmak gerekir.

niye bunu böyle yapmayın:

sayfalarında:

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

navigation.php içinde

<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>

Aslında sayfada size navigasyon koyarak ve bunu geçiyoruz hangi parametreler nerede kontrol etmek mümkün olacak.

Daha sonra edit: Sabit sözdizimi hatası.

Aksi takdirde ben soruyu anlamıyorum .. Eğer Require_oncenin üstünde $page = 'one'; koymak gerekir düşünüyorum.

Neden bu navigasyon için bir işlev veya sınıf oluşturmak yoktur ve bir parametre olarak veyaada aktif sayfayı koydu? Örneğin, gibi derdim bu şekilde:

$navigation = new Navigation( 1 );

veya

$navigation = navigation( 1 );
  1. $page='one' değil sonra require_once() before gerçekleşmelidir. Sonra çok geç-kod zaten gerekli olmuştur, ve $nav önceden tanımlanmış olmasıdır.

  2. Sen include('header.php'); kullanın ve include('footer.php'); yerine erken bir $nav değişkeni ayarı gerekmektedir. Bu esnekliği artırır.

  3. Daha fazla işlevleri olun. Böyle bir şey gerçekten takip etmek şeyleri kolaylaştırır:

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

    o zaman bu gibi "durum" yazabilirsiniz:

    <a href="..." <?= maybe($page=='one',aclass('active')) ?>> ....
    

Ben bu eski olduğunu biliyorum, ama bu cevapların hiçbiri (sry PPL) çok iyi

(Kıvrık sınıfları üzerinden yazmadan) bunu yapmak için en iyi yolu bağlantı href geçerli $ _SERVER ['REQUEST_URI'] karşılaştırmaktır. Neredeyse oradayız.

Bu deneyin. (Alındığı 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";
}

Bu sorunun çok kolay bir çözüm bu yapmaktır.

    <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>

Hangi çıktısı

    <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>