Bug #40064
Multiselect is not getting persisted
Status: | New | Start date: | 2012-08-22 | |
---|---|---|---|---|
Priority: | Must have | Due date: | ||
Assigned To: | - | % Done: | 0% |
|
Category: | ViewHelpers | |||
Target version: | - | |||
Has patch: | No | Affected Flow version: | Git master |
Description
I have a statement and want to assign multiple users to it using a multiselect box. The mulitselect box displays already selected users(selected by a workaround) correctly, but fails to change the selected users, they remain unchanged.
I attached a screenshot of the page.
The template code:
<f:form controller="Statement" arguments="{statement: statement}" action="updateUsers" name="Statement" object="{statement}"> <f:form.select property="users" options="{users}" optionLabelField="displayName" optionValueField="uid" multiple="5" /> ...
The statement controller:
/** * STEP 2: Select users * * @param \Drinkaccounting\Domain\Model\Statement $statement The statement * @return void */ public function selectUsersAction(Statement $statement) { $this -> view -> assign('statement', $statement); $this -> view -> assign('users', $this -> userRepository -> findAll()); } /** * STEP 2: Update selected users * * @param \Drinkaccounting\Domain\Model\Statement $statement The statement * @param array $selectedUsers * @return void */ public function updateUsersAction(Statement $statement) { $this -> statementRepository -> update($statement); $this -> addFlashMessage('Updated users'); $this -> redirect('selectUsers', 'Statement', NULL, array('statement' => $statement)); }
The statement model:
/** * A Statement * * @FLOW3\Entity */ class Statement { /** * The products * @var \Doctrine\Common\Collections\Collection<\Drinkaccounting\Domain\Model\Product> * @ORM\ManyToMany */ protected $products; ...
My workaround to select users without using the property attribute:
This workaround fails with an Exception if you try to update with no item selected, because then flow3 thinks selectedUsers is a string instead of an array. I haven't figured out a way to read and change the content of an argument in the initializeUpdateUsersAction. Anyway this can't be a final solution.
The template:
<f:form controller="Statement" arguments="{statement: statement, selectedUsers: selectedUsers}" action="updateUsers" name="Statement" object="{statement}"> <f:form.select name="selectedUsers" value="{statement.users}" options="{users}" optionLabelField="displayName" multiple="20" />
The statement controller:
/** * STEP 2: Select users * * @param \Drinkaccounting\Domain\Model\Statement $statement The statement * @return void */ public function selectUsersAction(Statement $statement) { $this -> view -> assign('statement', $statement); $this -> view -> assign('users', $this -> userRepository -> findAll()); } /** * STEP 2: Update selected users * * @param \Drinkaccounting\Domain\Model\Statement $statement The statement * @param array $selectedUsers * @return void */ public function updateUsersAction(Statement $statement, $selectedUsers) { // Clear users $statement -> clearUsers(); // Get user objects by identifier foreach ($selectedUsers as $userID) { $user = $this -> persistenceManager -> getObjectByIdentifier($userID, '\Drinkaccounting\Domain\Model\User'); $statement -> addUser($user); } $this -> statementRepository -> update($statement); $this -> addFlashMessage('Updated users'); $this -> redirect('selectUsers', 'Statement', NULL, array('statement' => $statement)); }
History
#1 Updated by Karsten Dambekalns over 2 years ago
- Affected Flow version changed from Git 1.2 (master) to Git master
#2 Updated by Rik Willems over 1 year ago
This seems to work out of the box for me, using Flow 2.2.