简体   繁体   English

仅显示在FormFields奏鸣曲中具有特定角色的用户

[英]Show only user with a specific role in FormFields sonata

Here I am on a project for my studies and I use symfony fosUser and sonata, I have a Book entity that I administer with sonata. 在这里,我正在进行一个研究项目,并使用symfony fosUser和奏鸣曲,我有一个与奏鸣曲一起管理的Book实体。

The problem is that I want to give an user to a book, but it becomes complicated when I want to find in my field user only the user whose role ROLE_MyRole, I search on forums for several hours without finding. 问题是我想给用户看书,但是当我只想在现场用户中找到角色ROLE_MyRole的用户时,情况变得很复杂,我在论坛上搜索了几个小时却找不到。

I'm sorry for my incompetence I learn symfony recently and does not yet have enough experience. 对不起,我最近学过symfony,但经验不足,对此感到抱歉。

This is my BookAdmin 这是我的BookAdmin


class BookAdmin extends Admin
{
    // Fields to be shown on create/edit forms
    protected function configureFormFields(FormMapper $formMapper)
    {
        static $options = array();
        $currentBook = $this->getSubject();
        if (null !== $currentBook->getFileName())
            $options = array(
                'required' => false,
                'help' => 'getWebPath().'">Download File : '.$currentBook->getFileName().'',
            );

        $formMapper
            ->add('title', null, array('label' => 'Titre : '))
            ->add('summary', null, array('label' => 'Résumé : '))
            ->add('category', null, array('label' => 'Catégorie : '))
            ->add('readers', null, array('label' => 'Lecteur(s) : '))
            ->add('file', 'file', $options)
            ;
    }

And this is my Book entity with readers field 这是我与读者字段相关的图书实体


class Book
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=255)
     */
    protected $title;

    /**
     * @var string
     *
     * @ORM\Column(name="summary", type="text")
     */
    protected $summary;

    /**
     * @Assert\File(
     *      mimeTypes={"application/pdf", "application/x-pdf"},
     *      mimeTypesMessage="Only PDF"
     * )
     */
    protected $file;

    /**
     * @var string
     *
     * @ORM\Column(name="file_path", type="string", length=255)
     */
    protected $fileName;

    /**
     * @var \DateTime
     *
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(name="created_at", type="datetime")
     */
    protected $createdAt;

    /**
     * @var \DateTime
     *
     * @Gedmo\Timestampable(on="update")
     * @ORM\Column(name="updated_at", type="datetime")
     */
    protected $updatedAt;

    /**
     * @var bool
     *
     * @ORM\Column(name="enabled", type="boolean", nullable=true)
     */
    protected $enabled;

    /**
     * @var bool
     *
     * @ORM\Column(name="received_by_reader", type="boolean", nullable=true)
     */
    protected $receivedByReader;

    /**
     * @var bool
     *
     * @ORM\Column(name="download_by_reader", type="boolean", nullable=true)
     */
    protected $downloadByReader;

    /**
     * @var bool
     *
     * @ORM\Column(name="send_by_reader", type="boolean", nullable=true)
     */
    protected $sendByReader;

    /**
     * @var bool
     *
     * @ORM\Column(name="reader_validation", type="boolean", nullable=true)
     */
    protected $readerValidation;

    /**
     * @var bool
     *
     * @ORM\Column(name="edited", type="boolean", nullable=true)
     */
    protected $edited;

    /**
     * @var User
     *
     * @ORM\ManyToOne(targetEntity="Application\Sonata\UserBundle\Entity\User")
     */
    protected $author;

    /**
     * @var ArrayCollection
     *
     * @ORM\ManyToMany(targetEntity="Application\Sonata\UserBundle\Entity\User", cascade={"persist"})
     */
    protected $readers;

Thanks You 谢谢

You can do something like this in your admin class: 您可以在管理类中执行以下操作:

$formMapper
    ->add('readers', null, array(
        'label' => 'Lecteur(s) : ',
        'code'  => 'getReadersWithMyRole'
))

and define in your User entity the following method: 并在您的用户实体中定义以下方法:

/**
 * Returns readers with "ROLE_MyRole" role
 *
 * @return array
 */
public function getReadersWithMyRole()
{
    $result = array();

    foreach ($this->getReaders() as $reader) {
        if ($reader->hasRole('ROLE_MyRole')) {
            $result[] = $reader;
        }
    }

    return $result;
}

Hope it helps. 希望能帮助到你。

it doesn't work too but we have find a solution, we can do that like this : 它也不起作用,但是我们找到了一个解决方案,我们可以这样做:

->add('reader', null, array(
'class' => 'ApplicationSonataUserBundle:User',
'label' => 'Lecteur : ',
'query_builder' => function (EntityRepository $er) {
    $qb = $er->createQueryBuilder('u');
    $qb->where($qb->expr()->like('u.roles', $qb->expr()->literal('%ROLE_READER%')));
    return $qb;
}))

if it can help someone 如果可以帮助某人

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM