«Моя территория мысли»

Подсветка пункта в меню или как определить текущий URL

  • Разработка

  • 6 Март 2017

  • 12

  • 0

Подсветка пункта в меню или как определить текущий URL

Казалось бы весьма примитивная задача, но повстречав, мягко скажем, безумные решения, я понимаю что это статья будет как нельзя кстати. В ней я представлю очень изящное решение выше обозначенной задачи... 

Я не буду ходит вокруг до около, сразу представлю функцию, а после покажу как ей пользоваться правильно, собственно вот она:

function is($location)
{
	$uri = $_SERVER['REQUEST_URI'];

	$path = parse_url($uri, PHP_URL_PATH);

	$sanitized = addcslashes($location, '\.+?[^]${}=!|:-#');

	$expression = str_replace(['(', '*', ')'], ['(?:', '[^/]*', ')?'], $sanitized);

	return !! preg_match("#^{$expression}$#u", $path);
}

С виду может показаться, что она мало функциональна, но это только на первый взгляд, более того, у нее имеется свой синтаксис для входной строки. Предположим у нас имеется каталогизатор объектов, или проще говоря интернет магазин с категориями. Меню у нас многоуровневое, разделов очень много, но начнем с малого, подсветим раздел «Контакты»:

<li <?= is('/contacts/') ? 'class="active"' : '' ?>>
	<a href="/contact/">Контакты</a>
</li>

Также просто подсветим пункт, ну допустим «О компании»:

<li <?= is('/about/us/') ? 'class="active"' : '' ?>>
	<a href="/about/us/">О компании</a>
</li>

Усложним задачу, предположим у нас имеется категория в магазине «Мужские штаны», но проблема в том, что категория содержит много вложенных категорий, и если мы находимся в категории «Джинсы», родительская категория должна оставаться подсвеченной, эта задача очень проста:

<li <?= is('/shop/pants/(*/)') ? 'class="active"' : '' ?>>
	<span>Мужские штаны</span>
	<ul>
		<li>
			<a href="/shop/pants/jeans/">Джинсы</a>
		</li>
		<li>
			<a href="/shop/pants/trousers/">Брюки</a>
		</li>
		<li>
			<a href="/shop/pants/briefs/">Шорты</a>
		</li>
	<ul>
</li>

Теперь, что касается синтаксисы, чтобы сделать часть адреса необязательной, просто возьмите эту часть в скобки, а если создать условие «Все что угодно , за исключением слеша», то просто укажите звездочку...

Готовую функцию можете взять здесь.

Спасибо за внимание!

Комментарии