xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Показывать блок в определённом разделе, минуя один из подразделов

Опубликовано в

В параметрах видимости блока можно указать либо Показывать только на перечисленных страницах, либо Показывать на всех страницах исключая перечисленные. Т.е. нельзя скомбинировать условия, и например показывать блок в первом уровне каталога catalog/*, но не показывать в остальных catalog/*/*.

Выручит опция Если введённый PHP-код возвращает значение TRUE, которая появляется при включении модуля PHP filter. Сам код будет примерно таким:

<?php
$request_path = request_path();
if (drupal_match_path($request_path, 'catalog/*') &&
  !drupal_match_path($request_path, 'catalog/*/*')) {
  return TRUE;
}
return FALSE;
?>

Параметры видимости блока

Так же добиться похожего результата можно используя модуль Block Visibility by RegExp.

Написанное актуально для Drupal 7
Похожие записи

Комментарии RSS

Немного упростить можно:

$request_path = request_path();
return drupal_match_path($request_path, 'catalog/*') && !drupal_match_path($request_path, 'catalog/search/*');

Еще немного упростим:
if((arg(0) == 'catalog') && (arg(1) != 'search')) return 1;

arg возвращает системный путь, а drupal_match_path работает с фактическим

Из условия не ясно на чем и как построен каталог. вот я и предложил - откуда мне знать отличается фактический от системного или нет ;)

Есть рабочий вариант под друпал 6? Срочно нужно.
По этому варианту появляется ошибка:

Fatal error: Call to undefined function request_path() in /var/www/bla----bla/includes/common.inc(1696) : eval()'d code on line 2

$request_path = $_GET['q'];

Спасибо за быстрый ответ, попробовал - блок не отображается ни на какой странице.
Мне надо, чтобы он показывался на catalog/page/* и не показывался на catalog/page.
Использовал такой код:

<?php
$request_path = $_GET['q'];
if (drupal_match_path($request_path, 'catalog/page/*') &&
  !drupal_match_path($request_path, 'catalog/page')) {
  return TRUE;
}
return FALSE;
?>

Показывать только на перечисленных страницах - catalog/page/*

Попробывал:

<?php
$request_path = $_GET['q'];
if drupal_match_path($request_path, 'catalog/page/*') {
  return TRUE;
}
return FALSE;
?>

Блок появляется на всех страницах.

И забыл уточнить, мне нужно, чтобы блок появлялся на всех страницах кроме catalog/page.

предыдущий коммент прочитайте, вам не нужен php код

Спасибо большое!
Все, как всегда, оказалось проще, чем я думал :)

Для решения таких штук испольщую Context, там можно не только по пути отображать блоки, но и по другим условиям.

Кстати, если взглянуть на реализацию request_path, то можно ужаснуться количеству кода.
Я бы еще упростил код от Ch:

$request_path = drupal_get_path_alias();
return drupal_match_path($request_path, 'catalog/*') && !drupal_match_path($request_path, 'catalog/search/*');

drupal_get_path_alias() в разы быстрее request_path().

то можно ужаснуться количеству кода

там 60% комментариев

drupal_get_path_alias() в разы быстрее request_path().

не правда

не правда

Возможно. Спорить не стану.

Проверил. Я был не прав. Признаю :)

А как сделать, множественное значение? Например, чтобы показывал там там и там и не показывал там и там?

Здравствуйте, а кто-нибудь сталкивался с показом блока только на первой странице Views?
Чтобы он не отображался на остальных страницах?
или отображением тольк на конктретной странице views page

Спасибо за подсказку, пригодилось.
А как добавить еще одну страницу для показа блока?

<?php
$request_path = request_path();
if (drupal_match_path($request_path, 'event/*') &&
  drupal_match_path($request_path, 'events_all/*') &&
  !drupal_match_path($request_path, 'event/metasonic-touch/*')) {
  return TRUE;
}
return FALSE;
?>

- не работает

(первое услови) || (второе условие)

а как добавить условие по типу ноды?

Как можно реализовать такое условие:
1. Создаю ноду. (Ноды под каждый url).
2. В дополнительное поле "field_url" прописываю, например: "catalog/page/konfety"
3. И нужно в блоке вывести текст из поля "body" только, если

$request_path = request_path();
if( $request_path == $node->field_url ) 

Я так понимаю, сначала нужно
$request_path = request_path();
получить из базы ту ноду, у которой есть в поле "field_url" данный url
$request_path = request_path();
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node');
$query->propertyCondition('type', 'page' );
$query->fieldCondition('field_url', 'value', $request_path, '==');
$query->range(0, 1);
$result = $query->execute();
if ($result) {
  // $nid = key($result['node']);
  return TRUE;
}
return FALSE;

url создаётся сложно, через Facet API Pretty Paths.
Хотел блок через views сделать. Или тоже просто кодом вывести текст?
Как правильнее это реализовать?

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании