1

I'm making the user edit.
I want to view selected role of the current user by Users.role_id = UsersRole.id

The table Users has four columns (id,username,roleId,descriptions)
The table UsersRole has two columns (id,name)

Controller:

public function editAction($id) {
    $user = $this->getDoctrine()
            ->getEntityManager()
            ->getRepository('TruckingMainBundle:Users')
            ->find($id);

    if (!$user) {
        throw $this->createNotFoundException('Unable to find user id.');
    }
    $form = $this->createForm(new \Trucking\AdminBundle\Form\UserType(), $user);
    $request = $this->getRequest();

    //save data
    if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);
        if ($form->isValid()) {
            $em = $this->getDoctrine()->getEntityManager();
            $em->persist($user);
            $em->flush();
            return $this->redirect($this->generateUrl('tracking_admin_users'));
        }
    }
    return $this->render('TruckingAdminBundle:user:edit.html.twig', array(
                'id' => $id,
                'form' => $form->createView()
                    )
    );
}

UserType.php

    public function buildForm(FormBuilderInterface  $builder, array $options) {

     $builder
        ->add('roleId', 'entity', array(
                'class' => 'TruckingMainBundle:UsersRole',
                'property' => 'name'
        ))
        ->...->..
    }

I don't know how to set selected (default) value in that list, I've been trying to do it for 5 hours ,but still no results

I've used preferred_choices, query_builder -> where I can select by critreia(but i don't need that)
http://symfony.com/doc/current/reference/forms/types/entity.html enter image description here

I can print my current user id -> print_r($user->getRoleId());
I already have it. My 'Users' entity has connection with UserRole entity

Users entity

namespace Trucking\MainBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
/**
 * Trucking\MainBundle\Entity\Users
 *
 * @ORM\Table(name="Users")
 * @ORM\Entity
 */
class Users implements UserInterface
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;

    /**
     * @var string $password
     *
     * @ORM\Column(name="password", type="string", length=15)
     */
    private $password;

    /**
     * @var string $username
     *
     * @ORM\Column(name="username", type="string", length=30)
     */
    private $username;

    /**
     * @var string $description
     *
     * @ORM\Column(name="description", type="string", length=20)
     */
    private $description;

    /**
     * @var string $permissions
     *
     * @ORM\Column(name="permissions", type="string", length=300)
     */
    private $permissions;

    /**
     * @var \DateTime $date
     *
     * @ORM\Column(name="date", type="datetime")
     */
    private $date;

    /**
     * @var integer $role_id
     *
     * @ORM\Column(name="role_id", type="integer")
     */
    private $role_id;

    /**
     * @var integer $company_id
     *
     * @ORM\Column(name="company_id", type="integer")
     */    
    private $company_id;

    /**
     * @ORM\ManyToMany(targetEntity="Company", inversedBy="users")
     *
     */
    protected $companies;

    /**
     * @ORM\OneToOne(targetEntity="UsersRole")
     * @ORM\JoinColumn(name="role_id", referencedColumnName="id")
     */
    protected $roles;

    public function __construct() {
        $this->companies = new ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set password
     *
     * @param string $password
     * @return Users
     */
    public function setPassword($password)
    {
        $this->password = $password;

        return $this;
    }

    /**
     * Get password
     *
     * @return string 
     */
    public function getPassword()
    {
        return $this->password;
    }

    /**
     * Set username
     *
     * @param string $username
     * @return Users
     */
    public function setUsername($username)
    {
        $this->username = $username;

        return $this;
    }

    /**
     * Get username
     *
     * @return string 
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     * Set description
     *
     * @param string $description
     * @return Users
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Set permissions
     *
     * @param string $permissions
     * @return Users
     */
    public function setPermissions($permissions)
    {
        $this->permissions = $permissions;

        return $this;
    }

    /**
     * Get permissions
     *
     * @return string 
     */
    public function getPermissions()
    {
        return $this->permissions;
    }

    /**
     * Set date
     *
     * @param \DateTime $date
     * @return Users
     */
    public function setDate($date)
    {
        $this->date = $date;

        return $this;
    }

    /**
     * Get date
     *
     * @return \DateTime 
     */
    public function getDate()
    {
        return $this->date;
    }

    /**
     * Set role_id
     *
     * @param integer $role
     * @return Users
     */
    public function setRoleId($role_id)
    {
        $this->roleId = $role_id;

        return $this;
    }

    /**
     * Get role_id
     *
     * @return integer 
     */
    public function getRoleId()
    {
        return $this->role_id;
    }

    /**
     * Set company_id
     *
     * @param Company $company_id
     * @return Users
     */
    public function setCompany(Company $company_id)
    {
        $this->company = $company_id;

        return $this;
    }

    /**
     * Get company_id
     *
     * @return integer 
     */
    public function getCompanyId()
    {
        return $this->company_id;
    }

    public function equals(UserInterface $user) {
        return $this->getUsername() == $user->getUsername();
    }

    public function eraseCredentials() {

    }

    public function getRoles() {
        return (array)$this->roles->getName();
    }

    public function setRoles($role) {
        $this->roles = array($role);
    }

    public function getSalt() {

    }    
}

