Bu PHP kodu yapmak için daha iyi bir yolu var mı?

5 Cevap

My PHP site has header,body,footer files that are included into the INDEX.PHP page.
On the header.php file I have a menu like this

    <div id="bottomrow"> 
      <div class="pad"> 
        <ul class="menu left">
          <li class="first <?=$current_home?>"><a href="/"><em>Home</em></a></li>
          <li class="users drop <?=$current_users?>"><a href=""><em>Users</em></a><span class="drop">&nbsp;</span> 
    	  	<ul id="moreheader">
                <li></li>
                <li></li>

            </ul>
    	  </li>
          <li class="<?=$current_forum?>"><a href=""><em>Forums</em></a></li>
          <li class="drop <?=$current_more?>"><a href="/moreheader"><em>More</em></a><span class="drop">&nbsp;</span> 
            <ul id="moreheader">
              <li><a href=""><em>Widgets</em></a></li>
              <li><a href=""><em>News</em></a></li>
              <li><a href=""><em>Promote</em></a></li>
              <li><a href=""><em>Development</em></a></li>
              <li><a href=""><em>Bookmarks</em></a></li>
              <li><a href=""><em>About</em></a></li>
            </ul>
          </li>
          <li class="moneytabmenu <?=$current_money?>"><a href="/moneytabmenu"><em>Money:<span class="moneytabmenu-total">$0.00</span></em></a></li>
        </ul>
        <ul class="menu right">
          <li class="drop myaccount <?=$current_myaccount?>"><a href="" class="first"><img class="avatar" src="http://gravatar.com/avatar.php?gravatar_id=7ab1baf18a91ab4055923c5fd01d68a2&amp;rating=pg&amp;size=80&amp;default=" height="19" width="19" alt="you" /><em>My 
            Account</em></a><span class="drop">&nbsp;</span> 
            <ul id="myaccount">
              <li><a href=""><em>Dashboard</em></a></li>
              <li><a href=""><em>Account Settings</em></a></li>
              <li><a href=""><em>Settings</em></a></li>
            </ul>
          </li>
          <li class="drop"><a href=""><em>Mail</em></a><span class="drop">&nbsp;</span> 
            <ul id="mailboxheader">
              <li><a href=""><em>InBox</em></a></li>
              <li><a href=""><em>SentBox</em></a></li>
              <li><a href=""><em>Trash</em></a></li>
              <li><a href=""><em>Post Bulletin</em></a></li>
              <li><a href=""><em>View Bulletins</em></a></li>
            </ul>
          </li>
          <li class="drop <?=$current_more?>"><a href=""><em>More</em></a><span class="drop">&nbsp;</span> 
            <ul id="moreheader">
              <li><a href=""><em>Widgets</em></a></li>
              <li><a href=""><em>News</em></a></li>
              <li><a href=""><em>Promote</em></a></li>
              <li><a href=""><em>Development</em></a></li>
              <li><a href=""><em>Bookmarks</em></a></li>
              <li><a href=""><em>About</em></a></li>
            </ul>
          </li>
        </ul>
      </div>
    </div>
    <!-- END div#bottomrow -->
  </div>

