Bu PHP fonksiyon geliştirilebilir?

9 Cevap php

Aşağıda bir navigasyon menüsü için üzerinde çalışıyorum bazı kod belirli bir sayfada, eğer uygun sekmesine bir "akım" css sınıfı katacak vardır.

Gerçekten böyle basit bir görevi yapmak için kodu bir sürü gibi görünüyor, çünkü PHP bunu yapmak için daha iyi bir yolu olup olmadığını merak ediyorum? Benim sayfaları da yerine PHP Jquery ile sekmeyi ayarlamak için daha iyi olurdu, bir jquery kütüphanesi zaten yüklenmiş olacak? Takdir herhangi bir ipucu

<?PHP

active_header('page identifier goes here'); //ie; 'home' or 'users.online'

function active_header($page_name)
{

    // arrays for header menu selector
    $header_home = array('home' => true);
    $header_users = array(
        'users.online' => true,
        'users.online.male' => true, 
        'users.online.female' => true, 
        'users.online.friends' => true, 
        'users.location' => true, 
        'users.featured' => true, 
        'users.new' => true, 
        'users.browse' => true, 
        'users.search' => true, 
        'users.staff' => true
    );
    $header_forum = array('forum' => true);
    $header_more = array(
        'widgets' => true, 
        'news' => true, 
        'promote' => true, 
        'development' => true, 
        'bookmarks' => true, 
        'about' => true
    );
    $header_money = array(
        'account.money' => true, 
        'account.store' => true, 
        'account.lottery' => true, 
        'users.top.money' => true
    );
    $header_account = array('account' => true);
    $header_mail = array(
        'mail.inbox' => true, 
        'mail.sentbox' => true, 
        'mail.trash' => true, 
        'bulletins.post' => true, 
        'bulletins.my' => true, 
        'bulletins' => true
    );

    // set variables if there array value exist
    if (isset($header_home[$page_name])){
        $current_home = 'current';
    }else if (isset($header_users[$page_name])){
        $current_users = 'current';
    }else if (isset($header_forum[$page_name])){
        $current_forum = 'current';
    }else if (isset($header_more[$page_name])){
        $current_more = 'current';
    }else if (isset($header_money[$page_name])){
        $current_money = 'current';
    }else if (isset($header_account[$page_name])){
        $current_account = 'current';
    }else if (isset($header_mail[$page_name])){
        $current_mail = 'current';
    }

    // show the links
    echo '<li class="' . (isset($current_home) ? $current_home : '') . '"><a href=""><em>Home</em></a></li>';
    echo '<li class="' . (isset($current_users) ? $current_users : '') . '"><a href=""><em>Users</em></a></li>';
    echo '<li class="' . (isset($current_forum) ? $current_forum : '') . '"><a href=""><em>Forum</em></a></li>';
    echo '<li class="' . (isset($current_more) ? $current_more : '') . '"><a href=""><em>More</em></a></li>';
    echo '<li class="' . (isset($current_money) ? $current_money : '') . '"><a href=""><em>Money</em></a></li>';
    echo '<li class="' . (isset($current_account) ? $current_account : '') . '"><a href=""><em>Account</em></a></li>';
    echo '<li class="' . (isset($current_mail) ? $current_mail : '') . '"><a href=""><em>Mail</em></a></li>';
}

?>

9 Cevap

Benim de çok atabilir. Çıkış özgün soru verilen aynı olacak şekilde sınırlıdır.

<?PHP

active_header('page identifier goes here'); //ie; 'home' or 'users.online'

