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

06.05.2011

В параметрах видимости блока можно указать либо Показывать только на перечисленных страницах, либо Показывать на всех страницах исключая перечисленные. Т.е. нельзя скомбинировать условия, и например показывать блок в первом уровне каталога 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
Похожие записи

Комментарии

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

$request_path = request_path();
return drupal_match_path($request_path, 'catalog/*') && !drupal_match_path($request_path, 'catalog/search/*');
Гость
09.05.2011, 12:15

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

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

Гость
09.05.2011, 12:32

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

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

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

Спасибо за быстрый ответ, попробовал - блок не отображается ни на какой странице.
Мне надо, чтобы он показывался на 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, там можно не только по пути отображать блоки, но и по другим условиям.

Vydrin_AP
17.08.2011, 13:20

Кстати, если взглянуть на реализацию 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().

не правда

Vydrin_AP
17.08.2011, 15:07

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

Ксения
01.07.2013, 16:36

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

<?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;
?>

- не работает

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

Гость
11.04.2014, 16:25

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

Игорь
20.08.2016, 09:46

Как можно реализовать такое условие:
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 сделать. Или тоже просто кодом вывести текст?
Как правильнее это реализовать?

Добавить комментарий