Sero
(Terrymcginnis345)
1
Witam forumowiczów,
Mam problem, nie łapię czegoś, bardzo proszę o pomoc.
Mam 3 modele, chcę aby we formularzu na widoku, móc dodać do nich dane (po jednym rekordzie do każdego z modeli (ActiveRecord).
Jak się domyślam muszę utworzyć 3 formularze, czy jakoś inaczej, np. jeden. Co potem? Jak rozumiem dane idą do kontrolera, czyli gdzie konkretnie?
Jak obsłużyć dane z formularza i ostatecznie zapisać je w modelach-tabelach typu ActiveRecord?
Co się dzieje po kliknięciu w przycisk – dane przesyłane są z requestu do akcji w kontrolerze?
Jak zapisać konkretny formularz, czy da się zapisać wszystkie jakimś krótszym kodem?
Aha, oczywiście używam ActiveForm.
Pozdrawiam
Bizley
(Bizley)
2
Przeczytaj sobie wszystko tu jeszcze raz http://www.yiiframework.com/doc-2.0/guide-README.html#getting-data-from-users i jak coś będzie niejasne to pytaj.
Sero
(Terrymcginnis345)
3
Witam,
Trochę się zagłębiłem w temacie, ale dalej mam problem i nie łapie jednej rzeczy.
Chyba łatwiej będzie to przekazać kodem. Co jest nie tak, że linijka
$loaded = ActiveRecord::loadMultiple($models, Yii::$app->request->post());
pozostaje false? Jak to wszystko zrealizować. Oto kod.
Kontroler
<?php
namespace app\controllers;
use yii;
use yii\web\Controller;
use yii\db\ActiveRecord;
use app\models\Opiekun;
use app\models\Zwierze;
use app\models\Pobyt;
class RezerwujController extends Controller {
public function actionIndex()
{
$modelOpiekun = new Opiekun();
$modelZwierze = new Zwierze();
$modelPobyt = new Pobyt();
$models = [ $modelOpiekun, $modelZwierze, $modelPobyt ];
$loaded = 'false';
$loaded = ActiveRecord::loadMultiple($models, Yii::$app->request->post());
/*
if($loaded)
{
$modelOpiekun->save();
$modelZwierze->save();
$modelPobyt->save();
}
*/
return $this->render('index',
[ 'modelOpiekun' => $modelOpiekun,
'modelZwierze' => $modelZwierze,
'modelPobyt' => $modelPobyt,
'loaded' => $loaded
]
);
}
}
?>
i widok
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/* @var $this yii\web\View */
/* @var $model app\models\Opiekun */
/* @var $form ActiveForm */
?>
<div class="index">
<?php $form = ActiveForm::begin();
//if($loaded) { echo "Formularz zapisany w bazie."; }
echo var_dump($loaded);
?>
<?= $form->field($modelOpiekun, 'nazwisko') ?>
<?= $form->field($modelOpiekun, 'telefon') ?>
<?= $form->field($modelOpiekun, 'imie') ?>
<?= $form->field($modelOpiekun, 'email') ?>
<br><br>
<?= $form->field($modelZwierze, 'gatunek') ?>
<?= $form->field($modelZwierze, 'imie') ?>
<?= $form->field($modelZwierze, 'plec') ?>
<?= $form->field($modelZwierze, 'wiek') ?>
<?= $form->field($modelZwierze, 'kolor') ?>
<br><br>
<?= $form->field($modelPobyt, 'od') ?>
<?= $form->field($modelPobyt, 'do') ?>
<div class="form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div><!-- index -->
Serdeczne dzięki za pomoc,
Pozdrawiam
Bizley
(Bizley)
4
loadMultiple() służy do załadowania kilku modeli tej samej klasy, więc w tym wypadku lepiej użyć przykładu z http://www.yiiframework.com/doc-2.0/guide-input-multiple-models.html#getting-data-for-multiple-models gdzie dzieje się dokładnie to, co chcesz osiągnąć (jak mniemam).
PS. Unikaj języka polskiego w kodzie, technicznie jest poprawnie, ale pokazać potem obcojęzycznym gorzej.