function active_header($page_name)
{
    // Unified array
    $headers = array(
        'Home' => array('home' => true),
        'Users' => array(
            'users.online' => true,
            'users.online.male' => true, 
            'users.online.female' => true, 
            'users.online.friends' => true, 
            'users.location' => true, 
            'users.featured' => true, 
            'users.new' => true, 
            'users.browse' => true, 
            'users.search' => true, 
            'users.staff' => true
        ),
        'Forum' => array('forum' => true),
        'More' => array(
            'widgets' => true, 
            'news' => true, 
            'promote' => true, 
            'development' => true, 
            'bookmarks' => true, 
            'about' => true
        ),
        'Money' => array(
            'account.money' => true, 
            'account.store' => true, 
            'account.lottery' => true, 
            'users.top.money' => true
        ),
        'Account' => array('account' => true),
        'Mail' => array(
            'mail.inbox' => true, 
            'mail.sentbox' => true, 
            'mail.trash' => true, 
            'bulletins.post' => true, 
            'bulletins.my' => true, 
            'bulletins' => true
        )
    );

    foreach($headers as $header => &$pages) {
        echo '<li class="';
        if(isset($pages[$page_name])) echo 'content';
        echo '"><a href=""><em>', $header, '</em></a></li>';
    }            

}

?>

Ben çıkışı ile kod karıştırma bir hayranı değilim, ama örneğin yapacağım.

Günün PHP ipucu: Eğer sadece bir dize yankılanan eğer dize birleştirme kullanmayın

Altındaki kodu, iki çok büyük blok basit bir döngü ölçüde azaltılmış olabilir:

<?php

foreach (array('home', 'users', 'forum' /* ... */ ) as $item) {
  $ar = "header_$item";
  echo '<li class="', (isset($$ar[$page_name]) ? 'current' : '')
    , '"><a href=""><em>', ucword($item), '</em></a></li>';
}

?>

Sen <li class=""> veya böyle bir şey yazdırmak için değil denemelisiniz; dağınık görünüyor. Ben bu sayfayı ya da değil $applicable_list düzenini değişen sona durumda ayrı bir işleve vurgulamak için olup olmadığının denetimini hareket ettik.

<?php
function active_header($page) {
    $applicable_list = array(
        "home" => array("home"),
        "users" => array(
            "users.online", "users.online.male", "users.online.female", "users.online.friends", 
            "users.location", "users.featured", "users.new", "users.browse", "users.search", "users.staff"
        ), 
        "forum" => array("forum"),
        "more" => array("widgets", "news", "promote", "development", "bookmarks", "about"),
        "money" => array("account.money", "account.store", "account.lottery", "users.top.money"),
        "account" => array("account"),
        "mail" => array("mail.inbox", "mail.sentbox", "mail.trash", "bulletins.post", "bulletins.my", "bulletins")
    );
    $pages = array_keys($applicable_list);

    function is_active_page($page, $category, $category_pages_list) {
        return array_key_exists($category, $category_pages_list) && in_array($page, $category_pages_list[$category]);
    }
    foreach($pages as $key => $category) {
        printf('<li%s><a href="#"><em>%s</em></a></li>' . "\n", 
            (is_active_page($page, $category, $applicable_list) ? ' class="current"' : ''),
            ucwords($category)
        );
    }
}

?>

Aksine dizi anahtarları olarak sayfa adlarını kullanarak daha sadece sayfa isimleri dizileri olabilir, ve sonra yerine isset($array[$page_name]) daha in_array ($page_name, $array) ile karşılaştırın.

Bu mutlu yetersiz @ gelen değişikliklerin yanında çalışması gerektiğini, ve üst kod statik bit biraz küçültmek için izin verecek.

Sizin dizileri birleştirmek, ya da başka bir sözcüktür fonksiyonu tüm bu mantık koydu. Benim örnek diziler birleştirir.

