2012-11-21 24 views
0

我一直在絞盡腦汁思考一個方法。我有一個頭文件在我的網站上的每個文檔中被調用,並且我需要從每個文檔動態選擇哪個錨被給定設置值。如下:php傳遞函數參數值來選擇其他字符串,並給出一個值

function headur($page) {echo'... 
    <ul> 
     <li><a'.$h.' href="/">Home</a> 
     <li><a'.$s.' href="/services">Services</a> 
     <li><a'.$p.' href="/portfolio">Portfolio</a> 
     <li><a'.$a.' href="/about">About</a> 
     <li><a'.$c.' href="/contact">Contact</a> 
    </ul>... 
    ;} 

然後在我的文檔我叫headur($a);,並從該參數值 - $a - 使用它作爲選擇給予匹配的內部串中的某個值 - class="selected"即這個特殊的函數調用將輸出的HTML像這樣:

<ul> 
     <li><a href="/">Home</a> 
     <li><a href="/services">Services</a> 
     <li><a href="/portfolio">Portfolio</a> 
     <li><a class="selected" href="/about">About</a> 
     <li><a href="/contact">Contact</a> 
    </ul> 

整個的一點是,它被動態地調用該函數的文檔中選擇,沒有我不必手動創建一個大的老if語句都匹配。即每個人使用if ($page == $a) {$a = ' class="selected"';},這是我一直在做的事情。我想這是在做.addClass();的php等價物,但在外部文件上。

在此先感謝。

回答

0

那麼你可以做這樣的事情:

<ul> 
    <li><a class="<?php echo $_SERVER['PHP_SELF'] == '/' ? 'selected' : '' ?>" href="/">Home</a> 
    <li><a class="<?php echo $_SERVER['PHP_SELF'] == '/services' ? 'selected' : '' ?>" href="/services">Services</a> 
    <li><a class="<?php echo $_SERVER['PHP_SELF'] == '/portfolio' ? 'selected' : '' ?>" href="/portfolio">Portfolio</a> 
    <li><a class="<?php echo $_SERVER['PHP_SELF'] == '/about' ? 'selected' : '' ?>"href="/about">About</a> 
    <li><a class="<?php echo $_SERVER['PHP_SELF'] == '/contact' ? 'selected' : '' ?>" href="/contact">Contact</a> 
</ul> 
+0

嗨馬克,不幸的是這並沒有開箱即用,首先我必須去掉<?php聲明,因爲這已經在php函數中了。感謝您嘗試=) –

1

只是存儲在數組中的類定義和索引搜索。在數組中使用數字鍵將是最簡單的,但在回讀代碼時不是非常具有描述性。要使用數字鍵只是做這樣的事情:

$pages = array("", "services", "portfolio", "about", "contact"); 
$where = array_search($a, $pages); // $a is the param passed to the function 
$pages[$where] .= "\" class=\"selected\""; 

我沒有你的頁面的順序,因此$ H將由$頁[0],$ S將由$替換替換頁[1]等上。如果你想讓我給你寫一些代碼,那麼你可以使用數組中的文本鍵來使它更容易,我也可以做到這一點,但我個人認爲這沒有額外的代碼工作正常。

+0

嗨Dan,感謝您的回覆,請您澄清在每個文檔的函數中會被調用的參數嗎?我添加了你編寫的腳本,並且在UL中將$ h,$ s等改爲$ pages [0],$ pages [1]等,但是我可以用任何方式想到它,但它根本不起作用。我目前的解決方案是 $ z ='class =「selected」'; \t if($ page == h){$ h = $ z;} \t elseif($ page == s){$ s = $ z;} \t elseif($ page == p){$ p = $ z;} \t elseif($ page == a){$ a = $ z;} \t elseif($ page == c){$ c = $ z;} 這很好用,但我一直在尋找一個簡單的解決方案。 –

0

這是非常典型的,以創建一個數組,並通過數組迭代:

$linkMenu = array(
    '/' => 'Home', 
    '/services' => 'Services', 
    '/portfolio' => 'Portfolio', 
    '/about' => 'About', 
    '/contact' => 'Contact', 
); 

function linkList($links, $page=null) { 
    echo '<ul>'; 
    foreach($links as $url=>$name) { 
     $selected = ($url == $page) ? " class='selected' " : ''; 
     echo "<li><a $selected href='$url'>$name</a></li>\n"; 
    } 
    echo '</ul>'; 
} 

現在,您可以創建鏈接菜單主頁用:

linkList($linkMenu, '/'); 
+0

嗨,恐怕這會返回一個錯誤'警告:爲foreach()提供的無效參數' –

+0

當我將代碼複製並粘貼到PHP文件並按原樣運行時,我得到了預期的輸出。也許你在某處拼錯了'$ linkMenu'變量名? – slashingweapon

+0

我從您提交的內容中複製並粘貼:/ –

0

一個解決辦法將您的模板加載到DOMDocument中,並將鏈接設置爲與當前URL匹配的激活鏈接:

$dom = new DOMDocument(); 
$dom->loadXML('<ul><li><a href="/yourLink">Your Link</a></li></ul>'); 

$xpath = new DOMXPath($dom); 
$url = $_SERVER['REQUEST_URI']; 

foreach ($xpath->query(sprintf('//a[@href="%s"]', $uri)) as $current) { 
    $current->setAttribute('class', 'selected'); 
} 

echo $dom->saveXML(); 

代碼未經測試!但它應該給你一個想法...這種方式,你可以寫你的模板 - 文件沒有任何PHP代碼在它...

+0

嗨馬庫斯,不完全是我在找什麼,我需要保持純粹的PHP設置,因爲我在做什麼。感謝您嘗試雖然=) –

相關問題