Last time I heard, embedded forms are saved when calling a form's save() method. This change was in the 1.3 & 1.4 release.
Daniel Sent from my iPad On Jun 1, 2010, at 2:27 AM, ken <marfillas...@gmail.com> wrote: > I would advise tracing through sfDoctrineForm::save() method. Embedded > forms save is not actually fired on containing form save. So if you > have many many relation or another embedded form inside an embedded > form, they wont be persisted. > > On May 31, 1:28 pm, Michael Hodges <mhodg...@gmail.com> wrote: >> Hello Symfony fans, >> >> I'm hoping someone can point to the error in my ways. I am working with >> embedded forms and the problem is that the master record is saved to the >> database, but not the user date for the detail records. I have followed the >> 'more with symphony 1.4 en' example very carefully and have been very >> successful with all aspects of the project except getting the save to work. >> It's like a Toyota scenario where I have a great car, except for one fatal >> flaw. Hoping you can help. >> >> The schema involves a master record, Transaction Receipt (master form), and >> two detail records: PurchaseDetail (Purchases) and PaymentDetail (Payments), >> the embedded forms. For every receipt there must be at least one purchase >> and one payment detail. My validation rules for this work well thanks to >> the examples in the tutorial. The schema is as follows (I left a lot out >> except the essentials for readability): >> >> TransactionReceipt: >> connection: doctrine >> tableName: TransactionReceipt >> actAs: { Timestampable: } >> columns: >> receipt_id: { type: integer(4), primary: true, autoincrement: true } >> paid_amount: { type: 'decimal(5, 2)', notnull: true } >> paid_date: { type: timestamp(25), notnull: true } >> Purchases: { class: PurchaseDetail, local: receipt_id, foreign: >> receipt_id, type: many } >> Payments: { class: PaymentDetail, local: receipt_id, foreign: >> receipt_id, type: many } >> >> PurchaseDetail: >> connection: doctrine >> tableName: PurchaseDetail >> actAs: { Timestampable: } >> columns: >> purchase_id: { type: integer(4), primary: true, autoincrement: true} >> receipt_id: { type: integer(4) } >> fee_name: { type: string(45) } >> fee_description: { type: string(45) } >> fee_amount: { type: 'decimal(5, 2)' } >> quantity: { type: integer(4) } >> relations: >> TransactionReceipt: { owningSide: Yes, local: receipt_id, type: one, >> foreign: receipt_id, foreignType: many, foreignAlias: Purchases, onDelete: >> CASCADE, onUpdate: CASCADE } >> >> PaymentDetail: >> connection: doctrine >> tableName: PaymentDetail >> actAs: { Timestampable: } >> columns: >> payment_id: { type: integer(4), primary: true, autoincrement: true } >> receipt_id: { type: integer(4) } >> payment_type: { type: string(2) } >> payment_amount: { type: 'decimal(5, 2)' } >> relations: >> TransactionReceipt: { owningSide: Yes, local: receipt_id, type: one, >> foreign: receipt_id, foreignType: many, foreignAlias: Payments, onDelete: >> CASCADE, onUpdate: CASCADE } >> >> The YAML dump of the tainted values are taken in TransactionReceiptForm at >> the beginning of the saveEmbeddedForms method. >> The results demonstrate that the subforms are correctly holding the tainted >> values provided by the user. >> >> _csrf_token: 4abd94aee8c8a102c044558e44263726 >> student_id: '10002' >> for_academic_year: '2009' >> paid_date: '2010-05-29 18:20:12' >> receipt_amount: '20.00' >> paid_amount: '20.00' >> newPurchases: >> - >> fee_name: 'ACT Pass' >> fee_amount: '20.00' >> quantity: '1' >> - >> fee_name: '' >> fee_amount: '' >> quantity: '' >> - >> fee_name: '' >> fee_amount: '' >> quantity: '' >> - >> fee_name: '' >> fee_amount: '' >> quantity: '' >> paid_by: mom >> newPayments: >> - >> payment_type: CA >> payment_amount: '20' >> - >> payment_type: '' >> payment_amount: '' >> >> In TransactionReceiptForm the default framework doSave method is called, I >> don't override it. When there are errors in any of the subfields they are >> handled correctly. However, when there are no errors and the doSave can >> proceed with saving the data to disk, only the master TransactionReceipt >> record is written to disk. None of the detail records for Payments or >> Purchases are written to disk. If I comment out the 'unset' logic in >> TransactionReceiptForm method saveEmbeddedForm, then the detail records with >> 'null' values are saved but none of the user input is saved too. Each >> detail record does include the receipt_id, so that's a good start. >> >> My TransactionReceiptForm, method configure is as follows: >> . . . >> $collectionForm = new PurchaseDetailCollectionForm(null, array( >> 'receipt' => $this->getObject(), >> 'count' => sfConfig::get('app_purchases_per_form'), >> )); >> $this->embedForm('newPurchases', $collectionForm); >> $collectionForm = new PaymentDetailCollectionForm(null, array( >> 'receipt' => $this->getObject(), >> 'count' => sfConfig::get('app_payments_per_form'), >> )); >> $this->embedForm('newPayments', $collectionForm); >> $this->embedRelation('Purchases'); >> $this->embedRelation('Payments'); >> . . . >> >> My collection form is as follows (following the tutorial very carefully): >> >> class PaymentDetailCollectionForm extends BaseForm //sfForm >> { >> public function configure() >> { >> if (!$receipt = $this->getOption('receipt')) >> { >> throw new InvalidArgumentException('Error: PaymentDetailCollectionForm >> requires a TransactionReceipt object.'); >> } >> $count = (Integer)sfConfig::get('app_payments_per_form'); // see app.yml >> for ($i = 0; $i < $this->getOption('count', $count); $i++) >> { >> $paymentDetail = new PaymentDetail(); >> $paymentDetail->TransactionReceipt = $receipt; >> $subForm = new PaymentDetailForm($paymentDetail); >> $this->embedForm($i, $subForm); >> } >> $this->mergePostValidator(new PaymentDetailValidatorSchema()); >> } >> >> } >> >> After reading the posts, not sure if I'm experiencing the reported bug or if >> I must >> take care of writing the code to bind the subforms. >> >> Any advice would be greatly appreciated, I've been stuck on this quite a >> while. >> It's my first Symfony protect. >> >> Thanks >> - Michael > > -- > If you want to report a vulnerability issue on symfony, please send it to > security at symfony-project.com > > You received this message because you are subscribed to the Google > Groups "symfony users" group. > To post to this group, send email to symfony-users@googlegroups.com > To unsubscribe from this group, send email to > symfony-users+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/symfony-users?hl=en -- If you want to report a vulnerability issue on symfony, please send it to security at symfony-project.com You received this message because you are subscribed to the Google Groups "symfony users" group. To post to this group, send email to symfony-users@googlegroups.com To unsubscribe from this group, send email to symfony-users+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/symfony-users?hl=en