通知下拉symfony

Notification dropdown symfony

我有一个通知图标。当用户单击它时,会出现一个下拉列表并显示一个列表。我想过滤列表以仅显示与已连接用户相关的内容。

{% if app.user.roles[0] == "ROLE_DEVELOPPER"%}
<!-- dropdown notification message -->
<li class="dropdown">
    <a title="Notifications" href="#fakelink" class="dropdown-toggle" data-toggle="dropdown">
        <strong> <i class="fa fa-bell"></i></strong>

    </a>
    {% if notif_conges|length > 0 %}
    <ul class="dropdown-menu animated half flipInX">
        //this section
        {% for notif_c in notif_conges %}

        {% if  notif_c.etat == "Acceptée" %}
        <li><a>Votre demande : "{{notif_c.motif}}" Envoyée le "{{notif_c.CreatedAt|date('Y-m-d H:i:s')}}" a était traitée </a></li>
        {% endif %}

        {% endfor %}

    </ul>
    {% endif %}

</li>
{% endif %}

你必须使用 is_granted twig 过滤器。

您可以指定您的用户角色,但 IS_AUTHENTICATED_REMEMBERED 角色将授予所有登录用户.

{% is_granted('IS_AUTHENTICATED_REMEMBERED') %}
<!-- dropdown notification message -->

...

{% endif %}

您想过滤通知。只需要显示有关已连接用户的通知。您有两个解决方案:

(非常)糟糕的方法:在视图中添加测试

    <ul class="dropdown-menu animated half flipInX">
        //this section
        {% for notif_c in notif_conges %}

        {% if  notif_c.etat == "Acceptée" and notif_c.user = app.user %}
        <li><a>Votre demande : "{{notif_c.motif}}" Envoyée le "{{notif_c.CreatedAt|date('Y-m-d H:i:s')}}" a était traitée </a></li>
        {% endif %}

        {% endfor %}

    </ul>

这是一种糟糕的方式,因为您会将所有通知转发到视图

糟糕的方法:在控制器中添加过滤器

class YourController
{
    public yourAction()
    {
       /** ... your code to handle notifications **/
       foreach ($notifications as $notification) {
          if ($notification->getUser()->getId() == $this->getUser()->getId)) {
             $filteredNotification[] = $notification;
          }
       }
       return $this->render('your_template_file', [
           'notif_c' => $filteredNotifications
       ]);
    }
}

这仍然是一个糟糕的方法,因为您要从数据库中检索所有通知。

好方法:只向您的存储库请求必要的通知 假设,您的通知正在使用 Doctrine 进行检索,存储库可以过滤数据以仅检索相关数据。

class YourController
{
    public yourAction()
    {
       /** ... your code is certainly something lke this: **/
         $notificationRepository = $this->entityManager->getRepository('AppBundle:Notification');
         $notifications = $notificationRepository->findAll();
         render 

       return $this->render('your_template_file', [
           'notif_c' => $notifications
       ]);
    }
}

findAll() 替换为 findBy(array $criteria) 并添加条件作为第一个参数:

class YourController
{
    public yourAction()
    {
         $notificationRepository = $this->entityManager->getRepository('AppBundle:Notification');
         $notifications = $notificationRepository->findBy([
           'etat' => 'Acceptée',
           'user' => $this->getUser(), //this could be a little different, I do not remember how to handle user in Sf2.8
         ]);
         render 

       return $this->render('your_template_file', [
           'notif_c' => $notifications
       ]);
    }
}