Jump to content

Построение динамических блоков на основе просматриваемой страницы

Для более продвинутых сайтов, построенных на приложении Страницы, вы можете изменить отображение дополнительного HTML или PHP блока в зависимости от просматриваемой пользователем страницы. Например, если у вас есть пользовательское меню, вы можете выделить его активный пункт.

Мы можем реализовать это путём проверки параметров, передаваемых в URL адресе. Хоть вы и получаете страницу по дружественному URL адресу, например такому http://<site.ru>/категория/страница, на самом деле передаётся стандартный адрес, например как http://<site.ru>/index.php?app=cms&module=pages&controller=page&path=/категория/страница. Обратите внимание, что в параметрах адреса мы можем определить на какую страницу ведёт эта ссылка. Когда мы получаем доступ к объекту \IPS\Request::i(), мы можем реализовать такую конструкцию:

{{if strpos( \IPS\Request::i()->path, 'section/page' ) !== FALSE}}
	<!-- Мы знаем, что пользователь находится на странице /категория/страница -->
{{elseif strpos( \IPS\Request::i()->path, 'othersection/otherpage' ) !== FALSE}}
	<!-- Мы знаем, что пользователь находится на странице /другая_категория/другая_страница -->
{{endif}}

Обратите внимание, что для достоверности мы используем PHP функцию strpos, проверяющую наличие URL адреса страницы в параметре, а не просто сравнение.

 

Пример

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

HTML код нашего блока меню может выглядеть следующим образом:

<ul class='ipsList_inline cMyMenu'>
  <li {{if strpos( \IPS\Request::i()->path, 'help/home' ) !== FALSE}}class='active'{{endif}}>
    <a href='/help/home'>Домой</a>
  </li>
  <li {{if strpos( \IPS\Request::i()->path, 'help/faq' ) !== FALSE}}class='active'{{endif}}>
    <a href='/help/faq'>FAQ</a>
  </li>
  <li {{if strpos( \IPS\Request::i()->path, 'help/tutorials' ) !== FALSE}}class='active'{{endif}}>
    <a href='/help/tutorials'>База знаний</a>
  </li>
</ul>

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

// Используем переменную PHP для хранения массива страниц => имена страниц в цикле
{{$myPages = array('help/home' => "Домой", 'help/faq' => "FAQ", 'help/tutorials' => "База знаний", 'help/qna/listing' => "Вопросы", 'help/qna/recent' => "Последние вопросы", 'help/contact' => "Свяжитесь с нами");}}

<ul class='ipsList_inline cMyMenu'>
	{{foreach $myPages as $url => $title}}
  		<li {{if strpos( \IPS\Request::i()->path, $url ) !== FALSE}}class='active'{{endif}}>
			<a href='{$url}'>{$title}</a>
	  	</li>
  	{{endforeach}}
</ul>

Теперь, чтобы добавить новые пункты в наше пользовательское меню в блоке, мы просто можем добавить их в массив.