Как установить в качестве значения по умолчанию в поле формы Symfony 2 аутентифицированное имя пользователя из FOSUserBundle

я нахожу этот фрагмент действительно полезным, чтобы поместить значение по умолчанию в мою форму при ее создании

 $builder
 ->add('myfield', 'text', array(
     'label' => 'Field',
     'data' => 'Default value'))
 ;

что, если я хочу заменить «значение по умолчанию» на аутентифицированного человека из пакета FOSUser? (которые возвращают true для is_granted("IS_AUTHENTICATED_REMEMBERED"))

я могу получить это имя в файле ветки с помощью

 {{ app.user.username }} 

я также сделал это в методе контроллера с

    $username=$this->container->get('security.context')->getToken()->getUser()->getUsername()   

но я не могу заставить это работать в моей форме!

я не уверен, что хорошо понимаю эту вещь с контейнером... ни как передавать переменные между классами и контроллером... может быть что-то в этом роде??

      ->add('myfield', 'text', array(
     'label' => 'Field',
     'data' => FOS\UserBundle\Model::$this->getUsername()))

person Matoeil    schedule 21.11.2012    source источник


Ответы (2)


Вы можете передать переменную из вашего контроллера в форму:

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

$username=$this->container->get('security.context')->getToken()->getUser()->getUsername()
$form = $this->createForm(new MyFormType($username), $entity);

в вашей форме:

protected $username;

public function __construct (array $username = null)
{
        $this->username = $username ;
}

public function buildForm(FormBuilder $builder, array $options)
{
   $builder  
     ->add('myfield', 'text', array(
      'label' => 'Field',
      'data' => $this->username))
}
person Chopchop    schedule 21.11.2012

Другой способ установить значения по умолчанию в форме — установить их в базовом объекте данных для формы, как в этом примере из документации Symfony по созданию формы:

public function newAction()
{
    // create a task and give it some dummy data for this example
    $task = new Task();
    $task->setTask('Write a blog post');
    $task->setDueDate(new \DateTime('tomorrow'));

    $form = $this->createFormBuilder($task)
        ->add('task', 'text')
        ->add('dueDate', 'date')
        ->getForm();

    return $this->render('AcmeTaskBundle:Default:new.html.twig', array(
        'form' => $form->createView(),
    ));
}

В этом примере базовым объектом данных формы является Задача, а значения, заданные для задачи, являются значениями по умолчанию, отображаемыми в форме. Объект задачи не является постоянным. Этот подход так же хорошо работает с классом формы, и если предположить, что базовым объектом для вашей формы является пользователь, он будет выглядеть примерно так:

$username = $this->container->get('security.context')->getToken()->getUser()->getUsername();

$user = new User();
$user->setUsername($username);
// could set any other default values on user here

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

Недостатком этого подхода является то, что если форма используется во многих местах, требующих одних и тех же значений по умолчанию, код будет повторяться. Это не та ситуация, с которой я сталкивался до сих пор - мои пользовательские формы повторно используются для создания/редактирования, но для редактирования не требуются значения по умолчанию.

person redbirdo    schedule 21.11.2012