// it's ugly, but at least the ugliness
// is confined to only _one_ array ;)
$map_pages_to_navitem = array(
    'home' => 'home',
    'users.online' => 'users',
    'users.online.male' => 'users',
    'users.online.female' => 'users',
    'users.online.friends' => 'users',
    'users.location' => 'users',
    'users.featured' => 'users',
    'users.new' => 'users',
    'users.browse' => 'users',
    'users.search' => 'users',
    'users.staff' => 'users',
    'forum' => 'forum',
    'widgets' => 'more',
    'news' => 'more',
    'promote' => 'more',
    'development' => 'more',
    'bookmarks' => 'more',
    'about' => 'more',
    'account.money' => 'money',
    'account.store' => 'money',
    'account.lottery' => 'money',
    'users.top.money' => 'money',
    'account' => 'account'),
    'mail.inbox' => 'mail', 
    'mail.sentbox' => 'mail', 
    'mail.trash' => 'mail', 
    'bulletins.post' => 'mail', 
    'bulletins.my' => 'mail', 
    'bulletins' => 'mail', 
);
$current = $map_pages_to_navitem[$page_name];

echo '<li class="'.($current=='home')?'current':''.'"><a href=""><em>Home</em></a></li>';
echo '<li class="'.($current=='users')?'current':''.'"><a href=""><em>Users</em></a></li>';
echo '<li class="'.($current=='forum')?'current':''.'"><a href=""><em>Forum</em></a></li>';
echo '<li class="'.($current=='more')?'current':''.'"><a href=""><em>More</em></a></li>';
echo '<li class="'.($current=='money')?'current':''.'"><a href=""><em>Money</em></a></li>';
echo '<li class="'.($current=='account')?'current':''.'"><a href=""><em>Account</em></a></li>';
echo '<li class="'.($current=='mail')?'current':''.'"><a href=""><em>Mail</em></a></li>';

Koduna baktığımızda, ben de sonuç <li> elemanı bir sınıf özniteliği değeri üzerinde atamak için bkz. JavaScript PHP daha iyi yapacağız.

Yani <li> bir kimliği her vermek ve JavaScript sınıf özniteliği atama bırakabilir:

echo '<li id="home"><a href=""><em>Home</em></a></li>';
echo '<li id="users"><a href=""><em>Users</em></a></li>';
echo '<li id="forum"><a href=""><em>Forum</em></a></li>';
echo '<li id="more"><a href=""><em>More</em></a></li>';
echo '<li id="money"><a href=""><em>Money</em></a></li>';
echo '<li id="account"><a href=""><em>Account</em></a></li>';
echo '<li id="mail"><a href=""><em>Mail</em></a></li>';

echo '<script type="text/javascript">';
    echo 'document.getElementById("'.$current.'").className = "current";';
          // you'll want to sanitize $current to avoid parse errors in your JS
echo '</script>'

:-) Başlayanlar için switch yerine geniş bir if/else kullanın

    // set variables if there array value exist
if (isset($header_home[$page_name])){
    $current_home = 'current';
}else if (isset($header_users[$page_name])){
    $current_users = 'current';
}else if (isset($header_forum[$page_name])){
    $current_forum = 'current';
}else if (isset($header_more[$page_name])){
    $current_more = 'current';
}else if (isset($header_money[$page_name])){
    $current_money = 'current';
}else if (isset($header_account[$page_name])){
    $current_account = 'current';
}else if (isset($header_mail[$page_name])){
    $current_mail = 'current';
}

Değişken değişkenleri (http://www.php.net/manual/en/language.variables.variable.php), foreach kullanımı ve işlevi bu bölümü azaltmak için zarar verebilir

Ben orijinal kodunu değiştirmek için herhangi bir zorlayıcı bir sebep görmüyorum. Okumak ve anlamak çok kolay, ve değiştirmek için yeterince kolay. Ben de sekme göstergesini ayarlamak için JavaScript kullanmak için herhangi bir neden yoktur sanmıyorum. PHP kullanarak, javascript engelli insanlar hitap, ve ben gerçekten ihtiyaç duyulan zaman için Javascript kaydetmek ister.

"Baskı htmlcode" dan "htmlcode dönmek" değişen değilse, ben en azından bunun için ikinci bir parametre eklemek istiyorum.