From 6b62cfbe61a388d822f443eb2ec81c66d772895a Mon Sep 17 00:00:00 2001 From: Daniel Filipek Date: Tue, 6 Oct 2015 09:08:21 +0200 Subject: [PATCH] input-multiple-models 100% --- docs/guide-pl/input-multiple-models.md | 76 ++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 docs/guide-pl/input-multiple-models.md diff --git a/docs/guide-pl/input-multiple-models.md b/docs/guide-pl/input-multiple-models.md new file mode 100644 index 0000000..4c58e62 --- /dev/null +++ b/docs/guide-pl/input-multiple-models.md @@ -0,0 +1,76 @@ +Pobieranie danych dla wielu modeli +================================ + +Kiedy mamy do czynienia z jakimiś skomplikowanymi danymi, jest możliwe, że będziesz musiał użyć wielu różnych modeli aby pobrać te dane od użytkownika. +Dla przykładu: Zakładając, że dane logowania użytkownika zapisane są w tabeli `user`, podczas gdy dane profilu użytkownika są przechowywane w tabeli `profile`, +będziesz chciał pobrać dane od użytkownika przez model `User` oraz `Profile`. +Z modelem Yii oraz wsparciem formularzy, możesz rozwiązać ten problem w sposób nie różniący się za bardzo od przetwarzania pojedyńczego modelu. + +W poniższym przykładzie pokażemy jak utworzyć formularz, który pozwoli Ci na zbieranie danych dla obydwu modeli: `User` oraz `Profile`. + +Na początek, akcja w kontrolerze do zbierania danych użytkownika oraz danych profilowych może zostać napisana następująco: + +```php +namespace app\controllers; + +use Yii; +use yii\base\Model; +use yii\web\Controller; +use yii\web\NotFoundHttpException; +use app\models\User; +use app\models\Profile; + +class UserController extends Controller +{ + public function actionUpdate($id) + { + $user = User::findOne($id); + $profile = Profile::findOne($id); + + if (!isset($user, $profile)) { + throw new NotFoundHttpException("The user was not found."); + } + + $user->scenario = 'update'; + $profile->scenario = 'update'; + + if ($user->load(Yii::$app->request->post()) && $profile->load(Yii::$app->request->post())) { + if ($user->validate() && $profile->validate()) { + $user->save(false); + $profile->save(false); + return $this->redirect(['user/view', 'id' => $id]); + } + } + + return $this->render('update', [ + 'user' => $user, + 'profile' => $profile, + ]); + } +} +``` + +W akcji `update`, najpierw ładujemy modele `$user` oraz `$profile`, które zostaną zaktualizowane danymi z bazy danych. +Następnie wywołujemy metodę [[yii\base\Model::load()]] aby wypełnić te dwa modele danymi wprowadzonymi przez użytkownika. +Kolejnie modele zostaną poddane waliacji i, w przypadku prawidłowej walidacji, zapisane. +W przeciwnym razie zostanie wyrenderowany widok `update`, który zawiera następujący kod: + +```php + 'user-update-form', + 'options' => ['class' => 'form-horizontal'], +]) ?> + field($user, 'username') ?> + + ...other input fields... + + field($profile, 'website') ?> + + 'btn btn-primary']) ?> + +``` +Tak jak widzisz, w widoku `update` tworzymy pola tekstowe używając dwóch modeli: `$user` oraz `$profile`.