UsersRole entity

namespace Trucking\MainBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

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

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

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

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return USERS_ROLE
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set description
     *
     * @param string $description
     * @return USERS_ROLE
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }
}

UserType (for form)

<?php
namespace Trucking\AdminBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints;

class UserType extends AbstractType {

    public function buildForm(FormBuilderInterface  $builder, array $options) {

     $builder
        ->add("username","text",array(
                   "label" => "Name",
                       'attr'   =>  array(
                           'class'   => 'input-xlarge',
                       ),
                    'constraints' => new Constraints\Length(array('min' => 3))
                   ))
        ->add('roleId', 'entity', array(
                'class' => 'TruckingMainBundle:UsersRole',
                "label" => "Roles",
                'property' => 'name'
        ))
        ->add("description","text",array(
           "label" => "Description",
               'attr'   =>  array(
                   'class'   => 'input-xlarge'
               ),
                'constraints' => new Constraints\NotBlank()
           ));
    }

    public function getName()
    {
        return 'trucing_adminbundle_usertype';
    }
}
Dezigo
  • 3,220
  • 3
  • 31
  • 39
  • I'm not entirely sure and too lazy to check, but `$builder->add('roleId', 'entity', array('data' => 'ROLE_ADMIN'))` should work. At least this is how you set a default value in `country` and `choice` fields? – dbrumann Jan 15 '13 at 16:03
  • http://stackoverflow.com/questions/7913086/how-to-set-default-value-for-form-field-in-symfony2 – Squazic Jan 15 '13 at 16:09
  • 'data' => 'ROLE_USER' doesn't work,I've tried to use 'preferred_choices' => array('ROLE_USER') and I have an error :Warning: spl_object_hash() expects parameter 1 to be object, string given – Dezigo Jan 15 '13 at 16:18
  • Can it be that instead of ROLE_USER you have to specify the id, e.g. 1? Otherwise you could just manipulate the query in a way so that the desired default value will be the first entry in the result set. Might not be the nicest solution, but that should work... – dbrumann Jan 15 '13 at 16:32

2 Answers2

1

Set the property on your entity before you render the form:

if (!$user) {
    throw $this->createNotFoundException('Unable to find user id.');
}

//THIS IS NEW
$theRole = getRoleEntityFromSomewhereItMakesSense();
$user->setRole($theRole); //Pass the role object, not the role's ID

$form = $this->createForm(new \Trucking\AdminBundle\Form\UserType(), $user);
$request = $this->getRequest();

When you generate a form, it gets automatically populated with the properties of the entity you are using.

EDIT Change

