Để kiểm tra xem một URL cụ thể hiện có đang hoạt động trong Cakephp 2.x hay không, bạn nên kiểm tra xem biểu mẫu có được chuẩn hóa (theo nghĩa là Router::normalize()) giống với biểu mẫu chuẩn của URL hiện được yêu cầu hay không (theo nghĩa $this->request->here
).
$currentUrl = Router::normalize($this->request->here);
$checkedUrl = Router::normalize($myUrl);
$isActive = $currentUrl === $checkedUrl;
Đôi khi bạn có thể muốn đối sánh rộng để hiển thị trang đang hoạt động trong menu, nếu một đứa trẻ hiện được hiển thị. Hãy nghĩ rằng bạn muốn hiển thị liên kết trình đơn của bạn đến trang tổng quan về trái cây tại /fruits/
khi hoạt động trong khi lướt trang web chi tiết chuối tại /fruits/banana/
. Bạn có thể đạt được điều này một cách dễ dàng bằng cách chỉ tìm kiếm một phần phù hợp.
$isActive = (0 === strpos($currentUrl, $checkedUrl));
Để chắc chắn kết hợp của bạn có thể trở nên phức tạp hơn, ví dụ như bạn đang sử dụng các thông số được đặt tên và tương tự và muốn phản ánh nó trong menu của bạn, nhưng bạn nên tìm đường từ đây.
Một giải pháp cho vấn đề cụ thể của bạn có thể trông như thế này:
$currentUrl = Router::normalize($this->request->here);
$links = array(
array(
'label' => __('View All'),
'url' => array('controller' => 'galleries', 'action' => 'index'),
),
array(
'label' => __('Add New'),
'url' => array('controller' => 'galleries', 'action' => 'add'),
),
/* ... */
);
foreach ($links as $link) {
$linkLabel = $link['label'];
$linkUrl = Router::url($link['url']);
$linkHtml = $this->Html->link($linkLabel, $linkUrl);
$linkActive = $currentUrl === $linkUrl;
echo $this->Html->tag('li', $linkHtml, array(
'class' => $linkActive ? 'active' : '',
'escape' => false, // to not escape anchor markup
));
}
Để làm live chút chỉ là nhỏ bé của bạn dễ dàng hơn bằng thậm chí không suy nghĩ về câu hỏi này, bạn cũng có thể sử dụng một Helper để tạo menu một ai đó khác được xây dựng như torifat/cake-menu_builder.
downvote, vì 'ở đây()' bao gồm tất cả các tham số có tên và chuỗi truy vấn. – mrdaliri
URL trong '$ this-> request-> here' này không nhất thiết phải giống với URL được tạo bởi router, ngay cả khi nó được. Bạn nên chuẩn hóa các URL của mình với ['Router :: normalize()] (http://api.cakephp.org/2.6/class-Router.html#_normalize) trước khi so sánh chúng. – bfncs