2012-11-21 23 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设置,因为我在做什么。感谢您尝试虽然=) –

相关问题