Вы здесь

Как сделать поле выбора страниц на которых будет отображаться views-block?

2

Дано:
тип материала Баннер у которого много полей.
Views блок для вывода этого баннера
Задача - сделать у баннера поле выбора страниц, на которых он будет показываться.
Среди страниц нужны страницы всех типов материала на сайте, и Views - страницы.

Версия Drupal: 
7.x
Связанные проекты: 
Entity reference
Вопрос задан 04.02.2015 - 09:42
Аватар пользователя Dima
Dima
18

Ответы

1

Будут проблемы со страницами вьюсов,панелей, в общем всем что не является сущностью. Entityreference тут не универсальный вариант. Я бы сделал просто textarea как советует xandeadx или множественное textfield поле, куда бы просто писал списки url где показывать, а уже контекстом или вьюсами проверять соответствие текущему урлу (родной проверки урла кажется нет, дергать через php).

Да, не очень красиво, но универсально.

Ответ дан 04.02.2015 - 13:22
3

К ответу adubovskoy и xandedadx добавлю. В случае если будете делать по принципу оригинальных блоков, т.е. textarea где с каждой строки будет указываться страница + чекбоксы типа показывать на перечисленных или показывать на всех кроме перечисленных, поможет код:

// Вместо PAGES надо подставить string переменную со списком урл.
// Затем мы его конвертируем в нижний регистр для сравнения.
$pages = drupal_strtolower(PAGES);
// Конвертируем текущий урл в нижний регистр, мало ли.
$path = drupal_strtolower(drupal_get_path_alias($_GET['q']));
// Сравниваем адреса (тут учитываются ЧПУ). В данном случае. $page_match примет TRUE
// если текущая страница имеется в списке.
$page_match = drupal_match_path($path, $pages);
// Сравнение оригинальных урл (node/NID), урл от вьюсов и т.д.
if ($path != $_GET['q']) {
$page_match = $page_match || drupal_match_path($_GET['q'], $pages);
}
// Допустим имеем следующие типы.
// 0 - На всех страницах кроме перечисленных.
// 1 - Выводится только на перечисленных.
// Значение берёте из нужной вами переменной. Пусть в примере будет 0.
$match_type = 0;
// Первое сравнение: $match_type == "0" && !$page_match
// Оно сравнивает "На всех страницах кроме перечисленных".
// Второе сравнение: $match_type && $page_match
// Оно сравнивает "Только на перечисленных страницах".
// "0" как строка, так как из моего кода выбирается чекбоксами, а их занчепния друпал
// понимает как строку.
if ($match_type == "0" && !$page_match || $match_type && $page_match) {
   // Тут либо возвращаем TRUE (если будет функция). 
   // Либо пишем вывод блока.
}

Надеюсь передал суть вывода. Код в в примере можно посмотреть тут: https://github.com/Niklan/Mappy/blob/7.x-1.x/mappy.module#L28-L58

Для простоты тот же самый код, только в виде функции возвращающей TRUE или FALSE.

/**
 * Проверяет, соответствует ли текущий адрес страницы указанным в списке.
 * $pages: Строка со списком страниц для проверки.
 * $match_type: Тип проверки. 
 *              0 - На всех кроме перечисленых;
 *              1 - Только на перечисленных.
function match_urls($pages, $match_type = 0);
  $pages = drupal_strtolower($pages);
  $path = drupal_strtolower(drupal_get_path_alias($_GET['q']));
  $page_match = drupal_match_path($path, $pages);
  if ($path != $_GET['q']) {
    $page_match = $page_match || drupal_match_path($_GET['q'], $pages);
  }

  if ($match_type == "0" && !$page_match || $match_type && $page_match) {
     return true;
  }
  else {
    return false;
  }
}

P.s. $paths в данном случае должен быть строкой, каждый новый адрес с новой строки (аля \r\n\ - textarea это делает сама, в иных случаях придётся следить за этим).
P.s.s. Этот код понимает паттерны:

node/*
node/*/example
*/lol

В общем всё как с оригинальными блоками.

Ответ дан 04.02.2015 - 17:52
Аватар пользователя Niklan
Niklan
445