->add('roleId', 'entity', array(

to

->add('roles', 'entity', array(

I don't get why you have roleId and roles at the same time.

Also change the following, since roles is a single element, not an array (you have a relation one-to-one on it, and should be one-to-many and reversed as many-to-one, but I guess it will also work)

public function getRoles() {
    return $this->roles;
}

public function setRoles($role) {
    $this->roles = $role;
}
ButterDog
  • 5,115
  • 6
  • 43
  • 61
  • I did't get it, but you should pass the hole entity to $user->setRole($theRole);, I'll edit my answer – ButterDog Jan 15 '13 at 17:06
  • Just add it to your entity, something like **setRole($r){$this->roles = array($r);}**, the actual implementation depends on your requirements, but shouldn't be complicated. – ButterDog Jan 15 '13 at 17:23
  • I'v created $user->setRoles(new \Trucking\MainBundle\Entity\UsersRole()); + I public function setRoles($role) { $this->roles = array($role); }, but still nothing.. I'm thinking about dependency.. – Dezigo Jan 15 '13 at 17:33
  • I had read about your idea before I created this topic, but I don't understand, what I need to implement, to make this simple thing – Dezigo Jan 15 '13 at 17:55
  • Your entity should contain a set of properties and getters and setters. That's the way the information is persisted and passed trough the application. A form is simply a way to let the users set values on your entities, so they are both connected. When you render your form, it will just display the data the entity contain, nothing more. Why don't you post the full code of your entity? – ButterDog Jan 15 '13 at 18:05
  • Edited answer, I don't see the need of having role_id and roles at the same time on your entity – ButterDog Jan 15 '13 at 18:47
1

There has been a problem with ORM JOINS. id to role_id

I've changed the mapping from One-To-One Bidirectional to One-To-One, Unidirectional with Join Table.


Full code:
Users.php

<?php

namespace Trucking\MainBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
/**
 * Trucking\MainBundle\Entity\Users
 *
 * @ORM\Table(name="Users")
 * @ORM\Entity
 */
class Users implements UserInterface
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;

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

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

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

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

    /**
     * @var integer $company_id
     *
     * @ORM\Column(name="company_id", type="integer")
     */    
    protected $company_id;

    /**
     * @var integer $role_id
     *
     * @ORM\Column(name="role_id", type="integer")
     */    
    protected $role_id;

    /**
     * @ORM\OneToOne(targetEntity="Company")
     * @ORM\JoinColumn( name="company_id", referencedColumnName="id" )
     */
    protected $companies;

    /**
     * @ORM\OneToOne(targetEntity="UsersRole")
     * @ORM\JoinColumn( name="role_id", referencedColumnName="id" )
     */
    protected $listRoles;

    public function __construct() {

    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set password
     *
     * @param string $password
     * @return Users
     */
    public function setPassword($password)
    {
        $this->password = sha1($password);

        return $this;
    }

    /**
     * Get password
     *
     * @return string 
     */
    public function getPassword()
    {
        return $this->password;
    }

    /**
     * Set username
     *
     * @param string $username
     * @return Users
     */
    public function setUsername($username)
    {
        $this->username = $username;

        return $this;
    }

    /**
     * Get username
     *
     * @return string 
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     * Set description
     *
     * @param string $description
     * @return Users
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Set permissions
     *
     * @param string $permissions
     * @return Users
     */
    public function setPermissions($permissions)
    {
        $this->permissions = $permissions;

        return $this;
    }

    /**
     * Get permissions
     *
     * @return string 
     */
    public function getPermissions()
    {
        return $this->permissions;
    }

    /**
     * Set company_id
     *
     * @param Company $company_id
     * @return Users
     */
    public function setCompanyId($company_id)
    {
        $this->company_id = $company_id;

        return $this;
    }

    /**
     * Get company_id
     *
     * @return integer 
     */
    public function getCompanyId()
    {
        return $this->company_id;
    }

    public function equals(UserInterface $user) {
        return $this->getUsername() == $user->getUsername();
    }

    public function eraseCredentials() {

    }

    /**
     * Get roles
     *
     * @return String 
     */
    public function getRoles() {
        $roles = $this->getListRoles();
        return (array)$roles->getName();
    }

    /**
     * Get roles
     *
     * @return \UsersRole 
     */
    public function getListRoles()
    {
        return $this->listRoles;
    }

    /**
     * Set roles
     *
     * @param \UsersRole
     * @return Users
     */
    public function setListRoles($roles)
    {
        $this->listRoles = $roles;
        return $this;
    }

    /**
     * Set role_id
     *
     * @param integer
     * @return Users
     */
    public function setRoleID($roleId) {
        $this->role_id = $roleId;
        return $this;
    }

    public function getSalt() {

    }

    /**
     * Get company
     *
     * @return Company
     */
    public function getCompanies()
    {
        return $this->companies;
    }

    /**
     * Set company
     *
     * @param Company $company
     * @return Users
     */
    public function setCompanies($company)
    {
        $this->companies = $company;
        return $this;
    }
}

UsersRole.php

<?php

namespace Trucking\MainBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

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

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

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

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return USERS_ROLE
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set description
     *
     * @param string $description
     * @return USERS_ROLE
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }
}

The controller hasn't been changed

public function editAction($id) {
    $user = $this->getDoctrine()
            ->getEntityManager()
            ->getRepository('TruckingMainBundle:Users')
            ->find($id);

    if (!$user) {
        throw $this->createNotFoundException('Unable to find user id.');
    }
    $form = $this->createForm(new \Trucking\AdminBundle\Form\UserType(), $user);
    $request = $this->getRequest();

    //save data
    if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);
        if ($form->isValid()) {
            $em = $this->getDoctrine()->getEntityManager();
            $em->persist($user);
            $em->flush();
            return $this->redirect($this->generateUrl('tracking_admin_users'));
        }
    }
    return $this->render('TruckingAdminBundle:user:edit.html.twig', array(
                'id' => $id,
                'form' => $form->createView()
                    )
    );
}

UserType.php

<?php
namespace Trucking\AdminBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints;

class UserType extends AbstractType {

    public function buildForm(FormBuilderInterface  $builder, array $options) {

     $builder
        ->add("username","text",array(
                   "label" => "Name",
                       'attr'   =>  array(
                           'class'   => 'input-xlarge',
                       ),
                    'constraints' => new Constraints\Length(array('min' => 3))
                   ))
        ->add("password","password",array(
                   "label" => "Password",
                       'attr'   =>  array(
                           'class'   => 'input-xlarge',
                       ),
                    'constraints' => new Constraints\Length(array('min' => 3))
                   ))
        ->add("listRoles","entity",array(
            'label' => 'Roles',
            'class'    => 'TruckingMainBundle:UsersRole' ,
            'property' => 'name'
        ))
        ->add("companies","entity",array(
            'label' => 'Companies',
            'class'    => 'TruckingMainBundle:Company' ,
            'property' => 'name'
        ))
        ->add("description","text",array(
           "label" => "Description",
               'attr'   =>  array(
                   'class'   => 'input-xlarge'
               ),
                'constraints' => new Constraints\NotBlank()
           ));
    }

    public function getName()
    {
        return 'trucking_adminbundle_usertype';
    }
}
Dezigo
  • 3,220
  • 3
  • 31
  • 39