如何使用 strpos($_SERVER['REQUEST_URI'] 从 url 段生成活动 类
How to use strpos($_SERVER['REQUEST_URI'] to generate active classes from url segments
我们已经找到了很多答案,但没有完全理解它们(或 strpos
手册页),如果已经有人回答,我们深表歉意。
设置:
考虑以下 urls...
http://www.domain.com/whats-on/show-name/
http://www.domain.com/whats-on/show-name/events
以及我们如何在以下列表项标记中应用 .active
class...
<li>
<a class="<?= (strpos($_SERVER['REQUEST_URI'], '/whats-on') === 0 ? 'active' : ''); ?>" href="<?= $ShowWhatsOn; ?>">What's on</a>
</li>
<li>
<a class="<?= (strpos($_SERVER['REQUEST_URI'], '/events') === 0 ? 'active' : ''); ?>" href="<?= $ShowEvents; ?>">Events</a>
</li>
问题:
What's On 在 What's On 页面和活动页面上获得活动 class,因为 /whats-on 也在 url 中:/whats-on/show-name/events
事件从不接收主动class
问题:
- 我们如何让 strpos 检查特定的 url 段,以便
.active
class 应用到正确的页面?
我们正在努力使菜单标记保持简短,所以希望有一种方法可以在一行中完成此操作?
任何正确方向的帮助或指示将不胜感激。
干杯
本
函数strpos
给出一个字符串(针)在另一个字符串(大海捞针)中的位置。所以通过做
strpos($_SERVER['REQUEST_URI'], '/whats-on') === 0
您正在检查 REQUEST_URI
是否以“/whats-on”开头(位于位置 0)。由于两个 URL 都以“/whats-on”开头,因此第一项将始终处于活动状态,而第二项永远不会。
一个修复方法是添加对“/events”的检查:
<li>
<a class="<?= (strpos($_SERVER['REQUEST_URI'], '/whats-on') === 0 && strpos($_SERVER['REQUEST_URI'], '/events') === false ? 'active' : ''); ?>" href="<?= $ShowWhatsOn; ?>">What's on</a>
</li>
<li>
<a class="<?= (strpos($_SERVER['REQUEST_URI'], '/whats-on') === 0 && strpos($_SERVER['REQUEST_URI'], '/events') !== false ? 'active' : ''); ?>" href="<?= $ShowEvents; ?>">Events</a>
</li>
尽管这对于您的模板来说有点冗长,因此您可能希望将逻辑分解为一个函数,例如 isActive()
。
好的,为了我以后(和其他人)参考,我就是这样解决的。
1。做两个函数
我在我的 CMS 的 /helpers/ 目录中创建了它,并将其命名为 npe_nav.php(如果使用 Concrete5 CMS,请不要将文件命名为 navigation.php,因为该名称已被 c5 使用所以对我不起作用)。
// Get URL segments
public function getURLSegments() {
return explode("/", parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
}
// Get a specific URL segment
// Takes a number which corisponds to a segment in the URL e.g. consider:
// http://www.domain.com/whats-on/show-name/events
// $navHelper->getURLSegment(1); will return whats-on
// $navHelper->getURLSegment(3); will return events
public function getURLSegment($n) {
$segs = $this->getURLSegments();
return count($segs) > 0 && count($segs) >= ($n-1)?$segs[$n]:'';
}
2。在模板中加载函数
在Concrete5中,我是这样加载的(package-name是指这个工具在CMS中保存的包):
// Load nav helper
$navHelper = Loader::helper('npe_nav','package-name');
3。在模板中调用函数
对于 URL:http://www.domain.com/whats-on/show-name/
这还会在应用 .active
之前检查第三段是否为空,因为 /whats-on/
出现在该部分的所有 URL 中 - 所以不希望它在其他页面。
<li>
<a class="<?= (($navHelper->getURLSegment(1) == 'whats-on') && (is_null($navHelper->getURLSegment(3))) ? 'active' : ''); ?>" href="<?= $ShowWhatsOn; ?>">What's on</a>
</li>
对于 URL:http://www.domain.com/whats-on/show-name/events
和段 3 的其他页面
<li>
<a class="<?= ($navHelper->getURLSegment(3) == 'events' ? 'active' : ''); ?>" href="<?= $ShowEvents; ?>">Events</a>
</li>
我们已经找到了很多答案,但没有完全理解它们(或 strpos
手册页),如果已经有人回答,我们深表歉意。
设置:
考虑以下 urls...
http://www.domain.com/whats-on/show-name/
http://www.domain.com/whats-on/show-name/events
以及我们如何在以下列表项标记中应用 .active
class...
<li>
<a class="<?= (strpos($_SERVER['REQUEST_URI'], '/whats-on') === 0 ? 'active' : ''); ?>" href="<?= $ShowWhatsOn; ?>">What's on</a>
</li>
<li>
<a class="<?= (strpos($_SERVER['REQUEST_URI'], '/events') === 0 ? 'active' : ''); ?>" href="<?= $ShowEvents; ?>">Events</a>
</li>
问题:
What's On 在 What's On 页面和活动页面上获得活动 class,因为 /whats-on 也在 url 中:/whats-on/show-name/events
事件从不接收主动class
问题:
- 我们如何让 strpos 检查特定的 url 段,以便
.active
class 应用到正确的页面?
我们正在努力使菜单标记保持简短,所以希望有一种方法可以在一行中完成此操作?
任何正确方向的帮助或指示将不胜感激。
干杯
本
函数strpos
给出一个字符串(针)在另一个字符串(大海捞针)中的位置。所以通过做
strpos($_SERVER['REQUEST_URI'], '/whats-on') === 0
您正在检查 REQUEST_URI
是否以“/whats-on”开头(位于位置 0)。由于两个 URL 都以“/whats-on”开头,因此第一项将始终处于活动状态,而第二项永远不会。
一个修复方法是添加对“/events”的检查:
<li>
<a class="<?= (strpos($_SERVER['REQUEST_URI'], '/whats-on') === 0 && strpos($_SERVER['REQUEST_URI'], '/events') === false ? 'active' : ''); ?>" href="<?= $ShowWhatsOn; ?>">What's on</a>
</li>
<li>
<a class="<?= (strpos($_SERVER['REQUEST_URI'], '/whats-on') === 0 && strpos($_SERVER['REQUEST_URI'], '/events') !== false ? 'active' : ''); ?>" href="<?= $ShowEvents; ?>">Events</a>
</li>
尽管这对于您的模板来说有点冗长,因此您可能希望将逻辑分解为一个函数,例如 isActive()
。
好的,为了我以后(和其他人)参考,我就是这样解决的。
1。做两个函数
我在我的 CMS 的 /helpers/ 目录中创建了它,并将其命名为 npe_nav.php(如果使用 Concrete5 CMS,请不要将文件命名为 navigation.php,因为该名称已被 c5 使用所以对我不起作用)。
// Get URL segments
public function getURLSegments() {
return explode("/", parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
}
// Get a specific URL segment
// Takes a number which corisponds to a segment in the URL e.g. consider:
// http://www.domain.com/whats-on/show-name/events
// $navHelper->getURLSegment(1); will return whats-on
// $navHelper->getURLSegment(3); will return events
public function getURLSegment($n) {
$segs = $this->getURLSegments();
return count($segs) > 0 && count($segs) >= ($n-1)?$segs[$n]:'';
}
2。在模板中加载函数
在Concrete5中,我是这样加载的(package-name是指这个工具在CMS中保存的包):
// Load nav helper
$navHelper = Loader::helper('npe_nav','package-name');
3。在模板中调用函数
对于 URL:http://www.domain.com/whats-on/show-name/这还会在应用 .active
之前检查第三段是否为空,因为 /whats-on/
出现在该部分的所有 URL 中 - 所以不希望它在其他页面。
<li>
<a class="<?= (($navHelper->getURLSegment(1) == 'whats-on') && (is_null($navHelper->getURLSegment(3))) ? 'active' : ''); ?>" href="<?= $ShowWhatsOn; ?>">What's on</a>
</li>
对于 URL:http://www.domain.com/whats-on/show-name/events
和段 3 的其他页面
<li>
<a class="<?= ($navHelper->getURLSegment(3) == 'events' ? 'active' : ''); ?>" href="<?= $ShowEvents; ?>">Events</a>
</li>