Menü Yukarıdaki benzer, yukarıdaki menü tamamlanmış değil ama bunu kurmak nasıl görebilirsiniz, ALT LİSTESİ öğeler alt makyaj liste öğeleri bir menü ve BAZI makyaj

  • liste öğeleri vardır Ana menü öğeleri bazı menüler.

    Bir kullanıcı bir alt menüde sayfalarının herhangi bir açıksa, o ana menü öğesi için "geçerli" css sınıfını eklemek gerekir.

    Aşağıda ben değişken index.php için $ _GET kullanıyor? P = SAYFA-İSİM duyuyorum hangi sayfayı belirlemek benim index.php sayfası

    Ben bu earliar benzer bir soru yayınlanmıştır ama ben aşağıdaki kodu yaptım ve çok tepki alamadım önce öyleydi, tepki tüm diziler kullanarak söz aldın ama ben alt menüler vardı yeni beofre oldu.

    So does anyone see a better way to add the css class "current" to a list item above based on which page I am on?


    Code on INDEX.php page that processes which menu item should be highlighted

    //set variables for menu item to appear as being SELECTED 
    $p = $_GET['p'];
    
    $current_home = '';
    $current_users = '';
    $current_forum = '';
    $current_more = '';
    $current_money = '';
    $current_myaccount = '';
    $current_mail = '';
    //if home then highlight home menu
    if($p === 'home'){
        $current_home = 'current';
    }
    if($p === 'users.online' || $p === 'users.location' || $p === 'users.featured' || $p === 'users.new' || $p === 'users.browse' || $p === 'users.search' $p === 'users.staff'){
        $current_users = 'current';
    }
    if($p === 'forum'){
        $current_forum = 'current';
    }
    if($p === 'widgets' || $p === 'news' || $p === 'promote' || $p === 'development' || $p === 'bookmarks'  || $p === 'about'){
        $current_more = 'current';
    }
    if($p === '=account.money' || $p === 'account.store' || $p === 'account.lottery' || $p === 'users.top.money'){
        $current_money = 'current';
    }
    if($p === 'account'){
        $current_myaccount = 'current';
    }
    if($p === 'mail.inbox' || $p === '=mail.sentbox' || $p === 'mail.trash' || $p === 'bulletins.post' || $p === 'bulletins.my'  || $p === 'bulletins'){
        $current_mail = 'current';
    }
    
  • 5 Cevap

    Ben daha fazla veri odaklı şeyi yapma öneriyoruz. Menü seçenekleri bir çok-boyutlu bir dizi oluşturmak ve sonra doğru HTML çıktısı, dizi yineleme.

    İşte ben bunu yapacağını nasıl (bu test edilmemiştir, ama fikri ben aktarmaya çalışıyorum budur):

    <?
    	$p = $_GET['p'];
    
      	$navArray = array();
        $navArray['home'] = array('main' => array('id'=>'home', 'url'=>'/', 'title'=>'Home'));
        $navArray['more'] = array('main' => array('id'=>'more', 'url'=>null, 'title'=>'More'), 
    							  'pages'=> array(
    								array('id'=>'widgets', 'url'=>'/more-widgets.php', 'title'=>'Widgets'),
    								array('id'=>'news', 'url'=>'/news.php', 'title'=>'News')));
    
    ?>
    
    
    <div id="bottomrow"> 
          <div class="pad"> 
           	<ul class="menu left">
    
    			<? foreach($navArray as $navHeading) : ?>
    				<? $current = $navHeading['main']['id'] == $p ? 'current' : ''; ?>
    	          	<li class="first <?=$current?>"><a href="<?=$navHeading['main']['url']?>"><em><?=$navHeading['main']['title']?></em></a></li>
    
    				<? if (!empty($navHeading['pages'])) : ?>
    					<ul id="sub-<?=$navHeading['main']['id']?>">
    					<? foreach($navHeading['pages'] as $navPage) : ?>
    						<? $current = $navPage['id'] == $p ? 'current' : ''; ?>
    						<li class="<?=$current?>"><a href="<?=$navPage['url'];?>"><em><?=$navPage['title']?></em></a></li>
    					<? endforeach; ?>
    					</ul>
    				<? endif; ?>
    			<? endforeach; ?>
    		</ul>
    	</div>
    </div>
    

    Öncelikle, ben bu menünün oluşturulması idare ve index.php sınıf yöntemi çağırmak için bir menü sınıf oluşturma öneririm. Bu, sunum kodunu ayırmak çağırdığınızda bunu sayfayı geçebileceği vb soyutlama, sağlamak ve sınıf uygulaması ilgilenir ve tam geri menü geçer olur.

    İkincisi, ben bir sürü veya koşullarına sahip bir switch deyimini kullanarak yerine else if ... öneririm. Sen mola anahtar dahil değil tarafından davaları basamakla:

    switch( $page) {
      case: 'home':
        $current_home = 'current';
        break;
      case: 'users.online':
      case: 'users.location':
      case: 'users.featured':
      .......
        $current_users = 'current';
        break;
    }
    

    Bildiğim kadarıyla PHP kullanımı gider gibi, size çok kullanmıyorsunuz demektir. Ben eğer ifadeleri ile de söylediğim gibi, eğer ben her aksine, $ sayfa kez değerlendirilir ve bir kez uyumlu olacaktır, bir anahtar çok daha iyi yapacağını düşünüyorum. Eğer menü için bir döngü kullanmak olsaydı, bu kod gerçek değişmez HTML miktarını azaltmak olabilir. O zaman menü sistemi oluşturmak için dizi içeriği, bazı html, ve değişkenleri dizi üzerinde döngü ve birleştirmek olabilir, her bir ana menü parça (belki diğerleri ne anlama geldiğini) tutmak için dizileri yarattı eğer. PHP daha az edebi HTML ve daha verimli kullanımı.

    Sizin HTML çok daha basitleştirilmiş olamaz, ancak PHP muhtemelen daha iyi yapılabilir. Genellikle küresel değişkenleri kullanmak kötü bir fikir, ama muhtemelen onun yerine böyle bir şey yapabilirsiniz:

    function current_tab($page) {
        global $p;
        // Check if $page is a prefix for $p
        if ($page == substr($p, 0, strlen($page))) {
            return "current";
        }
    }
    

    Sonra HTML, bu kullanın:

    <?=current_tab('account');?>
    

    Olmayan uyumdur sayfa isimleri için, özel koşullar kullanmanız gerekir gidiyoruz, ya da adlandırma değiştirebilir.

    Orada (sürdürülebilirlik ve genişletilebilirlik oldukça düşük) burada artırabilir bir sürü var, ama ben ilki, örneğin ... Bu Koşullamalar birkaç ortadan kaldırarak ile başlamak istiyorum, sen dize 'ile başlar olup olmadığını kontrol edebilirsiniz Kullanıcı 'bütün özel durumlarda ilgilenir,' Kullanıcılar.

    if(strpos($p, 'users') !== false) { ... }
    

    Aynı diğer durumlarda bir kaç için de geçerlidir.

    Her neyse, ben size sunucu tarafı komut yapısına bir göz atın öneririz. Genellikle, bu tür şeyler için daha genel bir çözüm bulabilirsiniz.

    Ben (PHP uzayda çok olmasına rağmen, CI benim seçimim) CodeIgniter gibi bir MVC çerçevesinde bakmak zorunda öneririm.

    Eğer biraz farklı kaygılar ve katı çiftleşmiş temiz ayrılmasını kazanıyor bunu yapısı neredeyse tüm mevcut mantık ve sadece yeniden kullanabilirsiniz CI gibi bir çerçeve ile ... zemin-up kendi yazmaya yolda.