Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yii2
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
PSDI Army
yii2
Commits
d8836f63
Commit
d8836f63
authored
Feb 15, 2014
by
Alexander Makarov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixes #2267: added "Handling variable number of models with a single form" to form docs
parent
20dad5e5
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
63 additions
and
0 deletions
+63
-0
form.md
docs/guide/form.md
+63
-0
No files found.
docs/guide/form.md
View file @
d8836f63
...
...
@@ -127,3 +127,65 @@ div.required label:after {
color
:
red
;
}
```
Handling variable number of models with a single form
-----------------------------------------------------
Sometimes you need to handle multiple models of the same kind in a signle form. For example, multiple settings where
each setting is stored as name-value and is represented by
`Setting`
model. The
following shows how to implement it with Yii.
Let's start with controller action:
```
php
namespace
app\controllers
;
use
Yii
;
use
yii\base\Model
;
use
yii\web\Controller
;
use
app\models\Setting
;
class
SettingsController
extends
Controller
{
// ...
public
function
actionUpdate
()
{
$settings
=
Setting
::
find
()
->
indexBy
(
'id'
)
->
all
();
if
(
Model
::
loadMultiple
(
$settings
,
Yii
::
$app
->
request
->
post
())
&&
Model
::
validateMultiple
(
$settings
))
{
foreach
(
$settings
as
$setting
)
{
$setting
->
save
(
false
);
}
return
$this
->
redirect
(
'index'
);
}
return
$this
->
render
(
'update'
,
[
'settings'
=>
$settings
]);
}
}
```
In the code above we're using
`indexBy`
when retrieving models from database to make array indexed by model ids. These
will be later used to identify form fields.
`loadMultiple`
fills multiple modelds with the form data coming from POST
and
`validateMultiple`
validates all models at once. In order to skip validation when saving we're passing
`false`
as
a parameter to
`save`
.
Now the form that's in
`update`
view:
```
php
<?php
use
yii\helpers\Html
;
use
yii\widgets\ActiveForm
;
$form
=
ActiveForm
::
begin
();
foreach
(
$settings
as
$index
=>
$setting
)
{
echo
Html
::
encode
(
$setting
->
name
)
.
': '
.
$form
->
field
(
$setting
,
"[
$index
]value"
);
}
ActiveForm
::
end
();
```
Here for each setting we are rendering name and an input with a value. It is important to add a proper index
to input name since that is how
`loadMultiple`
determines which model to fill with which values.
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment