Bagaimana cara menyimpan sfForm yang berisi formulir doktrin yang tertanam?

Saya memiliki formulir doktrin (KanoonGoodForm) berdasarkan kelas model KanoonGood, yang terlihat seperti ini:

class KanoonGoodForm extends BaseKanoonGoodForm
{
    public function configure()
    {
       $this->widgetSchema['count_num']->setAttribute('size', '1');
       $this->widgetSchema['price']->setAttribute('size', '1');

       $this->validatorSchema['category_id']->setOption('required', false);
       $this->validatorSchema['owner_id']->setOption('required', false);
       $this->validatorSchema['shop_id']->setOption('required', false);
       $this->validatorSchema['name']->setOption('required', false);
       $this->validatorSchema['price']->setOption('required', false);
       $this->validatorSchema['count_num']->setOption('required', false);
       $this->validatorSchema['description']->setOption('required', false);
    }
}

lalu saya membuat kelas KanoonGoodsGroupForm, untuk memiliki formulir dengan sejumlah formulir KanoonGoodForm yang tertanam secara acak:

class KanoonGoodsGroupForm extends sfForm
{
    public function configure() 
   { 
       for ($i = 0; $i < 2; $i++) 
       {
           $this->embedForm('good_'.($i+1), new KanoonGoodForm());
       }
       $this->widgetSchema->setNameFormat('KanoonGoodsGroup[%s]');
       $this->mergePostValidator(new KanoonGoodValidatorSchema());
   }
}

Dalam sebuah modul (bernama good), saya menggemakan contoh KanoonGoodsGroupForm, ketika tindakan baru dipanggil:

public function executeNew(sfWebRequest $request)
{
    $this->form = new KanoonGoodsGroupForm();
}

Karena semua formulir yang disematkan tidak perlu diisi, seperti PASAL INI mengatakan, saya membuat validator sendiri:

class KAnoonGoodValidatorSchema extends sfValidatorSchema
{
  protected function configure($options = array(), $messages = array())
  {
    $this->addMessage('category_id', 'The category_id is required.');
    $this->addMessage('owner_id', 'The owner_id is required.');
    $this->addMessage('shop_id', 'The shop_id is required.');
    $this->addMessage('name', 'The name is required.');
    $this->addMessage('price', 'The price is required.');
    $this->addMessage('count_num', 'The count_num is required.');
    $this->addMessage('description', 'The description is required.');
  }

  protected function doClean($values)
  {
    $errorSchema = new sfValidatorErrorSchema($this);

    foreach($values as $key => $value)
    {
      $errorSchemaLocal = new sfValidatorErrorSchema($this);
      // no caption and no filename, remove the empty values
      if (!$value['name'] && !$value['price']&& !$value['count_num']&& !$value['description'])
      {
        unset($values[$key]);
      }

      // some error for this embedded-form
      if (count($errorSchemaLocal))
      {
        $errorSchema->addError($errorSchemaLocal, (string) $key);
      }
    }

    // throws the error for the main form
    if (count($errorSchema))
    {
      throw new sfValidatorErrorSchema($this, $errorSchema);
    }

    return $values;
  }
}

sekarang saya ingin menyimpan formulir tersemat yang diisi oleh pengguna, apa yang harus saya lakukan dalam tindakan pembuatan untuk mencapai hal ini?

public function executeCreate(sfWebRequest $request)
{
    $this->forward404Unless($request->isMethod(sfRequest::POST));
    $this->form = new KanoonGoodsGroupForm();
    $this->form->bind($request->getParameter('KanoonGoodsGroup'), $request->getFiles('KanoonGoodsGroup'));

    if ($this->form->isValid())
    {

         //what should I do here? to save those filled embedded forms?
    }

   $this->setTemplate('edit');
  }

person Ehsan    schedule 01.08.2012    source sumber
comment
Coba foreach ($this->form->getEmbeddedForms() as $form) { $form->save(); }   -  person 1ed    schedule 02.08.2012
comment
Saya mencobanya, tetapi saya mendapat 500 | Kesalahan Server Internal | sfValidatorErrorSchema, pada baris ini: $this-›errorSchema = new sfValidatorErrorSchema($this-›validatorSchema); di BaseKanoonGoodForm.class.php saya   -  person Ehsan    schedule 02.08.2012


Jawaban (3)


Ketika saya menghadapi masalah serupa, saya menyelesaikannya dengan metode custom save() dalam formulir yang merupakan kumpulan formulir yang disematkan seperti ini

public function save($conn = null){
    foreach ($this->getEmbeddedForms() as $key => $form) {
        $object = $form->getObject();
        $object->merge($this->getValue($key));
        $object->save($conn);
    }
}

Itu berjalan melalui formulir yang disematkan dan menggabungkan objeknya dengan data yang divalidasi dari formulir grup dan kemudian menyimpannya

person Andrey Yaroshenko    schedule 25.11.2012

Anda harus menelepon:

$this->form->save();

Tetapi, Anda harus mengimplementasikan bagian yang terkait dengan saveEmbeddedForms.

person j0k    schedule 01.08.2012
comment
karena formulir ini adalah sfForm, maka tidak memiliki fungsi simpan atau simpanEmbeddedForms. Saya telah mencoba menerapkannya sendiri tetapi saya mendapatkan kesalahan seperti persyaratan csrf_token untuk setiap formulir yang disematkan! - person Ehsan; 01.08.2012

Anda harus Menerapkan metode penyimpanan untuk KanoonGoodsGroupForm sebagai berikut:

public function save() {
    $this->updateObjectEmbeddedForms($this->getTaintedValues());
    $this->saveEmbeddedForms();
  }

  public function saveEmbeddedForms($forms = null) {
    if (null === $forms) {
      $forms = $this->embeddedForms;
    }

    foreach ($forms as $form) {
      if ($form instanceof sfFormObject) {
        $form->getObject()->save();
        $form->saveEmbeddedForms();
      } else {
        $this->saveEmbeddedForms($form->getEmbeddedForms());
      }
    }
  }


  public function updateObjectEmbeddedForms($values, $forms = null) {
    if (null === $forms) {
      $forms = $this->embeddedForms;
    }

    foreach ($forms as $name => $form) {
      if (!isset($values[$name]) || !is_array($values[$name])) {
        continue;
      }

      if ($form instanceof sfFormObject) {
        $form->updateObject($values[$name]);
      } else {
        $this->updateObjectEmbeddedForms($values[$name], $form->getEmbeddedForms());
      }
    }
  }
person Rene Ramirez    schedule 20.05.2015