Как отобразить блокировку на страницах с URL-адресами, содержащими знак вопроса ("запрос на поиск"?


Например, я получаю URL-адрес, подобный

example.com/viewname?f=[0]field_name=%3A21

Я хочу сделать блок видимым на страницах, подобных приведенным выше, но не , когда отображается только представление.

Только вид будет выглядеть так: example.com/viewname

Поэтому я решил установить настройку видимости блока так, чтобы она была видна только на:

example.com/viewname*

Это не сработало (блок не появился), поэтому я попробовал:

example.com/viewname?* , example.com/viewname?f* и example.com/viewname/*

Нет успех.

РЕДАКТИРОВАТЬ:

Есть несколько вариантов:

1) Создание блока в пользовательском модуле может быть решением.

1a Установка видимости на "нет", отключив содержимое и заголовок блока (которые я решил использовать сейчас)

1b Включение модуля фильтра PHP и добавление блока, устанавливающего ограничения видимости, например:

/**
  * Implements hook_block_info().
  */
function mymod_block_info(){
  $blocks['mymod_job_agent'] = array(
    'info' => t('block description'), //The name that will appear in the block list.
    'cache' => DRUPAL_CACHE_PER_ROLE, //Default
    'region' => 'sidebar_first', // assign block region
    'status' => 1, // enable the block
    'visibility' => BLOCK_VISIBILITY_PHP, // set visibility to use the result of pages
    'pages' => '<?php return TRUE; ?>',
  );
  return $blocks;
}

Недостаток: так как hook_block_info вызывается только при установке модуля вы не можете изменить свой код без переустановки модуля. И помещать php-код в de pages просто неправильно. Поэтому я думаю, что мы можем пересечь вариант 1b.

2) Другим решением было бы использовать модуль Блокировать условную видимость по параметрам запроса URI, но я не мог понять, как использовать это в данном случае.

Чтение комментариев это то, что должно быть сделано на уровне темы...

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

 4
Author: Pierre.Vriens, 2013-04-22

4 answers

Вы можете использовать модуль Условная видимость блока по параметрам запроса URI для управления видимостью блока с помощью строки запроса.

Управляет видимостью блоков по параметрам запроса URI. Drupal изначально позволяет размещать блоки на страницах, используя их пути, однако этот модуль позволяет администраторам также отображать модули на основе параметров URL-запроса.

 4
Author: Lester Peabody, 2013-04-22 16:58:31

Я всегда помещал любую причудливую логику видимости внутри крючка просмотра блоков, например,

$block['subject']='';
$block['content']='';

switch($delta) {

  case 'foo':

     if ( // visibility condition is true ) {
        // create the block['subject'] and block['content'] here
     }

     return $block;

}

Так как, если $block['content'] пусто, блок не будет отображаться. Это может быть полностью "против пути drupal", но я чувствую, что это облегчает чтение кода, а также выводит из цикла на одну оценку php меньше.

ДОБАВЛЕНИЕ: Это, похоже, получило некоторое одобрение здесь: Есть ли способ установить видимость блока программно без использования модуля фильтра PHP?

 1
Author: Jimajamma, 2017-04-13 12:47:08

В конце концов я создал блок с помощью кода: Вот как я это сделал:

1) Создайте новый модуль или скопируйте существующий и переименуйте его.

2) Создайте блок, используя крючок hook_block_info(). Например:

/**
 * Implements hook_block_info().
 */
function mymodule_block_info(){

  $blocks['mymodule_block_name'] = array(
    'info' => t('Block description'), //The name that will appear in the block list.
    // if you cache blocks on your page and you use the query string for visibility
    // the page doesn't change so you need to set it to DRUPAL_NO_CACHE
    'cache' => DRUPAL_NO_CACHE,
    'region' => 'sidebar_first', // assign block region
    'status' => 1, // enable the block
  );

  return $blocks;
}

3) Создайте содержимое блока с помощью функции hook_block_view():

/**
 * Implements hook_block_view
 */
function vacancies_block_view($delta = '') {
  // declare empty block
  $block['subject'] = '';
  $block['content'] = ''; 

  // switch block name
  switch ($delta) {

    case 'mymodule_block_name':
      if( TRUE /* put visibility condition here */ ) {

        $block['subject'] = 'Block title';
        $block['content'] = 'Hello world!';

     }
    break;
  }

  return $block; // dont forget to the return the $block!
}

4) загрузите свой код, включите модуль, очистите кэш и проверьте результат.

Как было предложено Jimajamma, вы можете скрыть свой блок, установив тему блока и содержание '' Делает его приятнее вводить в ваше состояние php-код, а затем использовать модуль php-фильтра.

 1
Author: FLY, 2013-04-23 09:47:24

Для этого вы можете использовать модуль Правила блокировки видимости (без пользовательского кодирования). Вот цитата со страницы его проекта:

Модуль видимости блока правил позволяет использовать компоненты правил для управления видимостью блока. Это обеспечивает администраторам и разработчикам Drupal исключительную гибкость в управлении тем, когда блоки должны отображаться на их веб-сайтах, в дополнение к параметрам видимости по умолчанию, предоставляемым Drupal.

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

Нужно показывать блокировку только для пользователей, зарегистрированных более месяца назад?

Возможно, у вас есть блок, который должен отображаться только с 8 утра до 5 вечера в будние дни?

Как насчет отображения или скрытия блока в зависимости от текущих погодных условий?

Все это можно сделать с помощью видимости блокировки правил.

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

Для иллюстрации того, как использовать этот модуль, обратитесь к моему ответу на " Как запретить отображение блока представлений администраторам, таким как пользователь/1?". Он включает компонент Правил (в Правилах формат экспорта), который вы должны заменить этим вариантом, чтобы он соответствовал вашему конкретному вопросу):

{ "rules_block_visibility_popular_courses" : {
    "LABEL" : "Hide block for filtered course view",
    "PLUGIN" : "rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "USES VARIABLES" : {
      "module" : { "label" : "Module", "type" : "text" },
      "delta" : { "label" : "Delta", "type" : "text" },
      "result" : { "label" : "Result", "type" : "boolean", "parameter" : false }
    },
    "IF" : [
      { "text_matches" : {
          "text" : [ "site:current-page:path" ],
          "match" : "viewname?",
          "operation" : "starts"
        }
      }
    ],
    "DO" : [ { "data_set" : { "data" : [ "result" ], "value" : "1" } } ],
    "PROVIDES VARIABLES" : [ "result" ]
  }
}

Адаптируйте значение viewname в соответствии с вашими потребностями. И для дальнейшего улучшения вышеупомянутого компонента правил (чтобы сделать его более универсальным), просто замените условие правил в нем чем-то, используя соответствующее регулярное выражение (т.Е. Чтобы проверить, содержит ли текущий путь "?".

 0
Author: Pierre.Vriens, 2017-04-13 12:47:10