Я пытаюсь создать такую ​​форму для управления разрешениями.

twitter   sms   email    readonwebsite
user0    yes      no     yes          yes
user1     no     yes      no          yes
user2     no      no      no          yes
user3    yes     yes     yes          yes

В настоящее время я использую цикл foreach для каждого субпользователя и добавляю его непосредственно в форму.

$form = $form->add($subUser->getId() . '_twitter', 'checkbox', array
(
    'label'     => 'twitter',
    'required'  => false,
    'mapped' => false,
    'data' => (bool)//original checkbox value derived from db value
));

И повторяющийся код для разрешений sms, email и read. Это не кажется очень элегантным. При обработке формы мне пришлось бы иметь дело с такими ключами, как 1337_twitter и 69_sms. Есть ли способ обработать форму вроде $form[$subUser->getId()]['twitter']?

0
No_name 8 Янв 2014 в 02:00

2 ответа

Лучший ответ

Я предполагаю, что вы используете Doctrine, потому что вы не указали, какой ORM вы используете. У вас есть объект Permission? Если вы создадите связь между разрешениями и пользователями, это будет намного чище. Вы можете добавить permissions в свою форму пользователя, и им будет легко управлять.

Таким образом, ваша таблица разрешений будет содержать записи для «twitter», «sms», «email», «readonwebsite».

Вы можете настроить свои сущности и форму, как показано ниже:

Например

// src/PathTo/YourBundle/Entity/Permission.php
class Permission
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255, nullable=false)
     */
    private $name;  // e.g. 'twitter' or 'email'

    /**
     * @ORM\ManyToMany(targetEntity="User", mappedBy="permissions")
     */
    private $users;
}


// src/PathTo/YourBundle/Entity/User.php
class User
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToMany(targetEntity="Permssion")
     * @ORM\JoinTable(name="user_permission",
     *     joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="permission_id", referencedColumnName="id")}
     * )
     */
    private $permissions;
}


// src/PathTo/YourBundle/Form/Type/UserFormType.php

class UserFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            // Add more fields
            ->add('permissions', null, array(
                'expanded' => true, // Creates checkboxes
            ))
        ;
    }

    // ...
}

Затем в вашем контроллере

// src/PathTo/YourBundle/Controller/UserContoller.php
public function editAction($id, Request $request)
{
    // ...
    // Get your user object

    $form = $this->createForm(new UserFormType(), $user);

    $form->handleRequest($request);

    if ($form->isValid()) 
        $em->persist($user);
        $em->flush();

        // redirect back to some edit page
        // ...
    }

    // render some form template
    // ...
}

Это так просто :)

1
antony 7 Янв 2014 в 22:43
... $form->add("[{$subUser->getId()}][twitter]" ...
1
Jessica 7 Янв 2014 в 22:16