Привет Всем!Хочу попросить помощи, на форуме уже задавался подобный вопрос, но ответа так и не увидел. И так.Я создал блок в котором выводятся материалы пользователя. Например пользователь по id=15 заходит на свою страницу user/15 и видит этот блок,заходит на user/16 и также видит этот блок.
Вопрос! Как сделать чтобы он странице user/16 скрывался блок, соответственно на странице user/17 тоже скрывался и т.д. и так для всех пользователей.То есть пользователь id=16 видел блок соответственно на странице user/16 и больше нигде, пользователь id=17- user/17 и больше нигде и т.д. можно это как то сделать без php, или в фильтре видимость php, или какой хук можно использовать чтобы написать там условие видимости.Спасибо
Блок для текущего пользователя
Главные вкладки
Лучший ответ
<?php $account = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id()); ?>
здесь вы получаете объект юзера. А вам нужен только id, т.е. достаточно <?php \Drupal::currentUser()->id() ?>
Здесь:
<?php $current_path == 'user/$account' ?>
- в одиночных кавычках переменные не обрабатываются
- путь должен начинаться со слэша
if ... else при простом сравнении можно не использовать, а сразу возвращать результат сравнения
Итого должно получиться что-то вроде
<?php
$current_path = \Drupal::service('path.current')->getPath();
$current_user_id = \Drupal::currentUser()->id();
return $current_path === "/user/$current_user_id";
?>
Хотя может быть правильнее будет проверять не путь, а параметры маршрута, например
<?php
$current_user = \Drupal::currentUser();
$route_match = \Drupal::routeMatch();
return ($route_match->getRouteName() === 'entity.user.canonical' && $route_match->getParameter('user')->id() === $current_user->id());
?>
Комментарии
Создать блок на основе views с настройкой контекстного фильтра. Где выбираем Передать значение по умолчанию - ID авторизовавшегося пользователя. В правах пользователя отмечем Просмотр профилей пользователей для авторизованного пользователя. В настройках блока Роли -авторизованный пользователь(аналогичное можно сделать в настройках views). Настройка Страницы -Показывать блок на определённых страницах - Только на перечисленных страницах пишем user/*
Таким образом мой блок будет показываться на всех страницах user/*. А мне нужно, чтобы определенный юзер, например 15, на странице user/15 увидел блок со своими материалами, а если он перейдет на страницу user/16 этот блок не показывался, а методом выше он будет показываться. И так для всех пользователей
Можно сделать вьюс по материалам с двумя контекстными фильтрами по автору одновременно:
Это похоже. а про хук который можно использовать никто не знает?
hook_views_api() Пример его использования описан в статье Сложные фильтры в Views, способ 2 — пишем свой filter handler Там же есть полезные ссылки.
hook_block_list_alter() этот не подойдет видимость блока там описать?
Видимости блока можно изменить в hook_block_access
Почему бы не показывать этот блок на странице /user, А на /user/* скрывать?
На страницу user можно попасть только по заранее приготовленной ссылке. Если навести курсор на имя пользователя (например как автора статьи) то там всегда user/* на себя уже не попадешь.
там вроде подходящий пример есть
Это для 7
Сори! Почему то казалось про 7ку разговор.
Ну тогда пользователь(id=15) зайдя на свою страницу( user/15) не увидит блок, а должен. И также другие пользователи тоже не увидятю
я думаю нужно сохранить текущей путь, сохранить id текущего пользователя, который зашел на страницу и сравнить первый аргумент пути с id текущего пользователя, если равны, показывать блок(return true), не равны скрыть(return false)! В каком хуки это все реализовать?
C представлением понятно. Теперь мне надо сделать с блоком. Есть блок сделанный модулем Block Tabs, в нем есть несколько вкладок и надо скрыть его. В друпал 7 есть код:
<?php
global $user;
if (arg(0) == 'user' && $user->uid == arg(1)){
return TRUE;
}
else {
return FALSE;
}
?>
Подскажите, как его под друпал 8 переписать. Спасибо
Пытаюсь так
<?php
$current_path = \Drupal::service('path.current')->getPath();
$account = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());
if ($current_path == 'user/$account'){
Return TRUE;
}
else {
return FALSE;
}
?>
чего то не получается. Что ни так?
<?php $account = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id()); ?>
здесь вы получаете объект юзера. А вам нужен только id, т.е. достаточно
<?php \Drupal::currentUser()->id() ?>
Здесь:
<?php $current_path == 'user/$account' ?>
if ... else при простом сравнении можно не использовать, а сразу возвращать результат сравнения
Итого должно получиться что-то вроде
<?php
$current_path = \Drupal::service('path.current')->getPath();
$current_user_id = \Drupal::currentUser()->id();
return $current_path === "/user/$current_user_id";
?>
Хотя может быть правильнее будет проверять не путь, а параметры маршрута, например
<?php
$current_user = \Drupal::currentUser();
$route_match = \Drupal::routeMatch();
return ($route_match->getRouteName() === 'entity.user.canonical' && $route_match->getParameter('user')->id() === $current_user->id());
?>
Спасибо. Все работает