Wpis z mikrobloga

#pytanie #php #yii2

W bazie danych mam trzy tabele:

users - user_id | name | email | ... | address_id
invoices - invoice_id | nip | regon | address_id
addresses - address_id | city | country | ...

users.address_id oraz invoice.address_id to klucze obce do address.

W gii wygenerowałem trzy modele dziedziczące z ActiveRecord, na froncie korzystam z yii\widgets\ActiveForm. Gdy na formularz składają się tylko dane usera i jego adres to wszystko hula, formularz generuję tak:

= $form-field($user_model, 'name')->textInput() ?>
= $form-field($user_model, 'email')->textInput() ?>

= $form-field($address_model, 'country')->textInput() ?>
= $form-field($address_model, 'city')->textInput() ?>

Chciałbym jednak osiągnąć sytuację, w której user wprowadza swoje dane, swój adres, dane do faktury i adres do faktury, a wszystko to w jednym formularzu - z obsłużeniem tego w backendzie nie będzie problemu, jednak problem w tym, że coś takiego:

= $form-field($invoice_model, 'city')->textInput() ?>
Wyrzuca unknown property: common\models\Invoice::city.

Będę wdzięczny za wszelkie podpowiedzi. Dokumentacja + google + stack + jakieś losowe tutoriale nic mądrego nie podpowiadają, przy czym bardzo możliwe, że źle szukam bo to mój pierwszy raz z yii2 i dopiero próbuję się połapać :)
  • 6
@Jurigag: @uirapuru: to tak nie po bożemu omijać założenia frameworka :)

Znalazłem tak
formularz:

= $form-field($address_model, '[user]country')->textInput() ?>
= $form-field($address_model, '[invoice]country')->textInput() ?>

backend:

$redaction_addr = new Address();
$invoice_addr = new Address();

$user_addr->load($data['Address'], 'user');
$invoice_addr->load($data['Address'], 'invoice');
@rineo: a co to jest "założenie" frameworka? edytowanie encji z formularza? to framework ma złe założenie w takim razie. poza tym to jest ficzur symfonowy, a nie dobra praktyka. nadaje sie może do małych rzeczy, większe tylko komplikuje i wystawia na błędy
co to jest "założenie" frameworka?

@uirapuru: jeśli dobrze rozumiem to idea jest taka, że model jest przypisany do pól formularza (name="Model[]"), po czym w backendzie robię sobie $model->load($post, 'Model') i gra. Ma to sens, aczkolwiek - jak słusznie zauważyłeś - raczej do prostych rzeczy.

Przy czym wciąż zakładam, że mogę czegoś nie wiedzieć :)
@rineo: osobiscie staram się separować takie rzeczy od siebie. w wyniku działania formularza mam prosty obiekt z wypełnionymi przez niego danymi, który przekazuje do serwisu. Serwis to już osobna warstwa, ma w sobie już faktorki, repozytoria, tworzy wszystko jak trzeba i zapisuje do bazy. Działa oczywiście po staremu frameworkowa walidacja, a dodatkowo mogę podobny "command" utworzyć sobie nie tylko z formularza, ale np. poprzez api lub jakiekolwiek inne źródło, no i