Jump to content

symfony2 relação M:M


Recommended Posts

Boas,

Eu agora ando a fazer uma parte do meu site que é a introdução de novos utilizadores. Cada utilizador tem um tipo de acesso, sendo possível obter mais do que um, por exemplo o meu utilizador pode ser "ROLE_USER" e "ROLE_ADMIN". Logo tenho uma relação M:M. Numa tabela já tenho todos os acessos possíveis, e ao criar um novo utilizador consigo escolher quais os acessos a atribuir ao utilizador.

O meu problema é, ao gravar na base de dados, não estou a saber introduzir, o utilizador é introduzido, mas não criar a relação com o tipo de acesso. Já tive a procurar no google e a ler alguns tutoriais, mas não consegui colocar a funcionar.

Neste momento tenho o código assim:

public function newUserAction(Request $request){
	// create new user and insert to database
	$user = new Users();
	$user->setName('');
	$user->setPosition('');
	$user->setUsername('');
	$user->setEmail('');
	$user->setPassword('');

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

	if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);

		$factory = $this->container->get('security.encoder_factory');
		$encoder = $factory->getEncoder($user);
		$pwd = $encoder->encodePassword($user->getPassword(), $user->getSalt());
		$user->setPassword($pwd);

        if ($form->isValid()) {
            // perform some action, such as saving the task to the database
			$em = $this->getDoctrine()->getEntityManager();
            $em->persist($user);
            $em->flush();

            return $this->redirect($this->generateUrl('user_success'));
        }
    }

	return $this->render('AcmePorGeneBundle:User:newUser.html.twig', array(
            'form' => $form->createView(),
        ));
}

Assim fica apenas a introduzir o utilizador, alguém pode ajudar e dar umas orientação do que preciso fazer para obter o resultado pretendido?

?

...Join the dark side...and get a free cookie...

Link to comment
Share on other sites

Quanto a este problema já consegui resolver, foi esta a minha soluçao:

Ao criar a form:

public function buildForm(FormBuilder $builder, array $options){
    	$builder->add('name', 'text', array('required' => true, 'label' => 'Name: '));
	$builder->add('position', 'text', array('required' => true, 'label' => 'Position: '));
        $builder->add('username', 'text', array('required'  => true, 'label' => 'Username: '));
        $builder->add('email', 'text', array('required'  => true, 'label'  => 'E-Mail: '));
        $builder->add('password', 'password', array('required'  => true, 'label' => 'Password: '));
        $builder->add('idAccessLevel', 'entity', array( 'class' => 'Acme\TestBundle\Entity\AccessLevel',
				    'property' => 'permissions', 'multiple' => true, 'label' => 'Access:'
				));
    }

ao inserir na base de dados:

$access = new \Acme\TestBundle\Entity\AccessLevel();
...
for ($i = 0; $i < count($_POST['username']['idAccessLevel']); $i++){
			$em = $this->getDoctrine()->getEntityManager();
        		$entity = $em->getRepository('AcmeTestBundle:AccessLevel')->find($_POST['username']['idAccessLevel'][$i]);
			$user->addAccessLevel($entity);
		}

Ficou a funcionar, o único porem, que ainda não consegui resolver, é ao editar um utilizador, adicionar e retirar os tipos de acesso da-me erro, diz "Integrity constraint violation: 1062 Duplicate entry '1-5' for key 'PRIMARY'".

Pensei em duas soluções:

1) apagar as relações quando edito e voltar a criar;

2) verificar as relações existentes e comparar com as novas, retirar as que já não existem nas novas e adicionar as que faltam.

Mas ainda não consegui aplicar nenhuma destas soluções.

Se alguém puder ajudar e orientar-me no caminho certo eu agradeço  😉

...Join the dark side...and get a free cookie...

Link to comment
Share on other sites

Boas,

Alguém sabe como posso fazer isto?

Já ando desde as 9h da manha e ainda não consegui, já tentei "apagar" as relações existentes e ao fazer o update criar as novas relações, mas não alterou nada.

Basicamente o que tenho é uma tabela "ACCESS_LEVEL" que contem [EDIT, DELETE, CREATE, etc], uma tabela com os "USERS", e uma tabela relacional que contem o ID_ACCESS_LEVEL e o ID_USER. Ao criar um novo user eu atribuo alguns acessos, mas depois queria poder editar e retirar alguns acessos e inserir novos.

Para inserir os novos acessos consegui fazer, a parte que não estou a ter sucesso, é a parte de retirar alguns acessos. Por exemplo, o meu user tem acesso de "CREATE" e "DELETE", mas quero que tenha apenas de "CREATE", mas não estou a conseguir realizar esta parte.

Alguém sabe como posso fazer isto?

Desde já obrigado a quem souber ajudar-me  😄

...Join the dark side...and get a free cookie...

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.