Блок для текущего пользователя

Главные вкладки

Аватар пользователя leha373 leha373 19 октября 2020 в 21:37

Привет Всем!Хочу попросить помощи, на форуме уже задавался подобный вопрос, но ответа так и не увидел. И так.Я создал блок в котором выводятся материалы пользователя. Например пользователь по id=15 заходит на свою страницу user/15 и видит этот блок,заходит на user/16 и также видит этот блок.
Вопрос! Как сделать чтобы он странице user/16 скрывался блок, соответственно на странице user/17 тоже скрывался и т.д. и так для всех пользователей.То есть пользователь id=16 видел блок соответственно на странице user/16 и больше нигде, пользователь id=17- user/17 и больше нигде и т.д. можно это как то сделать без php, или в фильтре видимость php, или какой хук можно использовать чтобы написать там условие видимости.Спасибо

Лучший ответ

Аватар пользователя charOFF charOFF 24 октября 2020 в 20:33

<?php $account = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id()); ?>
здесь вы получаете объект юзера. А вам нужен только id, т.е. достаточно <?php \Drupal::currentUser()->id() ?>

Здесь:
<?php $current_path == 'user/$account' ?>

  1. в одиночных кавычках переменные не обрабатываются
  2. путь должен начинаться со слэша

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

Комментарии

Аватар пользователя vladtulku vladtulku 20 октября 2020 в 1:03

Создать блок на основе views с настройкой контекстного фильтра. Где выбираем Передать значение по умолчанию - ID авторизовавшегося пользователя. В правах пользователя отмечем Просмотр профилей пользователей для авторизованного пользователя. В настройках блока Роли -авторизованный пользователь(аналогичное можно сделать в настройках views). Настройка Страницы -Показывать блок на определённых страницах - Только на перечисленных страницах пишем user/*

Аватар пользователя leha373 leha373 20 октября 2020 в 8:06

Таким образом мой блок будет показываться на всех страницах user/*. А мне нужно, чтобы определенный юзер, например 15, на странице user/15 увидел блок со своими материалами, а если он перейдет на страницу user/16 этот блок не показывался, а методом выше он будет показываться. И так для всех пользователей

Аватар пользователя charOFF charOFF 20 октября 2020 в 10:21
1

Можно сделать вьюс по материалам с двумя контекстными фильтрами по автору одновременно:

  • в одном передать ID авторизовавшегося пользователя
  • во втором - ID из контекста пути
Аватар пользователя vladtulku vladtulku 20 октября 2020 в 15:30

На страницу user можно попасть только по заранее приготовленной ссылке. Если навести курсор на имя пользователя (например как автора статьи) то там всегда user/* на себя уже не попадешь.

Аватар пользователя leha373 leha373 20 октября 2020 в 15:33

gun_dose wrote: Почему бы не показывать этот блок на странице /user, А на /user/* скрывать?

Ну тогда пользователь(id=15) зайдя на свою страницу( user/15) не увидит блок, а должен. И также другие пользователи тоже не увидятю
я думаю нужно сохранить текущей путь, сохранить id текущего пользователя, который зашел на страницу и сравнить первый аргумент пути с id текущего пользователя, если равны, показывать блок(return true), не равны скрыть(return false)! В каком хуки это все реализовать?

Аватар пользователя leha373 leha373 24 октября 2020 в 9:31

charOFF wrote: Можно сделать вьюс по материалам с двумя контекстными фильтрами по автору одновременно:

в одном передать ID авторизовавшегося пользователя
во втором - ID из контекста пути

C представлением понятно. Теперь мне надо сделать с блоком. Есть блок сделанный модулем Block Tabs, в нем есть несколько вкладок и надо скрыть его. В друпал 7 есть код:

<?php
global $user;
if (
arg(0) == 'user' && $user->uid == arg(1)){
  return 
TRUE;
}
else {
  return 
FALSE;
}
?>

Подскажите, как его под друпал 8 переписать. Спасибо

Аватар пользователя leha373 leha373 24 октября 2020 в 15:21

Пытаюсь так


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

чего то не получается. Что ни так?

Аватар пользователя charOFF charOFF 24 октября 2020 в 20:33

<?php $account = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id()); ?>
здесь вы получаете объект юзера. А вам нужен только id, т.е. достаточно <?php \Drupal::currentUser()->id() ?>

Здесь:
<?php $current_path == 'user/$account' ?>

  1. в одиночных кавычках переменные не обрабатываются
  2. путь должен начинаться со слэша

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