-
-
Notifications
You must be signed in to change notification settings - Fork 28
/
Copy pathmodel.update.specified.field.txt
54 lines (44 loc) · 2.93 KB
/
model.update.specified.field.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Обновление определённого поля модели
====================================
Часто требуется обновить только одно поле модели не затрагивая все остальные.
Ярким примером может служить форма с inline-редактированием (т.е.
данные для каждой строки сохраняются непосредственно после редактирования).
Конечно можно написать SQL напрямую без использования модели, но в этом случае
мы потеряем замечательную возможность валидации правилами, описанными там.
В моём случае при асинхронном сохранении в метод приходят POST-ом два параметра:
id (имя поля) и value (значение).
```php
if(Yii::app()->request->isAjaxRequest) {
// Используется та же модель формы, что и при полном сохранении
$form = new UserForm();
if(!in_array($_POST['id'], $form->attributeNames())){
// Получен id, которого нет в форме… что-то тут не так.
throw new CHttpException(500, "Wrong data passed.");
}
$form->{$_POST['id']} = $_POST['value'];
// Валидируем по одному значению, а не всю форму
if ($form->validate(array($_POST['id']))) {
$user = new User();
// id пользователя мы и так знаем, так что выбирать всю модель не будем
$user->id = Yii::app()->user->id;
// Берём значение из формы (т.к. в процессе валидации оно могло поменяться)
$user->{$_POST['id']} = $form->$_POST['id'];
// Проверяем, есть ли такой атрибут в нашей модели, если есть — пытаемся
// сохранить. Второй параметр save() — массив полей, которые надо сохранять.
if($user->hasAttribute($_POST['id']) && !$user->save(true, array($_POST['id'])){
throw new CHttpException(500, "Unable to save user data");
}
}
else {
// Ошибки валидации поля отдаём клиенту
echo json_encode(array('error' => $form->getErrors($_POST['id'])));
}
}
else {
// Хорошим тоном будет реализовать и обычное сохранение… может у пользователя
// отключен JS.
}
```
---
- `Автор`: Александр Макаров, Sam Dark ([rmcreative.ru](http://rmcreative.ru/))
- `Обсуждение и комментарии`: [http://yiiframework.ru/forum/viewtopic.php?f=8&t=138](http://yiiframework.ru/forum/viewtopic.php?f=8&t=138)